diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/index.html b/index.html new file mode 100644 index 00000000..7d3fcf1d --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/latest/.buildinfo b/latest/.buildinfo new file mode 100644 index 00000000..474250aa --- /dev/null +++ b/latest/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 2f2f525768b625478901c6933767b8f1 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/latest/.nojekyll b/latest/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/latest/_images/MA35D_ASIC1&2.png b/latest/_images/MA35D_ASIC1&2.png new file mode 100644 index 00000000..4f7d53b7 Binary files /dev/null and b/latest/_images/MA35D_ASIC1&2.png differ diff --git a/latest/_images/MA35D_VPU.png b/latest/_images/MA35D_VPU.png new file mode 100644 index 00000000..d55cabf6 Binary files /dev/null and b/latest/_images/MA35D_VPU.png differ diff --git a/latest/_images/MA35D_pipeline.png b/latest/_images/MA35D_pipeline.png new file mode 100644 index 00000000..fc17564b Binary files /dev/null and b/latest/_images/MA35D_pipeline.png differ diff --git a/latest/_images/gst_xabrladder.png b/latest/_images/gst_xabrladder.png new file mode 100644 index 00000000..75d9d2ba Binary files /dev/null and b/latest/_images/gst_xabrladder.png differ diff --git a/latest/_images/gst_xcompositor.png b/latest/_images/gst_xcompositor.png new file mode 100644 index 00000000..1848b6b3 Binary files /dev/null and b/latest/_images/gst_xcompositor.png differ diff --git a/latest/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css b/latest/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css new file mode 100644 index 00000000..eb19f698 --- /dev/null +++ b/latest/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/latest/_sphinx_design_static/design-tabs.js b/latest/_sphinx_design_static/design-tabs.js new file mode 100644 index 00000000..36b38cf0 --- /dev/null +++ b/latest/_sphinx_design_static/design-tabs.js @@ -0,0 +1,27 @@ +var sd_labels_by_text = {}; + +function ready() { + const li = document.getElementsByClassName("sd-tab-label"); + for (const label of li) { + syncId = label.getAttribute("data-sync-id"); + if (syncId) { + label.onclick = onLabelClick; + if (!sd_labels_by_text[syncId]) { + sd_labels_by_text[syncId] = []; + } + sd_labels_by_text[syncId].push(label); + } + } +} + +function onLabelClick() { + // Activate other inputs with the same sync id. + syncId = this.getAttribute("data-sync-id"); + for (label of sd_labels_by_text[syncId]) { + if (label === this) continue; + label.previousElementSibling.checked = true; + } + window.localStorage.setItem("sphinx-design-last-tab", syncId); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/latest/_static/_sphinx_javascript_frameworks_compat.js b/latest/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/latest/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/latest/_static/basic.css b/latest/_static/basic.css new file mode 100644 index 00000000..30fee9d0 --- /dev/null +++ b/latest/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/latest/_static/css/badge_only.css b/latest/_static/css/badge_only.css new file mode 100644 index 00000000..e380325b --- /dev/null +++ b/latest/_static/css/badge_only.css @@ -0,0 +1 @@ +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/latest/_static/css/fonts/Roboto-Slab-Bold.woff b/latest/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/latest/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/latest/_static/css/fonts/Roboto-Slab-Bold.woff2 b/latest/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/latest/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/latest/_static/css/fonts/Roboto-Slab-Regular.woff b/latest/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/latest/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/latest/_static/css/fonts/Roboto-Slab-Regular.woff2 b/latest/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/latest/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/latest/_static/css/fonts/fontawesome-webfont.eot b/latest/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/latest/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/latest/_static/css/fonts/fontawesome-webfont.svg b/latest/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/latest/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/latest/_static/css/fonts/fontawesome-webfont.ttf b/latest/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/latest/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/latest/_static/css/fonts/fontawesome-webfont.woff b/latest/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/latest/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/latest/_static/css/fonts/fontawesome-webfont.woff2 b/latest/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/latest/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/latest/_static/css/fonts/lato-bold-italic.woff b/latest/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/latest/_static/css/fonts/lato-bold-italic.woff differ diff --git a/latest/_static/css/fonts/lato-bold-italic.woff2 b/latest/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/latest/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/latest/_static/css/fonts/lato-bold.woff b/latest/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/latest/_static/css/fonts/lato-bold.woff differ diff --git a/latest/_static/css/fonts/lato-bold.woff2 b/latest/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/latest/_static/css/fonts/lato-bold.woff2 differ diff --git a/latest/_static/css/fonts/lato-normal-italic.woff b/latest/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/latest/_static/css/fonts/lato-normal-italic.woff differ diff --git a/latest/_static/css/fonts/lato-normal-italic.woff2 b/latest/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/latest/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/latest/_static/css/fonts/lato-normal.woff b/latest/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/latest/_static/css/fonts/lato-normal.woff differ diff --git a/latest/_static/css/fonts/lato-normal.woff2 b/latest/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/latest/_static/css/fonts/lato-normal.woff2 differ diff --git a/latest/_static/css/theme.css b/latest/_static/css/theme.css new file mode 100644 index 00000000..2814741e --- /dev/null +++ b/latest/_static/css/theme.css @@ -0,0 +1,4771 @@ +html{ + box-sizing:border-box +} +*,:after,:before{ + box-sizing:inherit +} +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{ + display:block +} +audio,canvas,video{ + display:inline-block; + *display:inline; + *zoom:1 +} +[hidden],audio:not([controls]){ + display:none +} +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box +} +html{ + font-size:100%; + -webkit-text-size-adjust:100%; + -ms-text-size-adjust:100% +} +body{ + margin:0 +} +a:active,a:hover{ + outline:0 +} +abbr[title]{ + border-bottom:1px dotted +} +b,strong{ + font-weight:700 +} +blockquote{ + margin:0 +} +dfn{ + font-style:italic +} +ins{ + background:#ff9; + text-decoration:none +} +ins,mark{ + color:#000 +} +mark{ + background:#ff0; + font-style:italic; + font-weight:700 +} +.rst-content code,.rst-content tt,code,kbd,pre,samp{ + font-family:monospace,serif; + _font-family:courier new,monospace; + font-size:1em +} +pre{ + white-space:pre +} +q{ + quotes:none +} +q:after,q:before{ + content:""; + content:none +} +small{ + font-size:85% +} +sub,sup{ + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline +} +sup{ + top:-.5em +} +sub{ + bottom:-.25em +} +dl,ol,ul{ + margin:0; + padding:0; + list-style:none; + list-style-image:none +} +li{ + list-style:none +} +dd{ + margin:0 +} +img{ + border:0; + -ms-interpolation-mode:bicubic; + vertical-align:middle; + max-width:100% +} +svg:not(:root){ + overflow:hidden +} +figure,form{ + margin:0 +} +label{ + cursor:pointer +} +button,input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle +} +button,input{ + line-height:normal +} +button,input[type=button],input[type=reset],input[type=submit]{ + cursor:pointer; + -webkit-appearance:button; + *overflow:visible +} +button[disabled],input[disabled]{ + cursor:default +} +input[type=search]{ + -webkit-appearance:textfield; + -moz-box-sizing:content-box; + -webkit-box-sizing:content-box; + box-sizing:content-box +} +textarea{ + resize:vertical +} +table{ + border-collapse:collapse; + border-spacing:0 +} +td{ + vertical-align:top +} +.chromeframe{ + margin:.2em 0; + background:#ccc; + color:#000; + padding:.2em 0 +} +.ir{ + display:block; + border:0; + text-indent:-999em; + overflow:hidden; + background-color:transparent; + background-repeat:no-repeat; + text-align:left; + direction:ltr; + *line-height:0 +} +.ir br{ + display:none +} +.hidden{ + display:none!important; + visibility:hidden +} +.visuallyhidden{ + border:0; + clip:rect(0 0 0 0); + height:1px; + margin:-1px; + overflow:hidden; + padding:0; + position:absolute; + width:1px +} +.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{ + clip:auto; + height:auto; + margin:0; + overflow:visible; + position:static; + width:auto +} +.invisible{ + visibility:hidden +} +.relative{ + position:relative +} +big,small{ + font-size:100% +} +@media print{ + body,html,section{ + background:none!important + } + *{ + box-shadow:none!important; + text-shadow:none!important; + filter:none!important; + -ms-filter:none!important + } + a,a:visited{ + text-decoration:underline + } + .ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{ + content:"" + } + blockquote,pre{ + page-break-inside:avoid + } + thead{ + display:table-header-group + } + img,tr{ + page-break-inside:avoid + } + img{ + max-width:100%!important + } + @page{ + margin:.5cm + } + .rst-content .toctree-wrapper>p.caption,h2,h3,p{ + orphans:3; + widows:3 + } + .rst-content .toctree-wrapper>p.caption,h2,h3{ + page-break-after:avoid + } +} +.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{ + -webkit-font-smoothing:antialiased +} +/*! * Custome CSS styles for Xilinx GitHub Tutorials */ + p .footerinfo { + font-size:small; +} + footer .sphinxfooter{ + z-index:0; + background:#ffffff; +} + .sphinxhide { + display:none; +} + a:visited { + color: #9b59b6; +} + a:link { + color: blue; +} + .wy-nav-side a:hover { + color: white; +} + .headerlink { + padding-top: 60px; + margin-top: -50px; +} +/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ +@font-face{ + font-family:FontAwesome; + src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713); + src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg"); + font-weight:400; + font-style:normal +} +.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{ + display:inline-block; + font:normal normal normal 14px/1 FontAwesome; + font-size:inherit; + text-rendering:auto; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale +} +.fa-lg{ + font-size:1.33333em; + line-height:.75em; + vertical-align:-15% +} +.fa-2x{ + font-size:2em +} +.fa-3x{ + font-size:3em +} +.fa-4x{ + font-size:4em +} +.fa-5x{ + font-size:5em +} +.fa-fw{ + width:1.28571em; + text-align:center +} +.fa-ul{ + padding-left:0; + margin-left:2.14286em; + list-style-type:none +} +.fa-ul>li{ + position:relative +} +.fa-li{ + position:absolute; + left:-2.14286em; + width:2.14286em; + top:.14286em; + text-align:center +} +.fa-li.fa-lg{ + left:-1.85714em +} +.fa-border{ + padding:.2em .25em .15em; + border:.08em solid #eee; + border-radius:.1em +} +.fa-pull-left{ + float:left +} +.fa-pull-right{ + float:right +} +.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{ + margin-right:.3em +} +.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{ + margin-left:.3em +} +.pull-right{ + float:right +} +.pull-left{ + float:left +} +.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{ + margin-right:.3em +} +.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{ + margin-left:.3em +} +.fa-spin{ + -webkit-animation:fa-spin 2s linear infinite; + animation:fa-spin 2s linear infinite +} +.fa-pulse{ + -webkit-animation:fa-spin 1s steps(8) infinite; + animation:fa-spin 1s steps(8) infinite +} +@-webkit-keyframes fa-spin{ + 0%{ + -webkit-transform:rotate(0deg); + transform:rotate(0deg) + } + to{ + -webkit-transform:rotate(359deg); + transform:rotate(359deg) + } +} +@keyframes fa-spin{ + 0%{ + -webkit-transform:rotate(0deg); + transform:rotate(0deg) + } + to{ + -webkit-transform:rotate(359deg); + transform:rotate(359deg) + } +} +.fa-rotate-90{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform:rotate(90deg); + -ms-transform:rotate(90deg); + transform:rotate(90deg) +} +.fa-rotate-180{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform:rotate(180deg); + -ms-transform:rotate(180deg); + transform:rotate(180deg) +} +.fa-rotate-270{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform:rotate(270deg); + -ms-transform:rotate(270deg); + transform:rotate(270deg) +} +.fa-flip-horizontal{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform:scaleX(-1); + -ms-transform:scaleX(-1); + transform:scaleX(-1) +} +.fa-flip-vertical{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform:scaleY(-1); + -ms-transform:scaleY(-1); + transform:scaleY(-1) +} +:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{ + filter:none +} +.fa-stack{ + position:relative; + display:inline-block; + width:2em; + height:2em; + line-height:2em; + vertical-align:middle +} +.fa-stack-1x,.fa-stack-2x{ + position:absolute; + left:0; + width:100%; + text-align:center +} +.fa-stack-1x{ + line-height:inherit +} +.fa-stack-2x{ + font-size:2em +} +.fa-inverse{ + color:#fff +} +.fa-glass:before{ + content:"" +} +.fa-music:before{ + content:"" +} +.fa-search:before,.icon-search:before{ + content:"" +} +.fa-envelope-o:before{ + content:"" +} +.fa-heart:before{ + content:"" +} +.fa-star:before{ + content:"" +} +.fa-star-o:before{ + content:"" +} +.fa-user:before{ + content:"" +} +.fa-film:before{ + content:"" +} +.fa-th-large:before{ + content:"" +} +.fa-th:before{ + content:"" +} +.fa-th-list:before{ + content:"" +} +.fa-check:before{ + content:"" +} +.fa-close:before,.fa-remove:before,.fa-times:before{ + content:"" +} +.fa-search-plus:before{ + content:"" +} +.fa-search-minus:before{ + content:"" +} +.fa-power-off:before{ + content:"" +} +.fa-signal:before{ + content:"" +} +.fa-cog:before,.fa-gear:before{ + content:"" +} +.fa-trash-o:before{ + content:"" +} +.fa-home:before,.icon-home:before{ + content:"" +} +.fa-file-o:before{ + content:"" +} +.fa-clock-o:before{ + content:"" +} +.fa-road:before{ + content:"" +} +.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{ + content:"" +} +.fa-arrow-circle-o-down:before{ + content:"" +} +.fa-arrow-circle-o-up:before{ + content:"" +} +.fa-inbox:before{ + content:"" +} +.fa-play-circle-o:before{ + content:"" +} +.fa-repeat:before,.fa-rotate-right:before{ + content:"" +} +.fa-refresh:before{ + content:"" +} +.fa-list-alt:before{ + content:"" +} +.fa-lock:before{ + content:"" +} +.fa-flag:before{ + content:"" +} +.fa-headphones:before{ + content:"" +} +.fa-volume-off:before{ + content:"" +} +.fa-volume-down:before{ + content:"" +} +.fa-volume-up:before{ + content:"" +} +.fa-qrcode:before{ + content:"" +} +.fa-barcode:before{ + content:"" +} +.fa-tag:before{ + content:"" +} +.fa-tags:before{ + content:"" +} +.fa-book:before,.icon-book:before{ + content:"" +} +.fa-bookmark:before{ + content:"" +} +.fa-print:before{ + content:"" +} +.fa-camera:before{ + content:"" +} +.fa-font:before{ + content:"" +} +.fa-bold:before{ + content:"" +} +.fa-italic:before{ + content:"" +} +.fa-text-height:before{ + content:"" +} +.fa-text-width:before{ + content:"" +} +.fa-align-left:before{ + content:"" +} +.fa-align-center:before{ + content:"" +} +.fa-align-right:before{ + content:"" +} +.fa-align-justify:before{ + content:"" +} +.fa-list:before{ + content:"" +} +.fa-dedent:before,.fa-outdent:before{ + content:"" +} +.fa-indent:before{ + content:"" +} +.fa-video-camera:before{ + content:"" +} +.fa-image:before,.fa-photo:before,.fa-picture-o:before{ + content:"" +} +.fa-pencil:before{ + content:"" +} +.fa-map-marker:before{ + content:"" +} +.fa-adjust:before{ + content:"" +} +.fa-tint:before{ + content:"" +} +.fa-edit:before,.fa-pencil-square-o:before{ + content:"" +} +.fa-share-square-o:before{ + content:"" +} +.fa-check-square-o:before{ + content:"" +} +.fa-arrows:before{ + content:"" +} +.fa-step-backward:before{ + content:"" +} +.fa-fast-backward:before{ + content:"" +} +.fa-backward:before{ + content:"" +} +.fa-play:before{ + content:"" +} +.fa-pause:before{ + content:"" +} +.fa-stop:before{ + content:"" +} +.fa-forward:before{ + content:"" +} +.fa-fast-forward:before{ + content:"" +} +.fa-step-forward:before{ + content:"" +} +.fa-eject:before{ + content:"" +} +.fa-chevron-left:before{ + content:"" +} +.fa-chevron-right:before{ + content:"" +} +.fa-plus-circle:before{ + content:"" +} +.fa-minus-circle:before{ + content:"" +} +.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{ + content:"" +} +.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{ + content:"" +} +.fa-question-circle:before{ + content:"" +} +.fa-info-circle:before{ + content:"" +} +.fa-crosshairs:before{ + content:"" +} +.fa-times-circle-o:before{ + content:"" +} +.fa-check-circle-o:before{ + content:"" +} +.fa-ban:before{ + content:"" +} +.fa-arrow-left:before{ + content:"" +} +.fa-arrow-right:before{ + content:"" +} +.fa-arrow-up:before{ + content:"" +} +.fa-arrow-down:before{ + content:"" +} +.fa-mail-forward:before,.fa-share:before{ + content:"" +} +.fa-expand:before{ + content:"" +} +.fa-compress:before{ + content:"" +} +.fa-plus:before{ + content:"" +} +.fa-minus:before{ + content:"" +} +.fa-asterisk:before{ + content:"" +} +.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{ + content:"" +} +.fa-gift:before{ + content:"" +} +.fa-leaf:before{ + content:"" +} +.fa-fire:before,.icon-fire:before{ + content:"" +} +.fa-eye:before{ + content:"" +} +.fa-eye-slash:before{ + content:"" +} +.fa-exclamation-triangle:before,.fa-warning:before{ + content:"" +} +.fa-plane:before{ + content:"" +} +.fa-calendar:before{ + content:"" +} +.fa-random:before{ + content:"" +} +.fa-comment:before{ + content:"" +} +.fa-magnet:before{ + content:"" +} +.fa-chevron-up:before{ + content:"" +} +.fa-chevron-down:before{ + content:"" +} +.fa-retweet:before{ + content:"" +} +.fa-shopping-cart:before{ + content:"" +} +.fa-folder:before{ + content:"" +} +.fa-folder-open:before{ + content:"" +} +.fa-arrows-v:before{ + content:"" +} +.fa-arrows-h:before{ + content:"" +} +.fa-bar-chart-o:before,.fa-bar-chart:before{ + content:"" +} +.fa-twitter-square:before{ + content:"" +} +.fa-facebook-square:before{ + content:"" +} +.fa-camera-retro:before{ + content:"" +} +.fa-key:before{ + content:"" +} +.fa-cogs:before,.fa-gears:before{ + content:"" +} +.fa-comments:before{ + content:"" +} +.fa-thumbs-o-up:before{ + content:"" +} +.fa-thumbs-o-down:before{ + content:"" +} +.fa-star-half:before{ + content:"" +} +.fa-heart-o:before{ + content:"" +} +.fa-sign-out:before{ + content:"" +} +.fa-linkedin-square:before{ + content:"" +} +.fa-thumb-tack:before{ + content:"" +} +.fa-external-link:before{ + content:"" +} +.fa-sign-in:before{ + content:"" +} +.fa-trophy:before{ + content:"" +} +.fa-github-square:before{ + content:"" +} +.fa-upload:before{ + content:"" +} +.fa-lemon-o:before{ + content:"" +} +.fa-phone:before{ + content:"" +} +.fa-square-o:before{ + content:"" +} +.fa-bookmark-o:before{ + content:"" +} +.fa-phone-square:before{ + content:"" +} +.fa-twitter:before{ + content:"" +} +.fa-facebook-f:before,.fa-facebook:before{ + content:"" +} +.fa-github:before,.icon-github:before{ + content:"" +} +.fa-unlock:before{ + content:"" +} +.fa-credit-card:before{ + content:"" +} +.fa-feed:before,.fa-rss:before{ + content:"" +} +.fa-hdd-o:before{ + content:"" +} +.fa-bullhorn:before{ + content:"" +} +.fa-bell:before{ + content:"" +} +.fa-certificate:before{ + content:"" +} +.fa-hand-o-right:before{ + content:"" +} +.fa-hand-o-left:before{ + content:"" +} +.fa-hand-o-up:before{ + content:"" +} +.fa-hand-o-down:before{ + content:"" +} +.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{ + content:"" +} +.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{ + content:"" +} +.fa-arrow-circle-up:before{ + content:"" +} +.fa-arrow-circle-down:before{ + content:"" +} +.fa-globe:before{ + content:"" +} +.fa-wrench:before{ + content:"" +} +.fa-tasks:before{ + content:"" +} +.fa-filter:before{ + content:"" +} +.fa-briefcase:before{ + content:"" +} +.fa-arrows-alt:before{ + content:"" +} +.fa-group:before,.fa-users:before{ + content:"" +} +.fa-chain:before,.fa-link:before,.icon-link:before{ + content:"" +} +.fa-cloud:before{ + content:"" +} +.fa-flask:before{ + content:"" +} +.fa-cut:before,.fa-scissors:before{ + content:"" +} +.fa-copy:before,.fa-files-o:before{ + content:"" +} +.fa-paperclip:before{ + content:"" +} +.fa-floppy-o:before,.fa-save:before{ + content:"" +} +.fa-square:before{ + content:"" +} +.fa-bars:before,.fa-navicon:before,.fa-reorder:before{ + content:"" +} +.fa-list-ul:before{ + content:"" +} +.fa-list-ol:before{ + content:"" +} +.fa-strikethrough:before{ + content:"" +} +.fa-underline:before{ + content:"" +} +.fa-table:before{ + content:"" +} +.fa-magic:before{ + content:"" +} +.fa-truck:before{ + content:"" +} +.fa-pinterest:before{ + content:"" +} +.fa-pinterest-square:before{ + content:"" +} +.fa-google-plus-square:before{ + content:"" +} +.fa-google-plus:before{ + content:"" +} +.fa-money:before{ + content:"" +} +.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{ + content:"" +} +.fa-caret-up:before{ + content:"" +} +.fa-caret-left:before{ + content:"" +} +.fa-caret-right:before{ + content:"" +} +.fa-columns:before{ + content:"" +} +.fa-sort:before,.fa-unsorted:before{ + content:"" +} +.fa-sort-desc:before,.fa-sort-down:before{ + content:"" +} +.fa-sort-asc:before,.fa-sort-up:before{ + content:"" +} +.fa-envelope:before{ + content:"" +} +.fa-linkedin:before{ + content:"" +} +.fa-rotate-left:before,.fa-undo:before{ + content:"" +} +.fa-gavel:before,.fa-legal:before{ + content:"" +} +.fa-dashboard:before,.fa-tachometer:before{ + content:"" +} +.fa-comment-o:before{ + content:"" +} +.fa-comments-o:before{ + content:"" +} +.fa-bolt:before,.fa-flash:before{ + content:"" +} +.fa-sitemap:before{ + content:"" +} +.fa-umbrella:before{ + content:"" +} +.fa-clipboard:before,.fa-paste:before{ + content:"" +} +.fa-lightbulb-o:before{ + content:"" +} +.fa-exchange:before{ + content:"" +} +.fa-cloud-download:before{ + content:"" +} +.fa-cloud-upload:before{ + content:"" +} +.fa-user-md:before{ + content:"" +} +.fa-stethoscope:before{ + content:"" +} +.fa-suitcase:before{ + content:"" +} +.fa-bell-o:before{ + content:"" +} +.fa-coffee:before{ + content:"" +} +.fa-cutlery:before{ + content:"" +} +.fa-file-text-o:before{ + content:"" +} +.fa-building-o:before{ + content:"" +} +.fa-hospital-o:before{ + content:"" +} +.fa-ambulance:before{ + content:"" +} +.fa-medkit:before{ + content:"" +} +.fa-fighter-jet:before{ + content:"" +} +.fa-beer:before{ + content:"" +} +.fa-h-square:before{ + content:"" +} +.fa-plus-square:before{ + content:"" +} +.fa-angle-double-left:before{ + content:"" +} +.fa-angle-double-right:before{ + content:"" +} +.fa-angle-double-up:before{ + content:"" +} +.fa-angle-double-down:before{ + content:"" +} +.fa-angle-left:before{ + content:"" +} +.fa-angle-right:before{ + content:"" +} +.fa-angle-up:before{ + content:"" +} +.fa-angle-down:before{ + content:"" +} +.fa-desktop:before{ + content:"" +} +.fa-laptop:before{ + content:"" +} +.fa-tablet:before{ + content:"" +} +.fa-mobile-phone:before,.fa-mobile:before{ + content:"" +} +.fa-circle-o:before{ + content:"" +} +.fa-quote-left:before{ + content:"" +} +.fa-quote-right:before{ + content:"" +} +.fa-spinner:before{ + content:"" +} +.fa-circle:before{ + content:"" +} +.fa-mail-reply:before,.fa-reply:before{ + content:"" +} +.fa-github-alt:before{ + content:"" +} +.fa-folder-o:before{ + content:"" +} +.fa-folder-open-o:before{ + content:"" +} +.fa-smile-o:before{ + content:"" +} +.fa-frown-o:before{ + content:"" +} +.fa-meh-o:before{ + content:"" +} +.fa-gamepad:before{ + content:"" +} +.fa-keyboard-o:before{ + content:"" +} +.fa-flag-o:before{ + content:"" +} +.fa-flag-checkered:before{ + content:"" +} +.fa-terminal:before{ + content:"" +} +.fa-code:before{ + content:"" +} +.fa-mail-reply-all:before,.fa-reply-all:before{ + content:"" +} +.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{ + content:"" +} +.fa-location-arrow:before{ + content:"" +} +.fa-crop:before{ + content:"" +} +.fa-code-fork:before{ + content:"" +} +.fa-chain-broken:before,.fa-unlink:before{ + content:"" +} +.fa-question:before{ + content:"" +} +.fa-info:before{ + content:"" +} +.fa-exclamation:before{ + content:"" +} +.fa-superscript:before{ + content:"" +} +.fa-subscript:before{ + content:"" +} +.fa-eraser:before{ + content:"" +} +.fa-puzzle-piece:before{ + content:"" +} +.fa-microphone:before{ + content:"" +} +.fa-microphone-slash:before{ + content:"" +} +.fa-shield:before{ + content:"" +} +.fa-calendar-o:before{ + content:"" +} +.fa-fire-extinguisher:before{ + content:"" +} +.fa-rocket:before{ + content:"" +} +.fa-maxcdn:before{ + content:"" +} +.fa-chevron-circle-left:before{ + content:"" +} +.fa-chevron-circle-right:before{ + content:"" +} +.fa-chevron-circle-up:before{ + content:"" +} +.fa-chevron-circle-down:before{ + content:"" +} +.fa-html5:before{ + content:"" +} +.fa-css3:before{ + content:"" +} +.fa-anchor:before{ + content:"" +} +.fa-unlock-alt:before{ + content:"" +} +.fa-bullseye:before{ + content:"" +} +.fa-ellipsis-h:before{ + content:"" +} +.fa-ellipsis-v:before{ + content:"" +} +.fa-rss-square:before{ + content:"" +} +.fa-play-circle:before{ + content:"" +} +.fa-ticket:before{ + content:"" +} +.fa-minus-square:before{ + content:"" +} +.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{ + content:"" +} +.fa-level-up:before{ + content:"" +} +.fa-level-down:before{ + content:"" +} +.fa-check-square:before{ + content:"" +} +.fa-pencil-square:before{ + content:"" +} +.fa-external-link-square:before{ + content:"" +} +.fa-share-square:before{ + content:"" +} +.fa-compass:before{ + content:"" +} +.fa-caret-square-o-down:before,.fa-toggle-down:before{ + content:"" +} +.fa-caret-square-o-up:before,.fa-toggle-up:before{ + content:"" +} +.fa-caret-square-o-right:before,.fa-toggle-right:before{ + content:"" +} +.fa-eur:before,.fa-euro:before{ + content:"" +} +.fa-gbp:before{ + content:"" +} +.fa-dollar:before,.fa-usd:before{ + content:"" +} +.fa-inr:before,.fa-rupee:before{ + content:"" +} +.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{ + content:"" +} +.fa-rouble:before,.fa-rub:before,.fa-ruble:before{ + content:"" +} +.fa-krw:before,.fa-won:before{ + content:"" +} +.fa-bitcoin:before,.fa-btc:before{ + content:"" +} +.fa-file:before{ + content:"" +} +.fa-file-text:before{ + content:"" +} +.fa-sort-alpha-asc:before{ + content:"" +} +.fa-sort-alpha-desc:before{ + content:"" +} +.fa-sort-amount-asc:before{ + content:"" +} +.fa-sort-amount-desc:before{ + content:"" +} +.fa-sort-numeric-asc:before{ + content:"" +} +.fa-sort-numeric-desc:before{ + content:"" +} +.fa-thumbs-up:before{ + content:"" +} +.fa-thumbs-down:before{ + content:"" +} +.fa-youtube-square:before{ + content:"" +} +.fa-youtube:before{ + content:"" +} +.fa-xing:before{ + content:"" +} +.fa-xing-square:before{ + content:"" +} +.fa-youtube-play:before{ + content:"" +} +.fa-dropbox:before{ + content:"" +} +.fa-stack-overflow:before{ + content:"" +} +.fa-instagram:before{ + content:"" +} +.fa-flickr:before{ + content:"" +} +.fa-adn:before{ + content:"" +} +.fa-bitbucket:before,.icon-bitbucket:before{ + content:"" +} +.fa-bitbucket-square:before{ + content:"" +} +.fa-tumblr:before{ + content:"" +} +.fa-tumblr-square:before{ + content:"" +} +.fa-long-arrow-down:before{ + content:"" +} +.fa-long-arrow-up:before{ + content:"" +} +.fa-long-arrow-left:before{ + content:"" +} +.fa-long-arrow-right:before{ + content:"" +} +.fa-apple:before{ + content:"" +} +.fa-windows:before{ + content:"" +} +.fa-android:before{ + content:"" +} +.fa-linux:before{ + content:"" +} +.fa-dribbble:before{ + content:"" +} +.fa-skype:before{ + content:"" +} +.fa-foursquare:before{ + content:"" +} +.fa-trello:before{ + content:"" +} +.fa-female:before{ + content:"" +} +.fa-male:before{ + content:"" +} +.fa-gittip:before,.fa-gratipay:before{ + content:"" +} +.fa-sun-o:before{ + content:"" +} +.fa-moon-o:before{ + content:"" +} +.fa-archive:before{ + content:"" +} +.fa-bug:before{ + content:"" +} +.fa-vk:before{ + content:"" +} +.fa-weibo:before{ + content:"" +} +.fa-renren:before{ + content:"" +} +.fa-pagelines:before{ + content:"" +} +.fa-stack-exchange:before{ + content:"" +} +.fa-arrow-circle-o-right:before{ + content:"" +} +.fa-arrow-circle-o-left:before{ + content:"" +} +.fa-caret-square-o-left:before,.fa-toggle-left:before{ + content:"" +} +.fa-dot-circle-o:before{ + content:"" +} +.fa-wheelchair:before{ + content:"" +} +.fa-vimeo-square:before{ + content:"" +} +.fa-try:before,.fa-turkish-lira:before{ + content:"" +} +.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{ + content:"" +} +.fa-space-shuttle:before{ + content:"" +} +.fa-slack:before{ + content:"" +} +.fa-envelope-square:before{ + content:"" +} +.fa-wordpress:before{ + content:"" +} +.fa-openid:before{ + content:"" +} +.fa-bank:before,.fa-institution:before,.fa-university:before{ + content:"" +} +.fa-graduation-cap:before,.fa-mortar-board:before{ + content:"" +} +.fa-yahoo:before{ + content:"" +} +.fa-google:before{ + content:"" +} +.fa-reddit:before{ + content:"" +} +.fa-reddit-square:before{ + content:"" +} +.fa-stumbleupon-circle:before{ + content:"" +} +.fa-stumbleupon:before{ + content:"" +} +.fa-delicious:before{ + content:"" +} +.fa-digg:before{ + content:"" +} +.fa-pied-piper-pp:before{ + content:"" +} +.fa-pied-piper-alt:before{ + content:"" +} +.fa-drupal:before{ + content:"" +} +.fa-joomla:before{ + content:"" +} +.fa-language:before{ + content:"" +} +.fa-fax:before{ + content:"" +} +.fa-building:before{ + content:"" +} +.fa-child:before{ + content:"" +} +.fa-paw:before{ + content:"" +} +.fa-spoon:before{ + content:"" +} +.fa-cube:before{ + content:"" +} +.fa-cubes:before{ + content:"" +} +.fa-behance:before{ + content:"" +} +.fa-behance-square:before{ + content:"" +} +.fa-steam:before{ + content:"" +} +.fa-steam-square:before{ + content:"" +} +.fa-recycle:before{ + content:"" +} +.fa-automobile:before,.fa-car:before{ + content:"" +} +.fa-cab:before,.fa-taxi:before{ + content:"" +} +.fa-tree:before{ + content:"" +} +.fa-spotify:before{ + content:"" +} +.fa-deviantart:before{ + content:"" +} +.fa-soundcloud:before{ + content:"" +} +.fa-database:before{ + content:"" +} +.fa-file-pdf-o:before{ + content:"" +} +.fa-file-word-o:before{ + content:"" +} +.fa-file-excel-o:before{ + content:"" +} +.fa-file-powerpoint-o:before{ + content:"" +} +.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{ + content:"" +} +.fa-file-archive-o:before,.fa-file-zip-o:before{ + content:"" +} +.fa-file-audio-o:before,.fa-file-sound-o:before{ + content:"" +} +.fa-file-movie-o:before,.fa-file-video-o:before{ + content:"" +} +.fa-file-code-o:before{ + content:"" +} +.fa-vine:before{ + content:"" +} +.fa-codepen:before{ + content:"" +} +.fa-jsfiddle:before{ + content:"" +} +.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{ + content:"" +} +.fa-circle-o-notch:before{ + content:"" +} +.fa-ra:before,.fa-rebel:before,.fa-resistance:before{ + content:"" +} +.fa-empire:before,.fa-ge:before{ + content:"" +} +.fa-git-square:before{ + content:"" +} +.fa-git:before{ + content:"" +} +.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{ + content:"" +} +.fa-tencent-weibo:before{ + content:"" +} +.fa-qq:before{ + content:"" +} +.fa-wechat:before,.fa-weixin:before{ + content:"" +} +.fa-paper-plane:before,.fa-send:before{ + content:"" +} +.fa-paper-plane-o:before,.fa-send-o:before{ + content:"" +} +.fa-history:before{ + content:"" +} +.fa-circle-thin:before{ + content:"" +} +.fa-header:before{ + content:"" +} +.fa-paragraph:before{ + content:"" +} +.fa-sliders:before{ + content:"" +} +.fa-share-alt:before{ + content:"" +} +.fa-share-alt-square:before{ + content:"" +} +.fa-bomb:before{ + content:"" +} +.fa-futbol-o:before,.fa-soccer-ball-o:before{ + content:"" +} +.fa-tty:before{ + content:"" +} +.fa-binoculars:before{ + content:"" +} +.fa-plug:before{ + content:"" +} +.fa-slideshare:before{ + content:"" +} +.fa-twitch:before{ + content:"" +} +.fa-yelp:before{ + content:"" +} +.fa-newspaper-o:before{ + content:"" +} +.fa-wifi:before{ + content:"" +} +.fa-calculator:before{ + content:"" +} +.fa-paypal:before{ + content:"" +} +.fa-google-wallet:before{ + content:"" +} +.fa-cc-visa:before{ + content:"" +} +.fa-cc-mastercard:before{ + content:"" +} +.fa-cc-discover:before{ + content:"" +} +.fa-cc-amex:before{ + content:"" +} +.fa-cc-paypal:before{ + content:"" +} +.fa-cc-stripe:before{ + content:"" +} +.fa-bell-slash:before{ + content:"" +} +.fa-bell-slash-o:before{ + content:"" +} +.fa-trash:before{ + content:"" +} +.fa-copyright:before{ + content:"" +} +.fa-at:before{ + content:"" +} +.fa-eyedropper:before{ + content:"" +} +.fa-paint-brush:before{ + content:"" +} +.fa-birthday-cake:before{ + content:"" +} +.fa-area-chart:before{ + content:"" +} +.fa-pie-chart:before{ + content:"" +} +.fa-line-chart:before{ + content:"" +} +.fa-lastfm:before{ + content:"" +} +.fa-lastfm-square:before{ + content:"" +} +.fa-toggle-off:before{ + content:"" +} +.fa-toggle-on:before{ + content:"" +} +.fa-bicycle:before{ + content:"" +} +.fa-bus:before{ + content:"" +} +.fa-ioxhost:before{ + content:"" +} +.fa-angellist:before{ + content:"" +} +.fa-cc:before{ + content:"" +} +.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{ + content:"" +} +.fa-meanpath:before{ + content:"" +} +.fa-buysellads:before{ + content:"" +} +.fa-connectdevelop:before{ + content:"" +} +.fa-dashcube:before{ + content:"" +} +.fa-forumbee:before{ + content:"" +} +.fa-leanpub:before{ + content:"" +} +.fa-sellsy:before{ + content:"" +} +.fa-shirtsinbulk:before{ + content:"" +} +.fa-simplybuilt:before{ + content:"" +} +.fa-skyatlas:before{ + content:"" +} +.fa-cart-plus:before{ + content:"" +} +.fa-cart-arrow-down:before{ + content:"" +} +.fa-diamond:before{ + content:"" +} +.fa-ship:before{ + content:"" +} +.fa-user-secret:before{ + content:"" +} +.fa-motorcycle:before{ + content:"" +} +.fa-street-view:before{ + content:"" +} +.fa-heartbeat:before{ + content:"" +} +.fa-venus:before{ + content:"" +} +.fa-mars:before{ + content:"" +} +.fa-mercury:before{ + content:"" +} +.fa-intersex:before,.fa-transgender:before{ + content:"" +} +.fa-transgender-alt:before{ + content:"" +} +.fa-venus-double:before{ + content:"" +} +.fa-mars-double:before{ + content:"" +} +.fa-venus-mars:before{ + content:"" +} +.fa-mars-stroke:before{ + content:"" +} +.fa-mars-stroke-v:before{ + content:"" +} +.fa-mars-stroke-h:before{ + content:"" +} +.fa-neuter:before{ + content:"" +} +.fa-genderless:before{ + content:"" +} +.fa-facebook-official:before{ + content:"" +} +.fa-pinterest-p:before{ + content:"" +} +.fa-whatsapp:before{ + content:"" +} +.fa-server:before{ + content:"" +} +.fa-user-plus:before{ + content:"" +} +.fa-user-times:before{ + content:"" +} +.fa-bed:before,.fa-hotel:before{ + content:"" +} +.fa-viacoin:before{ + content:"" +} +.fa-train:before{ + content:"" +} +.fa-subway:before{ + content:"" +} +.fa-medium:before{ + content:"" +} +.fa-y-combinator:before,.fa-yc:before{ + content:"" +} +.fa-optin-monster:before{ + content:"" +} +.fa-opencart:before{ + content:"" +} +.fa-expeditedssl:before{ + content:"" +} +.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{ + content:"" +} +.fa-battery-3:before,.fa-battery-three-quarters:before{ + content:"" +} +.fa-battery-2:before,.fa-battery-half:before{ + content:"" +} +.fa-battery-1:before,.fa-battery-quarter:before{ + content:"" +} +.fa-battery-0:before,.fa-battery-empty:before{ + content:"" +} +.fa-mouse-pointer:before{ + content:"" +} +.fa-i-cursor:before{ + content:"" +} +.fa-object-group:before{ + content:"" +} +.fa-object-ungroup:before{ + content:"" +} +.fa-sticky-note:before{ + content:"" +} +.fa-sticky-note-o:before{ + content:"" +} +.fa-cc-jcb:before{ + content:"" +} +.fa-cc-diners-club:before{ + content:"" +} +.fa-clone:before{ + content:"" +} +.fa-balance-scale:before{ + content:"" +} +.fa-hourglass-o:before{ + content:"" +} +.fa-hourglass-1:before,.fa-hourglass-start:before{ + content:"" +} +.fa-hourglass-2:before,.fa-hourglass-half:before{ + content:"" +} +.fa-hourglass-3:before,.fa-hourglass-end:before{ + content:"" +} +.fa-hourglass:before{ + content:"" +} +.fa-hand-grab-o:before,.fa-hand-rock-o:before{ + content:"" +} +.fa-hand-paper-o:before,.fa-hand-stop-o:before{ + content:"" +} +.fa-hand-scissors-o:before{ + content:"" +} +.fa-hand-lizard-o:before{ + content:"" +} +.fa-hand-spock-o:before{ + content:"" +} +.fa-hand-pointer-o:before{ + content:"" +} +.fa-hand-peace-o:before{ + content:"" +} +.fa-trademark:before{ + content:"" +} +.fa-registered:before{ + content:"" +} +.fa-creative-commons:before{ + content:"" +} +.fa-gg:before{ + content:"" +} +.fa-gg-circle:before{ + content:"" +} +.fa-tripadvisor:before{ + content:"" +} +.fa-odnoklassniki:before{ + content:"" +} +.fa-odnoklassniki-square:before{ + content:"" +} +.fa-get-pocket:before{ + content:"" +} +.fa-wikipedia-w:before{ + content:"" +} +.fa-safari:before{ + content:"" +} +.fa-chrome:before{ + content:"" +} +.fa-firefox:before{ + content:"" +} +.fa-opera:before{ + content:"" +} +.fa-internet-explorer:before{ + content:"" +} +.fa-television:before,.fa-tv:before{ + content:"" +} +.fa-contao:before{ + content:"" +} +.fa-500px:before{ + content:"" +} +.fa-amazon:before{ + content:"" +} +.fa-calendar-plus-o:before{ + content:"" +} +.fa-calendar-minus-o:before{ + content:"" +} +.fa-calendar-times-o:before{ + content:"" +} +.fa-calendar-check-o:before{ + content:"" +} +.fa-industry:before{ + content:"" +} +.fa-map-pin:before{ + content:"" +} +.fa-map-signs:before{ + content:"" +} +.fa-map-o:before{ + content:"" +} +.fa-map:before{ + content:"" +} +.fa-commenting:before{ + content:"" +} +.fa-commenting-o:before{ + content:"" +} +.fa-houzz:before{ + content:"" +} +.fa-vimeo:before{ + content:"" +} +.fa-black-tie:before{ + content:"" +} +.fa-fonticons:before{ + content:"" +} +.fa-reddit-alien:before{ + content:"" +} +.fa-edge:before{ + content:"" +} +.fa-credit-card-alt:before{ + content:"" +} +.fa-codiepie:before{ + content:"" +} +.fa-modx:before{ + content:"" +} +.fa-fort-awesome:before{ + content:"" +} +.fa-usb:before{ + content:"" +} +.fa-product-hunt:before{ + content:"" +} +.fa-mixcloud:before{ + content:"" +} +.fa-scribd:before{ + content:"" +} +.fa-pause-circle:before{ + content:"" +} +.fa-pause-circle-o:before{ + content:"" +} +.fa-stop-circle:before{ + content:"" +} +.fa-stop-circle-o:before{ + content:"" +} +.fa-shopping-bag:before{ + content:"" +} +.fa-shopping-basket:before{ + content:"" +} +.fa-hashtag:before{ + content:"" +} +.fa-bluetooth:before{ + content:"" +} +.fa-bluetooth-b:before{ + content:"" +} +.fa-percent:before{ + content:"" +} +.fa-gitlab:before,.icon-gitlab:before{ + content:"" +} +.fa-wpbeginner:before{ + content:"" +} +.fa-wpforms:before{ + content:"" +} +.fa-envira:before{ + content:"" +} +.fa-universal-access:before{ + content:"" +} +.fa-wheelchair-alt:before{ + content:"" +} +.fa-question-circle-o:before{ + content:"" +} +.fa-blind:before{ + content:"" +} +.fa-audio-description:before{ + content:"" +} +.fa-volume-control-phone:before{ + content:"" +} +.fa-braille:before{ + content:"" +} +.fa-assistive-listening-systems:before{ + content:"" +} +.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{ + content:"" +} +.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{ + content:"" +} +.fa-glide:before{ + content:"" +} +.fa-glide-g:before{ + content:"" +} +.fa-sign-language:before,.fa-signing:before{ + content:"" +} +.fa-low-vision:before{ + content:"" +} +.fa-viadeo:before{ + content:"" +} +.fa-viadeo-square:before{ + content:"" +} +.fa-snapchat:before{ + content:"" +} +.fa-snapchat-ghost:before{ + content:"" +} +.fa-snapchat-square:before{ + content:"" +} +.fa-pied-piper:before{ + content:"" +} +.fa-first-order:before{ + content:"" +} +.fa-yoast:before{ + content:"" +} +.fa-themeisle:before{ + content:"" +} +.fa-google-plus-circle:before,.fa-google-plus-official:before{ + content:"" +} +.fa-fa:before,.fa-font-awesome:before{ + content:"" +} +.fa-handshake-o:before{ + content:"" +} +.fa-envelope-open:before{ + content:"" +} +.fa-envelope-open-o:before{ + content:"" +} +.fa-linode:before{ + content:"" +} +.fa-address-book:before{ + content:"" +} +.fa-address-book-o:before{ + content:"" +} +.fa-address-card:before,.fa-vcard:before{ + content:"" +} +.fa-address-card-o:before,.fa-vcard-o:before{ + content:"" +} +.fa-user-circle:before{ + content:"" +} +.fa-user-circle-o:before{ + content:"" +} +.fa-user-o:before{ + content:"" +} +.fa-id-badge:before{ + content:"" +} +.fa-drivers-license:before,.fa-id-card:before{ + content:"" +} +.fa-drivers-license-o:before,.fa-id-card-o:before{ + content:"" +} +.fa-quora:before{ + content:"" +} +.fa-free-code-camp:before{ + content:"" +} +.fa-telegram:before{ + content:"" +} +.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{ + content:"" +} +.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{ + content:"" +} +.fa-thermometer-2:before,.fa-thermometer-half:before{ + content:"" +} +.fa-thermometer-1:before,.fa-thermometer-quarter:before{ + content:"" +} +.fa-thermometer-0:before,.fa-thermometer-empty:before{ + content:"" +} +.fa-shower:before{ + content:"" +} +.fa-bath:before,.fa-bathtub:before,.fa-s15:before{ + content:"" +} +.fa-podcast:before{ + content:"" +} +.fa-window-maximize:before{ + content:"" +} +.fa-window-minimize:before{ + content:"" +} +.fa-window-restore:before{ + content:"" +} +.fa-times-rectangle:before,.fa-window-close:before{ + content:"" +} +.fa-times-rectangle-o:before,.fa-window-close-o:before{ + content:"" +} +.fa-bandcamp:before{ + content:"" +} +.fa-grav:before{ + content:"" +} +.fa-etsy:before{ + content:"" +} +.fa-imdb:before{ + content:"" +} +.fa-ravelry:before{ + content:"" +} +.fa-eercast:before{ + content:"" +} +.fa-microchip:before{ + content:"" +} +.fa-snowflake-o:before{ + content:"" +} +.fa-superpowers:before{ + content:"" +} +.fa-wpexplorer:before{ + content:"" +} +.fa-meetup:before{ + content:"" +} +.sr-only{ + position:absolute; + width:1px; + height:1px; + padding:0; + margin:-1px; + overflow:hidden; + clip:rect(0,0,0,0); + border:0 +} +.sr-only-focusable:active,.sr-only-focusable:focus{ + position:static; + width:auto; + height:auto; + margin:0; + overflow:visible; + clip:auto +} +.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{ + font-family:inherit +} +.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{ + font-family:FontAwesome; + display:inline-block; + font-style:normal; + font-weight:400; + line-height:1; + text-decoration:inherit +} +.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{ + display:inline-block; + text-decoration:inherit +} +.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{ + display:inline +} +.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{ + line-height:.9em +} +.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{ + display:inline-block +} +.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{ + opacity:.5; + -webkit-transition:opacity .05s ease-in; + -moz-transition:opacity .05s ease-in; + transition:opacity .05s ease-in +} +.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{ + opacity:1 +} +.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{ + font-size:14px; + vertical-align:-15% +} +.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{ + padding:12px; + line-height:24px; + margin-bottom:24px; + background:#e7f2fa +} +.rst-content .admonition-title,.wy-alert-title{ + font-weight:700; + display:block; + color:#fff; + background:#6ab0de; + padding:6px 12px; + margin:-12px -12px 12px +} +.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{ + background:#fdf3f2 +} +.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{ + background:#f29f97 +} +.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{ + background:#ffedcc +} +.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{ + background:#f0b37e +} +.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{ + background:#e7f2fa +} +.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{ + background:#6ab0de +} +.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{ + background:#dbfaf4 +} +.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{ + background:#1abc9c +} +.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{ + background:#f3f6f6 +} +.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{ + color:#404040; + background:#e1e4e5 +} +.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{ + color:#2980b9 +} +.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{ + margin-bottom:0 +} +.wy-tray-container{ + position:fixed; + bottom:0; + left:0; + z-index:600 +} +.wy-tray-container li{ + display:block; + width:300px; + background:transparent; + color:#fff; + text-align:center; + box-shadow:0 5px 5px 0 rgba(0,0,0,.1); + padding:0 24px; + min-width:20%; + opacity:0; + height:0; + line-height:56px; + overflow:hidden; + -webkit-transition:all .3s ease-in; + -moz-transition:all .3s ease-in; + transition:all .3s ease-in +} +.wy-tray-container li.wy-tray-item-success{ + background:#27ae60 +} +.wy-tray-container li.wy-tray-item-info{ + background:#2980b9 +} +.wy-tray-container li.wy-tray-item-warning{ + background:#e67e22 +} +.wy-tray-container li.wy-tray-item-danger{ + background:#e74c3c +} +.wy-tray-container li.on{ + opacity:1; + height:56px +} +@media screen and (max-width:768px){ + .wy-tray-container{ + bottom:auto; + top:0; + width:100% + } + .wy-tray-container li{ + width:100% + } +} +button{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle; + cursor:pointer; + line-height:normal; + -webkit-appearance:button; + *overflow:visible +} +button::-moz-focus-inner,input::-moz-focus-inner{ + border:0; + padding:0 +} +button[disabled]{ + cursor:default +} +.btn{ + display:inline-block; + border-radius:2px; + line-height:normal; + white-space:nowrap; + text-align:center; + cursor:pointer; + font-size:100%; + padding:6px 12px 8px; + color:#fff; + border:1px solid rgba(0,0,0,.1); + background-color:#27ae60; + text-decoration:none; + font-weight:400; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1); + outline-none:false; + vertical-align:middle; + *display:inline; + zoom:1; + -webkit-user-drag:none; + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; + -webkit-transition:all .1s linear; + -moz-transition:all .1s linear; + transition:all .1s linear +} +.btn-hover{ + background:#2e8ece; + color:#fff +} +.btn:hover{ + background:#2cc36b; + color:#fff +} +.btn:focus{ + background:#2cc36b; + outline:0 +} +.btn:active{ + box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1); + padding:8px 12px 6px +} +.btn:visited{ + color:#fff +} +.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:.4; + cursor:not-allowed; + box-shadow:none +} +.btn::-moz-focus-inner{ + padding:0; + border:0 +} +.btn-small{ + font-size:80% +} +.btn-info{ + background-color:#2980b9!important +} +.btn-info:hover{ + background-color:#2e8ece!important +} +.btn-neutral{ + background-color:#f3f6f6!important; + color:#404040!important +} +.btn-neutral:hover{ + background-color:#e5ebeb!important; + color:#404040 +} +.btn-neutral:visited{ + color:#404040!important +} +.btn-success{ + background-color:#27ae60!important +} +.btn-success:hover{ + background-color:#295!important +} +.btn-danger{ + background-color:#e74c3c!important +} +.btn-danger:hover{ + background-color:#ea6153!important +} +.btn-warning{ + background-color:#e67e22!important +} +.btn-warning:hover{ + background-color:#e98b39!important +} +.btn-invert{ + background-color:#222 +} +.btn-invert:hover{ + background-color:#2f2f2f!important +} +.btn-link{ + background-color:transparent!important; + color:#2980b9; + box-shadow:none; + border-color:transparent!important +} +.btn-link:active,.btn-link:hover{ + background-color:transparent!important; + color:#409ad5!important; + box-shadow:none +} +.btn-link:visited{ + color:#9b59b6 +} +.wy-btn-group .btn,.wy-control .btn{ + vertical-align:middle +} +.wy-btn-group{ + margin-bottom:24px; + *zoom:1 +} +.wy-btn-group:after,.wy-btn-group:before{ + display:table; + content:"" +} +.wy-btn-group:after{ + clear:both +} +.wy-dropdown{ + position:relative; + display:inline-block +} +.wy-dropdown-active .wy-dropdown-menu{ + display:block +} +.wy-dropdown-menu{ + position:absolute; + left:0; + display:none; + float:left; + top:100%; + min-width:100%; + background:#fcfcfc; + z-index:100; + border:1px solid #cfd7dd; + box-shadow:0 2px 2px 0 rgba(0,0,0,.1); + padding:12px +} +.wy-dropdown-menu>dd>a{ + display:block; + clear:both; + color:#404040; + white-space:nowrap; + font-size:90%; + padding:0 12px; + cursor:pointer +} +.wy-dropdown-menu>dd>a:hover{ + background:#2980b9; + color:#fff +} +.wy-dropdown-menu>dd.divider{ + border-top:1px solid #cfd7dd; + margin:6px 0 +} +.wy-dropdown-menu>dd.search{ + padding-bottom:12px +} +.wy-dropdown-menu>dd.search input[type=search]{ + width:100% +} +.wy-dropdown-menu>dd.call-to-action{ + background:#e3e3e3; + text-transform:uppercase; + font-weight:500; + font-size:80% +} +.wy-dropdown-menu>dd.call-to-action:hover{ + background:#e3e3e3 +} +.wy-dropdown-menu>dd.call-to-action .btn{ + color:#fff +} +.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{ + bottom:100%; + top:auto; + left:auto; + right:0 +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{ + background:#fcfcfc; + margin-top:2px +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{ + padding:6px 12px +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{ + background:#2980b9; + color:#fff +} +.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{ + right:0; + left:auto; + text-align:right +} +.wy-dropdown-arrow:before{ + content:" "; + border-bottom:5px solid #f5f5f5; + border-left:5px solid transparent; + border-right:5px solid transparent; + position:absolute; + display:block; + top:-4px; + left:50%; + margin-left:-3px +} +.wy-dropdown-arrow.wy-dropdown-arrow-left:before{ + left:11px +} +.wy-form-stacked select{ + display:block +} +.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle +} +.wy-form-aligned .wy-control-group>label{ + display:inline-block; + vertical-align:middle; + width:10em; + margin:6px 12px 0 0; + float:left +} +.wy-form-aligned .wy-control{ + float:left +} +.wy-form-aligned .wy-control label{ + display:block +} +.wy-form-aligned .wy-control select{ + margin-top:6px +} +fieldset{ + margin:0 +} +fieldset,legend{ + border:0; + padding:0 +} +legend{ + width:100%; + white-space:normal; + margin-bottom:24px; + font-size:150%; + *margin-left:-7px +} +label,legend{ + display:block +} +label{ + margin:0 0 .3125em; + color:#333; + font-size:90% +} +input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle +} +.wy-control-group{ + margin-bottom:24px; + max-width:1200px; + margin-left:auto; + margin-right:auto; + *zoom:1 +} +.wy-control-group:after,.wy-control-group:before{ + display:table; + content:"" +} +.wy-control-group:after{ + clear:both +} +.wy-control-group.wy-control-group-required>label:after{ + content:" *"; + color:#e74c3c +} +.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{ + padding-bottom:12px +} +.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{ + width:100% +} +.wy-control-group .wy-form-full{ + float:left; + display:block; + width:100%; + margin-right:0 +} +.wy-control-group .wy-form-full:last-child{ + margin-right:0 +} +.wy-control-group .wy-form-halves{ + float:left; + display:block; + margin-right:2.35765%; + width:48.82117% +} +.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){ + margin-right:0 +} +.wy-control-group .wy-form-halves:nth-of-type(odd){ + clear:left +} +.wy-control-group .wy-form-thirds{ + float:left; + display:block; + margin-right:2.35765%; + width:31.76157% +} +.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){ + margin-right:0 +} +.wy-control-group .wy-form-thirds:nth-of-type(3n+1){ + clear:left +} +.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{ + margin:6px 0 0; + font-size:90% +} +.wy-control-no-input{ + display:inline-block +} +.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{ + width:100% +} +.wy-form-message-inline{ + padding-left:.3em; + color:#666; + font-size:90% +} +.wy-form-message{ + display:block; + color:#999; + font-size:70%; + margin-top:.3125em; + font-style:italic +} +.wy-form-message p{ + font-size:inherit; + font-style:italic; + margin-bottom:6px +} +.wy-form-message p:last-child{ + margin-bottom:0 +} +input{ + line-height:normal +} +input[type=button],input[type=reset],input[type=submit]{ + -webkit-appearance:button; + cursor:pointer; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + *overflow:visible +} +input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{ + -webkit-appearance:none; + padding:6px; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + box-shadow:inset 0 1px 3px #ddd; + border-radius:0; + -webkit-transition:border .3s linear; + -moz-transition:border .3s linear; + transition:border .3s linear +} +input[type=datetime-local]{ + padding:.34375em .625em +} +input[disabled]{ + cursor:default +} +input[type=checkbox],input[type=radio]{ + padding:0; + margin-right:.3125em; + *height:13px; + *width:13px +} +input[type=checkbox],input[type=radio],input[type=search]{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box +} +input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{ + -webkit-appearance:none +} +input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{ + outline:0; + outline:thin dotted\9; + border-color:#333 +} +input.no-focus:focus{ + border-color:#ccc!important +} +input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{ + outline:thin dotted #333; + outline:1px auto #129fea +} +input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{ + cursor:not-allowed; + background-color:#fafafa +} +input:focus:invalid,select:focus:invalid,textarea:focus:invalid{ + color:#e74c3c; + border:1px solid #e74c3c +} +input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{ + border-color:#e74c3c +} +input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{ + outline-color:#e74c3c +} +input.wy-input-large{ + padding:12px; + font-size:100% +} +textarea{ + overflow:auto; + vertical-align:top; + width:100%; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif +} +select,textarea{ + padding:.5em .625em; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + box-shadow:inset 0 1px 3px #ddd; + -webkit-transition:border .3s linear; + -moz-transition:border .3s linear; + transition:border .3s linear +} +select{ + border:1px solid #ccc; + background-color:#fff +} +select[multiple]{ + height:auto +} +select:focus,textarea:focus{ + outline:0 +} +input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{ + cursor:not-allowed; + background-color:#fafafa +} +input[type=checkbox][disabled],input[type=radio][disabled]{ + cursor:not-allowed +} +.wy-checkbox,.wy-radio{ + margin:6px 0; + color:#404040; + display:block +} +.wy-checkbox input,.wy-radio input{ + vertical-align:baseline +} +.wy-form-message-inline{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle +} +.wy-input-prefix,.wy-input-suffix{ + white-space:nowrap; + padding:6px +} +.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{ + line-height:27px; + padding:0 8px; + display:inline-block; + font-size:80%; + background-color:#f3f6f6; + border:1px solid #ccc; + color:#999 +} +.wy-input-suffix .wy-input-context{ + border-left:0 +} +.wy-input-prefix .wy-input-context{ + border-right:0 +} +.wy-switch{ + position:relative; + display:block; + height:24px; + margin-top:12px; + cursor:pointer +} +.wy-switch:before{ + left:0; + top:0; + width:36px; + height:12px; + background:#ccc +} +.wy-switch:after,.wy-switch:before{ + position:absolute; + content:""; + display:block; + border-radius:4px; + -webkit-transition:all .2s ease-in-out; + -moz-transition:all .2s ease-in-out; + transition:all .2s ease-in-out +} +.wy-switch:after{ + width:18px; + height:18px; + background:#999; + left:-3px; + top:-3px +} +.wy-switch span{ + position:absolute; + left:48px; + display:block; + font-size:12px; + color:#ccc; + line-height:1 +} +.wy-switch.active:before{ + background:#1e8449 +} +.wy-switch.active:after{ + left:24px; + background:#27ae60 +} +.wy-switch.disabled{ + cursor:not-allowed; + opacity:.8 +} +.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{ + color:#e74c3c +} +.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{ + border:1px solid #e74c3c +} +.wy-inline-validate{ + white-space:nowrap +} +.wy-inline-validate .wy-input-context{ + padding:.5em .625em; + display:inline-block; + font-size:80% +} +.wy-inline-validate.wy-inline-validate-success .wy-input-context{ + color:#27ae60 +} +.wy-inline-validate.wy-inline-validate-danger .wy-input-context{ + color:#e74c3c +} +.wy-inline-validate.wy-inline-validate-warning .wy-input-context{ + color:#e67e22 +} +.wy-inline-validate.wy-inline-validate-info .wy-input-context{ + color:#2980b9 +} +.rotate-90{ + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -ms-transform:rotate(90deg); + -o-transform:rotate(90deg); + transform:rotate(90deg) +} +.rotate-180{ + -webkit-transform:rotate(180deg); + -moz-transform:rotate(180deg); + -ms-transform:rotate(180deg); + -o-transform:rotate(180deg); + transform:rotate(180deg) +} +.rotate-270{ + -webkit-transform:rotate(270deg); + -moz-transform:rotate(270deg); + -ms-transform:rotate(270deg); + -o-transform:rotate(270deg); + transform:rotate(270deg) +} +.mirror{ + -webkit-transform:scaleX(-1); + -moz-transform:scaleX(-1); + -ms-transform:scaleX(-1); + -o-transform:scaleX(-1); + transform:scaleX(-1) +} +.mirror.rotate-90{ + -webkit-transform:scaleX(-1) rotate(90deg); + -moz-transform:scaleX(-1) rotate(90deg); + -ms-transform:scaleX(-1) rotate(90deg); + -o-transform:scaleX(-1) rotate(90deg); + transform:scaleX(-1) rotate(90deg) +} +.mirror.rotate-180{ + -webkit-transform:scaleX(-1) rotate(180deg); + -moz-transform:scaleX(-1) rotate(180deg); + -ms-transform:scaleX(-1) rotate(180deg); + -o-transform:scaleX(-1) rotate(180deg); + transform:scaleX(-1) rotate(180deg) +} +.mirror.rotate-270{ + -webkit-transform:scaleX(-1) rotate(270deg); + -moz-transform:scaleX(-1) rotate(270deg); + -ms-transform:scaleX(-1) rotate(270deg); + -o-transform:scaleX(-1) rotate(270deg); + transform:scaleX(-1) rotate(270deg) +} +@media only screen and (max-width:480px){ + .wy-form button[type=submit]{ + margin:.7em 0 0 + } + .wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{ + margin-bottom:.3em; + display:block + } + .wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{ + margin-bottom:0 + } + .wy-form-aligned .wy-control-group label{ + margin-bottom:.3em; + text-align:left; + display:block; + width:100% + } + .wy-form-aligned .wy-control{ + margin:1.5em 0 0 + } + .wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{ + display:block; + font-size:80%; + padding:6px 0 + } +} +@media screen and (max-width:768px){ + .tablet-hide{ + display:none + } +} +@media screen and (max-width:480px){ + .mobile-hide{ + display:none + } +} +.float-left{ + float:left +} +.float-right{ + float:right +} +.full-width{ + width:100% +} +.rst-content table.docutils,.rst-content table.field-list,.wy-table{ + border-collapse:collapse; + border-spacing:0; + empty-cells:show; + margin-bottom:24px +} +.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; + text-align:center +} +.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{ + font-size:90%; + margin:0; + overflow:visible; + padding:8px 16px +} +.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{ + border-left-width:0 +} +.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{ + color:#000; + text-align:left; + vertical-align:bottom; + white-space:nowrap +} +.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{ + font-weight:700; + border-bottom:2px solid #e1e4e5 +} +.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{ + background-color:transparent; + vertical-align:middle +} +.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{ + line-height:18px +} +.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{ + margin-bottom:0 +} +.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{ + width:1%; + padding-right:0 +} +.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{ + margin:0 +} +.wy-table-secondary{ + color:grey; + font-size:90% +} +.wy-table-tertiary{ + color:grey; + font-size:80% +} +.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{ + background-color:#f3f6f6 +} +.rst-content table.docutils,.wy-table-bordered-all{ + border:1px solid #e1e4e5 +} +.rst-content table.docutils td,.wy-table-bordered-all td{ + border-bottom:1px solid #e1e4e5; + border-left:1px solid #e1e4e5 +} +.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-bordered{ + border:1px solid #e1e4e5 +} +.wy-table-bordered-rows td{ + border-bottom:1px solid #e1e4e5 +} +.wy-table-bordered-rows tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-horizontal td,.wy-table-horizontal th{ + border-width:0 0 1px; + border-bottom:1px solid #e1e4e5 +} +.wy-table-horizontal tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-responsive{ + margin-bottom:24px; + max-width:100%; + overflow:auto +} +.wy-table-responsive table{ + margin-bottom:0!important +} +.wy-table-responsive table td,.wy-table-responsive table th{ + white-space:auto +} +a{ + color:#2980b9; + text-decoration:none; + cursor:pointer +} +a:hover{ + color:#3091d1 +} +a:visited{ + color:#9b59b6 +} +html{ + height:100% +} +body,html{ + overflow-x:hidden +} +body{ + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + font-weight:400; + color:#404040; + min-height:100%; + background:#edf0f2 +} +.wy-text-left{ + text-align:left +} +.wy-text-center{ + text-align:center +} +.wy-text-right{ + text-align:right +} +.wy-text-large{ + font-size:120% +} +.wy-text-normal{ + font-size:100% +} +.wy-text-small,small{ + font-size:80% +} +.wy-text-strike{ + text-decoration:line-through +} +.wy-text-warning{ + color:#e67e22!important +} +a.wy-text-warning:hover{ + color:#eb9950!important +} +.wy-text-info{ + color:#2980b9!important +} +a.wy-text-info:hover{ + color:#409ad5!important +} +.wy-text-success{ + color:#27ae60!important +} +a.wy-text-success:hover{ + color:#36d278!important +} +.wy-text-danger{ + color:#e74c3c!important +} +a.wy-text-danger:hover{ + color:#ed7669!important +} +.wy-text-neutral{ + color:#404040!important +} +a.wy-text-neutral:hover{ + color:#595959!important +} +.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{ + margin-top:0; + font-weight:700; + font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif +} +p{ + line-height:24px; + font-size:16px; + margin:0 0 24px; +} +h1{ + font-size:175% +} +.rst-content .toctree-wrapper>p.caption,h2{ + font-size:150% +} +h3{ + font-size:125% +} +h4{ + font-size:115% +} +h5{ + font-size:110% +} +h6{ + font-size:100% +} +hr{ + display:block; + height:1px; + border:0; + border-top:1px solid #e1e4e5; + margin:24px 0; + padding:0 +} +.rst-content code,.rst-content tt,code{ + white-space:nowrap; + max-width:100%; + background:#fff; + border:1px solid #e1e4e5; + font-size:75%; + padding:0 5px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + color:#e74c3c; + overflow-x:auto +} +.rst-content tt.code-large,code.code-large{ + font-size:90% +} +.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{ + list-style:disc; + line-height:24px; + margin-bottom:24px +} +.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{ + list-style:disc; + margin-left:24px +} +.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{ + margin-bottom:0 +} +.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{ + list-style:circle +} +.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{ + list-style:square +} +.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{ + list-style:decimal +} +.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{ + list-style:decimal; + line-height:24px; + margin-bottom:24px +} +.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{ + list-style:decimal; + margin-left:24px +} +.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{ + margin-bottom:0 +} +.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{ + list-style:disc +} +.wy-breadcrumbs{ + *zoom:1 +} +.wy-breadcrumbs:after,.wy-breadcrumbs:before{ + display:table; + content:"" +} +.wy-breadcrumbs:after{ + clear:both +} +.wy-breadcrumbs li{ + display:inline-block +} +.wy-breadcrumbs li.wy-breadcrumbs-aside{ + float:right +} +.wy-breadcrumbs li a{ + display:inline-block; + padding:5px +} +.wy-breadcrumbs li a:first-child{ + padding-left:0 +} +.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{ + padding:5px; + border:none; + background:none +} +.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{ + color:#404040 +} +.wy-breadcrumbs-extra{ + margin-bottom:0; + color:#b3b3b3; + font-size:80%; + display:inline-block +} +@media screen and (max-width:480px){ + .wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none + } +} +@media print{ + .wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none + } +} +html{ + font-size:16px +} +.wy-affix{ + position:fixed; + top:1.618em +} +.wy-menu a:hover{ + text-decoration:none +} +.wy-menu-horiz{ + *zoom:1 +} +.wy-menu-horiz:after,.wy-menu-horiz:before{ + display:table; + content:"" +} +.wy-menu-horiz:after{ + clear:both +} +.wy-menu-horiz li,.wy-menu-horiz ul{ + display:inline-block +} +.wy-menu-horiz li:hover{ + background:hsla(0,0%,100%,.1) +} +.wy-menu-horiz li.divide-left{ + border-left:1px solid #404040 +} +.wy-menu-horiz li.divide-right{ + border-right:1px solid #404040 +} +.wy-menu-horiz a{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 16px +} +.wy-menu-vertical{ + width:300px + margin-bottom: 20px; +} +.wy-menu-vertical header,.wy-menu-vertical p.caption{ + color:#007C97; + height:32px; + line-height:32px; + padding:0 1.618em; + margin:12px 0 0; + display:block; + font-weight:700; + text-transform:uppercase; + font-size:100%; + white-space:nowrap; +} +.wy-menu-vertical ul{ + margin-bottom:0 +} +.wy-menu-vertical li.divide-top{ + border-top:1px solid #404040 +} +.wy-menu-vertical li.divide-bottom{ + border-bottom:1px solid #404040 +} +.wy-menu-vertical li.current{ + background:#e3e3e3 +} +.wy-menu-vertical li.current a{ + color:grey; + border-right:1px solid #c9c9c9; + padding:.4045em 2.427em +} +.wy-menu-vertical li.current a:hover{ + background:#d6d6d6 +} +.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{ + border:none; + background:inherit; + color:inherit; + padding-left:0; + padding-right:0 +} +.wy-menu-vertical li button.toctree-expand{ + display:block; + float:left; + margin-left:-1.2em; + line-height:18px; + color:#4d4d4d; + border:none; + background:none; + padding:0 +} +.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{ + color:#404040; + font-weight:700; + position:relative; + background:#fcfcfc; + border:none; + padding:.4045em 1.618em +} +.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{ + background:#fcfcfc +} +.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{ + color:grey +} +.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{ + display:block; + line-height:18px; + color:#333 +} +.wy-menu-vertical li.toctree-l1.current>a{ + border-bottom:1px solid #c9c9c9; + border-top:1px solid #c9c9c9 +} +.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{ + display:none +} +.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{ + display:block +} +.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{ + font-size:.9em +} +.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{ + color:#404040 +} +.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{ + color:grey +} +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{ + display:block +} +.wy-menu-vertical li.toctree-l2.current>a{ + padding:.4045em 2.427em +} +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{ + padding:.4045em 1.618em .4045em 4.045em +} +.wy-menu-vertical li.toctree-l3.current>a{ + padding:.4045em 4.045em +} +.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{ + padding:.4045em 1.618em .4045em 5.663em +} +.wy-menu-vertical li.toctree-l4.current>a{ + padding:.4045em 5.663em +} +.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{ + padding:.4045em 1.618em .4045em 7.281em +} +.wy-menu-vertical li.toctree-l5.current>a{ + padding:.4045em 7.281em +} +.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{ + padding:.4045em 1.618em .4045em 8.899em +} +.wy-menu-vertical li.toctree-l6.current>a{ + padding:.4045em 8.899em +} +.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{ + padding:.4045em 1.618em .4045em 10.517em +} +.wy-menu-vertical li.toctree-l7.current>a{ + padding:.4045em 10.517em +} +.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{ + padding:.4045em 1.618em .4045em 12.135em +} +.wy-menu-vertical li.toctree-l8.current>a{ + padding:.4045em 12.135em +} +.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{ + padding:.4045em 1.618em .4045em 13.753em +} +.wy-menu-vertical li.toctree-l9.current>a{ + padding:.4045em 13.753em +} +.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{ + padding:.4045em 1.618em .4045em 15.371em +} +.wy-menu-vertical li.toctree-l10.current>a{ + padding:.4045em 15.371em +} +.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{ + padding:.4045em 1.618em .4045em 16.989em +} +.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{ + background:#c9c9c9 +} +.wy-menu-vertical li.toctree-l2 button.toctree-expand{ + color:#a3a3a3 +} +.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{ + background:#bdbdbd +} +.wy-menu-vertical li.toctree-l3 button.toctree-expand{ + color:#969696 +} +.wy-menu-vertical li.current ul{ + display:block +} +.wy-menu-vertical li ul{ + margin-bottom:0; + display:none +} +.wy-menu-vertical li ul li a{ + margin-bottom:0; + color:#d9d9d9; + font-weight:400 +} +.wy-menu-vertical a{ + line-height:18px; + padding:.4045em 1.618em; + display:block; + position:relative; + font-size:90%; + color:#d9d9d9 +} +.wy-menu-vertical a:hover{ + background-color:#4e4a4a; + cursor:pointer +} +.wy-menu-vertical a:hover button.toctree-expand{ + color:#d9d9d9 +} +.wy-menu-vertical a:active{ + background-color:#2980b9; + cursor:pointer; + color:#fff +} +.wy-menu-vertical a:active button.toctree-expand{ + color:#fff +} +.wy-side-nav-search{ + display:block; + width:300px; + padding:.809em; + margin-bottom:.809em; + z-index:200; + background-color:#171c2d; + text-align:center; + color:#fcfcfc +} +.wy-side-nav-search input[type=text]{ + width:100%; + border-radius:50px; + padding:6px 12px; + border-color:#2472a4 +} +.wy-side-nav-search img{ + display:block; + margin:auto auto .809em; + height:45px; + width:45px; + background-color:#171c2d; + padding:5px; + border-radius:100% +} +.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{ + color:#fcfcfc; + font-size:100%; + font-weight:700; + display:inline-block; + padding:4px 6px; + margin-bottom:.809em; + max-width:100% +} +.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{ + background:hsla(0,0%,100%,.1) +} +.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{ + display:block; + margin:0 auto; + height:auto; + width:auto; + border-radius:0; + max-width:100%; + background:transparent +} +.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{ + margin-top:.85em +} +.wy-side-nav-search>div.version{ + margin-top:-.4045em; + margin-bottom:.809em; + font-weight:400; + color:hsla(0,0%,100%,.3) +} +.wy-nav .wy-menu-vertical header{ + color:#2980b9 +} +.wy-nav .wy-menu-vertical a{ + color:#b3b3b3 +} +.wy-nav .wy-menu-vertical a:hover{ + background-color:#2980b9; + color:#fff +} +[data-menu-wrap]{ + -webkit-transition:all .2s ease-in; + -moz-transition:all .2s ease-in; + transition:all .2s ease-in; + position:absolute; + opacity:1; + width:100%; + opacity:0 +} +[data-menu-wrap].move-center{ + left:0; + right:auto; + opacity:1 +} +[data-menu-wrap].move-left{ + right:auto; + left:-100%; + opacity:0 +} +[data-menu-wrap].move-right{ + right:-100%; + left:auto; + opacity:0 +} +.wy-body-for-nav{ + background:#fcfcfc +} +.wy-grid-for-nav{ + position:absolute; + width:100%; + height:100% +} +.wy-nav-side{ + position:fixed; + top:0; + bottom:0; + left:0; + padding-bottom:2em; + width:300px; + overflow-x:hidden; + overflow-y:hidden; + min-height:100%; + color:#9b9b9b; + background:#171c2d; + z-index:200 +} +.wy-side-scroll{ + width:320px; + position:relative; + overflow-x:hidden; + overflow-y:scroll; + height:100%; +} +.wy-nav-top{ + display:none; + background:#E9102B; + color:#fff; + padding:.4045em .809em; + position:relative; + line-height:50px; + text-align:center; + font-size:100%; + *zoom:1 +} +.wy-nav-top:after,.wy-nav-top:before{ + display:table; + content:"" +} +.wy-nav-top:after{ + clear:both +} +.wy-nav-top a{ + color:#fff; + font-weight:700 +} +.wy-nav-top img{ + margin-right:12px; + height:45px; + width:45px; + background-color:#2980b9; + padding:5px; + border-radius:100% +} +.wy-nav-top i{ + font-size:30px; + float:left; + cursor:pointer; + padding-top:inherit +} +.wy-nav-content-wrap{ + margin-left:300px; + background:#fcfcfc; + min-height:100% +} +.wy-nav-content{ + padding:1.618em 3.236em; + height:100%; + margin:auto +} +.wy-body-mask{ + position:fixed; + width:100%; + height:100%; + background:rgba(0,0,0,.2); + display:none; + z-index:499 +} +.wy-body-mask.on{ + display:block +} +footer{ + color:grey +} +footer p{ + margin-bottom:12px +} +.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{ + padding:0; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + font-size:1em; + background:none; + border:none; + color:grey +} +.rst-footer-buttons{ + *zoom:1 +} +.rst-footer-buttons:after,.rst-footer-buttons:before{ + width:100%; + display:table; + content:"" +} +.rst-footer-buttons:after{ + clear:both +} +.rst-breadcrumbs-buttons{ + margin-top:12px; + *zoom:1 +} +.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{ + display:table; + content:"" +} +.rst-breadcrumbs-buttons:after{ + clear:both +} +#search-results .search li{ + margin-bottom:24px; + border-bottom:1px solid #e1e4e5; + padding-bottom:24px +} +#search-results .search li:first-child{ + border-top:1px solid #e1e4e5; + padding-top:24px +} +#search-results .search li a{ + font-size:120%; + margin-bottom:12px; + display:inline-block +} +#search-results .context{ + color:grey; + font-size:90% +} +.genindextable li>ul{ + margin-left:24px +} +@media screen and (max-width:768px){ + .wy-body-for-nav{ + background:#fcfcfc + } + .wy-nav-top{ + display:block + } + .wy-nav-side{ + left:-300px + } + .wy-nav-side.shift{ + width:85%; + left:0 + } + .wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{ + width:auto + } + .wy-nav-content-wrap{ + margin-left:0 + } + .wy-nav-content-wrap .wy-nav-content{ + padding:1.618em + } + .wy-nav-content-wrap.shift{ + position:fixed; + min-width:100%; + left:85%; + top:0; + height:100%; + overflow:hidden + } +} +@media screen and (min-width:1100px){ + .wy-nav-content-wrap{ + /* background:rgba(0,0,0,.05) */ + } + .wy-nav-content{ + margin:0; + background:#fcfcfc + } +} +@media print{ + .rst-versions,.wy-nav-side,footer{ + display:none + } + .wy-nav-content-wrap{ + margin-left:0 + } +} +.rst-versions{ + position:fixed; + bottom:0; + left:0; + width:300px; + color:#fcfcfc; + background:#1f1d1d; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + z-index:400 +} +.rst-versions a{ + color:#2980b9; + text-decoration:none +} +.rst-versions .rst-badge-small{ + display:none +} +.rst-versions .rst-current-version{ + padding:12px; + background-color:#272525; + display:block; + text-align:right; + font-size:90%; + cursor:pointer; + color:#27ae60; + *zoom:1 +} +.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{ + display:table; + content:"" +} +.rst-versions .rst-current-version:after{ + clear:both +} +.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{ + color:#fcfcfc +} +.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{ + float:left +} +.rst-versions .rst-current-version.rst-out-of-date{ + background-color:#e74c3c; + color:#fff +} +.rst-versions .rst-current-version.rst-active-old-version{ + background-color:#f1c40f; + color:#000 +} +.rst-versions.shift-up{ + height:auto; + max-height:100%; + overflow-y:scroll +} +.rst-versions.shift-up .rst-other-versions{ + display:block +} +.rst-versions .rst-other-versions{ + font-size:90%; + padding:12px; + color:grey; + display:none +} +.rst-versions .rst-other-versions hr{ + display:block; + height:1px; + border:0; + margin:20px 0; + padding:0; + border-top:1px solid #413d3d +} +.rst-versions .rst-other-versions dd{ + display:inline-block; + margin:0 +} +.rst-versions .rst-other-versions dd a{ + display:inline-block; + padding:6px; + color:#fcfcfc +} +.rst-versions.rst-badge{ + width:auto; + bottom:20px; + right:20px; + left:auto; + border:none; + max-width:300px; + max-height:90% +} +.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{ + float:none; + line-height:30px +} +.rst-versions.rst-badge.shift-up .rst-current-version{ + text-align:right +} +.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{ + float:left +} +.rst-versions.rst-badge>.rst-current-version{ + width:auto; + height:30px; + line-height:30px; + padding:0 6px; + display:block; + text-align:center +} +@media screen and (max-width:768px){ + .rst-versions{ + width:85%; + display:none + } + .rst-versions.shift{ + display:block + } +} +.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{ + margin-bottom:24px +} +.rst-content img{ + max-width:100%; + height:auto +} +.rst-content div.figure,.rst-content figure{ + margin-bottom:24px +} +.rst-content div.figure .caption-text,.rst-content figure .caption-text{ + font-style:italic +} +.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{ + margin-bottom:0 +} +.rst-content div.figure.align-center,.rst-content figure.align-center{ + text-align:center +} +.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{ + margin-bottom:24px +} +.rst-content abbr[title]{ + text-decoration:none +} +.rst-content.style-external-links a.reference.external:after{ + font-family:FontAwesome; + content:"\f08e"; + color:#b3b3b3; + vertical-align:super; + font-size:60%; + margin:0 .2em +} +.rst-content blockquote{ + margin-left:24px; + line-height:24px; + margin-bottom:24px +} +.rst-content pre.literal-block{ + white-space:pre; + margin:0; + padding:12px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + display:block; + overflow:auto +} +.rst-content div[class^=highlight],.rst-content pre.literal-block{ + border:1px solid #e1e4e5; + overflow-x:auto; + margin:1px 0 24px +} +.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{ + padding:0; + border:none; + margin:0 +} +.rst-content div[class^=highlight] td.code{ + width:100% +} +.rst-content .linenodiv pre{ + border-right:1px solid #e6e9ea; + margin:0; + padding:12px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + user-select:none; + pointer-events:none +} +.rst-content div[class^=highlight] pre{ + white-space:pre; + margin:0; + padding:12px; + display:block; + overflow:auto +} +.rst-content div[class^=highlight] pre .hll{ + display:block; + margin:0 -12px; + padding:0 12px +} +.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + font-size:12px; + line-height:1.4 +} +.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{ + user-select:none; + pointer-events:none +} +.rst-content div.highlight span.linenos{ + display:inline-block; + padding-left:0; + padding-right:12px; + margin-right:12px; + border-right:1px solid #e6e9ea +} +.rst-content .code-block-caption{ + font-style:italic; + font-size:85%; + line-height:1; + padding:1em 0; + text-align:center +} +@media print{ + .rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{ + white-space:pre-wrap + } +} +.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{ + clear:both +} +.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{ + margin-bottom:0 +} +.rst-content .admonition-title:before{ + margin-right:4px +} +.rst-content .admonition table{ + border-color:rgba(0,0,0,.1) +} +.rst-content .admonition table td,.rst-content .admonition table th{ + background:transparent!important; + border-color:rgba(0,0,0,.1)!important +} +.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{ + list-style:lower-alpha +} +.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{ + list-style:upper-alpha +} +.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{ + margin-top:12px; + margin-bottom:12px +} +.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{ + margin-top:0 +} +.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{ + margin-bottom:12px +} +.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{ + margin-bottom:0 +} +.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{ + margin-bottom:12px +} +.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{ + margin-top:0; + margin-bottom:0 +} +.rst-content .line-block{ + margin-left:0; + margin-bottom:24px; + line-height:24px +} +.rst-content .line-block .line-block{ + margin-left:24px; + margin-bottom:0 +} +.rst-content .topic-title{ + font-weight:700; + margin-bottom:12px +} +.rst-content .toc-backref{ + color:#404040 +} +.rst-content .align-right{ + float:right; + margin:0 0 24px 24px +} +.rst-content .align-left{ + float:left; + margin:0 24px 24px 0 +} +.rst-content .align-center{ + margin:auto +} +.rst-content .align-center:not(table){ + display:block +} +.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{ + opacity:0; + font-size:14px; + font-family:FontAwesome; + margin-left:.5em +} +.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{ + opacity:1 +} +.rst-content .btn:focus{ + outline:2px solid +} +.rst-content table>caption .headerlink:after{ + font-size:12px +} +.rst-content .centered{ + text-align:center +} +.rst-content .sidebar{ + float:right; + width:40%; + display:block; + margin:0 0 24px 24px; + padding:24px; + background:#f3f6f6; + border:1px solid #e1e4e5 +} +.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{ + font-size:90% +} +.rst-content .sidebar .last,.rst-content .sidebar>:last-child{ + margin-bottom:0 +} +.rst-content .sidebar .sidebar-title{ + display:block; + font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif; + font-weight:700; + background:#e1e4e5; + padding:6px 12px; + margin:-24px -24px 24px; + font-size:100% +} +.rst-content .highlighted{ + background:#f1c40f; + box-shadow:0 0 0 2px #f1c40f; + display:inline; + font-weight:700 +} +.rst-content .citation-reference,.rst-content .footnote-reference{ + vertical-align:baseline; + position:relative; + top:-.4em; + line-height:0; + font-size:90% +} +.rst-content .hlist{ + width:100% +} +.rst-content dl dt span.classifier:before{ + content:" : " +} +.rst-content dl dt span.classifier-delimiter{ + display:none!important +} +html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{ + background:none; + border:none +} +html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{ + border:none; + background-color:transparent!important; + white-space:normal +} +html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{ + padding-left:0; + padding-right:0; + vertical-align:top +} +html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{ + display:grid; + grid-template-columns:max-content auto +} +html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{ + padding-left:1rem +} +html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{ + content:":" +} +html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{ + margin-bottom:0 +} +html.writer-html5 .rst-content dl.footnote{ + font-size:.9rem +} +html.writer-html5 .rst-content dl.footnote>dt{ + margin:0 .5rem .5rem 0; + line-height:1.2rem; + word-break:break-all; + font-weight:400 +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets{ + margin-right:.5rem +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{ + content:"[" +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{ + content:"]" +} +html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{ + font-style:italic +} +html.writer-html5 .rst-content dl.footnote>dd{ + margin:0 0 .5rem; + line-height:1.2rem +} +html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{ + font-size:.9rem +} +.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{ + color:grey +} +.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{ + color:#555 +} +.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{ + margin-bottom:0 +} +.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){ + margin-top:24px +} +.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{ + margin-bottom:24px +} +.rst-content table.docutils th{ + border-color:#e1e4e5 +} +html.writer-html5 .rst-content table.docutils th{ + border:1px solid #e1e4e5 +} +html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{ + line-height:1rem; + margin-bottom:0; + font-size:.9rem +} +.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{ + margin-bottom:0 +} +.rst-content table.field-list,.rst-content table.field-list td{ + border:none +} +.rst-content table.field-list td p{ + font-size:inherit; + line-height:inherit +} +.rst-content table.field-list td>strong{ + display:inline-block +} +.rst-content table.field-list .field-name{ + padding-right:10px; + text-align:left; + white-space:nowrap +} +.rst-content table.field-list .field-body{ + text-align:left +} +.rst-content code,.rst-content tt{ + color:#000; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + padding:2px 5px +} +.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{ + font-size:100%!important; + line-height:normal +} +.rst-content code.literal,.rst-content tt.literal{ + color:#e74c3c; + white-space:normal +} +.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{ + font-weight:700; + color:#404040 +} +.rst-content kbd,.rst-content pre,.rst-content samp{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace +} +.rst-content a code,.rst-content a tt{ + color:#2980b9 +} +.rst-content dl{ + margin-bottom:24px +} +.rst-content dl dt{ + font-weight:700; + margin-bottom:12px +} +.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{ + margin-bottom:12px +} +.rst-content dl dd{ + margin:0 0 12px 24px; + line-height:24px +} +html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){ + margin-bottom:24px +} +html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{ + display:table; + margin:6px 0; + font-size:90%; + line-height:normal; + background:#e7f2fa; + color:#2980b9; + border-top:3px solid #6ab0de; + padding:6px; + position:relative +} +html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{ + color:#6ab0de +} +html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{ + color:#404040; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{ + margin-bottom:6px; + border:none; + border-left:3px solid #ccc; + background:#f0f0f0; + color:#555 +} +html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{ + color:#404040; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{ + margin-top:0 +} +html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{ + background-color:transparent; + border:none; + padding:0; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{ + font-weight:700 +} +html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{ + display:inline-block; + padding:0 4px; + color:#000; + font-weight:700 +} +html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{ + display:inline-block; + padding-right:8px; + max-width:100% +} +html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{ + font-style:italic +} +html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + color:#000 +} +.rst-content .viewcode-back,.rst-content .viewcode-link{ + display:inline-block; + color:#27ae60; + font-size:80%; + padding-left:24px +} +.rst-content .viewcode-back{ + display:block; + float:right +} +.rst-content p.rubric{ + margin-bottom:12px; + font-weight:700 +} +.rst-content code.download,.rst-content tt.download{ + background:inherit; + padding:inherit; + font-weight:400; + font-family:inherit; + font-size:inherit; + color:inherit; + border:inherit; + white-space:inherit +} +.rst-content code.download span:first-child,.rst-content tt.download span:first-child{ + -webkit-font-smoothing:subpixel-antialiased +} +.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{ + margin-right:4px +} +.rst-content .guilabel{ + border:1px solid #7fbbe3; + background:#e7f2fa; + font-size:80%; + font-weight:700; + border-radius:4px; + padding:2.4px 6px; + margin:auto 2px +} +.rst-content .versionmodified{ + font-style:italic +} +@media screen and (max-width:480px){ + .rst-content .sidebar{ + width:100% + } +} +span[id*=MathJax-Span]{ + color:#404040 +} +.math{ + text-align:center +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff"); + font-weight:400; + font-style:normal; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff"); + font-weight:700; + font-style:normal; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff"); + font-weight:700; + font-style:italic; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff"); + font-weight:400; + font-style:italic; + font-display:block +} +@font-face{ + font-family:Roboto Slab; + font-style:normal; + font-weight:400; + src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff"); + font-display:block +} +@font-face{ + font-family:Roboto Slab; + font-style:normal; + font-weight:700; + src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff"); + font-display:block +} diff --git a/latest/_static/custom.css b/latest/_static/custom.css new file mode 100644 index 00000000..1cadbe76 --- /dev/null +++ b/latest/_static/custom.css @@ -0,0 +1,24 @@ +/* + * custom.css + * ~~~~~~~~~ + * + * Custom stylesheet. + * + * :copyright: Copyright 2022 by Xilinx, Inc. + * + */ + +/* -- main layout ----------------------------------------------------------- */ +@media screen and (max-width: 950px){ + .wy-body-for-nav{background:#000000} + .wy-nav-top{display:block} + .wy-nav-side{left:300px} + .wy-nav-side.shift{width:85%;left:0} + .wy-side-scroll{width:auto} + .wy-side-nav-search{width:auto} + .wy-menu.wy-menu-vertical{width:auto} + .wy-nav-content-wrap{margin-left:0} + .wy-nav-content-wrap + .wy-nav-content{padding:1.618em} + .wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden} +} \ No newline at end of file diff --git a/latest/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css b/latest/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css new file mode 100644 index 00000000..eb19f698 --- /dev/null +++ b/latest/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/latest/_static/design-tabs.js b/latest/_static/design-tabs.js new file mode 100644 index 00000000..36b38cf0 --- /dev/null +++ b/latest/_static/design-tabs.js @@ -0,0 +1,27 @@ +var sd_labels_by_text = {}; + +function ready() { + const li = document.getElementsByClassName("sd-tab-label"); + for (const label of li) { + syncId = label.getAttribute("data-sync-id"); + if (syncId) { + label.onclick = onLabelClick; + if (!sd_labels_by_text[syncId]) { + sd_labels_by_text[syncId] = []; + } + sd_labels_by_text[syncId].push(label); + } + } +} + +function onLabelClick() { + // Activate other inputs with the same sync id. + syncId = this.getAttribute("data-sync-id"); + for (label of sd_labels_by_text[syncId]) { + if (label === this) continue; + label.previousElementSibling.checked = true; + } + window.localStorage.setItem("sphinx-design-last-tab", syncId); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/latest/_static/doctools.js b/latest/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/latest/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/latest/_static/documentation_options.js b/latest/_static/documentation_options.js new file mode 100644 index 00000000..75cbead8 --- /dev/null +++ b/latest/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.2', + LANGUAGE: 'English', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/latest/_static/file.png b/latest/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/latest/_static/file.png differ diff --git a/latest/_static/jquery.js b/latest/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/latest/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/latest/_static/js/html5shiv.min.js b/latest/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/latest/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/latest/_static/js/theme.js b/latest/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/latest/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/latest/_static/layout.html b/latest/_static/layout.html new file mode 100644 index 00000000..81ae0134 --- /dev/null +++ b/latest/_static/layout.html @@ -0,0 +1,14 @@ +{% extends "!layout.html" %} + {% block footer %} {{ super() }} + + +{% endblock %} \ No newline at end of file diff --git a/latest/_static/minus.png b/latest/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/latest/_static/minus.png differ diff --git a/latest/_static/plus.png b/latest/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/latest/_static/plus.png differ diff --git a/latest/_static/pygments.css b/latest/_static/pygments.css new file mode 100644 index 00000000..84ab3030 --- /dev/null +++ b/latest/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/latest/_static/searchtools.js b/latest/_static/searchtools.js new file mode 100644 index 00000000..7918c3fa --- /dev/null +++ b/latest/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/latest/_static/sphinx_highlight.js b/latest/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/latest/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/latest/_static/xilinx-header-logo.png b/latest/_static/xilinx-header-logo.png new file mode 100644 index 00000000..00372830 Binary files /dev/null and b/latest/_static/xilinx-header-logo.png differ diff --git a/latest/_static/xilinx-header-logo.svg b/latest/_static/xilinx-header-logo.svg new file mode 100644 index 00000000..6b15297d --- /dev/null +++ b/latest/_static/xilinx-header-logo.svg @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + Page-1 + + + Sheet.1 + + + + + + diff --git a/latest/c_apis.html b/latest/c_apis.html new file mode 100644 index 00000000..ae325a76 --- /dev/null +++ b/latest/c_apis.html @@ -0,0 +1,1752 @@ + + + + + + + + + + + + + + + C API Programming Guide — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • C API Programming Guide
  • +
  • +
  • +
+
+
+
+
+ +
+

C API Programming Guide

+ +
+

Overview

+

The AMD AMA Video SDK provides a C-based application programming interface (API) which facilitates the integration of AMD transcoding capabilities in proprietary frameworks. This API is provided in the form of plugins leveraging the Xilinx Media Accelerator (XMA) library and the Xilinx Resource Manager (XRM) library.

+

The XMA Library

+

The XMA library (libxma) is meant to simplify the development of applications managing and controlling video accelerators such as decoders, scalers, filters, and encoders.

+

The XRM Library

+

The XRM library is used to manage the hardware accelerators available in the system. XRM keeps track of total system capacity for each of the compute units such as the decoder, scaler, and encoder. The XRM library makes it possible to perform actions such as reserving, allocating and releasing resources; calculating resource load and max capacity.

+

The AMD AMA Video SDK Plugins

+

The AMD AMA Video SDK provides 4 different plugins, each corresponding to a specific hardware accelerated feature of the card:

+
    +
  • The decoder plugin

  • +
  • The encoder plugin

  • +
  • The filter plugin

  • +
  • The scaler plugin

  • +
+

Any combination of plugins can be used when integrating with a proprietary framework.

+
+

Note

+

For elaborate definition of default and auto values, refer to counterpart sections in Using FFmpeg.

+
+
+
+

General Application Development Guide

+

Integration layers for applications using the AMD AMA Video SDK are organized around the following steps:

+
    +
  1. Initialization

  2. +
  3. Resource Reservation

  4. +
  5. Session Creation

  6. +
  7. Runtime Processing

  8. +
  9. Cleanup

  10. +
+
+

Resource Initialization and Allocation

+

Applications using the plugins must first create a XRM plugin using the xrm_PLUGIN_reserve(), where PLUGIN is one of dec, enc, or scale. This is done using the XRM APIs, as described in detail in the XRM API Reference Guide below.

+
+
+

Session Creation

+

Once the resources have been allocated, the application must create dedicated plugin sessions for each of the hardware accelerators that need to be used (decoder, scaler, encoder, filter).

+

To create a session, the application must first initialize all the required properties and parameters of the particular plugin. It must then call the corresponding session creation function. A complete reference for all the plugins is provided below.

+
+
+

Runtime Processing

+

The plugins provide functions to send data from the host and receive data from the device. The data is in the form of video frames (XmaFrame). It is also possible to do zero-copy operations where frames are passed from one hardware accelerator to the next without being copied back to the host. The send and receive functions are specific to each plugin and the return code should be used to determine the next suitable action. A complete reference for all the plugins is provided below.

+
+
+

Cleanup

+

When the application finishes, it should destroy each plugin session using the corresponding destroy function. Doing so will free the resources on the AMD devices for other jobs and ensure that everything is released and cleaned-up properly.

+

The application should also use the xrm_PLUGIN_release(), where PLUGIN is one of dec, enc, or scale to release allocated resources. This is done using the XRM APIs, as described in detail in the XRM API Reference Guide below.

+
+

+
+
+
+
+

Compiling and Linking with the AMD AMA Video SDK Plugins

+

The plugins can be dynamically linked to the application. The required package to build applications is XRM. This package is provided as part of the AMD AMA Video SDK.

+

To provide the necessary declarations in your application, include the following header in your source code:

+
#include <xrm.h>
+
+
+

To compile and link your application with the plugins, add the following lines to your CMakeList.txt file:

+
target_link_libraries (${PROJECT_NAME} PUBLIC xma PUBLIC xrm_interface)
+target_include_directories (${PROJECT_NAME}
+  PUBLIC "${PROJECT_SOURCE_DIR}/include"
+  PUBLIC "$<TARGET_PROPERTY:xrm,INTERFACE_INCLUDE_DIRECTORIES>")
+
+
+
+

+
+
+
+

Common XMA Data Structures

+
+
+struct XmaParameter
+
+ +

Type-Length-Value data structure used for passing custom arguments to a plugin. The declaration of XmaParameter can be found in the /opt/amd/ama/ma35/include/xma/xmaparam.h file.

+
+
+struct XmaFrameProperties
+
+ +

Data structure describing the frame dimensions for XmaFrame. The declaration of XmaFrameProperties can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+struct XmaFrame
+
+ +

Data structure describing a raw video frame and its buffers. XmaFrame structures can be received from the decoder or sent to the encoder. They are also used as input and outputs for the scaler and the look-ahead. The declaration of XmaFrame can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+

The AMD AMA Video SDK plugins supports 3 types of frames:

+
    +
  • XMA_HOST_BUFFER_TYPE frames must be copied to the device using the upload filter before they can be used by the device..

  • +
  • XMA_DEVICE_ONLY_BUFFER_TYPE frames must be copied to the host using the download filter before they can be used by the host application.

  • +
  • NO_BUFFER frames do not contain buffer data and are used as place holders to be filled in by XMA plugins..

  • +
+

The upload filter plugin send function only supports XMA_HOST_BUFFER_TYPE frames, while all other send frame functions only support XMA_DEVICE_BUFFER_TYPE frames. All frames used in receive functions must contain "dummy" data. All parameters in those frames will be filled in by the respective receive functions. All frames must be allocated using the provided XMA functions.

+
+
+struct XmaDataBuffer
+
+ +

Data structure describing a buffer containing encoded video data. XmaDataBuffer structures can be sent to the decoder or received from the encoder. The declaration of XmaDataBuffer can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+

All XmaDataBuffer structures must be allocated using one of the provided functions. XmaDataBuffer structures used in the encoder receive function must be allocated with "dummy" data and will be filled in by the encoder.

+
+

Note

+

Xma[Scaler|Encoder|Filter]Properties.sw_format

+
+

sw_format, which is a member of XmaScalerProperties, XmaEncoderProperties, and XmaFilterProperties structures, represents the pixel format of a frame on the device. Therefore, its assigned value is determined by the direction of data flow. Specifically:

+
+
+
XMA_NV12_FMT_TYPE and XMA_P010LE_FMT_TYPE, with flags = XMA_FRAME_PROPERTY_FLAG_TILE_4x4, are internal formats that can only be generated by decoder/scaler and not by the upload filter.
+
XMA_PACKED10_FMT_TYPE is an internal format that can only be generated by decoder/scaler and not the upload filter.
+
XMA_RGB24_FMT_TYPE is reserved for future use.
+
XMA_YUV420P_FMT_TYPE and XMA_YUV420P10LE_FMT_TYPE are external formats that can be used by the upload filter
+
+
+
+
+
+

+
+
+
+

Common XMA Data Reference

+

This section describes the commonly used calls and APIs that are required in most applications.

+
+

XMA Log Interface

+

The external interface to the xma logging consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmalogger.h file.

+
+
+int32_t xma_log_init(XmaLogLevelType log_level, XmaLogType log_type, XmaLogHandle *handle, ...)
+
+ +

This function creates a log session and must be called prior to logging. (See /opt/amd/ama/ma35/include/xma/xmalogger.h for details on variadic usage.)

+
+
+void xma_logmsg(XmaLogHandle handle, XmaLogLevelType level, const char *name, const char *msg, ...)
+
+ +

This function logs a message.

+
+
+void xma_log_release(XmaLogHandle handle)
+
+ +

This function releases a log session that was previously created with the xma_log_init() function.

+
+
+

XMA Session Interface

+

The external interface to the xma session consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xma.h file.

+
+
+int32_t xma_initialize(XmaLogHandle log, XmaInitParameter *init_params, XmaHandle *handle)
+
+ +

This function creates a XMA session and must be called prior to creating any plugins.

+
+
+void xma_release(XmaHandle handle)
+
+ +

This function releases a XMA session that was previously created with the xma_initialize() function.

+
+
+

XMA Data Buffer Interface

+

The external interface to the xma data buffer consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+XmaDataBuffer *xma_data_buffer_alloc(XmaHandle handle, size_t size, bool dummy)
+
+ +

This function creates a XmaDataBuffer of the given size.

+
+
+XmaDataBuffer *xma_data_from_buffer_clone(XmaHandle handle, uint8_t *data, size_t size, xma_data_buffer_clone_free_callback_function free_callback, void *opaque)
+
+ +

This function creates a XmaDataBuffer that points to the provided buffer. xma_data_buffer_clone_free_callback_function will be called, when the buffer is no longer needed.

+
+
+void xma_data_buffer_free(XmaDataBuffer *data)
+
+ +

This function releases a previously created XmaDataBuffer.

+
+
+

XMA Frame Interface

+

The external interface to the xma Frame consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+int32_t xma_frame_planes_get(XmaHandle handle, XmaFrameProperties *frame_props)
+
+ +

This returns the number of planes for a given pixel format.

+
+
+int32_t xma_frame_get_plane_height(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the height of the plane based on the frame height, pixel format, and plane.

+
+
+int32_t xma_frame_get_plane_stride(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the stride of the plane based on the frame width, pixel format, and plane.

+
+
+int32_t xma_frame_get_plane_size(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the size of the plane based on the frame width, height, pixel format, and plane.

+
+
+XmaFrame *xma_frame_alloc(XmaHandle handle, XmaFrameProperties *frame_props, bool dummy)
+
+ +

This function creates a XmaFrame with the given properties.

+
+
+XmaFrame *xma_frame_from_buffers_clone(XmaHandle handle, XmaFrameProperties *frame_props, XmaFrameData *frame_data, xma_frame_clone_free_callback_function free_callback, void *opaque)
+
+ +

This function creates a XmaFrame that points to the provided data and with the given properties. xma_frame_clone_free_callback_function will be called when the data is no longer needed.

+
+
+XmaFrame *xma_frame_clone(XmaHandle handle, XmaFrame *xma_frame)
+
+ +

This function creates a XmaFrame that uses the same buffers as the provided XmaFrame, but can have side data added or removed without affecting the original XmaFrame.

+
+
+int32_t xma_frame_inc_ref(XmaFrame *frame)
+
+ +

This function increases the reference count of the given XmaFrame.

+
+
+int32_t xma_frame_dec_ref(XmaFrame *frame)
+
+ +

This function decreases the reference count of the given XmaFrame.

+
+
+void xma_frame_free(XmaFrame *frame)
+
+ +

This function releases a XmaFrame that was created with the previous functions.

+
+
+int32_t xma_frame_add_side_data(XmaFrame *frame, XmaFrameSideData *side_data)
+
+ +

This function adds the side data to the frame. If there is already side data of the same type associated with the frame, it is removed and the new side data is set. The reference count of the side_data buffer is incremented by 1 on successful execution.

+
+
+XmaFrameSideData *xma_frame_get_first_side_data(XmaFrame *frame)
+
+ +

This function returns the handle to the first side data of any type. Added in v1.1.

+
+
+XmaFrameSideData *xma_frame_get_side_data(XmaFrame *frame, enum XmaFrameSideDataType type)
+
+ +

This function returns the handle to the first side data of the given type.

+
+
+XmaFrameSideData *xma_frame_get_next_side_data(XmaFrame *frame, XmaFrameSideData *side_data)
+
+ +

This function returns the handle to the next side data of any type. Added in v1.1.

+
+
+XmaFrameSideData *xma_frame_get_next_side_data_of_type(XmaFrame *frame, XmaFrameSideData *side_data)
+
+ +

This function returns the handle to the next side data of the given type. Added in v1.1.

+
+
+int32_t xma_frame_remove_side_data(XmaFrame *frame, XmaFrameSideData *side_data)
+
+ +

This function removes the side data from the frame. The side data buffer reference count is decremented by 1. If it results in a reference count of zero, then the side data is freed.

+
+
+int32_t xma_frame_remove_side_data_type(XmaFrame *frame, enum XmaFrameSideDataType type)
+
+ +

This function removes all side data of the given type. Any side data buffer that is removed has it's reference count decremented by 1. If it results in a reference count of zero, then the side data buffer is freed.

+
+
+void xma_frame_clear_all_side_data(XmaFrame *frame)
+
+ +

This function removes all side data from the frame. The reference count of each side data buffer associated with the frame is decremented by 1. If it results in a reference count of zero, then the side data is freed.

+
+
+

XMA Side Band Data

+

Passing side band data through xma consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+XmaFrameSideData *xma_side_data_alloc(XmaHandle handle, enum XmaFrameSideDataType type, XmaBufferType buffer_type, uint64_t size)
+
+ +

This function allocates side data handle, with reference count 1.

+
+
+void xma_side_data_free(XmaFrameSideData *side_data)
+
+ +

This function decrements the reference count of the side_data by 1.

+
+
+int32_t xma_side_data_inc_ref(XmaFrameSideData *side_data)
+
+ +

This function increments the reference count of the side_data by 1

+
+
+int32_t xma_side_data_dec_ref(XmaFrameSideData *side_data)
+
+ +

This function decrements the reference count of the side_data by 1.

+
+
+int32_t xma_side_data_get_refcount(XmaFrameSideData *side_data)
+
+ +

This function returns the reference count of the side_data.

+
+
+int32_t xma_side_data_read(XmaFrameSideData *side_data)
+
+ +

This function copies data from device to host. Deprecated in v1.1 and above.

+
+
+int32_t xma_side_data_write(XmaFrameSideData *side_data)
+
+ +

This function copies data from host to device. Only use this function if you created the side data and it has not yet been sent to any sessions, otherwise risk of a race condition can occur.

+
+
+int32_t xma_side_data_get_metadata(XmaFrameSideData *side_data, XmaParameter *metadata)
+
+ +

This function gets the value of specified metadata. Added in v1.1.

+
+
+int32_t xma_side_data_set_metadata(XmaFrameSideData *side_data, XmaParameter *metadata)
+
+ +

This function replaces or creates the specified metadata, depending on whether it exists on not. Added in v1.1.

+
+
+
+

1.0 SDK API

+

The following subsections describe APIs applicable to 1.0 SDK. Note that these APIs serve as bases for future versions. In order to allow forwards and backwards ABI compatibility, the application can now set which version of the API to use. If no version is set, version 1.0 is assumed. When a version is set, only features available in that version are allowed. This means if a feature was deprecated in an earlier version, or was added in a later version, it cannot be used and will either be ignored or returned as an error.

+

To set the API version, use the following code snippet:

+
XmaParameter params[1];
+uint32_t api_version = XMA_API_VERSION_M_ m;
+
+params[0].name = (char*)XMA_API_VERSION;
+params[0].type = XMA_UINT32;
+params[0].length = sizeof(uint32_t);
+params[0].value = &api_version;
+
+xma_init_param.params        = params;
+xma_init_param.param_cnt     = 1;
+xma_initialize(logger, &xma_init_param, handle);
+
+
+

, where M and m are major and minor versions of the SDK, e.g., for SDK 1.0 the macro becomes XMA_API_VERSION_1_0.

+
+

Decoder Plugin Reference

+
+

Decoder Interface

+

The external interface to the decoder plugin consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmadecoder.h file.

+
+
+XmaDecoderSession *xma_dec_session_create(XmaDecoderProperties *dec_props)
+
+ +

This function creates a decoder session and must be called prior to decoding data. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_dec_session_set_log(XmaDecoderSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_dec_session_send_data(XmaDecoderSession *session, XmaDataBuffer *data, int32_t *data_used)
+
+ +

This function sends input frame data to the hardware decoder by way of the plugin. The application needs to parse the input encoded stream and send one frame of data at a time in a XmaDataBuffer data structure.

+

The data_used value indicates the amount of input data consumed by the decoder.

+

If the function returns XMA_SUCCESS, then the decoder was able to consume the entirety of the available data and data_used will be set accordingly. In this case, the application can proceed with fetching decoded data using the xma_dec_session_recv_frame() API.

+

If the function returns XMA_TRY_AGAIN, then the decoder was did not consume any of the input data and data_used will be reported as 0. In this case, the application can proceed with fetching previously decoded data with the xma_dec_session_recv_frame() function but must send the same input again using using xma_dec_session_send_data() until the function returns XMA_SUCCESS.

+

If the function returns XMA_SEND_MORE_DATA, then the data sent is being processed, but more is required before any frames will be available.

+

Once the application has sent all the input frames to the decoder, it must notify the decoder by sending a null buffer. The application should then continue sending null buffers in order to flush out all the output YUV frames.

+
+
+int32_t xma_dec_session_get_properties(XmaDecoderSession *dec_session, XmaFrameProperties *fprops);
+
+ +

This function returns the decoder properties such as width, height, output format, and frame rate.

+
+
+int32_t xma_dec_session_recv_frame(XmaDecoderSession *session, XmaFrame *frame)
+
+ +

This function tries to fetch a decoded YUV frame from the hardware accelerator.

+

If the function returns XMA_SUCCESS, a valid YUV frame pointer is available in the buffer pointer of the XmaFrame argument.

+

If the function returns XMA_TRY_AGAIN, then the decoder still needs some input data to produce a complete YUV output frame.

+

If the function returns XMA_EOS, then the decoder has flushed out all the frames.

+
+
+int32_t xma_dec_session_destroy(XmaDecoderSession *session)
+
+ +

This function destroys a decoder session that was previously created with the xma_dec_session_create() function.

+
+
+

Decoder Properties

+

The AMD AMA Video SDK decoder is configured using a combination of standard XMA decoder properties and custom decoder parameters, both of which are specified using a XmaDecoderProperties data structure. The declaration of XmaDecoderProperties can be found in the /opt/amd/ama/ma35/include/xma/xmadecoder.h file.

+
+

+
+
+
+struct XmaDecoderProperties
+
+ +

This data structure is used to configure the AMD AMA Video SDK decoder.

+
+

+
+

Standard XMA Decoder Properties

+

When using the decoder plugin, the following members of the XmaDecoderProperties data structure must be set by the application:

+
+
hwdecoder_type

Specifying type of decoder to reserve.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the decoder plugin.

+
+
param_cnt

Count of custom parameters.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840. +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
bits_per_pixel

Bits per pixel for primary plane of output video. +Must be set to 8 or 10 bits per pixel.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS.

+
+
handle

handle to XMA device.

+
+
+

Custom Decoder Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the decoder plugin:

+
+
"out_fmt"

XMA pixel format. See -out_fmt for available options.

+
+
“low_latency”

Set to 1 to enable low latency mode.

+
+
"latency_logging"

Set to 1 to enable logging of latency information to the xma log.

+
+
+
+

+
+
+
+
+

Scaler Plugin Reference

+
+

Scaler Interface

+

The external interface to the scaler plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+
+XmaScalerSession *xma_scaler_session_create(XmaScalerProperties *props)
+
+ +

This function creates scaler session and must be called prior to sending input frames. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_scaler_session_send_frame(XmaScalerSession *session, XmaFrame *frame)
+
+ +

This function sends a YUV frame to the underlying XMA plugin( and eventually to hardware to scale the input frame to one or multiple resolutions.

+

The application can take further action depending upon the return value from this API.

+

If the function returns XMA_SUCCESS, then the application can proceed to fetch scaled output frames.

+

If the function returns XMA_SEND_MORE_DATA, then the application should proceed with sending next YUV frame.

+

If the function returns XMA_FLUSH_AGAIN it means that the application should keep flushing the scaler.

+

Once the application has sent all the input frames to the scaler, it must notify the scaler by sending a null frame to flush the scaler.

+
+
+int32_t xma_scaler_session_recv_frame_list(XmaScalerSession *session, XmaFrame **frame_list)
+
+ +

This function is called after calling the xma_scaler_session_send_frame(). This function returns a list of output frames with every call until it reaches end of scaling. Return codes can only be XMA_SUCCESS and XMA_ERROR.

+
+
+int32_t xma_scaler_session_destroy(XmaScalerSession *session)
+
+ +

This function destroys scaler session that was previously created with the xma_scaler_session_create() function.

+
+

+
+
+
+

Scaler Properties

+

The AMD AMA Video SDK scaler is configured using a combination of standard XMA scaler properties, standard XMA scaler input and output properties and custom scaler parameters, all of which are specified using XmaScalerProperties and XmaScalerInOutProperties data structures.

+
+

+
+
+
+struct XmaScalerProperties
+
+ +

This data structure is used to configure the video scaler. The declaration of XmaScalerProperties can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+
+struct XmaScalerInOutProperties
+
+ +

This data structure is used to configure the input and outputs of the video scaler. The XmaScalerFilterProperties data structure contains one XmaScalerInOutProperties for the scaler input and an array of 16 XmaScalerInOutProperties for the scaler outputs. The declaration of XmaScalerInOutProperties can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+

+
+

Standard XMA Scaler Properties

+

When using the scaler plugin, the following members of the XmaScalerProperties data structure must be set by the application:

+
+
hwscaler_type

Type of scaler. Must be set to XMA_ABR_SCALER_TYPE.

+
+
num_outputs

Number of scaler outputs.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the scaler plugin.

+
+
param_cnt

Count of custom parameters.

+
+
input

Input property of type XmaScalerInOutProperties

+
+
output

Output properties an array of type XmaScalerInOutProperties of size num_outputs

+
+
+

XMA Scaler Input and Output Properties

+

When configuring the scaler input and outputs, the following members of the XmaScalerInOutProperties data structure must be set by the application:

+
+
format

Host side input video format. +Must be set to XMA_VPE_FMT_TYPE

+
+
sw_format

Device side video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of video stream/data. +Valid values are integers between 128 and 3840, in multiples of 4. +Portrait mode is supported.

+
+
height

Height in pixels of video stream/data. +Valid values are even integers between 128 and 2160, in multiples of 4.

+
+
framerate

Framerate data structure specifying frame rate per second.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
+

Other members of XmaScalerInOutProperties are not applicable to the scaler plugin and should not be used.

+

Custom Scaler Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the scaler plugin:

+
+
"mix_rate"

This parameter is used to configure mix-rate sessions where some scaler outputs are configured at the input frame rate and some other outputs will be configured at half the rate.

+
+
“top”

Cropping the top of the video before scaling.

+
+
“width”

Cropping the width of the video before scaling.

+
+
“height”

Cropping the height of the video before scaling.

+
+
"latency_logging"

Set to 1 to enable logging of latency information to XMA logs. Set to 0 to disable logging.

+
+
+
+

+
+
+
+
+

Encoder Plugin Reference

+
+

Encoder Interface

+

The external interface to the encoder plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmaencoder.h file.

+
+
+XmaEncoderSession *xma_enc_session_create(XmaEncoderProperties *enc_props)
+
+ +

This function creates an encoder session and must be called prior to encoding input YUV. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_enc_session_set_log(XmaEncoderSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_enc_session_send_frame(XmaEncoderSession *session, XmaFrame *frame)
+
+ +

This function sends a YUV frame to the hardware encoder by way of the plugin.

+

Each time the application calls this function, it must provide a XmaFrame containing YUV data and information about this frame (XmaFrameProperties).

+

If the function returns XMA_SUCCESS, then the application can proceed to fetch the encoded data using the xma_enc_session_recv_data() API.

+

If the function returns XMA_SEND_MORE_DATA, then the application must send the next YUV frame before calling xma_enc_session_recv_data().

+

Once the application has sent all the input frames to the encoder, it should notify the hardware by sending a null frame. If the API returns XMA_SUCCESS after a null frame is sent, then the application can call xma_enc_session_recv_data() but must send a null frame again.

+
+
+int32_t xma_enc_session_recv_data(XmaEncoderSession *session, XmaDataBuffer *data, int32_t *data_size)
+
+ +

This function is called after calling the function xma_enc_session_send_frame(). The application is responsible for allocating the "dummy" XmaDataBuffer using one of the provided functions. It is also responsible for releasing it when done.

+

If the function returns XMA_SUCCESS, then valid output data is available.

+

If the function returns XMA_RESEND_AND_RECV, a data buffer is not ready to be returned and the length of the data buffer is set to 0. The XmaDataBuffer is untouched and can either be reused or released.

+

If the function returns XMA_EOS, the encoder has flushed all the output frames. The XmaDataBuffer is untouched and must be released.

+
+
+int32_t xma_enc_session_destroy(XmaEncoderSession *session)
+
+ +

This function destroys an encoder session that was previously created with the xma_enc_session_create() function.

+
+
+

Encoder Properties

+

The AMD AMA Video SDK encoder is configured using a combination of standard XMA encoder properties and custom encoder parameters, both of which are specified using a XmaEncoderProperties data structure.

+
+

+
+
+
+struct XmaEncoderProperties
+
+ +

This data structure is used to configure the video encoder. The declaration of XmaEncoderProperties can be found in the /opt/amd/ama/ma35/include/xma/xmaencoder.h file.

+

Standard XMA Encoder Properties

+

When using the encoder plugin, the following members of the XmaEncoderProperties data structure must be set by the application:

+
+
hwencoder_type

Specify type of encoder to reserve.

+
+
format

Host side input video format. +Must be set to XMA_VPE_FMT_TYPE

+
+
sw_format

Device side input video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840. +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
framerate

Framerate data structure specifying frame rate per second

+
+
lookahead_depth

The lookahead module depth to give start giving lookahead data. +Supported values are 0 to 40.

+
+
rc_mode

Rate control mode for custom rate control +Supported values are 0 (constant QP), 1 (CBR), 2 (VBR), and 3 (CVBR).

+
+
bitrate

Bitrate of output data (in kbps).

+
+
qp

Fixed quantization value. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
gop_size

Maximum group of pictures size in frames.

+
+
temp_aq_gain

Temporal AQ Gain. Valid values are 0-255.

+
+
spat_aq_gain

Spatial AQ Gain. Valid values are 0-255.

+
+
minQP

Minimum QP. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
maxQP

Maximum QP. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
profile

Encoding profile. Valid values are 0 (Baseline), 1 (Main), 2 (High), 3 (High 10), or 4 (High 10 Intra) for H.264, 100 (Main), 101 (Main Intra), 102 (Main 10), or 103 (Main 10 Intra) for HEVC, or 200 (Main) for AV1, or -1 (Auto) for any codec.

+
+
level

Encoding level.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the encoder plugin.

+
+
param_cnt

Count of custom parameters.

+
+
+

Custom Encoder Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the encoder plugin:

+
+
"slice"

Slice to perform the encode.

+
+
"latency_logging"

When enabled, it logs latency information to XMA log.

+
+
"spatial_aq"

Enables or disables adaptive spatial qp.

+
+
"temporal_aq"

Enables or disables adaptive temporal qp.

+
+
"qp_mode"

Sets qp mode to auto, relative load or uniform.

+
+
"tune_metrics"

Sets the tuning metric to none, VQ, PSNR, SSIM or VMAF.

+
+
"forced_idr"

Forces insertion of an IDR.

+
+
"crf"

Enables or disables CRF.

+
+
"expert_options"

sets encoder's expert option.

+
+
"device_type"

For AV1 encoder selects between Type 1 and Type 2.

+
+
+
+
+

Encoder Dynamic Parameters

+

Dynamic parameters allow for per frame updates to encoding parameters. These parameters are specified by either XmaDynamicEncParams or XmaDynamicEncParams_v2 structure. To insert dynamic data parameters to encoder, proceed as follows:

+
+
    +
  1. Allocate side band data through xma_side_data_alloc()

  2. +
  3. Set returned structure members, from Step 1, of XmaDynamicEncParams or XmaDynamicEncParams_v2

  4. +
  5. Clone frame using xma_frame_clone()

  6. +
  7. Attach XmaDynamicEncParams or XmaDynamicEncParams_v2 structure using xma_frame_add_side_data()

  8. +
  9. Check return values for status checking

  10. +
  11. Remove dynamic parameters from frame using xma_frame_dec_ref()

  12. +
+
+
+

Note

+

Use XmaDynamicEncParams structure for XMA_API_VERSION_1_1 and below. For XMA_API_VERSION_1_1_2 and above, use XmaDynamicEncParams_v2 structure.

+
+
+
+struct XmaDynamicEncParams
+
+ +

This data structure is used to configure the dynamic parameters of encoder. The declaration of XmaDynamicEncParams can be found in the /opt/amd/ama/ma35/include/xma/xmasidedata.h file. +See Video Encoding for details.

+

Dynamic Encoder Parameters

+
+
is_spatial_aq_gain_changed

Change indicator flag for spatial_aq_gain

+
+
spatial_aq_gain

Spatial adaptive quantizer gain factor

+
+
is_temporal_aq_gain_change

Change indicator flag for temporal_aq_gain

+
+
temporal_aq_gain

Temporal adaptive quantizer gain factor

+
+
is_temporal_mode_changed

Change indicator flag for temporal_aq_mode

+
+
temporal_aq_mode

Enable/disable temporal quantizer

+
+
is_spatial_mode_changed

Change indicator flag for spatial_aq_mode

+
+
spatial_aq_mode

Enable/disable spatial quantizer

+
+
is_bit_rate_changed

Change indicator flag for bit_rate_kbps

+
+
bit_rate_kbps

Bit rate in kbps

+
+
is_b_frames_changed

Change indicator flag for num_b_frames

+
+
num_b_frames

Number of B frames

+
+
is_min_qp_changed

Change indicator flag for min_qp

+
+
min_qp

Minimum QP value

+
+
is_max_qp_changed

Change indicator flag for min_qp

+
+
max_qp

Maximum QP value

+
+
+
+
+struct XmaDynamicEncParams_v2
+
+ +

This data structure is used to configure extra dynamic parameters for encoding. The declaration of XmaDynamicEncParams_v2 can be found in the /opt/amd/ama/ma35/include/xma/xmasidedata.h file. +See Video Encoding for details.

+

Dynamic Encoder Parameters Version 2

+
+
v1

XmaDynamicEncParams memeber

+
+
is_qp_changed

Change indicator flag for qp

+
+
qp

QP value

+
+
is_qp_i_offset_changed

Change indicator flag for qp_i_offset

+
+
qp_i_offset

QP offset for I frames

+
+
is_qp_b_offset_changed

Change indicator flag for qp_b_offset

+
+
qp_b_offset

QP offset for B frames

+
+
is_min_bit_rate_changed

Change indicator flag for min_bit_rate_kbps

+
+
min_bit_rate_kbps

Minimum bit rate in kbps

+
+
is_max_bit_rate_changed

Change indicator flag for max_bit_rate_kbps

+
+
max_bit_rate_kbps

Maximum bit rate in kbps

+
+
is_bit_rate_changed

Change indicator flag for bit_rate_kbps

+
+
reserved

For future use

+
+
+
+

+
+
+
+
+

Filter Plugin Reference

+
+

Filter Interface

+

The filter plugin is based on the Filter XMA plugin type. The external interface to the filter plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+
+
+XmaFilterSession *xma_filter_session_create(XmaFilterProperties *props)
+
+ +

This function creates a filter session and must be called prior to sending YUV frames to the filter. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_filter_session_set_log(XmaFilterSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_filter_session_send_frame(XmaFilterSession *session, XmaFrame *frame)
+
+ +

This function sends YUV frames to the filter module in hardware. After sending a frame, the application can take further action depending upon the return value from this API.

+

If this function returns XMA_SUCCESS, then the application can proceed to recieve a frame from this filter.

+

If this function returns XMA_TRY_AGAIN, it means the input frame has not been consumed and needs to re-send the same input frame after calling receive frame.

+

Once the application sends all input frames to the filter module, it should continue sending null frames until all the frames have been flushed out from the filter.

+
+
+int32_t xma_filter_session_recv_frame(XmaFilterSession *session, XmaFrame *frame)
+
+ +

This function is called after calling the function xma_filter_session_send_frame().

+

If this function returns XMA_SUCCESS, then the "dummy" frame provided by the application has been filled in and can be sent to the next plugin.

+

If this function returns XMA_RESEND_AND_RECV, then no frames have been sent to the filter for processing. The XmaFrame is untouched and may be reused or released. +If this function returns XMA_TRY_AGAIN, then frames have been sent and are currently being processed, but are not yet ready. The c:struct:XmaFrame is untouched and may be reused or released. +If this function returns XMA_EOS, then all frames have been processed. The c:struct:XmaFrame is untouched and must be released.

+
+
+int32_t xma_filter_session_destroy(XmaFilterSession *session)
+
+ +

This function destroys the filter session that was previously created with the xma_filter_session_create() function.

+
+
+

Filter Properties

+

The AMD AMA Video SDK filter is configured using a combination of standard XMA filter properties, standard XMA filter input and output properties and custom filter parameters, all of which are specified using XmaFilterProperties and XmaFilterPortProperties data structures.

+
+
+struct XmaFilterProperties
+
+ +

This data structure is used to configure the filter function. The declaration of XmaFilterProperties can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+
+
+struct XmaFilterPortProperties
+
+ +

This data structure is used to configure the input and output of the filter. The XmaFilterProperties data structure contains one XmaFilterPortProperties for the filter input and one XmaFilterPortProperties for the output output. The declaration of XmaFilterPortProperties can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+

Standard XMA Filter Properties

+

When using the filter plugin, the following members of the XmaFilterPortProperties data structure must be set by the application:

+
+
hwfilter_type

Sets the direction of stream entry to XMA_UPLOAD_FILTER_TYPE or XMA_DOWNLOAD_FILTER_TYPE.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the filter plugin.

+
+
param_cnt

Count of custom parameters.

+
+
input

Input property of type XmaFilterPortProperties

+
+
output

Output property of type XmaFilterPortProperties

+
+
+

Standard XMA Filter Port Properties

+

When configuring the filter input or output, the following members of the XmaFilterPortProperties data structure must be set by the application:

+
+
format

Input video format. +Must be set to XMA_VPE_FMT_TYPE.

+
+
sw_format

Device side input video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840 +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
framerate

Framerate data structure specifying frames per second.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
framerate

Framerate data structure specifying frame rate per second.

+
+
+

Custom Filter Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the filter plugin:

+
+
"latency_logging"

When enabled, it logs latency information to XMA log.

+
+
+
+

+
+
+
+
+

Ultra Low Latency Considerations

+
+

Decoder Low Latency Mode

+

To enable low latency in the decoder, add a XmaParameter with the name low_latency, of type XMA_INT32, and value of 1. After each frame is sent to the decoder, the decoder will return XMA_SUCCESS. The application can immediately call xma_dec_session_recv_frame(). It will return either XMA_SUCCESS (indicating a frame has been returned), XMA_EOS (indicating the end of stream has been reached), or XMA_RESEND_AND_RECV (indicating the frame is still being processed and xma_dec_session_recv_frame() must keep being called until it is ready).

+
+
+

Encoder Ultra Low Latency Mode

+

To enable Ultra Low Latency in the encoder, set XmaEncoderProperties.lookahead_depth = 0. After each frame is sent to the encoder, the encoder will return XMA_SUCCESS. The application can immediately call xma_enc_session_recv_data(). It will return either XMA_SUCCESS (indicating a frame has been returned), XMA_EOS (indicating the end of stream has been reached), or XMA_RESEND_AND_RECV (indicating the frame is still being processed and xma_enc_session_recv_data() must keep being called until it is ready).

+
+
+
+
+

1.1 SDK API

+

The following subsections delineate 1.1 API improvements over 1.0. To use 1.1 APIs, set XMA_API_VERSION parameter to XMA_API_VERSION_1_1. (See here for how to do this.)

+
+

Note

+

SDK 1.1.1 is not backward ABI compatible with SDK 1.0. This implies that 1.0 applications need to be migrated to 1.1.1 SDK, manually.

+
+
+

Sideband Data

+

The main difference between SDK 1.1 and 1.0 are:

+
    +
  1. v1.0 only allowed 1 sideband data of each type, adding another would replace the first. v1.1 allows multiple of each type. New functions are added to access/modify the sideband data.

  2. +
  3. HDR10 sideband data type are deprecated and replaced with several different SEI sideband data types

  4. +
  5. Applications can define their own sideband data types and add the sideband data to frames. Filters will pass this sideband data downstream. Currently, only frames can have sideband data.

  6. +
  7. All sideband data (both predefined and user defined) can have metadata. Metadata is XmaParameters attached to sideband data used for adding additional information about a sideband data buffer to a sideband data. Each sideband data can have only one sideband metadata with a given name. If an application tries to add new metadata to a sidedata and a metadata with the same name already exists, the original metadata will be deleted and replaced by the new metadata. Metadata exists solely on the host.

  8. +
  9. Added sidedata functions are:

    +
    - xma_side_data_get_metadata(): Gets the value of sideband metadata.
    +- xma_side_data_set_metadata(): Adds/replaces sideband metadata to sideband data.
    +- xma_frame_get_first_side_data(): Get the first sidedata of any type that is attached to a given frame.
    +- xma_frame_get_next_side_data(): Get the next sidedata of any type that is attached to a given frame.
    +- xma_frame_get_next_side_data_of_type(): Get the next sidedata of a given type that is attached to a given frame.
    +
    +
    +
  10. +
  11. Modified sidedata functions are:

    +
    - xma_frame_get_side_data(): In v1.0 it will continue to get the sidedata of a given type from a given frame. In v1.1 it will get the first sidedata of a given type from a given frame.
    +- xma_frame_remove_side_data_type(): In v1.0 it will continue to remove the sidedata of a given type. In v1.1 it will remove all sidedata of a given type.
    +
    +
    +
  12. +
  13. Deprecated sidedata functions are:

    +
    - xma_side_data_read(): In v1.0 it copies the contents of the sidedata buffer from the device to the host.
    +
    +
    +
  14. +
+
+
+

Multithreading

+
    +
  1. In the decoder, 2 XmaParameter parameters are added:XMA_DEC_PARAM_THREADS and XMA_DEC_PARAM_WAIT. If XMA_DEC_PARAM_THREADS is set to 1, a background thread is deployed to improve performance. Note that XMA_DEC_PARAM_THREADS is 0 by default. If the application is using different threads to send and receive data from the decoder, the parameter XMA_DEC_PARAM_WAIT will improve CPU utilization on the host. XMA_DEC_PARAM_WAIT is only available if XMA_DEC_PARAM_THREADS is 1. XMA_DEC_PARAM_WAIT is 0 by default.

  2. +
  3. Similarly, in the encoder, 2 XmaParameter parameters are added: XMA_ENC_PARAM_THREADS and XMA_ENC_PARAM_WAIT. These behave the same as in the decoder.

  4. +
  5. The encoder calling order of send and receive has changed to be more in line with the decoder and scaler.

    +
    +
      +
    • +
      xma_enc_session_send_frame() return values and expected application behavior:
        +
      • XMA_SUCCESS: A frame is successfully sent to the encoder, regardless of if any data can be pulled from the encoder. The application should try calling xma_enc_session_recv_data() and proceed depending on the return value from xma_enc_session_recv_data().

      • +
      • XMA_TRY_AGAIN: The encoder's internal buffers are currently full. The application should try calling xma_enc_session_recv_data() and proceed according to it's return code. The next time xma_enc_session_send_frame() is called, send the same frame as was last sent, as it has not yet been processed. XMA_TRY_AGAIN will only be returned if XMA_ENC_PARAM_WAIT is 0.

      • +
      +
      +
      +
    • +
    • +
      xma_enc_session_recv_data() return values and expected application behavior:
        +
      • XMA_SUCCESS: Compressed data was returned and xma_enc_session_send_frame() can be called.

      • +
      • XMA_RESEND_AND_RECV: No compressed data is ready and the application should call xma_enc_session_send_frame(). Multiple loops of xma_enc_session_send_frame() returning XMA_TRY_AGAIN and xma_enc_session_recv_data() returning XMA_RESEND_AND_RECV may occur if internal buffers are full but no compressed data is ready. Continue looping until one of the functions returns a different value. XMA_RESEND_AND_RECV will only be returned if XMA_ENC_PARAM_WAIT is 0.

      • +
      • XMA_EOS: The end of the stream has been reached.

      • +
      +
      +
      +
    • +
    +
    +
  6. +
  7. XMA_SCALER_PARAM_THREADS is enabled by default in the scaler. To disable threading and pipelining, set this parameter to 0.

  8. +
+
+
+

Logging

+

XMA logging has been extended to be able to optionally output AMA logging. To use it, in the call to xma_log_init(), set the log type to XMA_LOG_TYPE_AMA.

+
+
+

Upgrading

+
    +
  1. If any frame returned by a session needs to have sideband data added/removed, e.g. adding XMA_FRAME_SIDE_DATA_DYN_ENC_PARAMS, then:

    +
      +
    • Original frame will need to be cloned, using xma_frame_clone()

    • +
    • Original frame itself, not its clone, has to have it's reference count decremented, using xma_frame_dec_ref()

    • +
    • Clone frame can have its sideband data added or removed using xma_frame_add_side_data(), xma_frame_remove_side_data(), or xma_frame_remove_side_data_type().

    • +
    +

    Following the above, the clone can then be passed on downstream, same as the original frame.

    +
  2. +
  3. xma_frame_add_side_data() does not remove existing sideband data from a frame, prior to adding a new sideband data. Instead it will add the new sideband data in addition to the old sideband data. To remove existing sideband data, call xma_frame_remove_side_data_type() first.

  4. +
+
+
+
+

1.2 SDK API

+

The following subsections delineate additional APIs supported by 1.2 SDK.

+
+

Sideband Data

+
    +
  1. New structures defined in /opt/amd/ama/ma35/include/xma/xmasidedata.h:

    +
    - XmaDynCompositorParams: Structure to setup the compositor
    +- XmaA53ClosedCaption: Structure to pass closed caption
    +- XmaRpuRawData: Structure to setup raw  Reference Picture Unit (RPU)
    +- XmaRpuDolbyVision: Structure to setup Dolby RPU
    +
    +
    +
  2. +
+
+
+

Pixel Formats

+
    +
  1. New supported pixel formats defined in /opt/amd/ama/ma35/include/xma/xmabuffers.h:

    +
    - XMA_YUV422SP_10BIT_FMT_TYPE: YUV 4:2:2 Semi-planar
    +- XMA_UYVY422_FMT_TYPE: UYVY 4:2:2
    +- XMA_YUY2422_FMT_TYPE: YUY2 4:2:2
    +
    +
    +
  2. +
+
+
+

Decoder

+
    +
  1. New decode type defined in /opt/amd/ama/ma35/include/xma/xmadecoder.h:

    +
    - XMA_JPEG_DECODER_TYPE: JPEG decoder
    +
    +
    +
  2. +
+
+
+

Encoder

+

Updates are defined in /opt/amd/ama/ma35/include/xma/xmaencoder.h

+
    +
  1. New encoder types:

    +
    - XMA_JPEG_ENCODER_TYPE: JPEG encoder
    +- XMA_LOSSLESS_JPEG_ENCODER_TYPE: Lossless JPEG encoder
    +
    +
    +
  2. +
  3. Updates to XmaEncoderProperties:

    +
    - int32_t        qp;  Fixed quantization value, 0-63 for all codecs, default=-1(not used)
    +- int32_t        minQP; Minimum QP, 0-63, default=0 for all codecs
    +- int32_t        maxQP; Maximum QP, 0-63, default=63 for all codecs
    +
    +
    +
  4. +
  5. New rate control mode:

    +
    - XMA_ENC_RC_MODE_CRF: CRF mode
    +
    +
    +
  6. +
  7. New XmaParameter options:

    +
    - XMA_ENC_PARAM_CABR_CONFIG: "cabr" qualifier
    +- XMA_ENC_PARAM_QUALITY: int32 Lossy JPEG quality (0 to 100), default=-1
    +- XMA_ENC_PARAM_STILL_IMAGE: int32 For AV1 selects between video or series of images
    +
    +
    +
  8. +
  9. New still image enum:

    +
    - XmaEncoderStillImage
    +
    +
    +
  10. +
  11. New XmaDataBuffer member:

    +
    -int64_t dts; Used for passing DTS to downstream muxer
    +
    +
    +
  12. +
+
+
+

Filters

+

Updates are defined in /opt/amd/ama/ma35/include/xma/xmafilter.h

+
    +
  1. New filter options:

    +
    - XMA_THREADING_FLAG_USE_THREAD: To enable threading for filter operations
    +- XMA_THREADING_FLAG_WAIT: To wait for a filter thread to end
    +
    +
    +
  2. +
  3. New XmaParameters members:

    +
    - XMA_MIOFILTER_ML_CORE_ID: ML core ID
    +- XMA_MIOFILTER_ML_MODEL: ML inference model
    +- XMA_MIOFILTER_ML_PERFORMANCE: Enables ML performance logging
    +- XMA_MIOFILTER_ML_TENSOR_DUMP: Enables ML tensor dump
    +- XMA_MIOFILTER_ML_INF_REPEAT: Inference repeat count
    +- XMA_MIOFILTER_ML_INF_PERIOD: Inference application period
    +
    +
    +
  4. +
  5. Additional 2D filters:

    +

    Relevant files under /opt/amd/ama/ma35/include/xma/ are noted below.

    +
    - Crop: See xmacrop.h
    +- Color space conversion: See xmacsc.h
    +- Drawbox: See xmadrawbox.h
    +- Overlay: See xmaoverlay.h
    +- Pad: See xmapad.h
    +- Rotate: See xmarotate.h
    +- Subsample: See xmasubsample.h
    +- Tile: See xmatile.h
    +- Compositor: See xmacompositor.h
    +
    +
    +
  6. +
+
+
+
+

XRM API Reference

+

The Xilinx® FPGA Resource Manager (XRM) library is used to manage the hardware accelerators available in the system. XRM keeps track of total system capacity for each of the compute units such as the decoder, scaler, and encoder.

+

The XRM library includes a daemon, a command line tool and a C application programming interface (API). Using the library API, external applications can communicate with the XRM daemon and perform actions such as reserving, allocating and releasing resources.

+

More details on the XRM command line tool (xrmadm) and the XRM daemon (xrmd) can be found in the XRM Reference Guide section of the documentation.

+

The XRM C APIs are defined in /opt/amd/ama/ma35/include/xrm and /opt/amd/ama/ma35/include/xrm_interface directories.

+

The following sections describe XRM resource allocation APIs, for each versions of XRM library.

+
+

Version 1.0

+

The original version of XRM library that only supports decoder, scaler and encoder reservation APIs.

+
+

Decoder

+

The decoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file.

+
+
+int xrm_dec_reserve(XrmDecodeContext *xrm_dec_ctx, int dev_index, XrmInterfaceProperties *xrm_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant decoder parameters

+
+
+void xrm_dec_release(XrmDecodeContext *xrm_dec_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmDecodeContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file, and XrmInterfaceProperties is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_interface.h file.

+
+
+

Encoder

+

The encoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+int32_t xrm_enc_reserve(XrmEncodeContext *xrm_enc_ctx, int dev_index, int slice_id, bool is_xav1, bool is_ull, XrmInterfaceProperties *xrm_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_enc_release(XrmEncodeContext *xrm_enc_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmEncodeContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+

Scaler

+

The scaler plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+
+int32_t xrm_scale_reserve(XrmScaleContext *scaler_xrm_ctx, int dev_index, XrmInterfaceProperties *input_props, XrmInterfaceProperties *output_props, int num_outputs)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_scale_release(XrmScaleContext *scaler_xrm_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmScaleContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+
+
+

Version 2.0

+

This version of XRM library additionally supports ML engine reservation APIs. To ensure backward compatibility, xrm_props_create() API will reset the input data structure to zero and initializes the new parameters to their default values. It is noted that rebuild of applications are required in order to use version 2.0 of APIs.

+
+

Decoder

+

The decoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file.

+
+
+int xrm_dec_reserve_v2(XrmDecodeContextV2 *xrm_dec_ctx, const XrmDecodePropsV2 *xrm_dec_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant decoder parameters

+
+
+void xrm_dec_release_v2(XrmDecodeContextV2 *xrm_dec_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmDecodeContextV2 and XrmDecodePropsV2 are defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file.

+
+
+

Encoder

+

The encoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+int32_t xrm_enc_reserve_v2(XrmEncodeContextV2 *xrm_enc_ctx, const XrmEncodePropsV2 *xrm_enc_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_enc_release_v2(XrmEncodeContextV2 *xrm_enc_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmEncodeContextV2 and XrmEncodePropsV2 are defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+

Scaler

+

The scaler plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+
+int32_t xrm_scale_reserve_v2(XrmScaleContextV2 *xrm_scale_ctx, const XrmScalePropsV2 *xrm_scale_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_scale_release_v2(XrmScaleContextV2 *scaler_xrm_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmScaleContextV2 and XrmScalePropsV2 are defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+
+

ML

+

The scaler plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_ml_interface.h file.

+
+
+int xrm_ml_reserve_v2(XrmMLContextV2 *xrm_ml_ctx, const XrmMLPropsV2 *xrm_ml_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_ml_release_v2(XrmMLContextV2 *xrm_ml_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmMLContextV2 and XrmMLPropsV2 are defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_ml_interface.h file.

+
+
+
+

Building Sample Examples

+

To build the included sample applications, follow the steps below:

+
cd /opt/amd/ama/ma35/examples/xma/
+chmod -R 777 .
+mkdir build && cd build
+cmake ..
+make -j
+
+
+
+

+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/card_management.html b/latest/card_management.html new file mode 100644 index 00000000..68b607ff --- /dev/null +++ b/latest/card_management.html @@ -0,0 +1,723 @@ + + + + + + + + + + + + + + + Card Management — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Card Management
  • +
  • +
  • +
+
+
+
+
+ +
+

Card Management

+ +
+

Overview

+

The AMD AMA Video SDK builds on the Xilinx Resource Manager (XRM) to interface with AMD video acceleration cards. The AMD AMA Video SDK includes the mautil, mamgmt , and xrmadm command line tools for card installation, upgrade, and management.

+
+

mautil, mamgmt and print_ma35_load

+

The AMD Board Utility (mautil), and the AMD Board Management Utility (mamgmt) are standalone command line tools used to query, and administer AMD acceleration cards. print_ma35_load prints load status of the card in a readable manner.

+
    +
  • mautil is used to examine and identify the installed accelerator card(s). This option is meant for use by unprivileged users to get status information on AMD AMA devices. mautil is available on both the bare-metal host and guest VM.

  • +
  • mamgmt is used to examine devices, flash, reset and administer the installed accelerator card(s). This option is meant for use by privileged users to get status information of AMD AMA devices, flash firmware, create VFs, and reset target devices. mamgmt is not available on VF instances.

  • +
+

The mautil, and mamgmt commands can target specific device(s) by using PCIe BDF (Bus:Device.Function) identifier. The BDF notation works as follows:

+
    +
  • PCI Bus number in hexadecimal, often padded using a leading zeros to two or four digits

  • +
  • A colon (:)

  • +
  • PCI Device number in hexadecimal, often padded using a leading zero to two digits . Sometimes this is also referred to as the slot number.

  • +
  • A decimal point (.)

  • +
  • PCI Function number in hexadecimal.

  • +
+
+
+

xrmadm and xrmd

+

XRM is the software which manages the hardware accelerators available in the system. The XRM Systemd daemon (xrmd) is a background process supporting reservation, allocation, and release of hardware acceleration resources. The XRM xrmadm command line tool is used to interact with the XRM daemon (xrmd) in order to check status and generate resource utilization reports.

+

For more details about the XRM commands specific to the AMD AMA Video SDK refer to the XRM Command Reference Guide.

+
+

Note

+

To start, stop or get the status of xrmd, use systemctl, e.g., to get the current status of the daemon, issue the following:

+
systemctl status xrmd
+
+
+
+
+
+
+

Card and Device Identifiers

+
+

Device BDF

+

The list of all installed AMD AMA Video SDK compatible devices, including their BDF is obtained with the mautil examine or sudo mamgmt examine command.

+

For example, the command below detected 2 devices and lists their BDFs:

+
$ mautil examine
+-----------------------------------------------------------------------------------------
+System Configuration
+-----------------------------------------------------------------------------------------
+  OS Name                  : Linux
+  Release                  : 5.15.0-91-generic
+  Version                  : #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023
+  Machine                  : x86_64
+  CPU Cores                : 24
+  Memory                   : 127950.27 MB (124.95 GB)
+  System Up Time           : 0.02D (00D:00H:33M:57S)
+
+
+Available Devices
+
+  Serial Number                   BDF
+  ------------------------   --------
+  XFxxxxxxxxxx             :  03:00.0 (Primary Device)
+                           :  04:00.0
+  XFyyyyyyyyyy             :  01:00.0 (Primary Device)
+                           :  02:00.0
+
+
+
+
+

Bus ID

+

You can look-up the PCIe bus ID of a device through the following command:

+
cat /sys/class/misc/ama_transcoder{x}/bus_id
+
+
+

, where x is a number between 0 to total number of devices minus 1.

+

Example

+
    +
  • Bus id of /sys/class/misc/ama_transcoder0 is:

    +
    $ cat /sys/class/misc/ama_transcoder0/bus_id
    +  0000:01:00.0
    +
    +
    +
  • +
+
+
+

Firmware Version Number

+

To look-up the version number of each installed firmware, proceed as follows:

+
+
cat /sys/class/misc/ama_transcoder0/version_information
+
+
+

It should return:

+
+
+
ZSP Version = 2.1.0
+SC Version = 9.8.5
+eSecure Version = 1.0.0
+PCIe FW Version = 2.1.0
+PCIe CTRL Patch Version = 1.0.3
+PCIe PHY Patch A Version = 1.0.0
+
+
+
+
+
+
+

mautil

+

The mautil commands provides useful details about your environment and can be used to ensure that your cards and devices are properly detected.:

+
mautil [--help] [--version] [--batch] [--force] [command [commandArgs] --device <BDF>*|all], where "command" is one of the following:
+   examine    - Status of the system and device.
+   validate   - Validates the basic shell acceleration functionality
+
+
+
+

Note

+
    +
  • Running validate sub-command on a device running a video pipeline will impact the performance of the pipeline.

  • +
+
+

The list of applicable devices, for mautil sub-commands, can be obtained via mautil examine.

+

Reports can be generated in JSON format, by adding --format JSON -o <filename> to mautil command.

+
+

Getting Device Report

+

The mautil examine -d <BDF>*|all --report <type> commands provides additional details about the status of each AMD AMA Video SDK compatible device installed.

+

The --report (or -r) switch is used to view specific report(s) of interest:

+
    +
  • electrical: Reports Electrical and power sensors present on the device

  • +
  • device-hw: Provides information on the device's hardware

  • +
  • error-cnt: Reports on device's error counter

  • +
  • host: Prints host information

  • +
  • memory: Reports memory topology of the device

  • +
  • pcie-info: PCIe information of the device

  • +
  • thermal: Reports thermal sensors present on the device

  • +
  • utilization: Reports on accelerators resource utilization

  • +
  • all: Prints all the known status

  • +
+

An example usage for thermal and electrical reports, for the device with BDF 01:00.0 is:

+
mautil examine -r thermal electrical -d 01:00.0
+
+=========================================================================================
+1/1 [01:00.0] : MA35 Device
+-----------------------------------------------------------------------------------------
+Thermal Info [01:00.0]
+-----------------------------------------------------------------------------------------
+  Device Temperature       :  76 C
+  Board Temperature        :  70 C
+  Threshold Temperature    :  85 C
+  Max Operating Temperature: 105 C
+  Shutdown Temperature     : 110 C
+
+-----------------------------------------------------------------------------------------
+Electrical Info [01:00.0]
+-----------------------------------------------------------------------------------------
+Device:
+  Sensor-0                 :  0.749 V /  4.700 A /  3.520 W
+  Sensor-1                 :  0.750 V /  6.500 A /  4.875 W
+  Power Consumed           :  8.395 Watts
+
+  Aux                      :  0.737 V
+  DDR                      :  0.867 V
+  ENC                      :  0.751 V
+  ML Engine                :  0.752 V
+
+Board:
+  3V Aux                   :  3.296 V /  0.080 A /  0.264 W
+  3V Pex                   :  3.296 V /  0.374 A /  1.233 W
+  12V Pex                  : 12.192 V /  1.200 A / 14.630 W
+  Power Consumed           : 16.127 Watts
+
+
+
+

Device Validation

+

The mautil validate -d <BDF>*|all validate commands runs a number diagnostic tests on a device to ensure its proper operation:

+
 mautil validate -d  01:00.0 02:00.0
+...
+       Device              Test                       Progress                        %    Time
+=============  ================  ==================================================  ====  ====
+      01:00.0         mmio_perf  ##################################################  100%   11s 1s
+      02:00.0         mmio_perf  ##################################################  100%   12s 1s
+...
+
+
+
+
+
+
+

mamgmt

+

The mamgmt provides administrative commands for managing the installed devices, and as such, it must be run with root privileges. In addition to commands that are provided by mautil, mamgmt also allows for managing Virtual Functions (VF) on a device, and flashing firmwares:

+
mamgmt [--help] [--version] [--batch] [--force] [command [commandArgs] --device <BDF>*|all], where "command" is one of the following:
+  examine      - Status of the system and device
+  flash        - Update flash of a given device
+  numvfs       - Create a VF or destroys the active VF
+  reset        - Resets the given device
+
+
+
+

Getting Device Report

+

An example usage for all available reports on 01:00.0 is:

+
mamgmt examine -d 01:00.0 -r all
+-----------------------------------------------------------------------------------------
+System Configuration
+-----------------------------------------------------------------------------------------
+  OS Name                  : Linux
+  Release                  : 5.15.0-91-generic
+  Version                  : #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023
+  Machine                  : x86_64
+  CPU Cores                : 24
+  Memory                   : 127950.27 MB (124.95 GB)
+  System Up Time           : 0.07D (00D:01H:38M:27S)
+
+
+Available Devices
+
+  Serial Number                   BDF
+  ------------------------   --------
+  XFxxxxxxxxxxx            :  03:00.0 (Primary Device)
+                           :  04:00.0
+  XFLyyyyyyyyy             :  01:00.0 (Primary Device)
+                           :  02:00.0
+
+
+=========================================================================================
+1/1 [01:00.0] : MA35 Device
+-----------------------------------------------------------------------------------------
+PCIe Info [01:00.0]
+-----------------------------------------------------------------------------------------
+  Vendor ID                : 0X10EE
+  Device ID                : 0X5070
+  Sub Vendor ID            : 0X10EE
+  Sub Device ID            : 0X000E
+  Class Type               : 0x048000 (Multimedia Controller)
+  Link Negotiated Gen      : 5
+  Link Width               : x4
+
+-----------------------------------------------------------------------------------------
+Device Info [01:00.0]
+-----------------------------------------------------------------------------------------
+Board Hardware
+  Part Number              : 05105-02
+  Product Name             : ALVEO MA35D PQ
+  Product Revision         : 1
+  OEM ID                   : 3704
+  Serial Number            : XFxxxxxxx
+
+Firmware
+  eSecure                  : 1.0.0
+  PCIeCtlPatch             : 1.0.3
+  PCIeFw                   : 2.1.0
+  PCIePhyPatch             : 1.0.0
+  SC                       : 9.7.39
+  ZSP                      : 2.0.4
+
+-----------------------------------------------------------------------------------------
+Thermal Info [01:00.0]
+-----------------------------------------------------------------------------------------
+  Device Temperature       :  75 C
+  Board Temperature        :  69 C
+  Threshold Temperature    :  85 C
+  Max Operating Temperature: 105 C
+  Shutdown Temperature     : 110 C
+
+-----------------------------------------------------------------------------------------
+Electrical Info [01:00.0]
+-----------------------------------------------------------------------------------------
+Device:
+  Sensor-0                 :  0.749 V /  4.600 A /  3.445 W
+  Sensor-1                 :  0.750 V /  6.500 A /  4.875 W
+  Power Consumed           :  8.320 Watts
+
+  Aux                      :  0.737 V
+  DDR                      :  0.868 V
+  ENC                      :  0.750 V
+  ML Engine                :  0.752 V
+
+Board:
+  3V Aux                   :  3.296 V /  0.080 A /  0.264 W
+  3V Pex                   :  3.296 V /  0.374 A /  1.233 W
+  12V Pex                  : 12.192 V /  1.187 A / 14.472 W
+  Power Consumed           : 15.968 Watts
+
+-----------------------------------------------------------------------------------------
+Error Counter Info [01:00.0]
+-----------------------------------------------------------------------------------------
+AXI-SRAM (Uncorrectable)
+--------------------------
+  Segment-0                :         0
+  Segment-1                :         0
+
+DDR (Uncorrectable)          Counter-0  Counter-1  Counter-2  Counter-3
+--------------------------   ---------  ---------  ---------  ---------
+  Segment-0                :         0          0          0          0
+  Segment-1                :         0          0          0          0
+
+PCIe (Uncorrectable)       :         0
+
+AXI-SRAM (Correctable)
+--------------------------
+  Segment-0                :         0
+  Segment-1                :         0
+
+DDR (Correctable)            Counter-0  Counter-1  Counter-2  Counter-3
+--------------------------   ---------  ---------  ---------  ---------
+  Segment-0                :         0          0          0          0
+  Segment-1                :         0          0          0          0
+
+PCIe (Correctable)         :         0
+
+-----------------------------------------------------------------------------------------
+Memory Info [01:00.0]
+-----------------------------------------------------------------------------------------
+
+Segment-0 Counters            AXI-Read  AXI-Write   DFI-Read  DFI-Write
+                                (MBps)     (MBps)     (MBps)     (MBps)
+--------------------------   ---------  ---------  ---------  ---------
+  0                        :        33          0         66          0
+  1                        :        68          0        135          0
+  2                        :        33          0         66          0
+  3                        :        68          0        135          0
+--------------------------   ---------  ---------  ---------  ---------
+  Total                    :       202          0        402          0
+
+Segment-1 Counters            AXI-Read  AXI-Write   DFI-Read  DFI-Write
+                                (MBps)     (MBps)     (MBps)     (MBps)
+--------------------------   ---------  ---------  ---------  ---------
+  0                        :         0          0          0          0
+  1                        :         0          0          0          0
+  2                        :         0          0          0          0
+  3                        :         0          0          0          0
+--------------------------   ---------  ---------  ---------  ---------
+  Total                    :         0          0          0          0
+
+-----------------------------------------------------------------------------------------
+Device Memory Utilization [01:00.0]
+-----------------------------------------------------------------------------------------
+
+Type                              Used      Total     % Used
+--------------------------   ---------  ---------  ---------
+  Segment-0                :         0     784384          0
+  Segment-1                :         0     917504          0
+  MMIO                     :      4974      59392          8
+
+
+

Reports can be generated in JSON format, by adding --format JSON -o <filename> to mamgmt examine command.

+
+
+

Device Reset

+

An example usage to reset devices 01:00.0 and 02:00.0 is:

+
mamgmt reset -d 01:00.0 02:00.0
+****************************************************
+Reset Command Completed
+****************************************************
+
+
+
+
+

VF Creation and Destruction

+

To create and destroy a VF device, issue the following commands, respectively:

+
$ mamgmt -d <BDF> numvfs -v 1 # Create VF device
+$ mamgmt -d <BDF> numvfs -v 0 # Destroy VF device
+
+
+
+
+

Flashing Firmware

+

The flash subcommand provides means of programming a card, verifying flash images or for extracting a flash section from a device.

+

To flash or verify a flashing process, specify the <BDF>*|all of target device(s)s:

+
mamgmt flash [-d arg] [-r arg] [-p arg] [-v arg] [-s] [-o arg] [--help]. The following operations are supported:
+
+  -r, --read         - Specify the flash section to read into a file. Syntax:
+                         <flash_section>:<filename>
+                         Valid values for <flash_section> are:
+                         ZSP, SC and All
+  -p, --program      - Specify images to use to update the persistent device.
+  -v, --verify       - Verify if the device has same firmware as in specified image file.
+  -s, --sequential   - Program sequentially
+  -o, --output       - Direct the output to the given file
+
+
+

For example, the following command flashes all subsystems on all devices, using ma35_firmware.bin image:

+
sudo /opt/amd/ama/ma35/bin/mamgmt flash -d all -p /opt/amd/ama/ma35/firmware/ma35_firmware.bin
+Flash Regions and Devices To Be Programmed
+=======================================
+Flash Region: ZSP
+
+BDF        Current Version  New Version
+---------  ---------------  -----------
+  01:00.0            2.0.4        2.1.0
+  02:00.0            2.0.4        2.1.0
+...
+
+***********************************
+*        Programming Flash        *
+*   Do not power off the system   *
+***********************************
+
+=================================================================
+Programming Flash Region: ZSP  Device(s): 4
+
+   BDF     New Version            Status              Time        Phase
+---------  -----------  ---------------------------  -------  ---------------
+  01:00.0        2.1.0  [====================] 100%      41s   Successful
+  02:00.0        2.1.0  [====================] 100%      41s   Successful
+...
+=================================================================
+Total running time: 2m 22s
+
+****************************************************
+Reboot your machine for new firmware to take effect
+****************************************************
+Flash Command Completed
+****************************************************
+
+
+

To compare a flashed device with a flash image, use the --verify operation:

+
sudo /opt/amd/ama/ma35/bin/mamgmt flash  -d all -v /opt/amd/ama/ma35/firmware/ma35_firmware.bin
+****************************************************
+Device: 1/4 [01:00.0] MA35 Device
+****************************************************
+Image /opt/amd/ama/ma35/firmware/ma35_firmware.bin version 2.1.0 matches device ZSP.AMD firmware
+Image /opt/amd/ama/ma35/firmware/ma35_firmware.bin version 9.7.39 matches device SC firmware
+...
+
+
+
+
+
+

Checking Resource Utilization

+

Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

+
source /opt/amd/ama/ma35/scripts/setup.sh
+
+
+

Note that this command should be run only once per boot.

+

To check the current loading of all the devices in your system, use the following command:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

This will generate a report in JSON format containing the load information for all the compute unit (CU) resources. The report contains a section for each device in the system. The device sections contain sub-sections for each of the CUs (decoder, scaler, lookahead, encoder, am ML) in that device. For example, the load information for the encoder on device 0 may look as follows:

+
"device_0": {
+  ...
+  "cu_2": {
+       "cuId         ": "2",
+       "cuType       ": "IP Kernel",
+       "kernelName   ": "encoder",
+       "kernelAlias  ": "ENCODER_TYPE1_AMA",
+       "instanceName ": "encoder_1",
+       "cuName       ": "encoder:encoder_1",
+       "kernelPlugin ": "",
+       "maxCapacity  ": "497664000",
+       "numChanInuse ": "0",
+       "usedLoad     ": "0 of 1000000",
+       "reservedLoad ": "0 of 1000000",
+       "resrvUsedLoad": "0 of 1000000"
+   },
+
+
+

The usedLoad value indicates how much of that resource is currently being used and reserved. The value will range from 0 (nothing running) to 1000000 (fully loaded). The reservedLoad value indicates how much of that resource is being reserved using XRM. The resrvUsedLoad value indicates how much of the reserved load is actually being used.

+ +
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/encoder_comp_matrix.html b/latest/encoder_comp_matrix.html new file mode 100644 index 00000000..6760e868 --- /dev/null +++ b/latest/encoder_comp_matrix.html @@ -0,0 +1,2031 @@ + + + + + + + + + + + + + + + Encoding Compatibility Matrix — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Encoding Compatibility Matrix
  • +
  • +
  • +
+
+
+
+
+ +
+

Encoding Compatibility Matrix

+ +

Given the many adjustable parameters of an AMD AMA Video encoder, not all combinations of such parameters are permissible. The following tables describe the compatibility matrix for each encoder type.

+
+

AVC and HEVC Encoders

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LA Depth

Latency Mode

Cores

Slow Preset

Medium Preset

Fast Preset

No B Frames

CQP

CBR

VBR

CVBR

CRF

CABR

Spatial AQ

Temporal AQ

ROI QP Map

7-49

+
Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-3
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

6

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-2
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

5

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

4

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

3

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

2

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

1

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
Y
+
+

0

+
ULL
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
+
+

AV1 Type 1 Encoder

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LA Depth

Latency Mode

Cores

Slow Preset

Medium Preset

Fast Preset

No B Frames

CQP

CBR

VBR

CVBR

CRF

CABR

Spatial AQ

Temporal AQ

ROI QP Map

11-53

+
Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-7
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

10

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-6
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

9

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-5
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

8

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-4
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

7

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-3
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

6

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-2
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

5

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

4

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

3

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

2

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

1

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

0

+
ULL
+
+
+
1 or 2
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
+

Note

+
    +
  1. When using 2 cores, the minimum resolution should have width >= 720 and height >= 720

  2. +
  3. The Slow preset only has an impact for 10-bit content. For 8-bit content it is identical to the medium preset. This statement applies to all values of lookahead depth.

  4. +
+
+
+
+

AV1 Type 2 Encoder

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LA Depth

Latency Mode

Cores

Slow Preset

Medium Preset

Fast Preset

No B Frames

CQP

CBR

VBR

CVBR

CRF

CABR

Spatial AQ

Temporal AQ

ROI QP Map

7-49

+
Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-3
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

6

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-2
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

5

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

4

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

3

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+

2

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+

1

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+

0

+
ULL
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/examples.html b/latest/examples.html new file mode 100644 index 00000000..9f654fc2 --- /dev/null +++ b/latest/examples.html @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + Tutorials and Examples — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tutorials and Examples
  • +
  • +
  • +
+
+
+ + + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/examples/amf/amf_encoder.html b/latest/examples/amf/amf_encoder.html new file mode 100644 index 00000000..8339e304 --- /dev/null +++ b/latest/examples/amf/amf_encoder.html @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + AMF Encoder Tutorial — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMF Encoder Tutorial
  • +
  • +
  • +
+
+
+
+
+ +

Under Construction

+
+

AMF Encoder Tutorial

+

The examples in the /opt/amd/ama/ma35/bin folder illustrate how C-based applications can perform encoding in AMD AMA Video SDK devices, using the AMF (Advanced Media Framework) APIs.

+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/examples/ffmpeg/filters.html b/latest/examples/ffmpeg/filters.html new file mode 100644 index 00000000..89430914 --- /dev/null +++ b/latest/examples/ffmpeg/filters.html @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + FFmpeg Examples using Software Filters — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

FFmpeg Examples using Software Filters

+ +

Examples shown in this section describe how to use FFmpeg combining both AMD accelerated functions and software filters. In all these examples, an AMA compatible device, e.g., MA35D, is used to decode the input stream, the decoded frames are transfered back to the host using the hwdownload filter, one or more software filters are applied to the decoded frames and the filtered frames are transfered back to the device using hwupload for encoding. It should be noted that, when possible, zero-copy filters such as split and fps should be used, to minimize the traffic between the host CPU and target device.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Video Rotation

+

The following example demonstrates how to generate multiple flip-over operations on the host CPU and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "split=2[a][b]; \
+  [a]hwdownload,transpose=dir=1:passthrough=none,hwupload[a1]; \
+  [b]hwdownload,transpose=dir=2:passthrough=none,hwupload[b1]" \
+ -map "[a1]" -c:v h264_ama  -f mp4 <OUT DIR>/90_flip.mp4 \
+ -map "[b1]" -c:v h264_ama  -f mp4 <OUT DIR>/270_flip.mp4
+
+
+

, where INPUT is the path to the input AVC clip and OUT DIR is the name of the output directory. See FFmpeg's filters for details on passthrough and split filters.

+
+
+

Logo Overlay

+

The following example demonstrates how to overlay a yuv420p image on a decoded video, through host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -i <y4M LOGO> -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "[1]hwdownload[vid],[vid][0]overlay=x=0:y=0[l],[l]format=yuv420p[lay],[lay]hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/overlay.mp4
+
+
+

Note that input to accelerated encoder, h264_ama, is in yuv420p format. See FFmpeg's overlay filter for detail usage.

+
+
+

Crop and Shift

+

The following example demonstrates how to crop a decoded video, at a given x and y offsets, through host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "hwdownload,crop=640:480:(in_w-800):(in_h-out_h)/2,hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/crop.mp4
+
+
+
+
+

Video Composition

+

The following example demonstrates how to compose a tiled video on the host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -out_fmt yuv420p -i <INPUT_1> -c:v h264_ama -out_fmt yuv420p -i <INPUT_2> \
+ -c:v h264_ama -out_fmt yuv420p -i <INPUT_3> -c:v h264_ama -out_fmt yuv420p -i <INPUT_4> \
+ -filter_complex "[0]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[00];[1]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[11];\
+  [2]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[22];[3]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[33]; [00][11]hstack[top];\
+  [22][33]hstack[bot]; [top][bot] vstack,hwupload" \
+ -c:v h264_ama -b:v 15M -vframes 600 -f mp4 <OUT DIR>/compose.mp4
+
+
+
+

Note

+

For 10-bit support, the following changes are required to the provided examples:

+
    +
  1. Replace -out_fmt yuv420p with -out_fmt yuv420p10le

  2. +
  3. Add format=yuv420p10le to the filter graph.

  4. +
+

As an example, the following command shows 10-bit crop and shift:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p10le -i <INPUT> \
+ -filter_complex "hwdownload,format=yuv420p10le,crop=640:480:(in_w-800):(in_h-out_h)/2,hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/crop_10b.mp4
+
+
+
+
+
+

Chroma Subsampling

+

The following example demonstrates how to perform 4:2:2 to 4:2:0 chroma subsampling on the host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -i <INPUT>  -vf "format=yuv420p,hwupload" -c:v h264_ama -b:v 1M -f mp4 <OUTPUT>
+
+
+

, where <INPUT> is path of the 442 input raw file and <OUTPUT> is the encoded video file.

+
+
+

Decoding and De-interlacing

+

Given that AMD AMA SDK neither accepts interlaced contents nor performs de-interlacing, such operations need to be performed on the host CPU. The following example demonstrates how to perform interlaced to progressive transcoding:

+
ffmpeg -hwaccel ama -i <INPUT>  -filter_complex  "yadif=0,hwupload" -c:v h264_ama -f mp4 <OUTPUT>
+
+
+

, where <INPUT> is path of the interlaced content and <OUTPUT> is the encoded video file.

+
+
+

Text Insertion

+

The following example demonstrates how to insert a text into encode stream:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -re \
+-f lavfi -i testsrc=duration=60:size=1920x1080:rate=60,format=yuv420p -f rawvideo \
+-filter_complex "drawtext=text='Hello:y=10:fontcolor=yellow:fontsize=36',format=yuv420p, hwupload" \
+-c:v h264_ama -f mp4 <OUTPUT>
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/examples/ffmpeg/quality_analysis.html b/latest/examples/ffmpeg/quality_analysis.html new file mode 100644 index 00000000..da58d258 --- /dev/null +++ b/latest/examples/ffmpeg/quality_analysis.html @@ -0,0 +1,360 @@ + + + + + + + + + + + + + + + Video Quality Examples — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Video Quality Examples

+

This page is dedicated to explaining some of the details behind Video Quality (VQ), how it is measured, and how you can optimize your FFmpeg commands with the AMD AMA Video SDK to maximize its performance.

+

Further documentation on this topic can be found in the Tuning Video Quality section of the AMD AMA Video SDK user guide.

+ +
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Introduction to Video Quality

+

There has been a longstanding goal for video engineers to quantitatively determine the output quality of an encoder without having to watch and inspect every individual frame. This has led to an evolution of algorithmic solutions, the most common of which are:

+ +

Many people will argue which metric is best (although PSNR is commonly considered the least accurate). Jan Ozer from the Streaming Media Center posted his experimental correlation of MOS vs the above metrics. You can review the findings here.

+

Furthermore, due to the industry standard of tracking encoder "performance" to quantitative metrics like the ones listed above, many encoders have "taught to the test"; that is, they provide different command-line arguments that will give higher scores but may look worse to the human eye. For example, common CPU encoders x264 and x265 have a tune parameter which optimizes to objective metrics.

+

This page discusses the AMD AMA Video SDK command line flags used to optimize for objective quality (scores) and subjective quality (visual appeal) and provides additional details as to what is happening behind the scenes and why.

+
+
+

Optimized Settings for the AMD AMA Video SDK

+

It is highly recommended to perform encoding on raw video clips; that is, clips that have not undergone a transform/compression/encoding in the past. This ensures that the clips are in a universally known state in order to fairly compare encoders.

+

Alternatively, you can add the flags to decode before encoding, and the results will remain accurate as long as the same pre-encoded file is used as the source across all encoders under test. Information on this process can be found on the FFmpeg tutorial page.

+

Flags not illustrated in this page are covered in the Using FFmpeg chapter of the AMD AMA Video SDK user guide.

+

The following table demonstrates various encoder parameters that effect VQ and latency.

+ + ++++++ + + + + + + + + + + + + + + +
Video Tuning Parameters

Tune Mode

Latency Setting

Preset Type

Encoder

VMAF

+

VQ

+

SSIM

+

PSNR

+

(See -tune_metrics)

+

Normal

+

Ultra Low Latency

+

(See -lookahead_depth)

+

Fast

+

Medium

+

Slow

+

(See -preset)

+

h264_ama

+

hevc_ama

+

av1_ama

+

(See -c:v)

+
+

Various permutations of Metrics, Latency and Preset are possible. The following sections provide demonstrative examples.

+
+

AV1 VMAF - Normal Latency - Medium Preset

+

In this mode, which is the default mode, the only adjustable parameter is the tuning mode. The following example, illustrates the VMAF tune mode, for AV1 encoder

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v av1_ama -tune_metrics 4 -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -tune_metrics 4 specifies VMAF optimization mode.

+
+
+

AVC VMAF - Normal Latency - Slow Preset

+

In this mode, real-time performance at capacity is not guaranteed; however, better results are obtained, with respect to the selected tune metric. Note that this mode is not applicable to either types of AV1.

+

The following example, illustrates the VMAF tune mode, for AVC encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v h264_ama -tune_metrics 4 -preset slow -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -preset slow optimizes the objective tuning modes.

+
+
+

AV1 VMAF - Ultra Low Latency - Medium Preset

+

Ultra Low Latency (ULL) is achieved by setting the -lookahead_depth to 0. The following example, illustrates the VMAF tune ULL mode, for AV1 encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v av1_ama -tune_metrics 4 -b:v 2000k -lookahead_depth 0 -f rawvideo <OUTPUT>
+
+
+
+
+

AVC VMAF - Ultra Low Latency - Slow Preset

+

This mode is the combination of ULL and metric optimized options. Note that this mode is not applicable to either types of AV1.

+

The following example, illustrates the VMAF tune ULL mode, for AVC encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v h264_ama -tune_metrics 4 -lookahead_depth 0 -preset slow -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -preset slow optimizes the objective tuning modes.

+
+
+
+

Running PSNR/SSIM/VMAF Scores

+

Due to licensing reasons, the FFmpeg binary delivered in this package does not include a comprehensive set of codecs or plugins required for scoring video quality. You have many options:

+
    +
  1. (Easiest) Download a static FFmpeg build from John Van Sickle which has VMAF (among other plugins) precompiled + installed

  2. +
  3. Recompile another version FFmpeg and include the VMAF library

  4. +
  5. Recompile the FFmpeg starting from the source code included in this repository and include the VMAF library. For instructions on how to customize and rebuild the FFmpeg provided with the AMD AMA Video SDK, see the Rebuilding FFmpeg section

  6. +
+

The following sample command line demonstrates a typical VMAF calculation, through FFmpeg:

+
<FFMPEG PATH>/ffmpeg -i <DISTORTED FILE> -framerate <FRAME RATE> -s <RESOLUTION> -pix_fmt yuv420p -i <ORIGINAL> \
+-lavfi libvmaf="log_fmt=json:ms_ssim=1:ssim=1:psnr=1:log_path=/<LOG FILE PATH>.vmaf.json:model_path=<PATH TO VMAF MODEL>" -f null -
+
+
+

, where FFMPEG PATH is the path to modified FFmpeg, DISTORTED FILE is the encoded file, RESOLUTION is WidthxHeigth resolution of the original clip, ORIGINAL is the original clip, LOG FILE PATH is the path of log file and PATH TO VMAF MODEL is the path to an appropriate VMAF model, which typically is vmaf_4k_v0.6.1.pkl for 4K resolution or vmaf_float_v0.6.1.pkl for lower resolutions. See Models for relevant details. The above command line calculates PSNR, SSIM and VMAF, in json format.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/examples/ffmpeg/tutorials.html b/latest/examples/ffmpeg/tutorials.html new file mode 100644 index 00000000..8949fd7e --- /dev/null +++ b/latest/examples/ffmpeg/tutorials.html @@ -0,0 +1,1005 @@ + + + + + + + + + + + + + + + FFmpeg Tutorials — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

FFmpeg Tutorials

+

This page provides tutorials on how to use FFmpeg with the AMD AMA Video SDK. The complete reference guide for the FFmpeg version included in the AMD AMA Video SDK can be found here.

+

The tutorials break down the commands, starting with simple decode, scale and encode pipelines. The tutorials end with different varieties of full transcode pipelines.

+ +
+

Device Selection

+

As noted in Video Codec Unit section, each card is made of 2 devices, and by default all processing tasks are delegated to the first device in the systems. (See mautil to find out how many devices are available, in a runtime environment.) To override this behavior, default and non-default devices must be set, explicitly. To do so within a FFmpeg command, the default device is set by using FFmpeg's hardware acceleration framework, i.e., ffmpeg -hwaccel ama  -hwaccel_device /dev/ama_transcoder0 ..., and can be further refined, by delegating subtasks to non-default devices by using hwupload_ama. See Multi-device Transcode for an example.

+
+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+

+
+
+
+

Simple FFmpeg Examples

+

Some of the examples read or write RAW files from disk (encode-only or decode-only pipelines). There is a chance that due to the massive bandwidth required for operating on these RAW files, you will notice a drop in FPS; this is not due to the AMD AMA Video SDK but the disk speeds. We recommend reading/writing from /dev/shm which is a RAM disk.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Decode Only

+

This example accepts a clip that is already encoded in H.264, and will decode the file into a RAW format and save it to disk.

+

Command Line:

+
ffmpeg -y -hwaccel ama -c:v h264_ama -out_fmt nv12 -i <INPUT> \
+ -vf hwdownload,format=nv12 -f rawvideo /tmp/dec_out.nv12
+
+
+

Explanation of the flags:

+
    +
  • ffmpeg

    +
      +
    • The ffmpeg application, which is provided by AMD, and moved to the top of the PATH when you sourced the setup.sh script

    • +
    +
  • +
  • hwaccel ama

    +
      +
    • Instructs FFmpeg to use accelerated plugins provided by AMD AMA Video SDK

    • +
    +
  • +
  • -out_fmt nv12

    +
      +
    • Specifies nv12 output format for the decoded video. Note that this option has to be specified twice: 1) To convert from the internal buffer format to nv12 in the decoder and 2) To convert when transferring to the host.

    • +
    +
  • +
  • -f rawvideo

    +
      +
    • This signifies that the video is in a raw format, without container or other metadata/information about the clip

    • +
    +
  • +
  • -c:v h264_ama

    +
      +
    • Declares the decoder's codec for video (as opposed to, e.g., audio -c:a ac3) is the hardware-accelerated H.264 decoder

    • +
    +
  • +
  • -i <INPUT>

    +
      +
    • The input file to be transcoded

    • +
    +
  • +
  • -vf hwdownload

    +
      +
    • Internally, the decoder operates on AMD AMA Video SDK type buffers to improve performance. To convert back to a host-buffer, you must execute this filter.

    • +
    +
  • +
  • -y

    +
      +
    • Enable overwrite without prompting the user if they're sure

    • +
    +
  • +
  • /tmp/dec_out.yuv

    +
      +
    • The decoder will save the file to the path above

    • +
    +
  • +
+
+
+

Encode Only

+

This example accepts a RAW 1080p60 clip in YUV420 format. It will pass the clip to the encoder to produce an AV1 encoded MP4 output with a target bitrate of 5Mbps and saves it to disk. The command uses the default VQ setting. See FFmpeg Video Quality for details.

+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -b:v 5M -f mp4 -y sn1_av1.mp4
+
+
+

Explanation of the flags:

+
    +
  • -re

    +
      +
    • Flag to maintain the target frame rate

    • +
    +
  • +
  • -s 1920x1080

    +
      +
    • Since there is no container or metadata in a RAW clip, the user must define the input clip's resolution/size. This example states the input is 1080p

    • +
    +
  • +
  • -framerate 60

    +
      +
    • Again, without metadata, the encoder requires the framerate of the incoming stream

    • +
    +
  • +
  • -pix_fmt yuv420p

    +
      +
    • The color space of the encoder is by default yuv420p. this example is defining the input clip as being this same color space

    • +
    +
  • +
  • -f mp4

    +
      +
    • Sets the output video container to MP4

    • +
    +
  • +
  • -b:v 5M

    +
      +
    • The target bitrate of the encoded stream. 8M signifies a target bitrate of 8 Megabits per second. You can also use 8000K or 8000000.

    • +
    +
  • +
  • -c:v av1_ama

    +
      +
    • Declares the encoder's codec for video (as opposed to audio -c:a ...) is the hardware-accelerated AV1 encoder

    • +
    +
  • +
  • /tmp/enc_out.mp4

    +
      +
    • Save the output in the above path.

    • +
    +
  • +
+
+

4:2:2 10 Bit Conversion

+

To encode YUV, 4:2:2, 10 bit pixel format to YUV, 4:2:0, 8 bit use the following command:

+

Command Line:

+
ffmpeg -hwaccel ama -i <INPUT>  -vf "format=yuv420p,hwupload" -c:v h264_ama -b:v 1M <OUTPUT>
+
+
+

Explanation of the flags:

+
    +
  • -vf "format=yuv420p,hwupload"

    +
      +
    • Instructs the pipeline to upload and convert the input video as yuv420p.

    • +
    +
  • +
+
+
+

Constant Rate Factor (CRF) Mode

+

The following examples demonstrate the usage of the -crf flag and impact of the -qp option on the quality of the encoded streams.

+
+
High Quality Encoding
+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -crf 1 -qp 0 -f mp4 sn1_crf_hq.mp4
+
+
+

Explanation of the flags:

+
    +
  • -crf 1

    +
      +
    • Enables the -crf mode

    • +
    +
  • +
  • -qp 0

    +
      +
    • Sets the encoded AV1 stream to highest CRF quality

    • +
    +
  • +
+
+
+
Low Quality Encoding
+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -crf 1 -qp 255 -f mp4 sn1_crf_lq.mp4
+
+
+

Explanation of the flags:

+
    +
  • -qp 255

    +
      +
    • Sets the encoded AV1 stream to lowest CRF quality

    • +
    +
  • +
+
+
+
+
+

Basic Transcode

+

This example takes an H.264 clip and transcodes it to HEVC at the bitrate of 8Mbps. The output is written into /tmp/h264_to_hevc.

+

Command Line:

+
ffmpeg -y -hwaccel ama -c:v h264_ama -i <INPUT> \
+ -c:v hevc_ama -b:v 8M  -f rawvideo  /tmp/h264_to_hevc.hevc
+
+
+
+
+

Decode Only Into Multiple-Resolution Outputs

+

This example decodes an existing H.264 file and then scales it into multiple resolutions as defined below. It will not re-encode them, but save the RAW outputs to disk under /tmp/_scale<resolution>.yuv

+

Command Line:

+
 ffmpeg -y -hwaccel ama \
+-c:v h264_ama  -out_fmt nv12 -i <INPUT>  \
+-filter_complex "scaler_ama=outputs=4:out_res=(1920x1080|full|nv12)(1280x720|full|nv12)(720x480|full|nv12)(360x240|full|nv12) [a][b][c][d]; \
+                 [a]hwdownload,format=nv12[a1];[b]hwdownload,format=nv12[b1];[c]hwdownload,format=nv12[c1];[d]hwdownload,format=nv12[d1]" \
+-map '[a1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_1080p.yuv \
+-map '[b1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_720p.yuv  \
+-map '[c1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_480p.yuv \
+-map '[d1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_240p.yuv
+
+
+

Explanation of the flags:

+
    +
  • -filter_complex

    +
      +
    • The FFmpeg -filter_complex flag allows combining multiple filters together using a graph-like syntax. This example uses the scaler_ama to create 4 output resolutions from the input stream.

    • +
    • The scaler_ama filter configures the hardware-accelerated scaler to produce 4 output resolutions (1920x1080, 1280x720, 720x480, and 360x240). For each output, the width, height, frame rate and pixel format are defined as arguments to out_res option as in (WidthxHeight|Rate|Format). The 4 outputs are transfered to the host as a1, b1, c1 and d1 respectively.

    • +
    +
  • +
  • -map "[ID]"

    +
      +
    • Selects an output of the filter graph. The flags that follow apply to the selected stream.

    • +
    +
  • +
  • /tmp/scale_<resolution>.yuv

    +
      +
    • Save the output files to the paths listed

    • +
    +
  • +
+
+
+

Encode Only Into Multiple-Resolution Outputs

+

This example takes a raw 1080p60 YUV file, scales it down to different resolutions and frame rates, encodes each of the scaled streams to different formats and saves them to disk under /tmp/<encode format>_<resolution>p<frame rate>.mp4

+

Command Line:

+
ffmpeg -y -hwaccel ama -f rawvideo -pix_fmt yuv420p -s:v 1920x1080 -framerate 60 -i <INPUT> \
+-filter_complex "hwupload,scaler_ama=outputs=4:out_res=(1920x1080|full)(1280x720|half)(720x480|half)(360x240|half) [a][b][c][d]" \
+-map '[a]' -c:v hevc_ama -b:v 6M -f mp4 -y /tmp/hevc_1080p60.mp4 \
+-map '[b]' -c:v av1_ama  -b:v 2M -f mp4 -y /tmp/av1_720p30.mp4 \
+-map '[c]' -c:v h264_ama -b:v 1M -f mp4 -y /tmp/h264_480p30.mp4 \
+-map '[d]' -c:v av1_ama  -b:v 1M -f mp4 -y /tmp/av1_240p30.mp4
+
+
+

Explanation of the flags:

+
    +
  • -filter_complex "hwupload...

    +
      +
    • Specifies that video clip gets upload to the device.

    • +
    +
  • +
  • -filter_complex "...scaler_ama=outputs=4:out_res=...(1280x720|half)...

    +
      +
    • Declares scaler output of given resolution and rate. See scaler_ama for more details.

    • +
    +
  • +
  • -c:v [hevc_ama | av1_ama | h264_ama]

    +
      +
    • Declares various encode types HEVC, AV1 and H.264, respectively.

    • +
    +
  • +
  • /tmp/encode-format_resoultion.encode-format

    +
      +
    • Saves the output clips to the location listed

    • +
    +
  • +
+
+
+

Transcode with Multiple-Resolution Outputs

+

This example implements a complete transcoding pipeline on an 1080p60 H.264 input. It decodes the input stream, scales it to 4 different resolutions and encodes scaler's outputs into various formats and saves them to disk under /tmp/<encoder format>_<resolution>.mp4

+

Command Line:

+
ffmpeg -y -hwaccel ama \
+-c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=4:out_res=(1920x1080)(1280x720)(720x480)(360x240) [a][b][c][d]" \
+-map '[a]' -c:v hevc_ama -b:v 6M -f mp4 -y /tmp/hevc_1080p.mp4 \
+-map '[b]' -c:v av1_ama  -b:v 2M -f mp4 -y /tmp/av1_720p.mp4 \
+-map '[c]' -c:v h264_ama -b:v 1M -f mp4 -y /tmp/h264_480p.mp4 \
+-map '[d]' -c:v av1_ama  -b:v 1M -f mp4 -y /tmp/av1_240p.mp4
+
+
+
+
+

Transcode in ULL Mode

+

This example implements an ultra low latency transcode pipeline. For more details refer Tuning Transcode Latency.

+

Command Line:

+
ffmpeg  -hide_banner -loglevel error -y -hwaccel ama -low_latency 1 -c:v h264_ama -i <INPUT> \
+-c:v hevc_ama -b:v 10M -lookahead_depth 0 -f rawvideo /tmp/h264_to_hevc.hevc
+
+
+

Explanation of the flags:

+
    +
  • -low_latency 1

    +
      +
    • Enables low latency decoding mode.

    • +
    +
  • +
  • -lookahead_depth 0

    +
      +
    • LA size of 0 triggers ultra low latency encoding mode.

    • +
    +
  • +
+
+
+

8kp30 Transcode

+

This example shows how to construct an AV1 Type-1 8kp30 transcode pipeline.

+

Command Line:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i <INPUT> -c:v av1_ama -cores 2 -y -f mp4 <OUTPUT>
+
+
+

Explanation of the flags:

+
    +
  • -cores 2

    +
      +
    • Uses both cores for AV1 Type-1 encoding

    • +
    +
  • +
+
+
+

Multi-slice Transcode

+

This example shows how to transcode a 8kp30 input into a 4kp30 AVC and a 4kp30 HEVC.

+

Command Line:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -resize 3840x2160 -i <INPUT> -filter_complex "split=2[a][b]" \
+-map "[a]" -c:v h264_ama -slice 0 -f mp4 <OUTPUT 1> \
+-map "[b]" -c:v hevc_ama -slice 1 -f mp4 <OUTOUT 2>
+
+
+

Explanation of the flags:

+
    +
  • -resize 3840x2160

    +
      +
    • Uses decoder's downscaling capability

    • +
    +
  • +
  • -slice 0 and 1

    +
      +
    • Explicitly targets both slices, for 2x4kp60 encoding. Note that explicit slice assignment is only required if xrmd is not enabled.

    • +
    +
  • +
+
+
+

Multi-device Transcode

+

This example demonstrates hwdownload_ama ability to execute encoding or 2D processing tasks, on an arbitrary device.

+

Command Line:

+
ffmpeg  -hwaccel ama -hwaccel_device /dev/ama_transcoderX -c:v h264_ama -out_fmt yuv420p -i <INPUT> -filter_complex "hwdownload,hwupload_ama=device=Y" -c:v h264_ama -f mp4 <OUTPUT>
+
+
+

Explanation of the flags:

+
    +
  • hwdownload

    +
      +
    • Downloads the decoded stream from device X to the host

    • +
    +
  • +
  • hwupload_ama=device=Y

    +
      +
    • Uploads the decoded stream from the host to device Y for encoding

    • +
    +
  • +
+
+
+

Double Density Example with xrmd

+

This example demonstrates an example on how to achieve 4x4kp60 density on a single device

+

Command Line:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -i <4Kp6 H.264 file> \
+ -filter_complex "split=4[a][b][c][d]" \
+ -map "[a]" -c:v av1_ama -f rawvideo -y /tmp/out_3840x2160_0.av1 \
+ -map "[b]" -c:v hevc_ama -f rawvideo -y /tmp/out_3840x2160_0.hevc \
+ -map "[c]" -c:v av1_ama -f rawvideo -y /tmp/out_3840x2160_1.av1 \
+ -map "[d]" -c:v hevc_ama -f rawvideo -y /tmp/out_3840x2160_1.hevc
+
+
+

Explanation of the flags:

+
    +
  • -split

    +
      +
    • Splits input into several identical outputs.

    • +
    +
  • +
+
+
+

Double Density Example without xrmd

+

This example demonstrates how to achieve 4x4kp60 density on a single device, by explicitly allocating tasks on slices 0 and 1. Note in this example xrmd service has to be stopped.

+

Command Line:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -i <4Kp6 H.264 file> \
+ -filter_complex "split=4[a][b][c][d]" \
+ -map "[a]" -c:v av1_ama -slice 0 -f rawvideo -y /tmp/out_3840x2160_0.av1 \
+ -map "[b]" -c:v hevc_ama -slice 0 -f rawvideo -y /tmp/out_3840x2160_0.hevc \
+ -map "[c]" -c:v av1_ama -slice 1 -f rawvideo -y /tmp/out_3840x2160_1.av1 \
+ -map "[d]" -c:v hevc_ama -slice 1 -f rawvideo -y /tmp/out_3840x2160_1.hevc
+
+
+
+
+

Full Double Density

+

This example demonstrates how to achieve full density, by distributing transcode pipelines, between 2 devices.

+

Command Line:

+
for i in `seq 1 16`; do
+ ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoderX -re -c:v h264_ama -i <30 FPS INPUT> -c:v <TYPE 2 ENCODER> -lookahead_depth 10 -f null /dev/null > out_T2_0_$i.log 2>&1 &
+ ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoderX -re -c:v h264_ama -i <30 FPS INPUT> -c:v av1_ama -lookahead_depth 10 -f null /dev/null > out_av1_0_$i.log 2>&1 &
+ ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoderY -re -c:v h264_ama -i <30 FPS INPUT> -c:v <TYPE 2 ENCODER> -lookahead_depth 10 -f null /dev/null > out_T2_1_$i.log 2>&1 &
+ ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoderY -re -c:v h264_ama -i <30 FPS INPUT> -c:v av1_ama -lookahead_depth 10 -f null /dev/null > out_av1_1_$i.log 2>&1 &
+done
+
+
+

, where X and Y represent 2 different devices. <30 FPS INPUT> is a 30 FPS encoded video input. (The above example assumes H264 encoded input.), and <TYPE 2 ENCODER> is any one of AV1 Type-2, H264 or HEVC encoder. Note that by default av1_ama uses Type-1 AV1 encoder.

+

The above example transcodes 64 simultaneous 1080p30 pipelines. Note that if XRMD is disabled, then -slice parameter must be set explicitly.

+
+
+

Image Decoding

+

The following example demonstrates how to decode a series of JPEG images into a AVC video.

+

Command Line:

+
ffmpeg -framerate 60 -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v jpeg_ama -i <FILE PRFIX>_%03d.jpg  \
+-r 60 -c:v h264_ama -b:v 5M -f mp4 <OUTPUT>
+
+
+

, where <FILE PRFIX>_%03d.jpg indicates the name pattern of the JPEG images.

+
+
+

Image Encoding

+

The following example demonstrates how to encode a video stream into a series of JPEG images.

+

Command Line:

+
ffmpeg -y -hwaccel ama -s:v 1920x1080 -pix_fmt yuv420p -i <YUV INPUT> -vf "fps=1,hwupload" -c:v jpeg_ama -quality 90 <FILE PRFIX>_%04d.jpg
+
+
+

, where -quality specifies JPEG encoding quality.

+
+
+
+

2D Processing

+

This section provides examples on usage of various 2D Processing utilities. See 2D Engine for details.

+
+

Cropping

+

The following example demonstrates a 720P crop at offset (320, 180).

+

Command Line:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -re -out_fmt yuv420p -c:v h264_ama -i <INPUT> \
+-filter_complex "crop_ama=b_left=320:b_top=180:b_w=1280:b_h=720 [b]" -map "[b]" -c:v h264_ama -f mp4 <OUTPUT>
+
+
+
+
+

Padding

+

The following example demonstrates padding a 720P clip into a 1080p.

+

Command Line:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i <720P INPUT> \
+-filter_complex "pad_ama=p_left=320:p_top=180:p_w=1920:p_h=1080:color=pink" -c:v h264_ama -b:v 5M -f mp4 <1080P OUTPUT>
+
+
+
+
+

Video Rotation

+

The following example demonstrates how to transcode a flip-over operation

+

Command Line:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -i <INPUT> -filter_complex "rotate_ama=angle=180[c]" -map "[c]" -c:v hevc_ama -f mp4 <OUTPUT>
+
+
+

, where INPUT and OUTPUT are any one of supported encoded files. Note that only rotations which are multiples of 90 degrees are supported.

+
+
+

Color Space Conversion

+

The following example demonstrates how to convert from RGB to YUV:

+

Command Line:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -pix_fmt bgra -i <INPUT> -filter_complex "[0:v]hwupload,colorspace_ama=csc=rgb2yuv,hwdownload" -pix_fmt yuv420p -f rawvideo <OUTPUT>
+
+
+

The following example demonstrates how to encode a RGBA video file :

+

Command Line:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -f rawvideo -s 1920x1080 -pix_fmt bgra -i <INPUT> -filter_complex "[0:v]hwupload,colorspace_ama=csc=rgb2yuv" -c:v hevc_ama -f mp4 <OUTPUT>
+
+
+

Similarly, the following example demonstrates YUV to planar RGB conversion:

+

Command Line:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i <INPUT> -filter_complex "colorspace_ama=csc=yuv2rgb,hwdownload" -pix_fmt bgra -f rawvideo -y <RGBP OUTPUT>
+
+
+
+
+

Chroma Subsampling

+

The following example demonstrates how to convert from 4:2:2 pixel format to 4:2:0:

+

Command Line:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 \
+-pix_fmt yuv422p -i <INPUT> -filter_complex "hwupload,subsample_ama,hwdownload" -pix_fmt yuv420p -f rawvideo <OUTPUT>
+
+
+

, where graphic processor is set for pixel subsampling operation.

+

The following example demonstrates how to transcode a 4:2:2 pixel format video to 4:2:0 using both the host, for decoding, and an AMA AMD compatible card, for subsampling and encoding:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -i <INPUT> -filter_complex "hwupload,subsample_ama" -c:v h264_ama -b:v 5M -f mp4 <OUTPUT>
+
+
+

, where graphic processor is set for pixel subsampling operation.

+
+
+

Picture In Picture (PIP)

+

The following example demonstrates how to create a PIP video:

+

Command Line:

+
ffmpeg -y -hide_banner  -hwaccel ama -hwaccel_device /dev/ama_transcoder0  \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 1> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 2> \
+-filter_complex "[1:v]scaler_ama=outputs=1:out_res=(720x480|yuv420p)[p]; \
+                 [0:v][p]overlay_ama=x=0:y=0[x]" \
+-map "[x]" -c:v h264_ama -frames 1000 -b:v 15M -f mp4 -y <OUTPUT>
+
+
+

, where graphic processor is set for scaling and overlay operations, with INPUT 1 set as the background.

+
+
+

Tiling

+

The following example demonstrates how to create a tiling video:

+

Command Line:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 1> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 2> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 3> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 4> \
+-filter_complex "[0:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[0]; \
+                 [1:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[1]; \
+                 [2:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[2]; \
+                 [3:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[3]; \
+                 [0][1][2][3]tile_ama=layout=2x2:inputs=4:w=1920:h=1080[r]"
+-map "[r]" -c:v h264_ama -b:v 15M -f mp4 -y <OUTPUT>
+
+
+

, where graphic processor's is set for scaling and tiling operations, with INPUT 1 ... INPUT 4 set as tiles.

+
+
+

Thumbnailing

+

The following example shows how to generate JPEG thumnails from a video asset.

+

Command Line:

+
ffmpeg -hwaccel ama -c:v h264_ama -i <INPUT> -vf "select='eq(pict_type\,I)', scaler_ama=outputs=1:out_res=(144x144|full)" -vsync vfr -c:v jpeg_ama out_%03d.jpg
+
+
+

JPEG thumbnails are named from out_000.jpg through out_999.jpg.

+

Alternatively, down scaling can be done through the decoder.

+

Command Line:

+
ffmpeg -hwaccel ama -c:v h264_ama -resize 144x144 -i <INPUT> -vf "select='eq(pict_type\,I)'" -vsync vfr -c:v jpeg_ama out_%03d.jpg
+
+
+
+
+

Composition

+

The following example demonstrates how to create a static composition.

+

Command Line:

+
/opt/amd/ama/ma35/bin/ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 1> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 2> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 3> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 4> \
+-filter_complex "[0:v][1:v][2:v][3:v]\
+compositor_ama=inputs=4:out_res=1920x1080:enable_background=1:background=black:\
+input_params=\
+(960x540|angle=90|out_x=8|out_y=8|zorder=1)\
+(960x540|angle=90|out_x=408|out_y=208)\
+(960x540|angle=90|out_x=808|out_y=408|zorder=1)\
+(960x540|angle=90|out_x=1208|out_y=608|border_inner_size=2)[co];\
+[co]sendcmd=f=composite_static.txt[c]" \
+-map "[c]" -c:v av1_ama -b:v 5M -vframes 570 -f mp4 composite_test.mp4
+
+
+

, where composite_static.txt contains:

+
00:00:01.000 compositor_ama 'background=pink';
+00:00:03.000 compositor_ama 'background=green:input=1:border_inner_size=4:border_outer_size=2:border_color=blue';
+00:00:06.000 compositor_ama 'input=2:border_inner_size=4:border_outer_size=2:border_color=brown:input=0:border_inner_size=10:border_outer_size=10';
+00:00:08.000 compositor_ama 'input=3:flip=h:zorder=2:out_res=1280x540:in_y=1082';
+00:00:10.000 compositor_ama 'input=0=flip=v';
+00:00:12.000 compositor_ama 'angle=90';
+00:00:15.000 compositor_ama 'inputs_enabled=2';
+00:00:16.000 compositor_ama 'inputs_enabled=3';
+00:00:17.000 compositor_ama 'zorder=0'
+
+
+

This example starts by overlapping 3 scaled and rotated input clips, with a black background. The static composition file, then directs the pipeline to change the background color, z order, boarder line,etc. at prescribed intervals.

+

The compositor can also be executed in a dynamic manner, where different properties can be adjusted interactively, through ZeroMQ protocol.

+

Command Line:

+
/opt/amd/ama/ma35/bin/ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 1> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 2> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 3> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 4> \
+-filter_complex "[0:v][1:v][2:v][3:v]\
+compositor_ama=inputs=4:out_res=1920x1080:enable_background=1:background=black:\
+input_params=\
+(960x540|angle=90|out_x=8|out_y=8|zorder=1)\
+(960x540|angle=90|out_x=408|out_y=208)\
+(960x540|angle=90|out_x=808|out_y=408|zorder=1)\
+(960x540|angle=90|out_x=1208|out_y=608|border_inner_size=2)[co]; \
+[co]zmq=bind_address=tcp\\\://127.0.0.1\\\:5555[c]" \
+-map "[c]" -c:v h264_ama -b:v 5M  570 -f mpegts udp://MC_IP:MC_PORT??pkt_size=1316
+
+
+

To interactively change the compositor's properties, create the following Python script:

+
#!/usr/bin/python3
+import zmq
+import sys
+
+context = zmq.Context()
+Url=sys.argv[1]
+socket = context.socket(zmq.REQ)
+socket.connect(Url)
+cmd = sys.stdin.read()
+socket.send_string(cmd)
+recv = socket.recv()
+print(f"Received reply [{recv.decode()}]")
+
+
+

, and update properties as follows, e.g. the following changes the background to pink:

+
printf "compositor_ama background=pink" |  ./zmq_send.py "tcp://localhost:5555"
+
+
+

To observe the interactive updates, on a machine within the same multicast network, issue the following command:

+
ffplay udp://MC_IP:MC_PORT
+
+
+

, where MC_IP and MC_PORT are multicast address and multicast ports, respectively.

+
+
+
+

ML Processing

+

This section provides examples on usage of ROI for both face and text VQ enhancement.

+
+

ML Based Face ROI

+

The following example demonstrates how to perform ROI face encoding on an AMA AMD compatible card:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=3:out_res=(1280x720|yuv420p)(1280x720|yuv420p)(1280x720|rgbp)[def][ori][a]; \
+                 [a]ml_ama=model=roi:model_args=type=face[mlop];[ori][mlop]roi_scale_ama[res1]" \
+-map [res1] -c:v hevc_ama -b:v 300K -f mp4 <OUTPUT 1> \
+-map [def] -c:v hevc_ama -b:v 300K -f mp4 <OUTPUT 2>
+
+
+

, where ML engine is set for face ROI enhancement, and the resulting enhanced image, res1, is encoded.

+
+
+

ROI Gain Factor

+

The following example demonstrates the impact of probability-to-QP mapping gain factor:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i  <INPUT> \
+   -filter_complex "split=outputs=5 [plain][ml0][l][n][h]; \
+                             [ml0] scaler_ama=outputs=1:out_res=(1280x720|rgbp) [ml1]; \
+                             [ml1] ml_ama=model=roi:model_args=type=face [ml2]; \
+                             [ml2] split=outputs=3 [ml3_1][ml3_2][ml3_3]; \
+                             [l][ml3_1] roi_scale_ama=strength=low [ml_l]; \
+                             [n][ml3_2] roi_scale_ama=strength=normal [ml_n]; \
+                             [h][ml3_3] roi_scale_ama=strength=high [ml_h]" \
+     -map '[plain]' -c:v h264_ama -b:v 300k -f mp4 <OUTPUT1> \
+     -map '[ml_l]' -c:v h264_ama -b:v 300k -f mp4 <OUTPUT2> \
+     -map '[ml_n]' -c:v h264_ama -b:v 300k -f mp4 <OUTPUT3> \
+     -map '[ml_h]' -c:v h264_ama -b:v 300k -f mp4 <OUTPUT4>
+
+
+

Here <OUTPUTx>, for x={1-4}, represent encode streams without ML, low, normal and high gain factors, respectively.

+
+
+

ROI Ladder Transcoding

+

The following example demonstrates how to perform ROI transcoding at different resolutions:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i <INPUT> \
+ -filter_complex "split=2[s_org][s_ml]; \
+                  [s_org]scaler_ama=outputs=4:out_res=(1920x1080)(1280x720)(720x480)(360x240) [sa][sb][sc][sd]; \
+                  [s_ml]scaler_ama=outputs=1:(1280x720|rgbp)[ml_in]; \
+                  [ml_in]ml_ama=model=roi:model_args=type=face[ml_out]; [ml_out]split=4[ml_out_sa][ml_out_sb][ml_out_sc][ml_out_sd]; \
+                  [sa][ml_out_sa]roi_scale_ama[roi_a]; \
+                  [sb][ml_out_sb]roi_scale_ama[roi_b]; \
+                  [sc][ml_out_sc]roi_scale_ama[roi_c]; \
+                  [sd][ml_out_sd]roi_scale_ama[roi_d]" \
+-map [roi_a] -c:v av1_ama -b:v 300K -f rawvideo <OUTPUT1> \
+-map [roi_b] -c:v av1_ama -b:v 300K -f rawvideo <OUTPUT2> \
+-map [roi_c] -c:v av1_ama -b:v 300K -f rawvideo <OUTPUT3> \
+-map [roi_d] -c:v av1_ama -b:v 300K -f rawvideo <OUTPUT4>
+
+
+

Note that scale engine is invoke twice. Once for scaling the outputs and second time to perform pixel conversion.

+
+
+

ROI Face Detection

+

The following example demonstrates inference engine's ability to detect faces:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -i <INPUT> \
+-filter_complex "scaler_ama=outputs=2:out_res=(1280x720|yuv420p)(1280x720|rgbp)[ori][mlip]; \
+                 [mlip]ml_ama=model=roi:model_args=type=face[mlop]; \
+                 [ori][mlop]roi_scale_ama=roi_map_type=roi[rso]; \
+                 [rso]hwdownload, roi_overlay_ama[res1]" \
+-map [res1] -f rawvideo -pix_fmt yuv420p -f rawvideo <OUTPUT>
+
+
+

, where software plugin roi_overlay_ama overlays transparent rectangular boxes around all detected faces.

+
+
+

ML Based Text ROI

+

The following example demonstrates how to perform ROI text encoding on an AMA AMD compatible card:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -i <INPUT> \
+-filter_complex "scaler_ama=outputs=3:out_res=(1280x720|yuv420p)(1280x720|yuv420p)(1280x720|rgbp)[def][ori][a]; \
+                 [a]ml_ama=model=roi:model_args=type=text[mlop];[ori][mlop]roi_scale_ama[res1]" \
+-map [res1] -c:v hevc_ama -b:v 200K -f mp4  <OUTPUT 1> \
+-map [def] -c:v hevc_ama -b:v 200K -f mp4  <OUTPUT 2>
+
+
+

, where ML engine is set for text ROI enhancement, and the resulting enhanced image, res1, is encoded.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/examples/gstreamer/filters.html b/latest/examples/gstreamer/filters.html new file mode 100644 index 00000000..7bb698f1 --- /dev/null +++ b/latest/examples/gstreamer/filters.html @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + GStreamer Examples using Software Filters — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Examples using Software Filters

+ +

The /opt/amd/ama/ma35/examples/gstreamer/ama_pipeline_scripts/filters/ folder contains different examples showing how to use GStreamer combining both AMD accelerated functions and software filters. In all these examples, an AMA compatible device, e.g., MA35D, is used to decode the input stream, the decoded frames are transfered back to the host using the ama_download filter, one of more software filters are applied to the decoded frames and the filtered frames are transfered back to the device using ama_upload for encoding. It should be noted that, when possible, zero-copy filters such as tee should be used, to minimize the traffic between the host CPU and target device.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Video Rotation

+
    +
  • Example script: 01_rotate_video.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and will send the rotated, encoded h.264 output to /tmp/xil_rotate_<N>.mp4.

+
+
+

Logo Overlay

+
    +
  • Example script: 02_logo_overlay.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and an image file ("logo"). It will scale the logo to 500x100, place it 16 pixels right and 16 pixels down from the top-left corner of the output video file, which will be an encoded h.264 output saved to /tmp/xil_logo_overlay.mp4.

+
+
+

Crop and Zoom

+
    +
  • Example script: 03_crop_zoom.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and will crop a 300x200 sized section of the original video. The section's top left corner begins at 20 pixels to the right, and 10 pixels down from the top-left corner of the original video. The output video is h.264 encoded and is saved to /tmp/xil_crop_zoom.mp4

+
+
+

Video Composition

+
    +
  • Example script: 04_multi_comp.sh

  • +
+

This example accepts 4x 8-bit, YUV420, pre-encoded h264 files of equal dimensions, and will create an output 2x2 composite video which will be an encoded h.264 output saved to /tmp/xil_multi_comp.mp4. The output resolution will be equal to the original input.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/examples/gstreamer/tutorials.html b/latest/examples/gstreamer/tutorials.html new file mode 100644 index 00000000..12191d67 --- /dev/null +++ b/latest/examples/gstreamer/tutorials.html @@ -0,0 +1,456 @@ + + + + + + + + + + + + + + + GStreamer Introductory Tutorials — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Introductory Tutorials

+

This page provides tutorials on how to use GStreamer with the AMD AMA Video SDK. The complete reference guide for the GStreamer version included in the AMD AMA Video SDK can be found here.

+ +
+

Device Selection

+

As noted in Video Codec Unit section, each card is made of 2 devices, and by default all processing tasks are delegated to the first device in the systems. (See mautil to find out how many devices are available, in a runtime environment.) To override this behavior, default and non-default devices must be set, explicitly. See Working with Multiple Devices for more explanation, and Multidevice Transcode for sample usage.

+
+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Simple GStreamer Examples

+

By default, all the example scripts use the filesink plug-in and write the output files into the /tmp directory.

+

Some of the examples read or write RAW files from disk (encode-only or decode-only pipelines). There is a chance that due to the massive bandwidth required for operating on these RAW files, you will notice a drop in FPS; this is not due to the AMD AMA Video SDK but the disk speeds. We recommend reading/writing from /dev/shm which is a RAM disk.

+

Most of the scripts allow to use the fakesink plug-in which only displays performance numbers and will not write outputs to disk. This is done by setting the “fakesink” argument to 1.

+

Each script contains error checks before passing arguments to GStreamer pipeline command to help users avoid giving incorrect arguments.

+

Most of the example scripts included in this directory take H.264 input streams. To use H.265 input streams, update the scripts to use the h265parse GStreamer plug-in instead of h264parse.

+

For brevity purposes, explanations of the GStreamer element properties are not repeated after they have been explained once. The detailed explanation of the each GStreamer pipeline element property can be obtained by using gst-inspect-1.0 <element name> (e.g. gst-inspect-1.0 ama_av1enc).

+
+

Decode only

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! parsebin ! h264parse ! ama_h264dec ! capsfilter 'caps=video/x-raw(memory:AMAMemory),format=NV12,width=<WIDTH>,height=<HEIGHT>' !  ama_download ! filesink location=<OUTPUT>
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • gst-launch-1.0

    +
      +
    • The GStreamer application, which is provided by AMD, and moved to the top of the PATH when you sourced the setup.sh script

    • +
    +
  • +
  • filesrc location

    +
      +
    • Location of the file h.264 to read

    • +
    +
  • +
  • parsebin

    +
      +
    • Unpacks the container to elementary stream

    • +
    +
  • +
  • h264parse

    +
      +
    • Parses H.264 streams

    • +
    +
  • +
  • ama_h264dec

    +
      +
    • GStreamer plug-in that provides functionality to decode H.264 encoded streams. This plug-in accepts input encoded stream in byte-stream/NALU format only and produces NV12 frames.

    • +
    +
  • +
  • capsfilter

    +
      +
    • Specifies the capabilities of the streams. Note that keyword capsfilter is optional.

    • +
    +
  • +
+

In the above cli, <WIDTH> and <HEIGHT> are optional parameters that describe the desired resolution of the decoded stream. It should be noted that resizing is done on the decoder and as such does not impose any cost on the host CPU or the accelerated scaler Scaler Plugin.

+
+
+

Downscaling in decoder

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! parsebin ! h264parse ! ama_h264dec allow-downscaling=true ! capsfilter 'caps=video/x-raw(memory:AMAMemory),format=NV12,width=<WIDTH>,height=<HEIGHT>' !  ama_download ! filesink location=<OUTPUT>
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • allow-downscaling

    +
      +
    • Option to inform the downstream capfilter that downscaling will be performed though decoder.

    • +
    +
  • +
+
+
+

Encode only

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! rawvideoparse width=1920 height=1080 format=i420 framerate=60/1 ! ama_upload ! ama_h264enc ! h264parse ! filesink location=/tmp/out.h264
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • ama_h264enc

    +
      +
    • GStreamer plug-in that provides functionality to encode raw bit streams into AVC byte-stream.

    • +
    +
  • +
  • rawvideoparse

    +
      +
    • This element converts unformatted data streams into timestamped raw video frames, with specified resolution, frame rate and pixel format.

    • +
    +
  • +
  • ama_upload

    +
      +
    • This plugin transfer raw video file content from host to the device

    • +
    +
  • +
+
+
+

Transcode with Multiple-Resolution outputs

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! parsebin ! \
+h264parse ! ama_h264dec ! identity eos-after=1200 ! ama_scaler name=s \
+s.src_0 ! 'video/x-raw(memory:AMAMemory),width=1920,height=1080' ! ama_h265enc bitrate=6000000 ! queue ! filesink location=/tmp/hevc_1080p.hevc \
+s.src_1 ! 'video/x-raw(memory:AMAMemory),width=1280,height=720' ! ama_av1enc bitrate=2000000 ! queue ! filesink location=/tmp/av1_720p.av1 \
+s.src_2 ! 'video/x-raw(memory:AMAMemory),width=720,height=480' ! ama_h264enc bitrate=1000000 ! queue ! filesink location=/tmp/h264_480p.h264 \
+s.src_3 ! 'video/x-raw(memory:AMAMemory),width=360,height=240' ! ama_av1enc bitrate=1000000 ! queue ! filesink location=/tmp/av1_240p.av1
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • queue

    +
    +
      +
    • The queue will create a new thread on the source pad to decouple the processing on sink and source pad.

    • +
    +
    +
  • +
  • identity

    +
    +
      +
    • In this usage, forces the insertion of EOS after 1200 buffers.

    • +
    +
    +
  • +
+

For more comprehensive sets of examples refer to /opt/amd/ama/ma35/examples/gstreamer/ama_pipeline_scripts/tutorials folder.

+
+
+

Multidevice Transcode

+

This example demonstrates AMA SDK's DMA plugins capabilities to execute any of transcode operations, on a given device.

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! qtdemux ! h264parse ! ama_h264dec device=X ! "video/x-raw(memory:AMAMemory),format=I420" ! ama_download ! ama_upload device=Y ! ama_h264enc  ! h264parse ! mp4mux ! filesink location=<OUTPUT>
+
+
+

, where X and Y are device indices for decode and encode operations, respectively.

+
+
+

2D Filters

+

This following examples demonstrate AMA SDK's 2D plugins capabilities.

+

Subsampling:

+
gst-launch-1.0 -v \
+  filesrc location=<4:2:2 YUV> ! rawvideoparse format=uyvy width=1920 height=1080 framerate=30/1 \
+    ! ama_upload ! ama_videoconvert ! ama_download ! video/x-raw,format=I420 ! filesink location=<4:2:0 YUV>
+
+
+

Color space conversion:

+
gst-launch-1.0 -v \
+ filesrc location=<4:2:0 YUV> ! rawvideoparse format=i420 width=1920 height=1080 framerate=24/1 \
+ ! ama_upload ! ama_videoconvert ! ama_download ! video/x-raw,format=BGRA ! filesink location=<RGB>
+
+
+

Rotate:

+
gst-launch-1.0 -v videotestsrc num-buffers=300 ! video/x-raw,format=I420 ! ama_upload ! ama_rotate angle=rotate-90 !  ama_h264enc bitrate=1000000 ! filesink location=rotate.h264
+
+
+

Padding:

+
gst-launch-1.0 -v filesrc location=<4:2:0 YUV> ! rawvideoparse format=i420 width=1920 height=1080 framerate=24/1 ! \
+ ama_upload ! ama_videopad top=150 right=30 left=30 bottom=10 color=0x00FFAA00 ! ama_h264enc bitrate=1000000 ! filesink location=pad.h264
+
+
+

Crop:

+
gst-launch-1.0 -v filesrc location=<4:2:0 YUV> ! rawvideoparse format=i420 width=1920 height=1080 framerate=24/1 ! \
+ ama_upload ! ama_videocrop top=150 right=30 left=30 bottom=10 ! ama_h264enc bitrate=1000000 ! filesink location=pad.h264
+
+
+

Tile:

+
gst-launch-1.0 -v \
+ ama_tile name=tile grid_x=2 grid_y=2 \
+ ! 'video/x-raw(memory:AMAMemory)' ! ama_h264enc bitrate=1000000 ! filesink location=tile.h264 \
+ filesrc location=<INPUT 1> ! qtdemux ! h264parse ! ama_h264dec ! tile.sink_0 \
+ filesrc location=<INPUT 2> ! qtdemux ! h264parse ! ama_h264dec ! tile.sink_1 \
+ filesrc location=<INPUT 3> ! qtdemux ! h264parse ! ama_h264dec ! tile.sink_2 \
+ filesrc location=<INPUT 4> ! qtdemux ! h264parse ! ama_h264dec ! tile.sink_3
+
+
+

Overlay:

+
gst-launch-1.0 -v  ama_overlay name=overlay offset-x=50 offset-y=100 !  'video/x-raw(memory:AMAMemory)' ! ama_h264enc bitrate=1000000 ! filesink location=overlay.h264  \
+ filesrc location=<Background Video> ! qtdemux ! h264parse ! ama_h264dec ! 'video/x-raw(memory:AMAMemory),format=I420' ! overlay.video \
+ videotestsrc pattern=checkers-8 num-buffers=300 ! video/x-raw,format=I420,framerate=60/1 ! ama_upload ! overlay.overlay
+
+
+

Drawbox:

+
gst-launch-1.0 -v \
+ filesrc location=<INPUT> ! qtdemux ! h264parse ! ama_h264dec \
+ ! ama_drawbox top=10 left=20 width=200 height=400 thickness=10 color=0x00FFFF00 \
+ ! ama_h264enc bitrate=1000000 ! filesink location=drawbox.h264
+
+
+

Composition:

+
gst-launch-1.0  -v ama_compositor name=comp params-file=./dynamic_params.txt \
+ sink_0::width=200 sink_0::height=100 sink_0::xpos=0 sink_0::ypos=0 sink_0::border-inner-width=2 sink_0::border-color=0x00FF0000 \
+ sink_1::width=200 sink_1::height=100 sink_1::xpos=0 sink_1::ypos=108 sink_1::border-inner-width=2 sink_1::border-color=0x00FF0000 \
+ ! 'video/x-raw(memory:AMAMemory),format=I420' ! ama_h264enc bitrate=5000000 ! h264parse ! mp4mux ! filesink location=comp.mp4 \
+ filesrc location=<INPUT 1> ! qtdemux ! h264parse ! ama_h264dec ! comp.sink_0 \
+ filesrc location=<INPUT 2> ! qtdemux ! h264parse ! ama_h264dec ! comp.sink_1
+
+
+

, where parameter file contains:

+
00:00:01.000 compositor_ama 'background=pink';
+00:00:03.000 compositor_ama 'background=green:input=1:border_inner_size=4:border_outer_size=2:border_color=blue';
+00:00:06.000 compositor_ama 'input=1:border_inner_size=4:border_outer_size=2:border_color=brown:input=0:border_inner_size=10:border_outer_size=10';
+00:00:08.000 compositor_ama 'background=0x0000FF00';
+00:00:10.000 compositor_ama 'input=1:flip=hv';
+
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/examples/gstreamer/xabrladder.html b/latest/examples/gstreamer/xabrladder.html new file mode 100644 index 00000000..b3579cc5 --- /dev/null +++ b/latest/examples/gstreamer/xabrladder.html @@ -0,0 +1,391 @@ + + + + + + + + + + + + + + + GStreamer ABR Ladder Application — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer ABR Ladder Application

+ +
+

Introduction

+

The sample multi-scale program located at /opt/amd/ama/ma35/bin/gstreamer/ is a command line utility which implements the GStreamer video transcoding pipeline described in the diagram below. This application expects an input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams. The resolution of each output stream is configured using a JSON file (by default: /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder/abrladder.json). The output streams produced by this application are saved in the /tmp/ladder_outputs/ folder.

+

This application is installed through the amd-ama-gstreamer package. If this package is not present on your system, install it by following the steps described in the package feed page. The source code for this application is also available under, /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder.

+GStreamer pipeline of the ama_xabrladder application +
+

Note

+

This example supports input files of elementary stream NAL type or mp4 containers, with H.264/H.265 elementary stream in it. No other formats are supported

+
+
+
+

Host System Requirement

+
    +
  • AMD AMA Video SDK

  • +
  • amd-ama-gstreamer package

  • +
+
+
+

Usage

+

Below are the input parameters required to run the application.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Parameter

Short Form

Description

+
+--devidx
+
+ +
+
+-i
+
+ +
+
device index
+
Type: int
+
Range: 0 to 31
+
Default: NA
+
Option: Mandatory
+
+
+
+--json
+
+ +
+
+-j
+
+ +
+
JSON file used to describe the configuration of the ABR ladder
+
Type: string
+
Range: NA
+
Default: /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder
+
Option: Optional
+
+
+
+--codectype
+
+ +
+
+-c
+
+ +
+
Output codec type
+
Type: int
+
Range: 0 (H264), 1 (H265)
+
Default: NA
+
Option: Mandatory
+
+
+
+--file
+
+ +
+
+-f
+
+ +
+
Input file path name (mp4/elementary-stream)
+
Type: string
+
Range: NA
+
Default: NA
+
Option: Mandatory
+
+
+
+--forcekeyframe
+
+ +
+
+-k
+
+ +
+
Keyframe (IDR frame) insertion frequency in number of frames
+
Type: int
+
Range: NA
+
Default: 0
+
Option: Optional
+
+
+
+
+

Examples

+

Below are example commands for the ABR ladder use case. The output files are stored in /tmp/ladder_outputs/ folder. Ensure that enough space is available in this folder.

+
    +
  1. Running one ABR ladder on one device:

    +
    ama_xabrladder  --devidx 0 --codectype 0 --file <path to file>
    +
    +
    +
  2. +
+

The above command takes the input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams based on the codec type provided (0 for H.264 and 1 for H.265) with the following resolutions: 720p60, 720p30, 480p30, 360p30 and 160p30.

+
    +
  1. Running one ABR ladder on one device without lookahead:

    +
    ama_xabrladder  --devidx 0 --lookahead_enable 0 --codectype 0 --file <path to file>
    +
    +
    +
  2. +
+

The above command takes the input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams based on the codec type provided (0 for H.264 and 1 for H.265) with the following resolutions: 720p60, 720p30, 480p30, 360p30 and 160p30.

+
    +
  1. Running one ABR ladder on one device with lookahead enabled, and using the short-form options:

    +
    ama_xabrladder -i 0  -c 0 -f <path to file>
    +
    +
    +
  2. +
  3. Running two ABR ladders, mapping each ladder to a specific device using the devidx option:

    +
    ama_xabrladder --devidx 0  --codectype 1 --file <path to file>
    +ama_xabrladder --devidx 1  --codectype 1 --file <path to file>
    +
    +
    +
  4. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/examples/gstreamer/xcompositor.html b/latest/examples/gstreamer/xcompositor.html new file mode 100644 index 00000000..ddd3fd38 --- /dev/null +++ b/latest/examples/gstreamer/xcompositor.html @@ -0,0 +1,365 @@ + + + + + + + + + + + + + + + GStreamer Compositor Application — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Compositor Application

+ +
+

Introduction

+

The sample compositor program located at /opt/amd/ama/ma35/bin/gstreamer/ is a command line utility which implements the GStreamer video transcoding pipeline described in the diagram below. This application expects four input video files 60(mp4 with H.264/H.265 or H.264/H.265 elementary stream). The resolution of each input cannot exceed 1080p. The application creates an output stream by first composing the four inputs in a 2x2 grid, then by adding an optional logo and lastly by inserting a time stamp.

+

This application is installed through the amd-ama-gstreamer package. If this package is not present on your system, install it by following the steps described in the package feed page. The source code for this application is also available under, /opt/amd/ama/ma35/examples/gstreamer/ama_xcompositor.

+GStreamer pipeline of the ama_xcompositor application +
+

+
+
+
+

Host System Requirement

+
    +
  • AMD AMA Video SDK

  • +
  • amd-ama-gstreamer package

  • +
+
+
+

Usage

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Parameter

Description

-f

+
mp4/elementary-stream file path. Resolutions up to 1080p are supported.
+
Type: string
+
Range: NA
+
Default: NA
+
Option: Mandatory
+
+

-l

+
png/jpg logo file path. No logo will be overlayed if this option is not specified.
+
Type: string
+
Range: NA
+
Default: Null
+
Option: Optional
+
+

-b

+
Max bitrate for encoder in Kbps
+
Type: int
+
Range: 0 to 4294967295
+
Default: 5000
+
Option: Optional
+
+

-i

+
device index
+
Type: int
+
Range: 0 to 31
+
Default: 0
+
Option: Optional
+
+

-h

+
Horizontal offset of overlay logo in fractions of video image width, from top-left corner of video image (in relative positioning)
+
Type: double
+
Range: 0 to 1
+
Default: 0.9
+
Option: Optional
+
+

-v

+
Vertical offset of overlay logo in fractions of video image height, from top-left corner of video image (in relative positioning)
+
Type: double
+
Range: 0 to 1
+
Default: 0
+
Option: Optional
+
+

-n

+
Number of input buffers
+
Type: integer
+
Range: 20 to 2147483647
+
Default: 2000
+
Option: Optional
+
+

-o

+
Output file name and path
+
Type: String
+
Range: NA
+
Default: ./result.mp4
+
Option: Optional
+
+
+
+
+

Examples

+
    +
  1. Composition along with logo on top right of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png
    +
    +
    +
  2. +
  3. Composition with logo on top left of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png -h 0 -v 0
    +
    +
    +
  4. +
  5. Composition with logo on center of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png -h 0.5 -v 0.5
    +
    +
    +
  6. +
  7. Composition without logo layer:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265
    +
    +
    +
  8. +
  9. Composition on device with index 2:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -i 2
    +
    +
    +
  10. +
  11. Composition on decoder soft kernel start index at 8:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265
    +
    +
    +
  12. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/examples/xma/xma_apps.html b/latest/examples/xma/xma_apps.html new file mode 100644 index 00000000..7e1ace6b --- /dev/null +++ b/latest/examples/xma/xma_apps.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + + + XMA Examples for the AMD AMA Video SDK — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

XMA Examples for the AMD AMA Video SDK

+ +

The examples in the /opt/amd/ama/ma35/bin folder illustrate how C-based applications can natively interact with AMD AMA Video SDK devices using the XMA (Xilinx Media Accelerator) APIs. Source codes for decoder, encoder, scaler and transcoder can be found under /opt/amd/ama/ma35/examples/xma directory.

+

Detailed documentation on the AMD AMA Video SDK plugin interface and the XMA APIs can be found in the C API Programming Guide section of the documentation.

+

Requirements

+
    +
  • The XMA applications has been built for and verified on a supported OS.

  • +
  • The XMA applications only work with elementary streams. Container formats such as mp4 are not supported.

  • +
+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

XMA Decoder App

+
+

Decoder Test Instructions

+

The XMA decoder application supports most of the decode options supported by FFmpeg. The XMA decoder application supports only elementary H.264, HEVC and AV1 encoded bitstreams.

+
+

Decoder Usage

+

Running the decoder app with the --help option will print the complete list of options:

+
ma35_decoder_app --help
+encoded file and utilizes hardware acceleration to get the decoded
+output.
+
+Usage:
+        ma35_decoder_app [options] -i <input-file> -c:v <codec-type>
+        [codec_options] -o <output-file>
+
+Arguments:
+        --help                     Print this message and exit
+        -log_level <value>         Specify the log level
+        -log_location <value>      Log location. 0 for none,
+                                   1 console (default), 2 syslog, 3 file
+        -log_file <file>           Name and path of the log file. Default
+                                   ma35_decoder_app.log
+        -d <device_id>             Specify a device on which to run.
+                                   Default: 0
+
+Input Arguments:
+
+        -stream_loop <loop-count>  Number of times to loop the input
+                                   file
+        -i <input-file>            Input file to be used
+
+Codec Arguments:
+
+        -c:v <codec>               Specify H264 or H265 decoding.
+                                   (h264_ama, hevc_ama)
+        -latency_logging           Enable latency logging
+        -frames <frame-count>      Number of frames to be processed.
+        -pix_fmt fmt               The output format (nv12, yuv420p,
+                                   yuv420p10le, xv15) Default: nv12 8 bit,
+                                   yuv420p10le 10 bit
+        -o <file>                  File to which output is written.
+
+
+
+
+

Sample Decoder Command

+

Decode an hevc encoded file into raw N12 format:

+
ma35_decoder_app -c:v hevc_ama -i <INPUT> -frames 100 -pix_fmt nv12 -o out1.nv12
+
+
+
+

+
+
+
+
+
+

XMA Encoder App

+
+

Encoder Test Instructions

+

The encoder XMA application supports most of the encoder options supported by FFmpeg. The XMA application supports variety of input pixel formats, see -out_fmt, and can output H.264/HEVC/AV1 encoded elementary stream formats.

+
+

Encoder Usage

+

Running the encoder app with the --help option will print the complete list of options:

+
ma35_encoder_app --help
+XMA Encoder App Usage:
+     ./ma35_encoder_app [input options] -i input-file -c:v <codec-option>  [encoder options] -o <output-file>
+
+Arguments:
+
+     --help                     Print this message and exit.
+     -log_level <value>         Log level settings, supported are 0 or
+                                emergency, 1 or alert, 2 or critical, 3
+                                or error, 4 or warning, 5 or notice, 6
+                                or info, 7 or debug.
+                                Default is 3/error
+     -log_location <value>      Log location settings, supported are 0 or
+                                none, 1 or console, 2 or syslog, 3
+                                or file.
+                                Default is 1/console
+     -log_file <log-file>       Name and path of log file
+                                Default is ma35_encoder_app.log
+     -d <device-id>             Specify a device on which the
+                                encoder to run.
+                                Default is /dev/ama_transcoder0
+     -frames <frame-count>      Number of frames to be processed.
+
+Input options:
+
+     -stream_loop <loop-count>  Number of times to loop the input
+                                YUV file.
+     -w <width>                 Width of YUV input.
+     -h <height>                Height of YUV input.
+     -pix_fmt <pixel-format>    Pixel format of the input file. It must be yuv420p,
+
+     -i <input-file>            Name and path of input YUV file
+
+Codec option:
+
+     -c:v <codec>               Encoder codec to be used. Supported
+                                are h264_ama, hevc_ama, av1_ama
+     -device_type               When encoding to AV1, this sets which
+                                AV1 encoder will be used. Supported
+                                values are 1(Xilinx), 2(Vendor
+                                supplied), or any
+
+Encoder params:
+
+     -b:v <bitrate>             Bitrate can be given in Kbps or Mbps
+                                or bits i.e., 5000000, 5000K, 5M.
+                                Default is 5Mbps
+     -fps <fps>                 Input frame rate. Default is 30.
+     -g <intraperiod>           Intra period. Default is 15.
+     -qp <qp>                   QP. Supported are -1 to 51,
+                                default is -1
+     -min_qp <qp>               Minimum QP. Supported are 0 to 51,
+                                default is 0.
+     -max_qp <qp>               Maximum QP. Supported values are 0
+                                to 51, default is 51.
+     -spat_aq_gain <gain>       Spatial AQ gain. Supported values are
+                                0 to 100 or 255, default is 255.
+     -temp_aq_gain <gain>       Temporal AQ gain. Supported values are
+                                0 to 100 or 255, default is 255.
+     -temporal_aq <0/1>         Temporal AQ. Enable/Disable,
+                                default is -1.
+     -spatial_aq <0/1>          Spatial AQ. Enable/Disable,
+                                default is -1.
+     -qp_mode <qp>              QP Mode. Supported values 0, 1 and 2
+                                default is 0.
+     -control_rate <rc_mode>    Rate Control. Supported values -1, 0, 1, 2 and 3
+                                default is -1.
+     -bf <frames>               Number of B frames. Supported are -1
+                                to 3, default is -1.
+     -force_idr <0/1            Supported values are 0 and 1
+     -preset <value>            Encoder preset. Supported: slow, medium and fast
+                                are supported. Default: medium
+     -profile <value>           Encoder profile.
+                For AV1, supported -1 (auto) and 200 (main). Default: -1 (auto)
+                For HEVC, supported -1 (auto), 100 (main), 101 (main10_intra), 102
+                                (main10), 103 (main10_intra). Default: -1 (auto)
+                For H264, supported -1 (auto), 0 (baseline), 1 (main), 2 (high),
+                                3 (high10) 4 (high10_intra). Default: -1 (auto)
+     -level <value>             Encoder level.
+                For H264, supported are 0 (auto), 10, 11, 12, 13, 20, 21, 22, 30,
+                                31, 32, 40, 41, 42, 50, 51, 52, 60, 61, 62. Default:
+                                0 (auto)
+                For HEVC, supported are 0 (auto), 10, 20, 21, 30, 31, 40, 41, 50,
+                                51, 52, 60, 61, 62. Default: 0 (auto)
+                For AV1, supported are 0 (auto), 20, 21, 30, 31, 40, 41, 50, 51,
+                                52, 53, 60, 61, 62, 63. Default: 0 (auto)
+     -tier <value>              HEVC tier, supported are -1 (auto), 0 (main), 1 (high).
+                                Default: -1 (auto)
+                                Default is -1/auto
+     -crf <value>               Enable / disable CRF mode. Default: 0
+     -bufsize <value>           Size of VBV buffer (in bits). Default is -1. Strict
+                                ULL = 0, Relaxed ULL > 0
+     -dynamic_gop <value>       Dynamic GOP supported values are -1 (auto), 0 (disable)
+                                and 1 (enable). Default: -1
+     -tune_metrics <value>      Tunes encoder's video quality for objective metrics.
+                                Supported values are vq or 1, psnr or 2, ssim or
+                                3, vmaf or 4. Default: 1
+     -lookahead_depth <value>   Lookahead depth. Supported [-1, 53]. Default: -1
+     -latency_ms <value>        Lookahead depth specified in milliseconds. Supported
+                                [-1, 60000]. Default: -1
+     -no_bll <value>            No low latency b-frames. Supported [-1, 1]. Default:
+                                -1
+     -latency_logging <0/1>     Enable latency logging
+     -expert_options <string>   Expert options
+     -o <file>                  File to which output is written.
+     -stats <file>              File to which csv statistics output is written.
+
+
+
+
+

Sample Encoder Commands

+

H.265 encoding, ultra low latency (Consult the Tuning Latency of Transcode Pipeline section for more details):

+
ma35_encoder_app -w 1920 -h 1080 -pix_fmt yuv420p -i <INPUT> -c:v hevc_ama -b:v 5M -lookahead_depth 0 -g 30 -o out0.265
+
+
+
+

+
+
+
+
+
+

XMA Scaler App

+
+

Scaler Test Instructions

+

The scaler XMA application supports most of the scaler options supported by FFmpeg. The XMA application supports -out_fmt pixel formats.

+
+

Scaler Usage

+

Running the scaler app with the --help option will print the complete list of options:

+
ma35_scaler_app --help
+This program ingests an nv12, yuv420p, yuv420p10le, or xv15 input
+file and utilizes hardware acceleration to scale to various resolutions.
+
+Usage:
+        ma35_scaler_app [options] -w <input-width> -h <input-height> -i
+        <input-file> [scaler_options] -w <output-1-width> -h
+        <output-1-height> -o <output-1-file> -w ...
+
+Arguments:
+        --help                     Print this message and exit
+        -log <level>               Specify the log level
+        -log_location <value>      Log location. 0 for none,
+                                   1 console (default), 2 syslog, 3 file
+        -log_file <file>           Name and path of the log file. Default
+                                    ma35_scaler_app.log
+        -d <device-id>             Specify a device on which to run.
+                                   Default: 0
+
+Input Arguments:
+
+        -stream_loop <loop-count>  Number of times to loop the input
+                                   file
+        -w <width>                 Specify the input's width
+        -h <height>                Specify the input's height
+        -pix_fmt <pixel-format>    Pixel format of the input file (nv12,
+                                   xv15, yuv420p10le). Default : nv12.
+        -fps <frame-rate>          Frame rate. Used for scaler load
+                                   calculation.
+        -i <input-file>            Input file to be used
+
+Output Arguments:
+        -rate <half/full>          Set the rate to half. Half rate drops
+                                   frames to reduce resource usage.
+                                   Default: full.
+        -latency_logging           Enable latency logging
+        -w <width>                 Specify the output's width
+        -h <height>                Specify the output's height
+        -pix_fmt <pixel-format>    Pixel format of the output file (nv12,
+                                   xv15, yuv420p10le). Default: input fmt
+        -frames <frame-count>      Number of frames to be processed.
+        -o <file>                  File to which output is written.
+
+
+
+
+

Sample Scaler Command

+

Scale 1080p nv12 to 720p, 480p, 360p, and 240p nv12:

+
ma35_scaler_app -pix_fmt nv12 -w 1920 -h 1080 -i <INPUT> \
+-w 1280 -h 720  -pix_fmt nv12 -o out1.nv12 \
+-w 848  -h 480  -pix_fmt nv12 -o out2.nv12 \
+-w 640  -h 360  -pix_fmt nv12 -o out3.nv12 \
+-w 288  -h 160  -pix_fmt nv12 -o out4.nv12
+
+
+
+

+
+
+
+
+
+

XMA Transcoder App

+
+

Transcoder Test Instructions

+

The transcoder XMA application supports most of the options supported by ffmpeg. The XMA application supports only elementary H.264, HEVC and AV1 encoded stream input and outputs H.264/HEVC/AV1 encoded elementary stream.

+
+

Transcoder Usage

+

Running the transcoder app with the --help option will print the complete list of options:

+
 ma35_transcoder_app --help
+ XMA Transcoder App Usage:
+        ./program [generic options] -c:v <decoder codec> [decoder options]  -i input-file -scaler_ma -outputs [num] [Scaler options]  -c:v <encoder codec> [encoder options] -o <output-file>  -c:v <encoder codec> [encoder options] -o <output-file>  -c:v <encoder codec> [encoder options] -o <output-file>.....
+
+Arguments:
+
+        --help                     Print this message and exit.
+        -d <device-id>             Specify a device on which the
+                                   transcoder to run. Default: 0
+        -stream_loop <loop-count>  Number of times to loop the input file
+        -frames <frame-count>      Number of input frames to be processed
+
+Decoder options:
+
+        -c:v <codec>               Decoder codec to be used. Supported
+                                   are hevc_ama, h264_ama
+        -latency_logging <0/1>     Latency logging for decoder. Default
+                                   disabled
+        -push-model <0/1>          Decoder streaming model (pull or push). Default
+                                   is pull (can be faster than real-time)
+        -i <input-file>            Name and path of input H.264/HEVC file
+
+Scaler options:
+
+        -scaler_ma                 Name of the ABR scaler filter
+        -num-output <value>        Number of output files from scaler
+        -out_1_width <width>       Width of the scaler output channel 1
+        -out_1_height <height>     Height of the scaler output channel 1
+        -out_1_rate <full/half>    Full of Half rate for output channel 1
+        -out_2_width <width>       Width of the scaler output channel 2
+        -out_2_height <height>     Height of the scaler output channel 2
+        -out_2_rate <full/half>    Full of Half rate for output channel 2
+        -out_3_width <width>       Width of the scaler output channel 3
+        -out_3_height <height>     Height of the scaler output channel 3
+        -out_3_rate <full/half>    Full of Half rate for output channel 3
+        -out_4_width <width>       Width of the scaler output channel 4
+        -out_4_height <height>     Height of the scaler output channel 4
+        -out_4_rate <full/half>    Full of Half rate for output channel 4
+        -out_5_width <width>       Width of the scaler output channel 5
+        -out_5_height <height>     Height of the scaler output channel 5
+        -out_5_rate <full/half>    Full of Half rate for output channel 5
+        -out_6_width <width>       Width of the scaler output channel 6
+        -out_6_height <height>     Height of the scaler output channel 6
+        -out_6_rate <full/half>    Full of Half rate for output channel 6
+        -out_7_width <width>       Width of the scaler output channel 7
+        -out_7_height <height>     Height of the scaler output channel 7
+        -out_7_rate <full/half>    Full of Half rate for output channel 7
+        -out_8_width <width>       Width of the scaler output channel 8
+        -out_8_height <height>     Height of the scaler output channel 8
+        -out_8_rate <full/half>    Full of Half rate for output channel 8
+        -latency_logging <0/1>     Latency logging for scaler. Default
+                                   disabled
+Encoder options:
+
+        -c:v <codec>               Encoder codec to be used. Supported
+                                   are hevc_ama, h264_ama, and av1_ama
+        -device_type               When encoding to AV1, this sets which
+                                   AV1 encoder will be used. Supported
+                                   values are 1(Xilinx), 2(Vendor
+                                   supplied), or any
+        -b:v <bitrate>             Bitrate can be given in Kbps or Mbps
+                                   or bits i.e., 5000000, 5000K, 5M.
+                                   Default is 200kbps
+        -fps <fps>                 Input frame rate. Default is 30.
+        -g <intraperiod>           Intra period. Default is 12.
+        -max-bitrate <bitrate>     Maximum bit rate. Supported are -1 to
+                                   350000000, default is -1
+        -min_qp <qp>               Minimum QP. Supported are 0 to 51,
+                                   default is 0.
+        -max_qp <qp>               Maximum QP. Supported values are 0
+                                   to 51, default is 51.
+        -spatial_aq_gain <gain>    Spatial AQ gain. Supported values are
+                                   0 to 100 or 255, default is 255.
+        -temporal_aq_gain <gain>   Temporal AQ gain. Supported values are
+                                   0 to 100 or 255, default is 255.
+        -bf <frames>               Number of B frames. Supported are 0
+                                   to 7, default is 2.
+        -force_idr <0/1            Supported values are 0 and 1
+        -profile <value>           Encoder profile.
+                   For HEVC, supported are 100 or main, 101 or main10_intra,
+                                   102 or main10 , 103 or main10_intra
+                                   or still.
+                                   Default is 0/automatic
+                                   ENC_HEVC_MAIN - 100 or main
+                                   ENC_HEVC_MAIN_INTRA - 101 or main_intr
+                                   ENC_HEVC_MAIN_10 - 102 or main10
+                                   ENC_HEVC_MAIN10_INTRA - 103 or main10_intra             For H264, supported are auto or -1, 0 or baseline,
+                                   1 or main, 2 or high, 3 or high10
+                                   4 or high10_intra, Default is auto or -1
+                                   ENC_H264_BASELINE - 0 or baseline.
+                                   ENC_H264_MAIN - 1 or main.
+                                   ENC_H264_HIGH - 2 or high.
+                                   ENC_H264_HIGH_10 - 3 or high10.
+                                   ENC_H264_HIGH_10_INTRA - 4 or high10_intra   -level <value>             Encoder level.
+                                   For HEVC, supported are 10 to 52,
+                                   default is 50.
+                                   For H264, supported are 10 to 52,
+                                   default is 50.
+        -slices <value>            Number of slices per frame. Supported
+                                   are 1 to 68, default is 1.
+        -qp_mode <qp>              QP Mode. Supported values 0, 1 and 2
+                                   default is 0.
+        -control_rate <rc_mode>    Rate Control. Supported values -1 to 3
+                                   default is -1.
+        -aspect_ratio <value>      Aspect ratio. Supported values are 0
+                                   to 3, default is 0.
+        -lookahead_depth <value>   Lookahead depth. Supported are 0 to
+                                   20, default is 0.
+        -temporal_aq <0/1>         Temporal AQ. Enable/Disable,
+                                   default is -1.
+        -spatial_aq <0/1>          Spatial AQ. Enable/Disable,
+                                   default is -1.
+        -tune_metrics <value>      Tunes MPSoC H.264/HEVC encoder's video
+                                   quality for objective metrics, default 1.
+                                   Supported value from 1 to 4
+        -tier <value>              HEVC tier, supported are -1 or auto, 0 or main,
+                                   1 or high.
+                                   Default is -1/auto
+        -crf <value>               CRF supported values are 0 and 1 i.e. enable
+                                   and disable
+                                   Default is -1/auto
+        -latency_logging           Enable latency logging
+        -latency_mode <value>      0 normal latency (default), 1 low
+                                   latency, or 2 ultra low latency      -o <file>                  File to which output is written.
+
+
+
+
+

Sample Transcoder Commands

+

H.264 to AV1 Transcoder:

+
ma35_transcoder_app -streams 1 -frames 2000 -c:v h264_ama \
+-i <INPUT> \
+-c:v av1_ama -b:v 10M  -o h264_av1_transcode.av1
+
+
+

H.264 to H264 ABR Transcoder:

+
ma35_transcoder_app -streams 1 -c:v h264_ama \
+-i <INPUT> \
+-scaler_ma -num-output 4 \
+-out_1_width 1280 -out_1_height 720 -out_2_width 848 -out_2_height 480 \
+-out_3_width 640 -out_3_height 360 -out_4_width 288 -out_4_height 160 \
+-c:v h264_ama -b:v 4000K -o abr_ladder1.264 \
+-c:v h264_ama -b:v 3000K -o abr_ladder2.264 \
+-c:v h264_ama -b:v 2500K -o abr_ladder3.264 \
+-c:v h264_ama -b:v 1250K -o abr_ladder4.264
+
+
+

H.264 to AV1 ULL Transcode

+
ma35_transcoder_app -streams 1 -frames 2000 -c:v h264_ama \
+-i <INPUT>\
+-c:v av1_ama  -b:v 10M -lookahead_depth 0 -o h264_av1_transcode.av1
+
+
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/genindex.html b/latest/genindex.html new file mode 100644 index 00000000..70b721ce --- /dev/null +++ b/latest/genindex.html @@ -0,0 +1,1779 @@ + + + + + + + + + + + + + + Index — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Index
  • +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ Symbols + | A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | V + | W + | X + | Y + | Z + +
+

Symbols

+ + + +
+ +

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + +
+ +

G

+ + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + +
+ +

P

+ + + +
+ +

Q

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

V

+ + +
+ +

W

+ + +
+ +

X

+ + + +
+ +

Y

+ + +
+ +

Z

+ + +
+ + + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/latest/getting_started_on_prem.html b/latest/getting_started_on_prem.html new file mode 100644 index 00000000..a7f4a38d --- /dev/null +++ b/latest/getting_started_on_prem.html @@ -0,0 +1,410 @@ + + + + + + + + + + + + + + + Getting Started with AMD AMA Video SDK Cards — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Getting Started with AMD AMA Video SDK Cards
  • +
  • +
  • +
+
+
+
+
+ +
+

Getting Started with AMD AMA Video SDK Cards

+ +
+

Chassis Setup

+
    +
  1. BIOS setting:

    +
      +
    1. Ensure that chassis's BIOS is set to performance mode, e.g., sleep states, clock throttling, etc. are disabled.

    2. +
    3. 4x4 PCIe bifurcation must be enabled on each slot with a MA35 card.

    4. +
    5. Enable Single Root IO/Virtualization (SR-IOV).

    6. +
    7. Secure boot must be disabled.

    8. +
    9. Enable Above 4G Decoding.

    10. +
    11. Enable Access Control Services (ACS)

    12. +
    13. Enable virtualization.

    14. +
    +
  2. +
  3. Install a compatible kernel, e.g., see Linux VM Guest, Step 2, for details on how to install kernel 5.15 and other required packages. Note that if you are installing on kernel 6.5, gcc-12 is required.

  4. +
  5. Enable IOMMU by updating /etc/default/grub file to include

    +
      +
    • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on iommu=pt", for AMD based systems

    • +
    • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on iommu=pt", for Intel based chassis

    • +
    +
  6. +
  7. Update Grub

    +
    sudo update-grub
    +
    +
    +
  8. +
  9. Allocate at least 4GB of huge pages, per device, plus an extra 96 huge pages, e.g., a single card with 2 devices requires 2*2048+96=4192 huge pages

    +
    sudo sh -c "echo 'vm.nr_hugepages=4192' >> /etc/sysctl.conf"
    +
    +
    +

    Note that if a chassis is being configured to host VMs, then the total number of huge pages, on the host, needs to be the sum of allocated RAM of all VM instances plus 96. As an example, running 6 VMs, each with 12GB of RAM, requires 6*12GB/2MB+96=36960 huge pages. (See Virtualization for details.)

    +
  10. +
  11. Reboot

    +
    sudo reboot
    +
    +
    +
  12. +
  13. Verify settings

    +
    cat /proc/cmdline
    +BOOT_IMAGE=/vmlinuz-5.15.0-50-generic root=/dev/mapper/vg00-rootlv ro quiet splash amd_iommu=on iommu=pt
    +
    +
    +

    and

    +
    cat /proc/meminfo | grep -i huge
    +
    +
    +

    , should return:

    +
    HugePages_Total:    4192
    +HugePages_Free:     4192
    +HugePages_Rsvd:        0
    +Hugepagesize:       2048 kB
    +
    +
    +
  14. +
+
+
+

Check Cards

+

To establish whether deployed cards have proper firmware installed, proceed as follows:

+
    +
  1. List AMD AMA Video SDK PCIe devices

    +
    sudo lspci -vvvd 10ee:
    +
    +
    +

    If devices are not listed as Multimedia controller and/or Region 4 size is not 512MB, a flash update is required. Refer to Flash Firmware section, for instructions.

    +
  2. +
+
+
+

Install the AMD AMA Video SDK

+ +
    +
  • Ubuntu & Debian 12

    +
    +
      +
    1. Install packages

      +
      sudo apt -y install libhugetlbfs0 libboost-all-dev
      +sudo apt-mark unhold amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer amd-ama-ml
      +dpkg --get-selections 'amd-ama*' | awk '{system("sudo apt -y purge " $1)}'
      +sudo apt update
      +sudo apt install amd-ama-driver=1.2.0-* amd-ama-core=1.2.0-* amd-ama-xma=1.2.0-* amd-ama-ffmpeg=1.2.0-* amd-ama-gstreamer=1.2.0-* amd-ama-ml=1.2.0-*
      +sudo apt-mark hold amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer amd-ama-ml
      +
      +
      +
    2. +
    +
    +
  • +
+
    +
  • Fedora

    +
    +
      +
    1. On first install

      +
      sudo yum update
      +sudo yum install yum-plugin-versionlock
      +
      +
      +

      Lock your kernel, by inserting exclude=kernel* in the /etc/dnf/dnf.conf file.

      +
    2. +
    3. Install packages

      +
      sudo yum update
      +sudo yum versionlock delete amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer
      +sudo yum remove amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer
      +sudo yum install amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer
      +
      +
      +
    4. +
    +
    +
  • +
  • Insert kernel module

    +
    +
    sudo modprobe ama_transcoder
    +
    +
    +
    +
  • +
+
+
+

Flash Firmware

+

Flashing is required for this release:

+
    +
  1. To flash all devices, in parallel, issue the following:

    +
    sudo /opt/amd/ama/ma35/bin/mamgmt flash program -d all -p <firmware bin>
    +
    +
    +

    , where firmware bin is /opt/amd/ama/ma35/firmware/ma35_firmware.bin.

    +

    Ignore warning messages that state:

    +
    ...
    +Warning: SC update is not supported from ASIC 1 (skipping)
    +...
    +
    +
    +
  2. +
  3. Cold reboot:

    +
    sudo systemctl poweroff
    +
    +
    +

    , and power up.

    +
  4. +
+

For more details on flashing, refer to Programing a Device.

+
+
+

Installation Verification

+

After each reboot or SDK update execute the following command:

+
    +
  1. Confirm driver's successful installation by:

    +
    cat /sys/class/misc/ama_transcoder0/version_information
    +
    +
    +

    It should return:

    +
  2. +
+
+
ZSP Version = 2.1.0
+SC Version = 9.8.5
+eSecure Version = 1.0.0
+PCIe FW Version = 2.1.0
+PCIe CTRL Patch Version = 1.0.3
+PCIe PHY Patch A Version = 1.0.0
+
+
+
+

If the observed version numbers are older than the above, flashing is required. Refer to Flash Firmware section, for instructions.

+
+
+

Set Up the Runtime Environment

+
    +
  1. Run the setup script:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +

    Note that this script requires Bash shell to run.

    +
  2. +
  3. Prior to running any video processing pipeline, run the following command:

    +
    +
    mautil validate -d all
    +
    +
    +
    +
  4. +
  5. Ensure that all tests have passed.

  6. +
+
+
+

Run Your First Examples

+

See the tutorials and examples page to learn how to run jobs on your system.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/git_hub.html b/latest/git_hub.html new file mode 100644 index 00000000..f0f6756c --- /dev/null +++ b/latest/git_hub.html @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) Repository — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA) Repository
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA) Repository

+

AMD AMA Video SDK code repository contains source codes for various elements of the SDK along with sample codes, 3rd party integrations, convenience utilities and much more. It is located at ma35d sdk v1.2

+
+

Note

+

It is noted that sample codes, 3rd party integrations and convenience utilities are meant for demonstrative purposes and, as such, no guarantees are made regarding their usage in a production setting.

+
+ + ++++ + + + + + + + + + + + + + + + + +
Development & Helper Utilities

Name

Notes

+
+
Python script that generates human readable timing stats, for a given video pipeline
+
+
+
+
Python script that uses map-reduce to transcode a file in faster than real-time.
+
+
+
+
Collection of simple startup C codes, using XMA library, for decoding, encoding and multi-rung transcoding.
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/index.html b/latest/index.html new file mode 100644 index 00000000..b9c1d995 --- /dev/null +++ b/latest/index.html @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA)
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA)

+

The AMD AMA Video SDK is a complete software stack allowing users to seamlessly leverage the hardware accelerated features of AMD video codec units and enable high-density real-time transcoding for live streaming video service providers, OEMs, and Content Delivery Network (CDNs), on compatible cards. Included in the AMD AMA Video SDK is a pre-compiled version of FFmpeg which integrates video transcoding plug-ins for AMD devices, enabling simple hardware acceleration of video decoding, scaling and encoding. The AMD AMA Video SDK also provides a C-based application programming interface (API) which facilitates the integration of AMD video codec units transcoding capabilities in proprietary frameworks.

+

Cards compatible with AMA SDK offer low power usage, high visual quality at high density. Specifically, MA35D video transcoding card, which is made of 2 Video Processing Units (VPU), is capable of transcoding to and from HEVC, AVC and AV1 formats, at an aggregate rate of up to two 4Kp60, for AVC and HEVC formats, and four 4Kp60 for AV1 format, per VPU.

+ +
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/managing_compute_resources.html b/latest/managing_compute_resources.html new file mode 100644 index 00000000..963b4348 --- /dev/null +++ b/latest/managing_compute_resources.html @@ -0,0 +1,732 @@ + + + + + + + + + + + + + + + Managing Video Acceleration Compute Resources — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Managing Video Acceleration Compute Resources
  • +
  • +
  • +
+
+
+
+
+ +
+

Managing Video Acceleration Compute Resources

+ +
+

Introduction

+

The notion of compute units (CUs) and CU pool is central to resource management. A typical video transcode pipeline is made of multiple CUs such as decoder, scaler, lookahead, and encoder. These together form a CU pool. Based on the input resolution, framerate and type of transcode, the load of CUs within a CU pool varies. The number of required resources determines how many parallel jobs can run in real-time. CUs and CU pool are managed by the Xilinx® resource manager (XRM). XRM is a software layer responsible for managing the video hardware accelerators available in the host system. AMD AMA Video SDK compilable cards have a set processing capacity, e.g., an MA35 device is capable of an aggregate processing equivalent of 2 4kp60 H264/HEVC in parallel to 2 4kp60 AV1 streams. XRM allows for running and managing multiple heterogeneous job, in parallel, on all devices hosted in a chassis. It is noted that XRM strictly adheres to the total capacity of the hosted accelerators, i.e., it does not allow for over-subscription of resources.

+

The rest of this guide explains how to:

+
    +
  1. Assign jobs to specific devices using explicit device identifiers

  2. +
  3. Measure device load and determine where to run jobs using either manual or automated resource management techniques

  4. +
+
+
+

Assigning Jobs to Specific Devices

+

By default, a job is submitted to device 0 and slice handling/assignment by XRMD. When running multiple jobs in parallel, device 0 is bound to run out of resources rapidly and additional jobs will error out due to insufficient resources. By using explicit device identifiers, new jobs can be individually submitted to a specific device. This makes it easy and straightforward to leverage the entire video acceleration capacity of your system, based on the number of cards and devices.

+

The FFmpeg -hwaccel option can be used to specify the device on which a specific job should be run. This makes it possible to assign multiple jobs across all available devices in the host. +Determining on which device(s) to run a job can be done using either the manual or automated methods described in the following sections.

+
+

Examples using Explicit Device IDs

+

FFmpeg example of two different jobs run on two different devices

+

In this example, two different FFmpeg jobs are run in parallel. The -hwaccel option is used to submit each job to a different device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0  -c:v h264_ama -i INPUT1.h264 -f mp4 -c:v hevc_ama -y /dev/null &
+ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder1  -c:v h264_ama -i INPUT2.h264 -f mp4 -c:v hevc_ama -y /dev/null &
+
+
+
+

+
+
+
+
+

Manual Resource Management

+

The card management tools included in the AMD AMA Video SDK provide ways to query the status and utilization of the video accelerator devices. Using these tools the user can determine which resources are available and thereby determine on which device to submit a job (using explicit device identifies, as explained in the previous section).

+

Given that each device has a set compute capacity, the user is responsible for only submitting jobs which will not exceed the capacity of the specified device. If a job is submitted on a device where there are not enough compute unit resources available to support the job, the job will error out with a message about resource allocation failure.

+

The XRM and card management tools provide methods to estimate CU requirements and check current device load.

+
+

Checking System Load

+

Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

+
source /opt/amd/ama/ma35/scripts/setup.sh
+
+
+

Note that this command should be run only once per boot.

+

To check the current loading of all the devices in your system, use the following command:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

This will generate a report in JSON format containing the load information for all the compute unit (CU) resources. The report contains a section for each device in the system. The device sections contain sub-sections for each of the CUs (decoder, scaler, lookahead, encoder, am ML) in that device. For example, the load information for the encoder on device 0 may look as follows:

+
"device_0": {
+  ...
+  "cu_2": {
+       "cuId         ": "2",
+       "cuType       ": "IP Kernel",
+       "kernelName   ": "encoder",
+       "kernelAlias  ": "ENCODER_TYPE1_AMA",
+       "instanceName ": "encoder_1",
+       "cuName       ": "encoder:encoder_1",
+       "kernelPlugin ": "",
+       "maxCapacity  ": "497664000",
+       "numChanInuse ": "0",
+       "usedLoad     ": "0 of 1000000",
+       "reservedLoad ": "0 of 1000000",
+       "resrvUsedLoad": "0 of 1000000"
+   },
+
+
+

The usedLoad value indicates how much of that resource is currently being used and reserved. The value will range from 0 (nothing running) to 1000000 (fully loaded). The reservedLoad value indicates how much of that resource is being reserved using XRM. The resrvUsedLoad value indicates how much of the reserved load is actually being used.

+
+ +
+

Insufficient Resources

+

If there are not enough compute unit resources available on the device to support a FFmpeg job, the job will error out with a message about resource allocation failure:

+
Insufficient resources available for allocation
+
+
+

In this case, you can check the system load (as described in the section below) and look for a device with enough free resources, or wait until another job finishes and releases enough resources to run the desired job.

+
+
+

Job Resource Requirements

+

The load of a given job can be estimated by taking the resolution and frame rate of the job as a percentage of the total capacity of a device. For instance, on an MA35D device, a 1080p60 stream will require 12.5% of encode resources available on that device. Resource loads are reported with a precision of 1/1000000.

+
+

+
+
+
+
+

Automated Resource Management

+

The AMD AMA Video SDK provides a mechanism to automatically determine how many instances of various jobs can be submitted to the system and on which device(s) to dispatch each job instance. This mechanism relies on Job Descriptions files and a Job Slot Reservation tool which calculates the resources required for each job, determines on which device each job should be run and reserves the resources accordingly. Note that there is no requirement for job descriptions to be homogeneous.

+
+

Note

+

To observe the various job management log messages use tail -F /var/log/syslog command.

+
+
+

Video Transcode Job Descriptions

+

A video transcode Job Description File (JDF) provides information to the resource manager about what resources are needed to run a particular job. With this information, the resource manager can calculate the CU load for the specified job as well as the maximum possible number of jobs that can be run real-time in parallel.

+

A video transcode job description is specified through a JSON file and the key-value pairs specify the functions, formats, and resolutions needed.

+
+
function

Which HW resource to use (DECODER, SCALER, ENCODER, and ML)

+
+
format

Input/output format (H264, HEVC, AV1, VP9, yuv420p, and yuv420p10le)

+
+
resolution

Input/output height, width, and frame-rate as a numerator / denominator fraction

+
+
type

Optional entry to select between Type 1 and Type 2 AV1 encoder. Valid values are 1 and 2, with default equal 1

+
+
load_factor

Optional entry that instructs XRM to allocate a multiple factor of required resources. The multiplication factor is either the default 1.0, i.e., no addition allocation or explicitly defined by this entry. A typical usage of this entry is in cases where there is a need for headroom, while allocating resources.

+
+
num_job_slots

Optional entry that explicitly specifies the number of resources or job slots for a particular job. The absence of this entry allows for a given job to reserve all available resources on a given device, instead of what is required to complete the job.

+
+
resources

All the resources listed in this section of the job description will be allocated on the same device. If the job requires a single device, this is the section in which resources should be specified.

+
+
additionalresources_n

Optional entry to allocate resources on the nth device, n in the 1 to N-1 range, where N is the number of available devices. If a job cannot fit on a single device and must be split across two devices, then resources which should be allocated on the first device are listed under resources section and the resources which should be allocated on the nth device are listed in the additionalresources_n section.

+
+
cores

Optional entry to enable 2-core encoding in order to achieve higher throughput. Valid values are 1 and 2, for single core and double cores encodings, respectively. Default value is 1. See /opt/amd/ama/ma35/scripts/describe_job/example_2_core_encode.json for usage example.

+
+
preset

Optional entry to select one of fast, medium or slow encoding presets. Default value is medium. See /opt/amd/ama/ma35/scripts/describe_job/example_fast_preset.json for usage example.

+
+
model (Applicable when function is set to ML.)

Valid value is "roi".

+
+
model_args (Applicable when function is set to ML.)

Valid values are "type=face" and "type=text"

+
+
+

Several examples of JSON job slot descriptions can be found in the /opt/amd/ama/ma35/scripts/describe_job folder once the AMD AMA Video SDK has been installed.

+

Below is the /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale example. This JSON example describes an ABR transcode job which uses a decoder, scaler, and encoder to generate 12 output renditions.

+
{
+    "request": {
+        "name": "t10_transcode_multiscale",
+        "request_id": 1,
+        "parameters": {
+            "name": "testjob",
+            "resources": 
+            [
+                {
+                    "function": "DECODER",
+                    "format":   "H264",
+                    "resolution": { "input": { "width": 3840, "height": 2160, "frame-rate": { "num":60, "den":1} } }
+                },
+                        {
+                    "function": "SCALER",
+                    "format":   "yuv420p",
+                    "resolution":{                                                                                 
+                        "input": { "width": 3840, "height": 2160, "frame-rate": { "num":60, "den":1} },
+                        "output":
+                        [        
+                            { "width": 1920, "height": 1080, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1600, "height": 900, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1440, "height": 900, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1360, "height": 768, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1280, "height": 720, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1024, "height": 768, "frame-rate": { "num":60, "den":1}},
+                            { "width": 960, "height": 540, "frame-rate": { "num":60, "den":1}},
+                            { "width": 848, "height": 480, "frame-rate": { "num":60, "den":1}},
+                            { "width": 640, "height": 360, "frame-rate": { "num":60, "den":1}},
+                            { "width": 540, "height": 480, "frame-rate": { "num":60, "den":1}},
+                            { "width": 352, "height": 288, "frame-rate": { "num":60, "den":1}},
+                            { "width": 288, "height": 160, "frame-rate": { "num":60, "den":1}}
+                        ]
+                    }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1920, "height": 1080, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1600, "height": 900, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1440, "height": 900, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1360, "height": 768, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1280, "height": 720, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1024, "height": 768, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 960, "height": 540, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 848, "height": 480, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 640, "height": 360, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 540, "height": 480, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 352, "height": 288, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 288, "height": 160, "frame-rate": { "num":60, "den":1} } } 
+                }
+            ]
+        }
+    }
+}
+
+
+

The next sections document the two different ways of using job descriptions to run multiple jobs across one or more devices:

+ +
+
+

The Job Slot Reservation Tool

+

The job slot reservation application, jobslot_reservation, takes as input multiple JSON job description files. Each JSON JDF provides information to the resource manager about what kind of transcode is intended to run on a card. With this information, the resource manager calculates the CU load for the specified job as well as the maximum possible number of jobs that can be run real-time in parallel.

+

Once the maximum possible number of jobs is known, CUs and job slots are reserved, and corresponding reservation IDs are stored in a bash file at /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh, where TIMESTAMP refers to Linux epoch timestamp and JDF is the name of JSON JDF, without its extension. A reservation ID is a unique identifier which is valid while the job slot reservation application is running. After sourcing the respective /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh files, the reservation IDs are then passed to individual FFmpeg processes via the XRM_RESERVE_ID environment variable. The FFmpeg processes then use this reservation ID to retrieve and use the corresponding CUs reserved by the job slot reservation tool.

+

The reserved resources are released by ending the job reservation process. Reserved slots can be reused after an FFmpeg job finishes, as long as the job reservation process is still running.

+

Optionally, jobslot_reservation can take --dry_run argument to check how many job slots are possible for a given job, without actual reservation. Additionally, this application is process-safe.

+

Ill-formed JSON Job Descriptions

+

If you run the jobslot_reservation tool with a syntactically incorrect JSON description, you will see the following messages:

+
decoder plugin function=0 fail to run the function
+scaler plugin function=0 fail to run the function
+encoder plugin function=0 fail to run the function
+
+
+

This indicates that the job description is ill-formed and needs to be corrected.

+
+

Example requiring a single device per job

+

This example uses the /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json file describing a 1080p ABR ladder running on a single device.

+
    +
  1. Setup the environment:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  2. +
  3. Run the job slot reservation application with the desired JSON job description. For example

    +
    $ jobslot_reservation /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json
    +JobDescriptionFile: /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json
    +Requested Loads:
    +scaler [0]: 523634
    +
    +decoder [0]: 250000
    +
    +...
    +
    +lookahead [0]: 6111
    +
    +encoder [0]: 5555
    +
    +lookahead [0]: 2777
    +
    +===============================================================
    +Total Job Slots possible : 2
    +Dry run: Disabled
    +
    +Job Type: /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json
    +Job Slots Alloted: 2
    +XRM_RESERVE_ID file - "/var/tmp/amd/xrm_jobReservation_79533431_t10_transcode_multiscale.sh"
    +================================================================
    +
    +---------------------------------------------------------------
    +
    +The Job-slot reservations are alive as long as this Application is alive!
    +(press Enter to close this app)
    +
    +---------------------------------------------------------------
    +
    +
    +
  4. +
+

The job slot reservation application creates a /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh with XRM_RESERVE_ID_{n} set to unique IDs generated by XRM (with n ranging from 1 to the number of possible job slots for the given job). Here is an example of this generated file:

+
export XRM_RESERVE_ID_0=1
+export XRM_RESERVE_ID_1=2
+
+
+
    +
  1. Launch individual FFmpeg processes in distinct shells after sourcing the /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh file and setting XRM_RESERVE_ID environment to a unique XRM_RESERVE_ID_{n}.

    +

    For job 1, within a new terminal:

    +
    source /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh
    +export XRM_RESERVE_ID=${XRM_RESERVE_ID_1}
    +ffmpeg -c:v h264_ama ...
    +
    +
    +

    For job 2, within a new terminal:

    +
    source /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh
    +export XRM_RESERVE_ID=${XRM_RESERVE_ID_2}
    +ffmpeg -c:v h264_ama ...
    +
    +
    +

    And so forth for the other jobs.

    +
  2. +
  3. Press Enter in the job reservation app terminal to release the resources after the jobs are complete.

  4. +
+
+
+

Multi-devices Flow

+

Multi-device flow is identical to the single device one, with the addition of additionalresources_n key(s) in JDFs. (See /opt/amd/ama/ma35/scripts/describe_job/t27_2-dev_h264_4kp60_to_hevc_2kp60.json for a sample JSON file.) The generated script will include new variables of the form var_dev_x_y = D, where D represents the target device. (x and y are used for internal resource tracking.) Similar to the single device steps:

+
    +
  1. Execute jobslot_reservation, with a proper multi-device JDF.

  2. +
  3. Source the generated script file.

  4. +
  5. Export the relevant XRM_RESERVE_ID variables.

  6. +
  7. Assign var_dev_x_y variables to the default device and to device parameter of hwupload_ama, e.g.:

    +
    ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder${var_dev_0_0} -c:v h264_ama -i ... \
    +  -filter_complex "hwdownload,hwupload_ama=device=${var_dev_0_1}" -c:v hevc_ama ...
    +
    +
    +
  8. +
+

, performs the decode operation on the device noted by var_dev_0_0 and the encode operation on device var_dev_0_1.

+
+
+
+

Automated Job Launching

+

The Job Slot Reservation tool automatically reserves job slots, but actual jobs still need to be manually launched using the generated reservations IDs. It is possible to create custom orchestration layers to automatically handle the reservation of job slots and the launching of jobs.

+

The AMD AMA Video SDK includes an example launcher application for FFmpeg. Source code for the FFmpeg Launcher example and the Job Slot Reservation tool are included in the Github repository of AMD AMA Video SDK and can be used as a starting point for developing custom orchestration layers.

+
+

The FFmpeg Launcher Example

+

The FFmpeg launcher, launcher, is an example application which automates the dispatching of FFmpeg jobs across multiple devices. It simplifies the process of manually setting up XRM reservation IDs and launching FFmpeg for many video streams. The FFmpeg launcher takes tuples of source, Transcode Job Description (TJD) files, where each line of source file is a full path to the location of an input file and TJD has the following format:

+
+
job_description = JDF_PATH

JDF_PATH value refers to the full path of a JDF

+
+
cmdline = FFMPEG_CMD

FFMPEG_CMD refers to a complete FFmpeg pipeline command, without input source file after -i.

+
+
+

As an example, the source1.txt and job1.txt tuple describes a decode pipeline running on device 0:

+

source1.txt:

+
/path/to/4kp60.h264
+
+
+

job1.txt:

+
job_description = /path/to/JDF file
+
+cmdline = ffmpeg -y -hwaccel ama -c:v h264_ama -out_fmt nv12 -i -filter_hw_device dev0 -filter_complex "hwdownload,format=nv12[out]" -map "out]" -vframes 300 -f rawvideo -pix_fmt nv12 /dev/null
+
+
+
+

Note

+

The FFmpeg launcher is only an example application. It is provided as an illustration of how an orchestration layer can use Job Descriptions, but it is not an official feature of the AMD AMA Video SDK.

+
+

The following steps show how to use the FFmpeg launcher for an arbitrary number of jobs, assuming all are within the total compute capacity of the accelerator cards.

+
    +
  1. Environment setup

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  2. +
  3. To run the FFmpeg launcher, use the following command:

    +
    launcher <(source, TJD)> {(source, TJD)}
    +
    +
    +

    Here is an example of the command:

    +
    launcher source1.txt job1.txt source2.txt job2.txt
    +
    +
    +
  4. +
+
+

+
+
+
+
+
+

XRM Reference Guide

+

The Xilinx® resource manager (XRM) is the software which manages the hardware accelerators available in the system. XRM includes the following components:

+
    +
  • xrmd: the XRM daemon, a background process supporting reservation, allocation, and release of hardware acceleration resources.

  • +
  • xrmadm the command line tool is used to interact with the XRM daemon (xrmd).

  • +
  • a C Application Programming Interface (API)

  • +
+
+

Command Line Interface

+

The XRM xrmadm command line tool is used to interact with the XRM daemon (xrmd). It provides the following capabilities and uses a JSON file as input for each action:

+
    +
  • Generate status reports for each device

  • +
  • Load and unload the hardware accelerators

  • +
  • Load and unload the software plugins

  • +
+

The XRM related files are installed under /opt/amd/ama/ma35/scripts/.

+
+

Setup

+

When sourced, the /opt/amd/ama/ma35/scripts/setup.sh script takes care of setting up the enviroment for the AMD AMA Video SDK, including its XRM components:

+
    +
  • The XRM daemon (xrmd) is started

  • +
  • The hardware accelerators (xclbin) and software plugins are loaded on the Xilinx devices

  • +
+
+
+

Generating Status Reports

+

xrmadm can generate reports with the status of each device in the system. This capability is particularly useful to check the loading of each hardware accelerator.

+

To generate a report for all the devices in the system:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

To generate a more detailed report for a single device, which is specified in the json file:

+
xrmadm /opt/amd/ama/ma35/scripts/list_onedevice_cmd.json
+
+
+

A sample JSON file for generating a report for device 0 is shown below:

+
{
+    "request": {
+        "name": "list",
+        "requestId": 1,
+        "device": 0
+    }
+}
+
+
+
+
+

Loading/Unloading Software Plugins

+

xrmadm can be used to load or unload the software plugins required to manage the compute resources. The software plugins perform resource management functions such as calculating CU load and CU max capacity. Once a plugin is loaded, it becomes usable by a host application through the XRM APIs. The XRM plugins need to be loaded before executing an application (such as FFmpeg/GStreamer) which relies on the plugins.

+

To load the plugins:

+
xrmadm /opt/amd/ama/ma35/scripts/load_xrm_plugins_cmd.json
+ {
+     "response": {
+         "name": "loadXrmPlugins",
+         "requestId": "1",
+         "status": "ok"
+     }
+ }
+
+
+

To unload the plugins:

+
xrmadm /opt/amd/ama/ma35/scripts/unload_xrm_plugins_cmd.json
+ {
+     "response": {
+         "name": "unloadXrmPlugins",
+         "requestId": "1",
+         "status": "ok"
+     }
+ }
+
+
+
+
+
+

C Application Programming Interface

+

XRM provides a C Application Programming Interface (API) to reserve, allocate and release CUs from within a custom application. For complete details about this programming interface, refer to the XRM API Reference Guide section of the documentation.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/migration.html b/latest/migration.html new file mode 100644 index 00000000..9440f086 --- /dev/null +++ b/latest/migration.html @@ -0,0 +1,760 @@ + + + + + + + + + + + + + + + Software Migration Considerations — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Software Migration Considerations
  • +
  • +
  • +
+
+
+
+
+ +
+

Software Migration Considerations

+ +

This section of documentation covers the notable API differences between the current release of SDK, 1.2, and previous versions.

+
+

API Changes from Alveo U30

+

This sub-section describes differences between U30 and MA35D

+
+

FFmpeg API Changes

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + +

Options General

MA35D

U30

-c:v:

+

Used for codec selection. Aside from naming convention changes, new AV1 codec and VP9 decoder are now available.

+

-c:v

-c:v

-filter_complex:

+

Used for frame filtering operation. Aside from naming convention changes, new 2D composition and ML operations are now available.

+

-filter_complex

-filter_complex

-hwaccel:

+

Used to select hardware accelerator engine. This option was previously referred to as xlnx_hwdev.

+

-hwaccel

-xlnx_hwdev

-vf:

+

Used to select the DMA transfer direction between host and accelerator.

+

-vf

xvbm_convert

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Encoder

Version 1.2

U30

-level:

+

Used to specify encoder's level. It now supports AV1's levels.

+

-level

-level

-profile:

+

Used to set encoder's profile. It now supports AV1's main.

+

-profile

-profile

-control_rate:

+

Used to set rate control mode. Options to this setting have changed.

+

-control_rate

-control-rate

-tune_metrics:

+

Used to tune VQ metrics. Options to this setting have changed.

+

-tune_metrics

-tune-metrics

-cores:

+

Used to explicitly specify the number of processing cores.

+

Deprecated

-cores

-periodicity-idr:

+

Used to determine IDR frame frequency.

+

Deprecated

-periodicity-idr

-force_key_frames:

+

Used to force IDR frame insertion, at specified frame numbers.

+

Deprecated

-force_key_frames

-disable-pipeline:

+

Used to enable/disable pipelining.

+

Deprecated

-disable-pipeline

-aspect-ratio:

+

Used to set video's aspect ratio.

+

Deprecated

-aspect-ratio

-expert-options:

+

Used to set encoder's expert option.

+

Deprecated

-expert-options

-avc-lowlat:

+

Used to enable/disable ULL for AVC.

+

Deprecated

-avc-lowlat

+ +++++ + + + + + + + + + + + + + + + + +

Options Decoder

Version 1.2

U30

-splitbuff_mode:

+

Used to configure decoder's buffer mode.

+

Deprecated

-splitbuff_mode

-entropy_buffers_count:

+

Used to set number of decoder's entropy buffers.

+

Deprecated

-entropy_buffers_count

+ +++++ + + + + + + + + + + + + + + + + + + + + +

Options Scaler

Version 1.2

U30

-out_{N}_width:

+

Used to configure width of an output rung.

+

Deprecated

-out_{N}_width

-out_{N}_height:

+

Used to configure height of an output rung.

+

Deprecated

-out_{N}_height

-out_{N}_rate:

+

Used to configure frame rate of an output rung.

+

Deprecated

-out_{N}_rate

+
+
+

Gstreamer API Changes

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Encoder

Version 1.2

U30

tune_metrics:

+

Used to tune VQ metrics. Options to this setting have changed.

+

tune-metrics

tune-metrics

ultra-low-latency:

+

Used to set ULL mode.

+

Set lookahead-depth to 0.

ultra-low-latency

target-bitrate:

+

Used to set target bit rate.

+

bitrate

target-bitrate

control_rate:

+

Used to set rate control mode. Options to this setting have changed.

+

rate-control

control-rate

dev-idx:

+

Used to specify the index of the device on which the encoder should be executed.

+

device

dev-idx

aspect-ratio:

+

Used to set video’s aspect ratio.

+

Deprecated

aspect-ratio

avc-lowlat:

+

Used to enable/disable ULL for AVC.

+

Deprecated

avc-lowlat

dependent-slice:

+

Used to specify slice dependency.

+

Deprecated

dependent-slice

enable-pipeline:

+

Used to enable/disable pipelining.

+

Deprecated

enable-pipeline

ip-delta:

+

Used to set IP delta.

+

Deprecated

ip-delta

loop-filter-beta-offset:

+

Used to set loop filter beta offset.

+

Deprecated

loop-filter-beta-offset

loop-filter-tc-offset:

+

Used to set loop filter tc offset..

+

Deprecated

loop-filter-tc-offset

slice-qp:

+

Used to set slice QP mode.

+

Deprecated

slice-qp

scaling-list:

+

Used to set lscaling list mode.

+

Deprecated

scaling-list

reservation-id:

+

Used to set resource pool reservation id.

+

Deprecated

reservation-id

rc-mode:

+

Used to enable custom rate control mode.

+

Deprecated

rc-mode

qp-mode:

+

Used to set QP control mode used by the encoder.

+

Deprecated

qp-mode

pb-delta:

+

Used to set PB delta.

+

Deprecated

pb-delta

periodicity-idr:

+

Used to set periodicity of IDR frames.

+

Deprecated

periodicity-idr

num-cores:

+

Used to set the number of encoder cores to be used for current stream.

+

Deprecated

num-cores

num-slices:

+

Used to set the number of slices produced for each frame.

+

Deprecated

num-slices

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Decoder

Version 1.2

U30

dev-idx:

+

Used to specify the index of the device on which the decoder should be executed.

+

device

dev-idx

avoid-dynamic-alloc:

+

Used to set a flag to avoid dynamic allocation of output buffers.

+

Deprecated

avoid-dynamic-alloc

avoid-output-copy:

+

Used to set a flag to avoid output frames copy.

+

Deprecated

avoid-output-copy

disable-hdr10-sei:

+

Used to configure whether to passthrough HDR10/10+ SEI messages or not.

+

Deprecated

disable-hdr10-sei

interpolate-timestamps:

+

Used to configure interpolation of output buffers PTS.

+

Deprecated

interpolate-timestamps

num-entropy-buf:

+

Used to specifie the number of decoder internal entropy buffers.

+

Deprecated

num-entropy-buf

reservation-id:

+

Used to set resource Pool Reservation id.

+

Deprecated

reservation-id

splitbuff-mode:

+

Used to configure decoder in split/unsplit input buffer mode.

+

Deprecated

splitbuff-mode

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Scaler

Version 1.2

U30

dev-idx:

+

Used to specify the index of the device on which the scaler should be executed.

+

device

dev-idx

avoid-output-copy:

+

Used to set a flag to avoid output frames copy on all source pads.

+

Deprecated

avoid-output-copy

coef-load-type:

+

Used to configure coefficients loading type for scaling.

+

Deprecated

coef-load-type

enable-pipeline:

+

Used to enable buffer pipelining to improve performance in non zero-copy use cases.

+

Deprecated

enable-pipeline

reservation-id:

+

Used to configure resource pool reservation id.

+

Deprecated

reservation-id

+
+
+
+

CLI Changes from 1.1.2 to 1.2

+

This sub-section describes differences between 1.1.2 and current version.

+
+

PCIe Addressing

+

Unlike the previous version, where PCIe devices were addressed as DBDF, this release uses BDF scheme. See Card Management.

+
+
+

FFmpeg CLI Changes

+ +++++ + + + + + + + + + + + + +

Options General

1.2

1.1.2

-c:v:

+

New still image codecs are now available. See -c:v for details.

+

-c:v

-c:v

+ +++++ + + + + + + + + + + + + +

Options Encoder

1.2

1.1.2

-control_rate:

+

cabr has been removed as a rate control mode, and can now be applied as a modifier to all encoding modes.

+

-control_rate and -cabr

-control_rate

+ +++++ + + + + + + + + + + + + +

Options Decoder

1.2

1.1.2

-resize:

+

Option to perform downscaling through decoders has been added.

+

-resize

+ +++++ + + + + + + + + + + + + +

Options 2D Engine

1.2

1.1.2

crop, pad, drawbox, and other 2D operations:

+

2D operations that were previously sub-commands of 2d_ama are now invoked with a simpler syntax.

+

2D Engine

-scaler_ama and -2d_ama

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/objects.inv b/latest/objects.inv new file mode 100644 index 00000000..e88c4d6f Binary files /dev/null and b/latest/objects.inv differ diff --git a/latest/package_feed.html b/latest/package_feed.html new file mode 100644 index 00000000..530ca434 --- /dev/null +++ b/latest/package_feed.html @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + Distribution Package Feed — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Distribution Package Feed
  • +
  • +
  • +
+
+
+
+
+ +
+

Distribution Package Feed

+ +
+

Package Descriptions

+ ++++ + + + + + + + + + + + + + + + + + + + + + + +

Name

Description

amd-ama-core

This package includes all the core elements that are required for running applications.

amd-ama-driver

This package includes all kernel driver and firmware elements.

amd-ama-ffmpeg

This package includes all the relevant software for running hardware-accelerated FFmpeg pipelines.

amd-ama-gstreamer

This package includes all the relevant software for running hardware-accelerated Gstreamer pipelines.

amd-ama-xma

This package includes various XMA based application programs and development header files.

+
+
+

Configuring the Package Feed

+

Distribution based package feeds allow for convenient and robust methods to update and upgrade relevant packages of the AMD AMA Video SDK. In order to be able to install the AMD AMA Video SDK packages from the package feed, point your package management client to the remote AMD AMA Video SDK package repository according to the instructions described below.

+
+

Ubuntu

+
    +
  1. Add Xilinx key:

    +
    wget -qO - https://www.xilinx.com/support/download/2018-2-1/xilinx-master-signing-key.asc | sudo tee /usr/share/keyrings/xilinx-master-signing-key.asc
    +
    +
    +
  2. +
  3. Add Xilinx PPA feed:

    +
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/xilinx-master-signing-key.asc] https://packages.xilinx.com/artifactory/debian-packages $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/xilinx.list
    +
    +
    +
  4. +
+
+
+

Debian 12

+
    +
  1. Add Xilinx key:

    +
    wget -qO - https://www.xilinx.com/support/download/2018-2-1/xilinx-master-signing-key.asc | sudo tee /usr/share/keyrings/xilinx-master-signing-key.asc
    +
    +
    +
  2. +
  3. Add Xilinx PPA feed:

    +
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/xilinx-master-signing-key.asc] https://packages.xilinx.com/artifactory/debian-packages jammy main" | sudo tee /etc/apt/sources.list.d/xilinx.list
    +
    +
    +
  4. +
+
+
+

Fedora

+
    +
  1. Add Xilinx key:

    +
    sudo rpm --import https://www.xilinx.com/support/download/2018-2-1/xilinx-master-signing-key.asc
    +
    +
    +
  2. +
  3. List keys and check for Xilinx key

    +
    rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n'
    +
    +
    +
  4. +
  5. Add the following lines to the /etc/yum.repos.d/xilinx.repo file:

    +
    +
    [Artifactory]
    +name=Artifactory
    +baseurl=https://packages.xilinx.com/artifactory/rpm-packages/$basearch/
    +enabled=1
    +gpgcheck=0
    +sslverify=0
    +
    +
    +
    +
  6. +
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/preview.html b/latest/preview.html new file mode 100644 index 00000000..843051b0 --- /dev/null +++ b/latest/preview.html @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + New Feature Preview — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • New Feature Preview
  • +
  • +
  • +
+
+
+
+
+ +
+

New Feature Preview

+ +
+

Overview

+

This section describes new enhanced features, which are meant for demonstrative proposes and are only supported in FFmpeg. Note that although these features are not meant to be used in production environments; however, as they mature, they will become fully qualified as production ready.

+
+

Machine Learning Content Aware Encoding (MLCAE)

+

MLCAE is a novel rate control mode designed to optimize frames' encoding based on their complexity. By leveraging the statistics generated by the lookahead module, the ML algorithm updates the encoder's configuration and achieves significant bitrate savings without compromising perceived video quality.

+

The current implementation of MLCAE enhances the CBR mode by dynamically adjusting the bitrate according to the frame's predicted complexity. This feature optimizes the encoder's performance, leading to more efficient video encoding. The MLCAE algorithm monitors the lookahead module's stats and dynamically adjusts the encoder's parameters based on the predicted frame complexity. These adjustments ensure that the encoder config is optimally set in real-time, resulting in consistent video quality and bitrate savings throughout the entire video stream.

+

The following example demonstrates how MLCAE gets invoked:

+
ffmpeg -hide_banner -loglevel info -hwaccel ama -hwaccel_device /dev/ama_transcoder0  -re -c:v h264_ama -i <INPUT>  -c:v h264_ama -control_rate mlcae -b:v 5M -f mp4 -y <OUTPUT>
+
+
+
+

Note

+

For the best results, when using mlcae mode, encode bit rate should be above 3 Mbps. Also note that for this release, only h264_ama encoder is supported.

+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/release_notes.html b/latest/release_notes.html new file mode 100644 index 00000000..5d26f1b0 --- /dev/null +++ b/latest/release_notes.html @@ -0,0 +1,412 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) Release Notes — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA) Release Notes
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA) Release Notes

+
+

Note

+

Version: 1.2

+
+ +
+

+
+
+

Overview

+

This section describes various requirements, limitations, known issues and their respective workarounds that are applicable to AMD AMA Video SDK.

+
+
+

Release Requirements

+
    +
  1. This release will upgrade the MA35D firmware versions to:

    +
    +
    ZSP Version = 2.1.0
    +SC Version = 9.8.5
    +eSecure Version = 1.0.0
    +PCIe FW Version = 2.1.0
    +PCIe CTRL Patch Version = 1.0.3
    +PCIe PHY Patch A Version = 1.0.0
    +
    +
    +
    +
  2. +
  3. This documentation is applicable to 1.2 release.

  4. +
  5. Ensure that chassis's BIOS is set to performance mode, e.g., sleep states, clock throttling, etc. are disabled.

  6. +
+
+
+

New in This Release

+
    +
  1. Support for new encoder features in resource management toolchain.

  2. +
  3. New rate control modifier -cabr.

  4. +
  5. Improvements to board management utilities, e.g., see mautil and mamgmt.

  6. +
  7. Preview of ML based content adaptive (mlcae) rate control mode.

  8. +
  9. Support for PCIe passthrough.

  10. +
  11. Support for FFmpeg v6.1.1. (v5.1.2 deprecated.)

  12. +
  13. Compositor 2D gpu plugin support, e.g., see compositor_ama.

  14. +
  15. Support for downscaling using the decoder, e.g., see -resize.

  16. +
  17. Support for pipelines spanning multiple devices.

  18. +
  19. Created AMA specific DMA filters to improve throughput, e.g., see hwupload_ama and hwdownload_ama.

  20. +
  21. Support for 2D gpu color space conversion, input rotation, color subsampling, and overlay and tiling in GStreamer. See 2D Engines for details.

  22. +
  23. Support for JPEG and AVIF image processing, e.g., see -c:v.

  24. +
  25. Dual core AV1 encoding, enabling 4kp120 and 8Kp30, is now supported for all lookahead depths.

  26. +
  27. Support for min QP and CABR with ULL

  28. +
  29. Support for passing through CEA 608, 708 closed captions in transcode flows.

  30. +
  31. Support for passing through video full range flag in transcode flows.

  32. +
  33. Support for passing through DolbyVision T.35s in transcode flows.

  34. +
  35. Simplified command-line options for configuring CRF.

  36. +
  37. Support for unified QP range among all codecs.

  38. +
  39. Support for Fedora 40.

  40. +
  41. Support for pipeline and inference_period in ML plugin.

  42. +
+
+
+

Feature Highlight

+
    +
  1. Support for video transcode using either our supplied FFmpeg (n6.1), Gstreamer (v1.22), or custom Xilinx Media Acceleration (XMA) applications.

  2. +
  3. Support for up to 8 x 4Kp60 8-bit or 10-bit video decode VP9, AV1, AVC or HEVC per device.

  4. +
  5. Support for up to 4 x 4Kp60 8-bit or 10-bit video decode of AV1 per device.

  6. +
  7. Support for up to 2 x 4Kp60 8-bit or 10-bit video transcode of AVC or HEVC per device.

  8. +
  9. Support for up to 4 x 4Kp60 8-bit or 10-bit video transcode of AV1 per device.

  10. +
  11. Support for up to 1 x 8Kp30 8-bit or 10-bit video transcode of AV1 per device

  12. +
  13. Support for integration with software-based video image filters using our hardware DMA support to/from device memory.

  14. +
  15. Support for up to 160 Mbps encode throughput per device

  16. +
  17. Support for encoder levels >= 6.

  18. +
  19. Support for virtualization using either SR-IOV or PCIe passthrough.

  20. +
  21. Optional use of our supplied resource management daemon (xrmd) for automated accelerator selection and load balancing.

  22. +
  23. Detailed telemetry report, which includes resource utilization, power usage, heat dissipation, PCIe and memory bandwidth.

  24. +
  25. Dedicated 2D GPU and Machine Learning (ML) engines for pixel processing and encoding enhancements.

  26. +
  27. Face and text-based ML models for enhanced low bitrate video encoding for fine text and faces using the ML engine of the card.

  28. +
  29. Dual core AV1 encoding enabling 4kp120 and 8Kp30.

  30. +
  31. Programmable latency modes from 0 - 40 frames, with no impact on density.

  32. +
  33. Selectable video metrics modes MOS, SSIM and PSNR, with no impact on density.

  34. +
  35. HDR10, HDR10+ and/or HLG metadata pass through transcode support.

  36. +
  37. Simple to use validation applications.

  38. +
+
+
+

Supported Kernels and Distributions

+

The following table denotes the current supported kernels and distributions.

+ + +++++ + + + + + + + + + + + + + + + + + + + + +
Supported OS & Kernel

OS Name(s)

Generic Kernel(s)

Notes

+
Ubuntu 22.04
+
Ubuntu 20.04
+
+
+
5.15.0, 5.19.0, 6.2.0 and 6.5.0
+
+
+
Preferred kernels are 5.15.0, 6.2.0 and 6.5.0
+
+
+
Debian 12
+
+
+
6.1
+
+
+

+
+
+
Fedora 40
+
+
+
6.8
+
+
+
Preferred kernel is 6.9
+
+
+
+
+

Known Limitations

+
    +
  1. PF and VF must support PCIe memory regions BAR0 of 8 MB, BAR2 of 64 MB and BAR4 of 512 MB sizes.

  2. +
  3. PF and VF release versions must match.

  4. +
  5. A device that has been assigned to a VM cannot share its resources with its host.

  6. +
  7. Only a single VF may be assigned to a VM.

  8. +
  9. For maximum server scalability, ensure that a single VF is assigned to a VM.

  10. +
  11. Ensure that both the host and VMs are running the same SDK version.

  12. +
  13. MA35D only supports progressive content, i.e., interlaced contents are not supported in either the decoder or encoder.

  14. +
  15. For encoding, only resolutions that are divisible by 4 are supported, i.e., both height and width.

  16. +
  17. For decoding, only resolutions that are divisible by 2 are supported, i.e., both height and width.

  18. +
  19. This version of the SDK does not support splitting a video acceleration use case across multiple MA35D devices.

  20. +
  21. With the current version of FFmpeg, n5.1.2, it is not recommended to transport AV1 over MPEG TS.

  22. +
  23. XMA sample applications are not meant to be run at maximum density.

  24. +
  25. Encode rates up to maximum of 400 Mbps are supported.

  26. +
  27. 4Kp120 is only supported for AV1 (type 1) encoder, under ultra low latency mode, using both cores.

  28. +
  29. VBR and CVBR rate control modes are not supported for lookahead depth between 0 and 4.

  30. +
  31. Using an encoder lookahead_depth value of <11 may limit the number of b-frames or other encoder features such as rate control modes, aq modes and so forth. See Encoding Compatibility Matrix for details.

  32. +
  33. When using the encoder fast preset, lookahead_depth must be > 0.

  34. +
  35. Mixing 2-slice AV1 Type 1 encoding and 1-slice encoding is not supported on a single device

  36. +
  37. Encoder does not support dynamic QP maps in either AV1 Type 2 encoding or with lookahead_depth = 0.

  38. +
  39. 2D GPU only supports 8-bit video.

  40. +
  41. The 2D GPU and ML engines are not supported in Gstreamer or through XMA interface.

  42. +
  43. AV1 decoder does not support 8k resolution in portrait mode.

  44. +
+
+
+

Known Issues

+
    +
  1. A secondary bus reset (SBR) will cause the server to hang. A cold boot of the server will restore function. After installation of our driver package, our setup.sh script should be run prior to utilizing any of the features of the SDK. The setup.sh will disable secondary bus reset.

  2. +
  3. AV1 decoding using the included ama_av1dec Gstreamer plugin requires the use of an IVF packaged AV1 raw video stream and a corresponding ivfparse plugin to be utilized to demux the AV1 video stream.

  4. +
  5. If the kernel driver is not loaded, tools such as mautil may crash when invoked.

  6. +
  7. An AV1 HLS stream may playback at slower than real time speeds. Recommend explicitly setting of fps playback frame rate when using ffplay or use ffplay from ffmpeg 5.1.2 or 6.0

  8. +
  9. Recommend playback of raw video using more recent versions of ffplay (n5.1.2n6.0 or later) or more recent versions of media players such as VLC v3.0.17.4. Alternatively, muxing the raw video into an IVF container format is also permitted.

  10. +
  11. Using Gstreamer, 1080p30 transcodes and or lower resolutions cannot run at full density with default lookahead depth.

  12. +
  13. ROI Model currently doesn't support portrait mode in a specific resolution of 1080x1920.

  14. +
  15. A strict HDR10+ compliance checker may report some warnings in encoded HDR10+ bitstreams generated by this release.

  16. +
  17. Firmware downgrade to GA1.0 may not work on some desktop machines or low end servers. Warm boot the server to get to working state.

  18. +
  19. AV1 decoder accepts streams up to 40 Mbps.

  20. +
  21. Attempts to firmware updates before the 10-minute mark, of card uptime, with 9.7.35 satellite controller firmware will fail.

  22. +
  23. XMA ML APIs do not include roi_scale xma filter.

  24. +
  25. Logo overlay prints error messages every 30s, which are innocuous.

  26. +
+
+
+

Upgrading from Previous Versions

+
    +
  1. Remove any previously installed ma35 and amd-ama packages as per installation instructions.

  2. +
  3. Remove any manually created Boost library soft links that may have been created, previously.

  4. +
  5. Remove all entries from /etc/apt/sources.list.d/xilinx.list if this file exists.

  6. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/search.html b/latest/search.html new file mode 100644 index 00000000..66e9a5c4 --- /dev/null +++ b/latest/search.html @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + Search — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Search
  • +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/latest/searchindex.js b/latest/searchindex.js new file mode 100644 index 00000000..9845fa8c --- /dev/null +++ b/latest/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["c_apis", "card_management", "encoder_comp_matrix", "examples", "examples/amf/amf_encoder", "examples/ffmpeg/filters", "examples/ffmpeg/quality_analysis", "examples/ffmpeg/tutorials", "examples/gstreamer/filters", "examples/gstreamer/tutorials", "examples/gstreamer/xabrladder", "examples/gstreamer/xcompositor", "examples/xma/xma_apps", "getting_started_on_prem", "git_hub", "index", "managing_compute_resources", "migration", "package_feed", "preview", "release_notes", "specs_and_features", "troubleshooting", "tuning_pipeline_latency", "tuning_video_quality", "unified_logging", "using_ffmpeg", "using_gstreamer", "virtualization"], "filenames": ["c_apis.rst", "card_management.rst", "encoder_comp_matrix.rst", "examples.rst", "examples/amf/amf_encoder.rst", "examples/ffmpeg/filters.rst", "examples/ffmpeg/quality_analysis.rst", "examples/ffmpeg/tutorials.rst", "examples/gstreamer/filters.rst", "examples/gstreamer/tutorials.rst", "examples/gstreamer/xabrladder.rst", "examples/gstreamer/xcompositor.rst", "examples/xma/xma_apps.rst", "getting_started_on_prem.rst", "git_hub.rst", "index.rst", "managing_compute_resources.rst", "migration.rst", "package_feed.rst", "preview.rst", "release_notes.rst", "specs_and_features.rst", "troubleshooting.rst", "tuning_pipeline_latency.rst", "tuning_video_quality.rst", "unified_logging.rst", "using_ffmpeg.rst", "using_gstreamer.rst", "virtualization.rst"], "titles": ["C API Programming Guide", "Card Management", "Encoding Compatibility Matrix", "Tutorials and Examples", "AMF Encoder Tutorial", "FFmpeg Examples using Software Filters", "Video Quality Examples", "FFmpeg Tutorials", "GStreamer Examples using Software Filters", "GStreamer Introductory Tutorials", "GStreamer ABR Ladder Application", "GStreamer Compositor Application", "XMA Examples for the AMD AMA Video SDK", "Getting Started with AMD AMA Video SDK Cards", "AMD Advanced Media Acceleration (AMA) Repository", "AMD Advanced Media Acceleration (AMA)", "Managing Video Acceleration Compute Resources", "Software Migration Considerations", "Distribution Package Feed", "New Feature Preview", "AMD Advanced Media Acceleration (AMA) Release Notes", "Specs and Features of the AMD AMA Video SDK", "AMD Advanced Media Acceleration (AMA) Troubleshooting", "Tuning Latency", "Tuning Video Quality", "Unified Logging", "Using FFmpeg", "Using GStreamer", "Virtualization"], "terms": {"amazon": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "ec2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "vt2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "2022": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "2024": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "ma35": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "opt": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "The": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 19, 20, 22, 23, 24, 25, 26, 27, 28], "provid": [0, 1, 5, 6, 7, 9, 10, 15, 16, 21, 24, 25, 26, 27, 28], "base": [0, 3, 4, 10, 12, 13, 15, 16, 18, 19, 20, 21, 22, 23, 24, 26, 27], "which": [0, 1, 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28], "facilit": [0, 15, 21], "integr": [0, 14, 15, 20, 21], "transcod": [0, 5, 10, 11, 14, 15, 20, 22, 24, 26, 27], "capabl": [0, 7, 9, 15, 16, 21, 24, 26], "proprietari": [0, 15, 21], "framework": [0, 4, 7, 15, 21, 25, 27], "thi": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 21, 22, 23, 24, 26, 27, 28], "i": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "form": [0, 10, 16, 21, 24, 26], "leverag": [0, 15, 16, 19, 21, 26, 27], "xilinx": [0, 1, 12, 16, 18, 20, 21, 22, 28], "media": [0, 4, 6, 12, 21, 27], "acceler": [0, 1, 5, 7, 8, 9, 12, 17, 18, 21, 25, 28], "librari": [0, 6, 14, 20, 25, 26], "manag": [0, 17, 18, 20, 21, 28], "libxma": 0, "meant": [0, 1, 14, 19, 20, 28], "simplifi": [0, 16, 20], "control": [0, 1, 12, 13, 17, 19, 20, 21, 22, 25, 26, 27, 28], "us": [0, 1, 2, 4, 6, 7, 9, 10, 12, 14, 17, 19, 20, 21, 22, 23, 24, 28], "hardwar": [0, 1, 7, 12, 15, 16, 17, 18, 20, 21, 22, 25, 26], "avail": [0, 1, 7, 9, 10, 11, 16, 17, 21, 22, 26, 27, 28], "system": [0, 1, 5, 6, 7, 8, 9, 12, 13, 21, 22, 27, 28], "keep": 0, "track": [0, 1, 6, 16, 22, 23, 26], "total": [0, 1, 13, 16, 26, 27], "capac": [0, 6, 16, 27], "each": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 21, 22, 24, 25, 26, 28], "comput": [0, 1, 21], "unit": [0, 1, 7, 9, 15, 16, 28], "make": [0, 16, 21, 26, 28], "possibl": [0, 5, 6, 8, 16, 22], "perform": [0, 1, 4, 5, 6, 7, 8, 9, 12, 13, 16, 17, 19, 20, 22, 23, 25, 27, 28], "action": [0, 16, 21, 26], "reserv": [0, 1, 17], "releas": [0, 1, 13, 15, 16, 17, 18, 19, 22, 24, 26], "calcul": [0, 6, 12, 16, 21], "load": [0, 1, 12, 17, 20, 21, 28], "max": [0, 1, 11, 12, 16, 24, 25, 26, 27], "4": [0, 1, 2, 5, 6, 9, 12, 13, 20, 21, 22, 23, 24, 26, 27, 28], "differ": [0, 6, 7, 8, 10, 16, 17, 21, 24, 25, 26, 27], "correspond": [0, 16, 20, 24], "specif": [0, 1, 10, 15, 20, 21, 24, 25, 26, 27, 28], "featur": [0, 15, 16, 26, 27, 28], "card": [0, 7, 9, 15, 16, 17, 20, 28], "ani": [0, 7, 9, 12, 13, 20, 21, 22, 24, 25, 26, 27], "combin": [0, 2, 5, 6, 7, 8, 21, 23, 26], "can": [0, 1, 4, 5, 6, 7, 8, 9, 12, 16, 17, 21, 22, 23, 24, 26, 27, 28], "when": [0, 2, 5, 7, 8, 9, 12, 16, 19, 20, 22, 24, 26, 27], "For": [0, 1, 2, 5, 6, 7, 9, 12, 13, 16, 19, 20, 21, 23, 24, 26, 27, 28], "elabor": 0, "definit": [0, 21], "default": [0, 6, 7, 9, 10, 11, 12, 13, 16, 20, 22, 23, 24, 25, 26, 27, 28], "auto": [0, 12, 21, 26, 27], "valu": [0, 1, 2, 12, 16, 20, 22, 24, 25, 26, 27], "counterpart": 0, "section": [0, 1, 5, 6, 7, 8, 9, 12, 13, 16, 17, 19, 20, 21, 22, 24, 25, 26, 27, 28], "ffmpeg": [0, 3, 6, 8, 9, 12, 13, 15, 18, 19, 20, 21, 24, 25], "layer": [0, 11, 16, 25], "ar": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "organ": 0, "around": [0, 7, 24], "follow": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "step": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 21, 22, 28], "must": [0, 1, 7, 9, 12, 13, 16, 20, 21, 24, 26, 27], "first": [0, 7, 9, 11, 16, 26, 28], "creat": [0, 1, 7, 8, 9, 11, 16, 20, 21, 22, 27, 28], "xrm_plugin_reserv": 0, "where": [0, 1, 5, 6, 7, 9, 13, 16, 17, 21, 24, 25, 26, 28], "one": [0, 1, 5, 7, 8, 10, 16, 21, 24, 26, 27, 28], "dec": [0, 23, 25, 26], "enc": [0, 1, 25], "scale": [0, 7, 8, 10, 12, 15, 17, 26, 27], "done": [0, 5, 7, 8, 9, 16, 21, 22], "describ": [0, 2, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28], "detail": [0, 1, 5, 6, 7, 9, 12, 13, 16, 17, 20, 21, 22, 24, 26, 27], "below": [0, 1, 7, 10, 11, 16, 18, 21, 22, 24, 26, 27], "onc": [0, 1, 7, 9, 16, 21, 26], "have": [0, 2, 6, 9, 13, 16, 17, 20, 21, 23, 24, 26, 27, 28], "been": [0, 6, 9, 12, 16, 17, 20, 21, 22, 26, 28], "dedic": [0, 6, 20, 21], "need": [0, 5, 13, 16, 21, 27, 28], "To": [0, 1, 7, 9, 13, 16, 21, 22, 23, 24, 26, 28], "all": [0, 1, 2, 5, 6, 7, 8, 9, 12, 13, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 28], "requir": [0, 5, 6, 7, 8, 9, 12, 13, 18, 21, 22, 23, 26], "particular": [0, 16], "It": [0, 1, 5, 6, 7, 8, 9, 12, 13, 14, 16, 17, 21, 22, 23, 24, 26, 27, 28], "call": [0, 21], "function": [0, 1, 5, 8, 9, 16, 20, 21, 24, 27, 28], "A": [0, 1, 13, 16, 20, 21, 26], "complet": [0, 1, 7, 9, 12, 15, 16, 21, 26, 27, 28], "send": [0, 8, 25, 26], "from": [0, 1, 6, 7, 8, 9, 11, 12, 13, 15, 16, 18, 21, 22, 24, 25, 26, 27, 28], "host": [0, 1, 5, 7, 8, 9, 13, 16, 17, 20, 21, 22, 26, 27], "receiv": [0, 7], "devic": [0, 4, 5, 8, 10, 11, 12, 13, 15, 17, 20, 21, 24, 26, 28], "xmafram": 0, "also": [0, 1, 7, 10, 11, 15, 19, 20, 21, 22, 23, 24, 26, 27, 28], "do": [0, 1, 7, 20, 21, 22, 23, 24, 28], "zero": [0, 1, 5, 8, 17, 27], "copi": [0, 5, 8, 17, 22, 26, 27], "oper": [0, 1, 5, 7, 9, 16, 17, 21, 22, 24, 25, 26, 27, 28], "pass": [0, 7, 9, 13, 16, 20, 21, 22, 26, 28], "next": [0, 16], "without": [0, 6, 10, 11, 16, 19, 21, 24, 26, 27, 28], "being": [0, 1, 7, 13, 16, 22], "back": [0, 5, 7, 8, 22], "return": [0, 1, 13, 22, 28], "code": [0, 6, 10, 11, 12, 14, 16, 21, 26, 27], "should": [0, 1, 2, 5, 6, 7, 8, 9, 12, 13, 16, 17, 19, 20, 21, 24, 26], "determin": [0, 6, 16, 17, 23, 24, 25], "suitabl": [0, 21], "finish": [0, 16], "destroi": [0, 1], "so": [0, 7, 16, 20, 21, 23, 26], "free": [0, 16], "other": [0, 6, 7, 10, 13, 16, 17, 20, 21, 22, 24], "job": [0, 13, 26, 27], "ensur": [0, 1, 5, 6, 7, 8, 9, 10, 12, 13, 19, 20, 22, 24, 26, 28], "everyth": 0, "clean": 0, "up": [0, 1, 11, 15, 16, 20, 21, 22, 26], "properli": [0, 1, 22, 28], "xrm_plugin_releas": 0, "packag": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 20, 22, 27, 28], "part": [0, 1, 21, 28], "necessari": 0, "declar": [0, 7], "your": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 16, 18, 22, 26, 27], "includ": [0, 1, 6, 7, 9, 13, 15, 16, 18, 20, 21, 25, 26, 27, 28], "header": [0, 18, 28], "sourc": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 20, 21, 22, 25, 26], "h": [0, 7, 8, 9, 10, 11, 12, 21, 26], "add": [0, 5, 6, 18, 22, 23, 26, 27, 28], "line": [0, 1, 5, 6, 7, 8, 9, 10, 11, 18, 20, 21, 24, 25, 26, 27], "cmakelist": 0, "txt": [0, 7, 9, 16, 23, 24, 25], "file": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28], "target_link_librari": 0, "project_nam": 0, "public": 0, "xrm_interfac": [0, 26, 27], "target_include_directori": 0, "project_source_dir": 0, "target_properti": 0, "interface_include_directori": 0, "struct": 0, "xmaparamet": 0, "type": [0, 1, 6, 7, 10, 11, 12, 16, 17, 20, 21, 22, 25, 26, 27, 28], "length": [0, 27], "custom": [0, 6, 16, 17, 20, 21, 27, 28], "argument": [0, 6, 7, 9, 12, 16, 22, 26], "found": [0, 5, 6, 7, 8, 9, 12, 16, 23, 24, 26, 27, 28], "xmaparam": 0, "xmaframeproperti": 0, "dimens": [0, 8, 26], "xmabuff": 0, "raw": [0, 5, 6, 7, 9, 12, 20, 22, 24], "its": [0, 1, 6, 16, 20, 21, 22, 24, 26, 27, 28], "sent": 0, "thei": [0, 6, 7, 9, 19, 21, 24, 26], "input": [0, 5, 6, 7, 8, 9, 10, 11, 12, 16, 17, 19, 20, 21, 22, 26], "output": [0, 1, 5, 6, 8, 10, 11, 12, 16, 17, 19, 21, 22, 23, 24, 25, 26], "look": [0, 1, 6, 16, 21, 24, 26], "ahead": [0, 1, 16, 21, 24, 26], "support": [0, 1, 5, 7, 10, 11, 12, 13, 16, 17, 18, 19, 22, 23, 24, 26, 27, 28], "3": [0, 1, 2, 5, 7, 9, 12, 13, 19, 20, 21, 22, 24, 26, 27, 28], "xma_host_buffer_typ": 0, "upload": [0, 7, 26, 27], "befor": [0, 6, 9, 16, 20, 22, 26], "xma_device_only_buffer_typ": 0, "download": [0, 6, 7, 18, 26, 27, 28], "no_buff": 0, "contain": [0, 1, 7, 8, 9, 10, 12, 14, 16, 20, 22, 24, 26, 27], "place": [0, 8], "holder": 0, "fill": 0, "onli": [0, 1, 2, 6, 12, 16, 19, 20, 21, 22, 23, 24, 26, 27, 28], "while": [0, 16, 21, 22, 24, 26], "xma_device_buffer_typ": 0, "dummi": 0, "those": 0, "respect": [0, 1, 6, 7, 9, 16, 20, 21, 26, 27], "xmadatabuff": 0, "sw_format": 0, "member": 0, "xmascalerproperti": 0, "xmaencoderproperti": 0, "xmafilterproperti": 0, "repres": [0, 7, 16, 26], "therefor": 0, "assign": [0, 7, 20, 21, 26, 28], "direct": [0, 1, 7, 17, 21, 26, 27], "flow": [0, 20, 25], "xma_nv12_fmt_typ": 0, "xma_p010le_fmt_typ": 0, "flag": [0, 6, 7, 17, 20, 23], "xma_frame_property_flag_tile_4x4": 0, "intern": [0, 7, 16, 17, 22, 27], "xma_packed10_fmt_typ": 0, "an": [0, 1, 2, 5, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 20, 21, 22, 23, 24, 25, 26, 27, 28], "xma_rgb24_fmt_typ": 0, "futur": [0, 27], "xma_yuv420p_fmt_typ": 0, "xma_yuv420p10le_fmt_typ": 0, "extern": [0, 21], "commonli": [0, 6], "most": [0, 6, 9, 12, 21, 24], "consist": [0, 19], "xma_log_init": 0, "xma_logmsg": 0, "xma_log_releas": 0, "xmalogg": 0, "int32_t": 0, "xmalogleveltyp": 0, "log_level": [0, 12, 23, 25], "xmalogtyp": 0, "log_typ": 0, "xmaloghandl": 0, "handl": [0, 16, 26], "prior": [0, 13, 20, 24], "see": [0, 5, 6, 7, 8, 9, 12, 13, 16, 17, 20, 21, 22, 23, 24, 26], "variad": 0, "usag": [0, 1, 5, 7, 9, 14, 15, 16, 20, 21, 24, 26, 27], "void": 0, "level": [0, 12, 17, 20, 21, 23, 25, 26], "const": 0, "char": 0, "name": [0, 1, 5, 7, 9, 10, 11, 12, 14, 16, 17, 18, 20, 21, 25, 26, 27, 28], "msg": 0, "messag": [0, 12, 13, 16, 17, 20, 22, 26, 28], "wa": [0, 17, 25], "previous": [0, 5, 7, 8, 17, 20], "xma_initi": 0, "xma_releas": 0, "xmainitparamet": 0, "init_param": 0, "xmahandl": 0, "xma_data_buffer_alloc": 0, "xma_data_from_buffer_clon": 0, "xma_data_buffer_fre": 0, "size_t": 0, "size": [0, 5, 7, 8, 12, 13, 20, 22, 23, 24, 25, 26, 27, 28], "bool": 0, "given": [0, 1, 2, 5, 7, 9, 12, 14, 16, 21, 23, 24], "uint8_t": 0, "xma_data_buffer_clone_free_callback_funct": 0, "free_callback": 0, "opaqu": 0, "point": [0, 1, 16, 18, 22, 24], "longer": 0, "xma_frame_planes_get": 0, "xma_frame_get_plane_height": 0, "xma_frame_get_plane_strid": 0, "xma_frame_get_plane_s": 0, "xma_frame_alloc": 0, "xma_frame_from_buffers_clon": 0, "xma_frame_clon": 0, "xma_frame_inc_ref": 0, "xma_frame_dec_ref": 0, "xma_frame_fre": 0, "xma_frame_add_side_data": 0, "xma_frame_get_first_side_data": 0, "xma_frame_get_side_data": 0, "xma_frame_get_next_side_data": 0, "xma_frame_get_next_side_data_of_typ": 0, "xma_frame_remove_side_data": 0, "xma_frame_remove_side_data_typ": 0, "xma_frame_clear_all_side_data": 0, "frame_prop": 0, "number": [0, 9, 10, 11, 12, 13, 16, 17, 20, 22, 23, 24, 25, 26, 27], "plane": 0, "height": [0, 2, 7, 9, 11, 12, 16, 17, 20, 24, 26, 27], "stride": 0, "width": [0, 1, 2, 7, 9, 11, 12, 16, 17, 20, 24, 26, 27], "xmaframedata": 0, "frame_data": 0, "xma_frame_clone_free_callback_funct": 0, "xma_fram": 0, "same": [0, 1, 6, 7, 16, 20, 22, 24, 26, 27], "ad": [0, 1, 11, 17, 26], "remov": [0, 13, 17, 20, 22, 28], "affect": 0, "origin": [0, 6, 8], "increas": [0, 21, 23, 24, 26, 27], "count": [0, 12], "decreas": [0, 21, 22, 24], "previou": [0, 16, 17], "xmaframesidedata": 0, "side_data": 0, "If": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 22, 23, 25, 26, 27, 28], "alreadi": [0, 7], "associ": [0, 21, 22, 24, 26, 28], "new": [0, 1, 5, 6, 7, 8, 9, 12, 16, 17], "set": [0, 7, 9, 12, 14, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "increment": [0, 21], "success": [0, 1, 13], "execut": [0, 5, 6, 7, 8, 9, 12, 13, 16, 17, 22, 26, 27, 28], "v1": [0, 14, 20], "enum": [0, 27], "xmaframesidedatatyp": 0, "decrement": [0, 22], "result": [0, 1, 5, 6, 7, 11, 16, 19, 21, 23, 24, 26], "freed": 0, "ha": [0, 1, 2, 6, 7, 12, 16, 17, 20, 21, 22, 23, 24, 26, 27], "": [0, 1, 5, 6, 7, 8, 9, 12, 13, 16, 17, 19, 20, 21, 22, 24, 26, 27, 28], "through": [0, 1, 5, 6, 7, 10, 11, 16, 17, 20, 21, 24, 26, 28], "xma_side_data_alloc": 0, "xma_side_data_fre": 0, "xma_side_data_inc_ref": 0, "xma_side_data_dec_ref": 0, "xma_side_data_get_refcount": 0, "xma_side_data_read": 0, "xma_side_data_writ": 0, "xma_side_data_get_metadata": 0, "xma_side_data_set_metadata": 0, "xmabuffertyp": 0, "buffer_typ": 0, "uint64_t": 0, "deprec": [0, 17, 20], "abov": [0, 6, 7, 9, 10, 13, 19, 21, 22, 23, 24, 25, 26, 28], "you": [0, 1, 5, 6, 7, 8, 9, 12, 13, 16, 22, 26, 27, 28], "yet": 0, "otherwis": [0, 25, 26, 28], "risk": 0, "race": 0, "condit": [0, 21, 22], "occur": 0, "metadata": [0, 7, 20, 26], "get": [0, 7, 12, 15, 19, 20, 22, 25, 27, 28], "specifi": [0, 1, 6, 7, 9, 11, 12, 16, 17, 22, 24, 26, 27], "replac": [0, 5], "depend": [0, 17, 21, 22, 23, 24, 27], "whether": [0, 13, 17, 24, 27], "exist": [0, 7, 20, 21, 28], "subsect": 0, "note": [0, 1, 5, 6, 7, 8, 9, 13, 14, 15, 16, 19, 21, 22, 23, 24, 26, 27, 28], "serv": [0, 27], "In": [0, 1, 5, 6, 8, 9, 16, 18, 21, 23, 26], "order": [0, 1, 6, 7, 16, 18, 23, 26, 27, 28], "allow": [0, 1, 7, 9, 15, 16, 18, 21, 23, 24, 26, 27, 28], "forward": 0, "backward": 0, "abi": 0, "compat": [0, 1, 5, 7, 8, 13, 15, 16, 20, 21, 23, 24, 27, 28], "now": [0, 17, 20], "assum": [0, 7, 16, 21, 25, 26, 28], "mean": [0, 1, 6, 24, 26], "earlier": 0, "later": [0, 20, 22, 26], "cannot": [0, 11, 16, 20], "either": [0, 6, 16, 20, 21, 26], "ignor": [0, 13, 26, 28], "error": [0, 1, 7, 9, 12, 16, 20, 22, 25, 26, 27], "snippet": [0, 28], "param": [0, 9, 12, 24, 27], "uint32_t": 0, "api_vers": 0, "xma_api_version_m_": 0, "m": [0, 23, 27, 28], "xma_api_vers": 0, "xma_uint32": 0, "sizeof": 0, "xma_init_param": 0, "param_cnt": 0, "logger": 0, "major": [0, 24], "minor": 0, "e": [0, 1, 5, 7, 8, 9, 12, 13, 16, 20, 21, 22, 24, 26, 27, 28], "g": [0, 1, 5, 7, 8, 9, 12, 13, 16, 20, 21, 22, 24, 26, 27], "macro": 0, "becom": [0, 16, 19, 22], "xma_api_version_1_0": 0, "xma_dec_session_cr": 0, "xma_dec_set_log": 0, "xma_dec_session_send_data": 0, "xma_dec_session_get_properti": 0, "xma_dec_session_recv_fram": 0, "xma_dec_session_destroi": 0, "xmadecod": 0, "xmadecodersess": 0, "xmadecoderproperti": 0, "dec_prop": 0, "run": [0, 1, 10, 12, 16, 18, 20, 21, 22, 26, 27, 28], "until": [0, 16, 21], "after": [0, 9, 13, 16, 20, 22, 26, 28], "sever": [0, 7, 16, 21], "factor": [0, 16, 24, 26, 27], "resolut": [0, 2, 6, 8, 10, 11, 12, 16, 20, 21, 22, 24, 26, 27], "rate": [0, 5, 6, 9, 12, 15, 16, 17, 19, 20, 21, 23, 26, 27], "bit": [0, 2, 5, 8, 9, 12, 17, 19, 20, 23, 26, 27], "depth": [0, 2, 12, 17, 20, 21, 22, 24, 26, 27], "xma_dec_session_set_log": 0, "chang": [0, 5, 7, 21, 24, 26], "some": [0, 6, 7, 9, 20, 22, 24], "data_us": 0, "wai": [0, 16, 21, 26, 27], "pars": [0, 9, 14], "stream": [0, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 19, 20, 21, 22, 24, 26, 27], "time": [0, 1, 5, 6, 7, 8, 9, 11, 12, 14, 15, 16, 19, 20, 22, 23, 24], "indic": [0, 1, 7, 9, 16, 22, 26, 28], "amount": [0, 24], "consum": [0, 1, 16], "xma_success": 0, "abl": [0, 18, 22, 28], "entireti": 0, "accordingli": [0, 16], "case": [0, 10, 16, 17, 20, 21, 22, 24, 26], "proce": [0, 1, 13, 22, 28], "fetch": 0, "xma_try_again": 0, "did": 0, "report": [0, 20, 21, 22, 25], "again": [0, 7, 21, 22], "xma_send_more_data": 0, "more": [0, 1, 5, 7, 8, 9, 12, 13, 14, 16, 19, 20, 21, 22, 24, 26, 27], "notifi": 0, "null": [0, 6, 7, 11, 16, 21, 23], "continu": [0, 22], "flush": 0, "out": [0, 5, 7, 9, 16, 21, 22, 27], "yuv": [0, 7, 9, 12, 26, 27], "dec_sess": 0, "fprop": 0, "tri": 0, "valid": [0, 13, 16, 20, 21, 26, 27], "pointer": 0, "still": [0, 12, 16, 17, 21, 26], "produc": [0, 7, 9, 10, 17, 21, 27], "xma_eo": 0, "configur": [0, 1, 5, 6, 7, 8, 9, 10, 12, 13, 16, 17, 19, 20, 21, 22, 24, 25, 26, 27, 28], "standard": [0, 6, 21, 26, 27], "both": [0, 1, 5, 7, 8, 20, 21, 23, 24, 26], "hwdecoder_typ": 0, "arrai": 0, "list": [0, 1, 6, 7, 12, 13, 16, 17, 18, 20, 21, 23, 24, 26], "incom": [0, 7, 24, 26], "even": [0, 21], "integ": [0, 11, 26, 27], "between": [0, 1, 5, 7, 8, 16, 17, 20, 21, 23, 26, 27, 28], "128": [0, 26, 28], "3840": [0, 16], "portrait": [0, 20, 21, 26], "2160": [0, 16], "bits_per_pixel": 0, "per": [0, 1, 7, 12, 13, 15, 20, 24, 27, 28], "primari": [0, 1, 24], "8": [0, 1, 2, 7, 8, 9, 11, 12, 13, 16, 20, 23, 26, 27, 28], "10": [0, 2, 5, 8, 9, 12, 17, 20, 22, 23, 26, 27], "xma_frame_property_flag_compress": 0, "addit": [0, 1, 6, 16, 24, 25, 27], "out_fmt": [0, 5, 7, 12, 16, 26], "option": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 16, 17, 20, 23, 24, 27, 28], "low_lat": [0, 7, 23, 26], "enabl": [0, 7, 10, 12, 13, 15, 16, 17, 18, 20, 21, 22, 23, 25, 26, 27, 28], "latency_log": [0, 12], "inform": [0, 1, 6, 7, 9, 16, 23, 25], "xma_scaler_session_cr": 0, "xma_scaler_set_log": 0, "xma_scaler_session_send_fram": 0, "xma_scaler_session_recv_frame_list": 0, "xma_scaler_session_destroi": 0, "xmascal": 0, "xmascalersess": 0, "prop": 0, "underli": [0, 24], "eventu": 0, "multipl": [0, 5, 16, 20, 21, 24, 26], "take": [0, 1, 7, 9, 10, 16, 26, 27], "further": [0, 5, 6, 7, 8, 22, 23, 24, 27], "upon": [0, 22], "xma_flush_again": 0, "frame_list": 0, "everi": [0, 6, 20, 23], "reach": [0, 21, 26], "end": [0, 7, 16, 20, 22, 23, 24, 26], "xma_error": 0, "xmascalerinoutproperti": 0, "xmascalerfilterproperti": 0, "16": [0, 1, 7, 8, 21, 26, 27], "hwscaler_typ": 0, "xma_abr_scaler_typ": 0, "num_output": 0, "xma_vpe_fmt_typ": 0, "framer": [0, 6, 7, 9, 16, 24, 27], "second": [0, 7, 24, 27, 28], "mix_rat": 0, "mix": [0, 20], "half": [0, 7, 12, 22, 26, 27], "top": [0, 5, 7, 8, 9, 11, 21, 26, 27], "crop": [0, 9, 17, 21, 26, 27], "disabl": [0, 7, 12, 13, 16, 17, 20, 25, 26, 27], "xma_enc_session_cr": 0, "xma_enc_session_set_log": 0, "xma_enc_session_send_fram": 0, "xma_enc_session_recv_data": 0, "xma_enc_session_destroi": 0, "xmaencod": 0, "xmaencodersess": 0, "enc_prop": 0, "about": [0, 1, 7, 16, 24], "data_s": 0, "respons": [0, 16], "xma_resend_and_recv": 0, "readi": [0, 19], "untouch": 0, "reus": [0, 16], "hwencoder_typ": 0, "lookahead_depth": [0, 6, 7, 12, 20, 22, 23, 24, 26], "lookahead": [0, 1, 2, 10, 12, 16, 17, 19, 20, 22, 26, 27], "modul": [0, 13, 19, 26, 28], "give": [0, 6, 9], "start": [0, 1, 6, 7, 11, 15, 16, 22, 23, 24, 28], "40": [0, 12, 20, 21], "rc_mode": [0, 12], "constant": [0, 21, 23, 26, 27], "qp": [0, 2, 7, 12, 17, 20, 21, 24, 26, 27], "cbr": [0, 2, 19, 21, 23, 24, 26, 27], "vbr": [0, 2, 20, 21, 24, 26, 27], "cvbr": [0, 2, 20, 21, 24, 26, 27], "bitrat": [0, 7, 9, 11, 12, 17, 19, 20, 22, 24, 26, 27], "kbp": [0, 11, 12], "fix": [0, 22, 24, 27], "quantiz": [0, 21, 23, 24, 26, 27], "51": [0, 12, 24, 26, 27], "264": [0, 1, 7, 8, 9, 10, 11, 12, 21, 26], "hevc": [0, 7, 9, 12, 15, 16, 20, 21, 24, 26, 27], "255": [0, 7, 12, 24, 26, 27], "av1": [0, 1, 7, 9, 12, 15, 16, 17, 20, 21, 26, 27], "gop_siz": 0, "maximum": [0, 12, 16, 20, 21, 24, 26, 27], "group": [0, 22, 28], "pictur": [0, 26, 27], "temp_aq_gain": [0, 12], "tempor": [0, 2, 12, 21, 24, 26, 27], "aq": [0, 2, 12, 20, 24, 26, 27], "gain": [0, 12, 24, 26, 27], "spat_aq_gain": [0, 12], "spatial": [0, 2, 12, 21, 24, 26, 27], "minqp": [0, 24], "minimum": [0, 2, 12, 26, 27], "maxqp": [0, 24], "profil": [0, 12, 17, 21, 26], "baselin": [0, 12, 21, 26], "main": [0, 12, 17, 18, 21, 22, 26, 27], "high": [0, 12, 15, 21, 22, 24, 26, 27], "intra": [0, 12, 21, 26, 27], "100": [0, 1, 9, 12, 21, 22, 26], "101": [0, 1, 12], "102": [0, 12], "103": [0, 12], "200": [0, 1, 9, 12], "codec": [0, 6, 7, 9, 10, 12, 15, 17, 20, 26], "slice": [0, 12, 16, 17, 20, 21, 26, 27], "spatial_aq": [0, 12, 26], "adapt": [0, 20], "temporal_aq": [0, 12, 26], "qp_mode": [0, 12, 26], "rel": [0, 11, 27], "uniform": [0, 26, 27], "tune_metr": [0, 6, 12, 17, 24, 26], "tune": [0, 7, 12, 17, 21, 26, 27], "metric": [0, 6, 12, 17, 20, 26, 27], "none": [0, 5, 12, 26, 28], "vq": [0, 6, 7, 12, 17, 21, 23, 24, 26, 27], "psnr": [0, 12, 20, 24, 26, 27], "ssim": [0, 12, 20, 24, 26, 27], "vmaf": [0, 12, 24, 26, 27], "forced_idr": [0, 26], "forc": [0, 1, 9, 17, 25, 26, 27, 28], "insert": [0, 9, 10, 11, 13, 17, 23, 26, 27, 28], "idr": [0, 10, 17, 21, 26, 27], "crf": [0, 2, 12, 20, 24, 26, 27], "expert_opt": [0, 12], "expert": [0, 12, 17], "device_typ": [0, 12], "select": [0, 6, 13, 16, 17, 20, 21, 23, 26, 27], "updat": [0, 1, 7, 9, 13, 18, 19, 20, 22], "These": [0, 16, 19, 21, 24, 26], "xmadynamicencparam": 0, "xmadynamicencparams_v2": 0, "clone": [0, 27], "attach": [0, 28], "check": [0, 9, 18, 22, 28], "statu": [0, 1, 21, 22, 27, 28], "xma_api_version_1_1": 0, "xma_api_version_1_1_2": 0, "xmasidedata": 0, "is_spatial_aq_gain_chang": 0, "spatial_aq_gain": [0, 12, 26], "is_temporal_aq_gain_chang": 0, "temporal_aq_gain": [0, 12, 26], "is_temporal_mode_chang": 0, "temporal_aq_mod": 0, "is_spatial_mode_chang": 0, "spatial_aq_mod": 0, "is_bit_rate_chang": 0, "bit_rate_kbp": 0, "is_b_frames_chang": 0, "num_b_fram": 0, "b": [0, 2, 5, 6, 7, 11, 12, 19, 20, 23, 24, 26, 27], "is_min_qp_chang": 0, "min_qp": [0, 12, 26], "is_max_qp_chang": 0, "max_qp": [0, 12, 26], "extra": [0, 13, 26, 28], "memeb": 0, "is_qp_chang": 0, "is_qp_i_offset_chang": 0, "qp_i_offset": [0, 26], "offset": [0, 5, 7, 9, 11, 17, 24, 26, 27], "is_qp_b_offset_chang": 0, "qp_b_offset": [0, 26], "is_min_bit_rate_chang": 0, "min_bit_rate_kbp": 0, "is_max_bit_rate_chang": 0, "max_bit_rate_kbp": 0, "xma_filter_session_cr": 0, "xma_filter_session_set_log": 0, "xma_filter_session_send_fram": 0, "xma_filter_session_recv_fram": 0, "xma_filter_session_destroi": 0, "xmafilt": 0, "xmafiltersess": 0, "reciev": 0, "re": [0, 5, 7, 19, 21, 23, 24, 26], "mai": [0, 1, 6, 16, 20, 21, 22, 23, 24, 26, 27, 28], "current": [0, 1, 16, 17, 19, 20, 24, 26, 27], "xmafilterportproperti": 0, "hwfilter_typ": 0, "entri": [0, 16, 20, 26], "xma_upload_filter_typ": 0, "xma_download_filter_typ": 0, "port": [0, 7], "xma_int32": 0, "immedi": 0, "delin": [0, 21, 23, 28], "improv": [0, 7, 17, 20, 21, 24, 26], "over": [0, 5, 7, 16, 20, 22, 26, 27], "here": [0, 6, 7, 9, 16, 24], "how": [0, 1, 4, 5, 6, 7, 8, 9, 12, 13, 16, 19, 21, 23, 24, 26, 27], "impli": [0, 21, 24, 26], "migrat": 0, "manual": [0, 20, 21, 28], "anoth": [0, 6, 16, 26, 27], "would": 0, "access": [0, 13, 21, 22, 27], "modifi": [0, 6, 17, 20, 24], "hdr10": [0, 17, 20, 21], "sei": [0, 17, 21], "defin": [0, 7, 16, 21, 24, 25, 26, 28], "own": [0, 22, 24, 28], "downstream": [0, 9, 26, 27], "predefin": 0, "user": [0, 1, 6, 7, 9, 15, 16, 21, 25, 26, 27, 28], "sidedata": 0, "delet": [0, 13], "sole": 0, "xma_dec_param_thread": 0, "xma_dec_param_wait": 0, "background": [0, 1, 7, 9, 16, 26, 27], "thread": [0, 9, 21, 25], "deploi": [0, 13, 21, 24], "cpu": [0, 1, 5, 6, 8, 9, 28], "util": [0, 7, 10, 11, 12, 16, 20, 21, 22, 23, 24, 25, 26, 28], "similarli": [0, 7, 24], "xma_enc_param_thread": 0, "xma_enc_param_wait": 0, "behav": [0, 28], "expect": [0, 10, 11, 21, 22, 26, 27], "behavior": [0, 7, 9, 21, 24, 26], "successfulli": 0, "regardless": 0, "pull": [0, 12], "try": [0, 22], "full": [0, 12, 16, 20, 21, 22, 26, 27], "accord": [0, 18, 19, 21], "last": [0, 26], "compress": [0, 6, 23, 24, 26], "No": [0, 2, 10, 11, 12, 21, 27], "loop": [0, 12, 17], "xma_scaler_param_thread": 0, "pipelin": [0, 1, 7, 9, 10, 11, 12, 13, 14, 16, 17, 18, 20, 21, 23, 24, 26], "extend": [0, 26], "xma_log_type_ama": 0, "xma_frame_side_data_dyn_enc_param": 0, "itself": [0, 24], "doe": [0, 1, 6, 9, 16, 20, 21, 22, 26, 27], "instead": [0, 9, 16, 24], "old": 0, "xmadyncompositorparam": 0, "setup": [0, 1, 20, 27, 28], "compositor": [0, 3, 7, 20, 26], "xmaa53closedcapt": 0, "close": [0, 16, 20, 21], "caption": [0, 20], "xmarpurawdata": 0, "rpu": 0, "xmarpudolbyvis": 0, "dolbi": 0, "xma_yuv422sp_10bit_fmt_typ": 0, "semi": 0, "planar": [0, 7], "xma_uyvy422_fmt_typ": 0, "uyvi": [0, 9], "xma_yuy2422_fmt_typ": 0, "yuy2": 0, "xma_jpeg_decoder_typ": 0, "jpeg": [0, 7, 20, 21, 26, 27], "xma_jpeg_encoder_typ": 0, "xma_lossless_jpeg_encoder_typ": 0, "lossless": [0, 26, 27], "63": [0, 12, 26], "xma_enc_rc_mode_crf": 0, "xma_enc_param_cabr_config": 0, "cabr": [0, 2, 17, 20, 26], "qualifi": [0, 19], "xma_enc_param_qu": 0, "int32": 0, "lossi": 0, "qualiti": [0, 3, 12, 15, 19, 22, 23, 26, 27], "xma_enc_param_still_imag": 0, "seri": [0, 7], "imag": [0, 1, 5, 8, 11, 17, 20, 21, 27, 28], "xmaencoderstillimag": 0, "int64_t": 0, "dt": 0, "muxer": 0, "xma_threading_flag_use_thread": 0, "xma_threading_flag_wait": 0, "wait": [0, 16, 22], "xma_miofilter_ml_core_id": 0, "core": [0, 1, 2, 7, 13, 16, 17, 18, 20, 21, 22, 26, 27, 28], "id": [0, 7, 12, 17, 21, 25, 26, 27], "xma_miofilter_ml_model": 0, "infer": [0, 7], "model": [0, 6, 7, 12, 16, 20, 24, 26, 28], "xma_miofilter_ml_perform": 0, "xma_miofilter_ml_tensor_dump": 0, "tensor": [0, 21], "dump": 0, "xma_miofilter_ml_inf_repeat": 0, "repeat": [0, 9, 26, 28], "xma_miofilter_ml_inf_period": 0, "period": [0, 12, 17, 23, 26, 27], "2d": [0, 1, 16, 17, 20], "relev": [0, 6, 16, 18, 23, 26, 28], "under": [0, 4, 6, 7, 10, 11, 12, 16, 20, 26, 27], "xmacrop": 0, "color": [0, 9, 20, 26, 27], "space": [0, 9, 10, 20, 21, 25, 26, 27], "convers": [0, 9, 20, 21, 26, 27], "xmacsc": 0, "drawbox": [0, 9, 17, 27], "xmadrawbox": 0, "overlai": [0, 7, 9, 11, 20, 21, 27], "xmaoverlai": 0, "pad": [0, 1, 9, 17, 21, 26], "xmapad": 0, "rotat": [0, 9, 20, 21, 24, 26, 27], "xmarot": 0, "subsampl": [0, 9, 20, 21, 26, 27], "xmasubsampl": 0, "tile": [0, 5, 9, 20, 21, 26, 27], "xmatil": 0, "xmacompositor": 0, "fpga": 0, "daemon": [0, 1, 16, 20, 28], "command": [0, 1, 5, 6, 7, 8, 9, 10, 11, 13, 17, 20, 21, 22, 24, 28], "tool": [0, 1, 20, 21, 24], "commun": [0, 21, 26, 27], "xrmadm": [0, 16], "xrmd": [0, 16, 20, 21, 26], "document": [0, 6, 12, 16, 17, 20, 24, 26, 27], "directori": [0, 5, 9, 12], "xrm_dec_reserv": 0, "xrm_dec_releas": 0, "xrm_dec_interfac": 0, "int": [0, 10, 11, 24], "xrmdecodecontext": 0, "xrm_dec_ctx": 0, "dev_index": 0, "xrminterfaceproperti": 0, "xrm_prop": 0, "were": [0, 17], "xrm_enc_reserv": 0, "xrm_enc_releas": 0, "xrm_enc_interfac": 0, "xrmencodecontext": 0, "xrm_enc_ctx": 0, "slice_id": 0, "is_xav1": 0, "is_ul": 0, "xrm_scale_reserv": 0, "xrm_scale_releas": 0, "xrm_scale_interfac": 0, "xrmscalecontext": 0, "scaler_xrm_ctx": 0, "input_prop": 0, "output_prop": 0, "addition": [0, 16, 25, 26], "engin": [0, 1, 6, 7, 17, 20, 24], "xrm_props_creat": 0, "reset": [0, 20, 21, 22], "rebuild": [0, 6], "xrm_dec_reserve_v2": 0, "xrm_dec_release_v2": 0, "xrmdecodecontextv2": 0, "xrmdecodepropsv2": 0, "xrm_dec_prop": 0, "xrm_enc_reserve_v2": 0, "xrm_enc_release_v2": 0, "xrmencodecontextv2": 0, "xrmencodepropsv2": 0, "xrm_enc_prop": 0, "xrm_scale_reserve_v2": 0, "xrm_scale_release_v2": 0, "xrmscalecontextv2": 0, "xrm_scale_ctx": 0, "xrmscalepropsv2": 0, "xrm_scale_prop": 0, "xrm_ml_reserve_v2": 0, "xrm_ml_release_v2": 0, "xrm_ml_interfac": 0, "xrmmlcontextv2": 0, "xrm_ml_ctx": 0, "xrmmlpropsv2": 0, "xrm_ml_prop": 0, "cd": [0, 27], "chmod": 0, "r": [0, 1, 7, 21, 26, 28], "777": 0, "mkdir": 0, "cmake": [0, 27], "j": [0, 10, 26], "amd": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 23, 24, 25, 26, 27, 28], "ama": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 23, 24, 25, 27, 28], "video": [1, 2, 3, 4, 9, 10, 11, 14, 15, 17, 18, 19, 20, 22, 23, 25, 27, 28], "sdk": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28], "build": [1, 6, 26, 27, 28], "xrm": [1, 21, 22, 25, 26, 27], "interfac": [1, 12, 15, 20, 21], "instal": [1, 5, 6, 7, 8, 9, 10, 11, 12, 16, 18, 20, 26, 27, 28], "upgrad": [1, 18], "board": [1, 20], "standalon": 1, "queri": [1, 16, 21], "administ": 1, "print": [1, 7, 12, 20, 26], "readabl": [1, 14, 16, 23], "manner": [1, 5, 7, 8, 21], "examin": [1, 21], "unprivileg": 1, "bare": [1, 28], "metal": [1, 28], "guest": [1, 13], "vm": [1, 13, 20], "privileg": 1, "target": [1, 5, 7, 8, 16, 17, 21, 22, 24, 25, 26, 27, 28], "instanc": [1, 13, 16, 23, 28], "pcie": [1, 13, 20, 21, 22], "notat": 1, "work": [1, 9, 12, 20, 22], "pci": [1, 21, 28], "hexadecim": 1, "often": 1, "lead": [1, 19], "two": [1, 10, 15, 16, 21, 24, 27], "four": [1, 11, 15], "digit": 1, "colon": 1, "sometim": [1, 22], "refer": [1, 7, 9, 13, 17, 21, 24, 25, 26, 27], "slot": [1, 13, 22], "decim": 1, "softwar": [1, 3, 7, 15, 18, 20, 21, 22, 25, 26], "systemd": [1, 28], "process": [1, 6, 9, 12, 13, 15, 16, 17, 20, 23, 24, 25, 26, 27], "alloc": [1, 7, 13, 16, 17, 21, 27, 28], "interact": [1, 7, 12, 16, 23, 25, 28], "gener": [1, 5, 7, 12, 13, 14, 17, 19, 20, 21, 23, 25, 28], "guid": [1, 6, 7, 9, 12, 26, 27], "stop": [1, 7], "systemctl": [1, 13, 28], "issu": [1, 7, 13, 26, 28], "obtain": [1, 6, 9, 23, 26, 27, 28], "sudo": [1, 13, 18, 22, 27, 28], "exampl": [1, 4, 15, 19, 21, 22, 23, 24, 28], "detect": [1, 22, 26], "2": [1, 5, 9, 11, 12, 13, 14, 15, 16, 18, 20, 21, 22, 24, 26, 27, 28], "o": [1, 11, 12, 28], "linux": [1, 13, 16], "5": [1, 2, 7, 10, 11, 12, 13, 16, 20, 21, 22, 26, 27, 28], "15": [1, 7, 12, 13, 20, 24, 28], "0": [1, 2, 5, 6, 7, 9, 10, 11, 12, 13, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28], "91": 1, "ubuntu": [1, 13, 20, 28], "smp": 1, "tue": 1, "nov": 1, "14": 1, "13": [1, 12], "30": [1, 7, 9, 12, 20, 21, 24], "08": [1, 7, 9], "utc": 1, "2023": [1, 28], "machin": [1, 7, 20, 24, 28], "x86_64": 1, "24": [1, 9], "memori": [1, 9, 20, 21, 27, 28], "127950": 1, "27": 1, "mb": [1, 20, 26], "124": 1, "95": 1, "gb": 1, "02d": 1, "00d": 1, "00h": 1, "33m": 1, "57": 1, "serial": [1, 28], "xfxxxxxxxxxx": 1, "03": [1, 7, 9, 28], "00": [1, 5, 7, 9, 21, 22, 28], "04": [1, 20, 28], "xfyyyyyyyyyi": 1, "01": [1, 7, 9, 21, 28], "02": [1, 22, 28], "cat": [1, 13, 28], "sy": [1, 7, 13, 22, 28], "class": [1, 13, 24, 26], "misc": [1, 13], "ama_transcod": [1, 13, 16, 22, 28], "x": [1, 5, 7, 9, 16, 20, 24, 26, 27], "bus_id": 1, "minu": [1, 26], "1": [1, 5, 6, 7, 9, 10, 11, 12, 13, 16, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28], "ama_transcoder0": [1, 5, 6, 7, 12, 13, 16, 19, 21, 22, 23, 26], "0000": [1, 22, 28], "version_inform": [1, 13], "zsp": [1, 13, 20], "sc": [1, 7, 13, 18, 20, 22], "9": [1, 2, 11, 13, 20, 22, 27], "esecur": [1, 13, 20], "fw": [1, 13, 20, 22], "ctrl": [1, 13, 20, 22], "patch": [1, 13, 20, 26, 27], "phy": [1, 13, 20], "environ": [1, 16, 19], "help": [1, 9, 12, 26, 28], "batch": 1, "commandarg": 1, "basic": 1, "shell": [1, 13, 16], "sub": [1, 16, 17], "impact": [1, 2, 7, 20, 24, 26], "applic": [1, 3, 4, 5, 6, 7, 8, 9, 12, 15, 18, 20, 21, 23, 24, 26, 27, 28], "via": [1, 16, 28], "json": [1, 6, 10, 16], "format": [1, 5, 6, 7, 9, 10, 12, 15, 16, 20, 24, 26, 27], "filenam": 1, "d": [1, 7, 12, 13, 16, 18, 20, 21, 22, 27, 28], "switch": [1, 22], "view": 1, "interest": 1, "electr": 1, "power": [1, 13, 15, 20, 21], "sensor": 1, "present": [1, 5, 6, 7, 8, 9, 10, 11, 12, 21], "hw": [1, 16], "cnt": 1, "counter": [1, 27], "topologi": [1, 23, 24], "info": [1, 12, 19, 21, 23, 25, 26, 27, 28], "thermal": 1, "known": [1, 6, 16, 22, 24, 27], "temperatur": 1, "76": 1, "c": [1, 3, 4, 5, 6, 7, 10, 12, 13, 14, 15, 17, 19, 20, 21, 22, 23, 24, 26, 28], "70": 1, "threshold": [1, 24, 26], "85": 1, "105": 1, "shutdown": 1, "110": 1, "749": 1, "v": [1, 5, 6, 7, 9, 11, 12, 16, 17, 19, 20, 21, 23, 24, 26, 28], "700": 1, "520": 1, "w": [1, 7, 12, 22, 26], "750": 1, "6": [1, 2, 6, 12, 13, 20, 22, 26, 27], "500": 1, "875": 1, "395": 1, "watt": 1, "aux": 1, "737": 1, "ddr": 1, "867": 1, "751": 1, "ml": [1, 13, 16, 17, 19, 20, 21, 24, 26], "752": 1, "3v": 1, "296": 1, "080": 1, "pex": 1, "374": 1, "233": 1, "12v": 1, "12": [1, 7, 12, 13, 16, 20, 21], "192": 1, "630": 1, "127": [1, 7], "diagnost": 1, "test": [1, 6, 13, 21, 28], "proper": [1, 5, 6, 7, 8, 9, 12, 13, 16], "progress": [1, 5, 20, 21], "mmio_perf": 1, "11": [1, 2, 5, 12, 20, 21, 28], "administr": [1, 28], "root": [1, 13, 26, 28], "virtual": [1, 13, 20, 22], "numvf": [1, 28], "activ": [1, 26, 28], "07d": 1, "01h": 1, "38m": 1, "xfxxxxxxxxxxx": 1, "xflyyyyyyyyi": 1, "vendor": [1, 12, 28], "0x10ee": 1, "0x5070": 1, "0x000e": 1, "0x048000": 1, "multimedia": [1, 13, 27, 28], "link": [1, 20, 21, 27], "negoti": [1, 27], "gen": [1, 25], "x4": 1, "05105": 1, "product": [1, 14, 19], "alveo": 1, "ma35d": [1, 5, 8, 14, 15, 16, 17, 20, 22], "pq": 1, "revis": 1, "oem": [1, 15, 21], "3704": 1, "xfxxxxxxx": 1, "pciectlpatch": 1, "pciefw": 1, "pciephypatch": 1, "7": [1, 2, 12, 20, 22, 26, 27, 28], "39": 1, "75": [1, 22], "69": 1, "600": [1, 5, 23, 24], "445": 1, "320": [1, 7], "868": 1, "187": 1, "472": 1, "968": 1, "axi": 1, "sram": 1, "uncorrect": 1, "segment": [1, 24], "correct": [1, 16], "read": [1, 7, 9], "write": [1, 7, 9, 25], "dfi": 1, "mbp": [1, 12, 19, 20], "33": [1, 5, 23], "66": 1, "68": [1, 12, 21], "135": 1, "202": 1, "402": 1, "784384": 1, "917504": 1, "mmio": 1, "4974": 1, "59392": 1, "subcommand": 1, "program": [1, 10, 11, 12, 13, 15, 18, 21, 22, 24], "verifi": [1, 12, 13], "extract": [1, 26], "arg": [1, 28], "p": [1, 7, 13, 26, 27], "syntax": [1, 7, 17, 26], "flash_sect": 1, "persist": [1, 21], "sequenti": 1, "subsystem": 1, "ma35_firmwar": [1, 13], "bin": [1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 22, 28], "region": [1, 13, 20, 24, 26], "Be": 1, "off": [1, 22, 23, 24, 26, 27, 28], "phase": [1, 21], "41": [1, 12], "2m": [1, 7], "22": [1, 5, 12, 20], "reboot": [1, 13, 22, 28], "effect": [1, 6, 23, 24, 26, 27], "compar": [1, 6], "match": [1, 20, 21], "mandatori": [1, 5, 6, 7, 8, 9, 10, 11, 12, 16], "script": [1, 5, 6, 7, 8, 9, 12, 13, 14, 16, 20, 23, 26], "sh": [1, 5, 6, 7, 8, 9, 12, 13, 16, 20, 22, 28], "boot": [1, 13, 16, 20], "list_cmd": [1, 16], "cu": [1, 16], "decod": [1, 6, 8, 11, 13, 14, 15, 16, 17, 20, 25], "scaler": [1, 7, 9, 16, 17], "encod": [1, 5, 6, 8, 11, 14, 15, 16, 17, 20, 21, 25], "am": [1, 16], "device_0": [1, 16], "cu_2": [1, 16], "cuid": [1, 16], "cutyp": [1, 16], "ip": [1, 16, 17, 22, 28], "kernel": [1, 11, 13, 16, 18, 22, 28], "kernelnam": [1, 16], "kernelalia": [1, 16], "encoder_type1_ama": [1, 16], "instancenam": [1, 16], "encoder_1": [1, 16], "cunam": [1, 16], "kernelplugin": [1, 16], "maxcapac": [1, 16], "497664000": [1, 16], "numchaninus": [1, 16], "usedload": [1, 16], "1000000": [1, 9, 16], "reservedload": [1, 16], "resrvusedload": [1, 16], "much": [1, 14, 16], "rang": [1, 10, 11, 16, 20, 21, 22, 23, 24, 26, 27], "noth": [1, 16], "fulli": [1, 16, 19, 21], "actual": [1, 16, 21, 24], "snapshot": [1, 16], "1080p60": [1, 7, 16, 21], "singl": [1, 7, 13, 20, 21, 26, 28], "deviceid": [1, 16], "scaler_ama": [1, 5, 7, 16, 17, 21, 26], "decoder_ama": [1, 16], "250000": [1, 16], "25": [1, 16, 24], "encoder_type2_ama": [1, 16], "lookahead_ama": [1, 16], "125000": [1, 16], "ml_ama": [1, 7, 16, 26], "enc_channel_ama": [1, 16], "8000": [1, 16], "decoder_av1_ama": [1, 16], "device_1": [1, 16], "Not": [1, 16, 26, 27], "observ": [1, 7, 13, 16, 22, 24], "quarter": [1, 16], "8th": [1, 16], "sinc": [1, 7, 16, 28], "plugin": [1, 6, 7, 9, 12, 13, 20, 21, 22, 25, 26], "gpu": [1, 16, 20, 21], "mani": [2, 6, 7, 9, 16, 21, 26, 27, 28], "adjust": [2, 6, 7, 19, 24, 26], "paramet": [2, 7, 9, 10, 11, 16, 19, 23, 25, 26, 28], "permiss": 2, "la": [2, 7, 21], "latenc": [2, 7, 12, 17, 20, 21, 26, 27], "mode": [2, 6, 12, 13, 17, 19, 20, 21, 25, 27], "slow": [2, 12, 16, 21, 24, 26, 27], "preset": [2, 12, 16, 20, 21, 26, 27, 28], "medium": [2, 12, 16, 21, 24, 26, 27], "fast": [2, 6, 12, 16, 20, 21, 24, 26, 27], "frame": [2, 5, 6, 7, 8, 9, 10, 12, 16, 17, 19, 20, 23, 24, 26, 27], "cqp": [2, 23, 24, 27], "roi": [2, 16, 20, 21], "map": [2, 5, 7, 10, 14, 16, 20, 21, 24, 26, 27], "49": 2, "normal": [2, 7, 12, 21, 26], "y": [2, 5, 6, 7, 9, 13, 16, 19, 21, 23, 24, 26, 27, 28], "low": [2, 12, 15, 17, 20, 21, 22, 24, 26, 27], "n": [2, 7, 8, 11, 16, 17, 18, 21, 24, 26], "ull": [2, 6, 12, 17, 20, 24, 26, 27], "53": [2, 12], "720": [2, 7, 9, 12, 16], "ident": [2, 7, 9, 16, 25, 26, 27], "statement": 2, "appli": [2, 5, 7, 8, 17, 26, 27], "filter": [3, 7, 12, 17, 20, 21, 22, 25, 27], "gstreamer": [3, 5, 6, 7, 12, 13, 16, 18, 20, 21, 24, 25], "abr": [3, 12, 16, 24, 25, 26], "ladder": [3, 16, 24, 25, 26], "xma": [3, 5, 6, 7, 8, 9, 13, 14, 18, 20, 21, 25, 27], "construct": [4, 7], "folder": [4, 5, 6, 7, 8, 9, 10, 12, 16, 26, 27], "illustr": [4, 6, 12, 16, 21, 24, 26, 27], "advanc": [4, 21], "api": [4, 12, 15, 16, 20, 21], "shown": [5, 16], "transfer": [5, 7, 8, 9, 17, 21, 26, 27], "hwdownload": [5, 7, 16, 26], "hwupload": [5, 6, 7, 24, 26], "split": [5, 7, 14, 16, 17, 20, 21], "fp": [5, 7, 9, 12, 20, 21, 26], "minim": [5, 8, 25], "traffic": [5, 8], "descript": [5, 7, 8, 10, 11, 25, 26, 27], "accumul": [5, 7, 8], "explain": [5, 6, 7, 8, 9, 16], "version": [5, 6, 7, 8, 9, 12, 13, 15, 17, 18, 21, 22, 26, 27, 28], "On": [5, 6, 7, 8, 9, 12, 13, 28], "premis": [5, 6, 7, 8, 9, 12, 15, 28], "export": [5, 6, 7, 8, 9, 12, 16, 23, 25, 27], "import": [5, 6, 7, 8, 9, 12, 18, 24], "variabl": [5, 6, 7, 8, 9, 12, 16, 25, 26, 27], "open": [5, 6, 7, 8, 9, 12, 26], "termin": [5, 6, 7, 8, 9, 12, 16, 25, 26], "correctli": [5, 6, 7, 8, 9, 12], "demonstr": [5, 6, 7, 9, 14, 19, 21, 23], "flip": [5, 7, 9, 26, 27], "hwaccel": [5, 6, 7, 16, 17, 19, 21, 23, 24, 26], "hwaccel_devic": [5, 6, 7, 16, 19, 21, 23, 26], "dev": [5, 6, 7, 9, 12, 13, 16, 17, 19, 21, 23, 26, 27, 28], "h264_ama": [5, 6, 7, 12, 16, 19, 21, 23, 26], "yuv420p": [5, 6, 7, 12, 16, 21, 24, 26], "filter_complex": [5, 7, 16, 17, 21, 26], "transpos": 5, "dir": [5, 22], "passthrough": [5, 17, 20], "a1": [5, 7], "b1": [5, 7], "f": [5, 6, 7, 10, 11, 16, 19, 21, 23, 24, 26], "mp4": [5, 7, 8, 9, 10, 11, 12, 16, 19, 21, 23, 26], "90_flip": 5, "270_flip": 5, "path": [5, 6, 7, 9, 10, 11, 12, 16, 25, 26, 27, 28], "avc": [5, 7, 9, 15, 17, 20, 21, 24, 27], "clip": [5, 6, 7, 24], "y4m": 5, "vid": 5, "l": [5, 7, 11, 22, 26], "lai": 5, "640": [5, 12, 16], "480": [5, 9, 12, 16], "in_w": 5, "800": [5, 23], "in_h": 5, "out_h": 5, "compos": [5, 11], "hide_bann": [5, 7, 19, 21], "input_1": 5, "input_2": 5, "input_3": 5, "input_4": 5, "out_r": [5, 7, 21, 26], "1920x1080": [5, 6, 7, 21, 24, 26], "hstack": 5, "bot": 5, "vstack": 5, "15m": [5, 7], "vframe": [5, 7, 16], "yuv420p10l": [5, 12, 16, 21, 26], "graph": [5, 7, 26], "As": [5, 7, 9, 13, 16, 21, 22, 23, 24, 28], "show": [5, 7, 8, 16, 21, 24], "crop_10b": 5, "vf": [5, 6, 7, 17, 20, 24, 26, 28], "1m": [5, 7, 26], "442": [5, 23], "neither": 5, "accept": [5, 7, 8, 9, 20, 26], "nor": 5, "yadif": 5, "lavfi": [5, 6, 24], "testsrc": [5, 24], "durat": [5, 24, 26], "60": [5, 6, 7, 9, 11, 12, 16, 22, 24, 26, 28], "rawvideo": [5, 6, 7, 16, 24], "drawtext": 5, "hello": 5, "fontcolor": 5, "yellow": 5, "fontsiz": 5, "36": 5, "page": [6, 7, 9, 10, 11, 13, 26, 28], "behind": 6, "measur": [6, 16, 24, 25], "maxim": 6, "topic": 6, "There": [6, 7, 9, 26], "longstand": 6, "goal": 6, "quantit": 6, "watch": 6, "inspect": [6, 9], "individu": [6, 16, 27], "led": 6, "evolut": 6, "algorithm": [6, 19], "solut": [6, 21], "common": [6, 22, 25], "peak": 6, "signal": [6, 26], "nois": 6, "ratio": [6, 12, 17, 21], "structur": [6, 24, 26], "similar": [6, 16, 21, 22], "index": [6, 10, 11, 17], "multimethod": 6, "assess": 6, "fusion": 6, "opinion": 6, "mo": [6, 20], "human": [6, 14, 23], "visual": [6, 15, 23, 24, 27], "screen": 6, "feedback": 6, "peopl": 6, "argu": 6, "best": [6, 19, 21, 22, 23, 24, 26, 27], "although": [6, 19], "consid": 6, "least": [6, 13, 28], "accur": 6, "jan": 6, "ozer": 6, "center": [6, 11], "post": 6, "hi": 6, "experiment": 6, "correl": [6, 21], "review": 6, "find": [6, 7, 9, 22, 26, 28], "furthermor": [6, 21, 23], "due": [6, 7, 9, 16, 22, 26, 27], "industri": [6, 26], "like": [6, 7, 23, 26], "ones": [6, 21, 24], "taught": 6, "higher": [6, 16, 23, 24, 26, 28], "wors": 6, "ey": 6, "x264": [6, 21], "x265": [6, 21], "object": [6, 12, 21, 23, 24, 26, 27], "discuss": 6, "subject": [6, 24], "appeal": 6, "what": [6, 16], "happen": [6, 24], "scene": [6, 24], "why": 6, "highli": [6, 21], "recommend": [6, 7, 9, 20, 21, 22, 23, 24], "undergon": 6, "transform": 6, "past": 6, "univers": 6, "state": [6, 7, 13, 20, 21, 22, 28], "fairli": 6, "altern": [6, 7, 20, 21, 22], "remain": 6, "long": [6, 16], "pre": [6, 8, 15, 21], "across": [6, 16, 20, 21, 27], "tutori": [6, 13, 15, 21, 26, 28], "cover": [6, 17], "chapter": [6, 26], "variou": [6, 7, 12, 14, 16, 18, 20, 21, 22, 24, 26, 27], "hevc_ama": [6, 7, 12, 16, 21, 24, 26], "av1_ama": [6, 7, 12, 21, 23, 26], "permut": 6, "pix_fmt": [6, 7, 12, 16], "2000k": 6, "real": [6, 12, 14, 15, 16, 19, 20, 22], "guarante": [6, 14], "howev": [6, 19, 21, 24, 26, 28], "better": [6, 23, 24], "achiev": [6, 7, 16, 19, 21, 23, 24, 28], "licens": [6, 26], "reason": 6, "binari": [6, 26], "deliv": [6, 21], "comprehens": [6, 9, 26], "easiest": 6, "static": [6, 7, 21, 24, 26], "john": 6, "van": 6, "sickl": 6, "among": [6, 20, 21, 23, 24], "precompil": 6, "recompil": 6, "repositori": [6, 16, 18, 22, 28], "instruct": [6, 7, 13, 16, 18, 20, 21, 22, 26, 27], "sampl": [6, 9, 10, 11, 14, 16, 20, 24, 26], "typic": [6, 16, 21, 24], "distort": [6, 24], "libvmaf": 6, "log_fmt": 6, "ms_ssim": 6, "log_path": 6, "log": [6, 7, 12, 14, 16, 22, 23, 27], "model_path": 6, "TO": 6, "widthxheigth": 6, "appropri": [6, 27], "vmaf_4k_v0": 6, "pkl": 6, "4k": [6, 21], "vmaf_float_v0": 6, "lower": [6, 20, 21, 22, 23, 24, 26, 27], "break": 7, "down": [7, 8, 21, 25, 26], "varieti": [7, 12, 27], "made": [7, 9, 14, 15, 16, 21], "task": [7, 9, 21, 28], "deleg": [7, 9], "mautil": [7, 9, 13, 20, 21], "runtim": [7, 9, 24], "overrid": [7, 9], "non": [7, 9, 17, 21], "explicitli": [7, 9, 16, 17, 20, 21, 22, 23], "within": [7, 16, 24, 26, 27, 28], "refin": 7, "subtask": 7, "hwupload_ama": [7, 16, 20, 26], "disk": [7, 9, 28], "chanc": [7, 9], "massiv": [7, 9], "bandwidth": [7, 9, 20, 21, 23], "notic": [7, 9, 12, 24], "drop": [7, 9, 12], "speed": [7, 9, 20, 21, 22, 24], "we": [7, 9, 25], "shm": [7, 9, 26], "ram": [7, 9, 13, 21, 28], "save": [7, 8, 10, 19], "nv12": [7, 9, 12, 16, 21, 26, 27], "tmp": [7, 8, 9, 10, 16, 25], "dec_out": 7, "explan": [7, 9], "move": [7, 9, 24], "twice": [7, 26], "convert": [7, 9, 22, 26, 27], "buffer": [7, 9, 11, 12, 17, 22, 23, 24, 26, 27], "signifi": 7, "oppos": 7, "audio": [7, 26], "ac3": [7, 22], "overwrit": 7, "prompt": 7, "sure": [7, 26], "yuv420": [7, 8], "5mbp": [7, 12], "5m": [7, 12, 19, 24], "sn1_av1": 7, "maintain": 7, "1080p": [7, 11, 12, 16, 21, 26], "8m": 7, "megabit": 7, "8000k": 7, "8000000": 7, "enc_out": 7, "pixel": [7, 8, 9, 12, 20, 24, 26, 27], "sn1_crf_hq": 7, "highest": [7, 21], "sn1_crf_lq": 7, "lowest": [7, 23], "8mbp": 7, "written": [7, 12, 21], "h264_to_hevc": 7, "them": 7, "_scale": 7, "1280x720": 7, "720x480": 7, "360x240": 7, "c1": 7, "d1": 7, "scale_1080p": 7, "scale_720p": 7, "scale_480p": 7, "scale_240p": 7, "togeth": [7, 16, 26, 27], "widthxheight": [7, 26], "scale_": 7, "_": [7, 16, 25], "6m": 7, "hevc_1080p60": 7, "av1_720p30": 7, "h264_480p30": 7, "av1_240p30": 7, "format_resoult": 7, "locat": [7, 9, 10, 11, 12, 14, 16, 23, 25, 26, 27, 28], "implement": [7, 10, 11, 19, 26], "hevc_1080p": [7, 9], "av1_720p": [7, 9], "h264_480p": [7, 9], "av1_240p": [7, 9], "ultra": [7, 12, 17, 20], "loglevel": [7, 19, 21], "10m": [7, 12], "trigger": 7, "4kp30": [7, 21], "resiz": [7, 9, 17, 20, 21, 26, 27], "3840x2160": [7, 21, 26], "outout": 7, "downscal": [7, 17, 20, 21, 27], "2x4kp60": 7, "explicit": [7, 21, 26], "hwdownload_ama": [7, 20, 26], "abil": [7, 24], "arbitrari": [7, 16], "ama_transcoderx": 7, "4x4kp60": [7, 21], "4kp6": 7, "out_3840x2160_0": 7, "out_3840x2160_1": 7, "servic": [7, 13, 15, 21, 22, 28], "distribut": [7, 21], "seq": [7, 21], "nostdin": [7, 21, 23], "out_t2_0_": 7, "out_av1_0_": 7, "ama_transcoderi": 7, "out_t2_1_": 7, "out_av1_1_": 7, "h264": [7, 8, 9, 10, 11, 12, 16, 26, 27], "64": [7, 20, 21, 26], "simultan": [7, 21], "1080p30": [7, 20, 21], "jpeg_ama": [7, 26], "prfix": 7, "03d": 7, "jpg": [7, 11], "pattern": [7, 9], "90": [7, 9, 21, 24, 26, 27], "04d": 7, "720p": [7, 12, 21, 26], "180": [7, 26, 27], "crop_ama": [7, 26], "b_left": [7, 26], "b_top": [7, 26], "b_w": [7, 26], "1280": [7, 9, 12, 16], "b_h": [7, 26], "pad_ama": [7, 26], "p_left": [7, 26], "p_top": [7, 26], "p_w": [7, 26], "1920": [7, 9, 12, 16, 24], "p_h": [7, 26], "1080": [7, 9, 12, 16, 24, 26], "pink": [7, 9], "rotate_ama": [7, 26], "angl": [7, 9, 26, 27], "degre": [7, 27], "rgb": [7, 9, 26, 27], "bgra": [7, 9, 21, 27], "colorspace_ama": [7, 26], "csc": [7, 26], "rgb2yuv": [7, 26], "rgba": [7, 21, 27], "yuv2rgb": [7, 26], "rgbp": [7, 21, 26, 27], "yuv422p": 7, "subsample_ama": [7, 26], "graphic": [7, 28], "processor": 7, "overlay_ama": [7, 26], "1000": 7, "tile_ama": [7, 26], "layout": [7, 22, 26, 27], "2x2": [7, 8, 11, 26], "thumnail": 7, "asset": [7, 21], "eq": 7, "pict_typ": 7, "144x144": 7, "vsync": 7, "vfr": 7, "out_": [7, 17], "out_000": 7, "out_999": 7, "compositor_ama": [7, 9, 20, 26], "enable_background": [7, 26], "black": [7, 26, 27], "input_param": [7, 26], "960x540": [7, 21], "out_x": [7, 26], "out_i": [7, 26], "zorder": [7, 26, 27], "408": 7, "208": 7, "808": 7, "1208": 7, "608": [7, 20], "border_inner_s": [7, 9, 26], "co": [7, 26], "sendcmd": [7, 26], "composite_stat": 7, "570": 7, "composite_test": 7, "000": [7, 9], "green": [7, 9], "border_outer_s": [7, 9, 26], "border_color": [7, 9, 26], "blue": [7, 9], "06": [7, 9, 28], "brown": [7, 9], "1280x540": 7, "in_i": [7, 26], "1082": 7, "inputs_en": [7, 26], "17": [7, 20, 22], "overlap": 7, "z": [7, 26, 27], "boarder": 7, "etc": [7, 13, 18, 20, 22, 23, 24, 27, 28], "prescrib": 7, "interv": [7, 27], "dynam": [7, 12, 17, 19, 20, 26, 27], "properti": [7, 9, 22, 26, 27], "zeromq": 7, "protocol": 7, "zmq": 7, "bind_address": 7, "tcp": 7, "5555": [7, 16], "mpegt": 7, "udp": 7, "mc_ip": 7, "mc_port": 7, "pkt_size": 7, "1316": 7, "python": [7, 14], "usr": [7, 18, 26], "python3": [7, 27], "context": 7, "url": 7, "argv": 7, "socket": 7, "req": 7, "connect": [7, 28], "cmd": 7, "stdin": 7, "send_str": 7, "recv": 7, "repli": 7, "printf": 7, "zmq_send": 7, "py": [7, 23], "localhost": [7, 25], "multicast": 7, "network": [7, 15, 21, 23, 28], "ffplai": [7, 20, 22], "address": [7, 28], "enhanc": [7, 19, 20, 21, 24, 26, 27], "def": 7, "ori": 7, "model_arg": [7, 16, 26], "mlop": 7, "roi_scale_ama": [7, 26], "res1": 7, "300k": 7, "probabl": [7, 24, 26], "plain": 7, "ml0": 7, "ml1": 7, "ml2": 7, "ml3_1": 7, "ml3_2": 7, "ml3_3": 7, "strength": [7, 24, 26], "ml_l": 7, "ml_n": 7, "ml_h": 7, "output1": 7, "output2": 7, "output3": 7, "output4": 7, "outputx": 7, "s_org": 7, "s_ml": 7, "sa": 7, "sb": 7, "sd": 7, "ml_in": 7, "ml_out": 7, "ml_out_sa": 7, "ml_out_sb": 7, "ml_out_sc": 7, "ml_out_sd": 7, "roi_a": 7, "roi_b": 7, "roi_c": 7, "roi_d": 7, "invok": [7, 17, 19, 20], "mlip": 7, "roi_map_typ": [7, 26], "rso": 7, "roi_overlay_ama": [7, 26], "transpar": [7, 21, 27], "rectangular": 7, "box": [7, 21, 26, 27], "200k": 7, "ama_pipeline_script": [8, 9], "ama_download": [8, 9, 27], "ama_upload": [8, 9, 24, 27], "tee": [8, 18, 28], "01_rotate_video": 8, "xil_rotate_": 8, "02_logo_overlai": 8, "500x100": 8, "right": [8, 9, 11, 27], "left": [8, 9, 11, 26, 27], "corner": [8, 11], "xil_logo_overlai": 8, "03_crop_zoom": 8, "300x200": 8, "begin": 8, "20": [8, 9, 11, 12, 20, 21, 24, 28], "xil_crop_zoom": 8, "04_multi_comp": 8, "4x": [8, 21], "equal": [8, 16, 25], "xil_multi_comp": 8, "By": [9, 16, 19, 24, 27], "filesink": [9, 27], "plug": [9, 15, 21], "fakesink": [9, 24], "displai": [9, 21, 23], "avoid": [9, 17, 22], "incorrect": [9, 16], "265": [9, 10, 11, 12, 21], "h265pars": 9, "h264pars": 9, "breviti": 9, "purpos": [9, 14, 28], "element": [9, 14, 18, 21, 22, 27], "gst": [9, 24, 25], "ama_av1enc": [9, 27], "launch": [9, 24], "filesrc": 9, "parsebin": 9, "ama_h264dec": [9, 27], "capsfilt": [9, 24], "cap": [9, 22, 24, 26, 27], "amamemori": 9, "unpack": 9, "elementari": [9, 10, 11, 12], "byte": [9, 27], "nalu": 9, "keyword": 9, "cli": 9, "desir": [9, 16, 22, 24, 26], "impos": [9, 26], "cost": [9, 23], "true": [9, 27], "capfilt": 9, "though": 9, "rawvideopars": [9, 24], "i420": [9, 24, 27], "ama_h264enc": [9, 27], "unformat": 9, "data": [9, 21, 22, 26], "timestamp": [9, 16, 17, 25], "eo": 9, "1200": [9, 24], "ama_scal": [9, 27], "src_0": 9, "ama_h265enc": [9, 24, 27], "6000000": 9, "queue": [9, 26], "src_1": 9, "2000000": 9, "src_2": 9, "src_3": 9, "360": [9, 12, 16], "240": 9, "decoupl": 9, "sink": 9, "dma": [9, 17, 20, 21, 26], "qtdemux": 9, "mp4mux": 9, "ama_videoconvert": [9, 27], "videotestsrc": 9, "num": [9, 12, 16, 17, 24], "300": [9, 16, 24], "ama_rot": [9, 27], "ama_videopad": [9, 27], "150": 9, "bottom": [9, 27], "0x00ffaa00": 9, "ama_videocrop": [9, 27], "ama_til": [9, 27], "grid_x": 9, "grid_i": 9, "sink_0": 9, "sink_1": 9, "sink_2": 9, "sink_3": 9, "ama_overlai": [9, 27], "50": [9, 12, 13, 24], "checker": [9, 20, 28], "ama_drawbox": [9, 27], "400": [9, 20], "thick": [9, 26, 27], "0x00ffff00": 9, "composit": [9, 11, 17, 23, 26, 27], "ama_compositor": [9, 27], "comp": 9, "dynamic_param": 9, "xpo": [9, 27], "ypo": [9, 26, 27], "border": [9, 26, 27], "inner": [9, 27], "0x00ff0000": 9, "108": 9, "5000000": [9, 12, 27], "0x0000ff00": 9, "hv": 9, "multi": [10, 14, 21, 23], "diagram": [10, 11], "ama_xabrladd": 10, "abrladd": 10, "ladder_output": 10, "feed": [10, 11, 13], "nal": 10, "short": 10, "devidx": 10, "31": [10, 11, 12], "na": [10, 11], "string": [10, 11, 12, 26], "codectyp": 10, "h265": [10, 11, 12, 24, 27], "forcekeyfram": 10, "k": 10, "keyfram": 10, "frequenc": [10, 17], "store": [10, 16], "enough": [10, 16], "720p60": [10, 21], "720p30": [10, 21], "480p30": [10, 21], "360p30": [10, 21], "160p30": [10, 21], "lookahead_en": 10, "exce": [11, 16, 24], "grid": [11, 26, 27], "logo": [11, 20], "lastli": 11, "stamp": 11, "ama_xcompositor": 11, "png": 11, "4294967295": [11, 27], "5000": [11, 24, 26], "horizont": [11, 21, 27], "fraction": [11, 16], "posit": [11, 24, 26, 27], "doubl": [11, 16, 21], "vertic": [11, 21, 26, 27], "2147483647": [11, 27], "2000": [11, 12], "along": [11, 14, 21, 26], "video1": 11, "video2": 11, "video3": 11, "video4": 11, "soft": [11, 20], "nativ": [12, 27], "built": [12, 21, 26], "bitstream": [12, 20], "ma35_decoder_app": 12, "codec_opt": 12, "exit": 12, "log_loc": 12, "consol": [12, 25, 28], "syslog": [12, 16, 25, 27], "log_fil": 12, "device_id": 12, "stream_loop": [12, 26], "fmt": 12, "xv15": 12, "n12": 12, "out1": 12, "ma35_encoder_app": 12, "emerg": 12, "alert": 12, "critic": 12, "warn": [12, 13, 20, 22, 23, 25], "debug": [12, 25, 28], "suppli": [12, 20, 26], "5000k": 12, "intraperiod": 12, "control_r": [12, 17, 19, 23, 26], "bf": [12, 26], "force_idr": 12, "main10_intra": 12, "main10": [12, 21], "high10": 12, "high10_intra": 12, "21": 12, "32": [12, 21, 26], "42": 12, "52": 12, "61": 12, "62": 12, "tier": [12, 26, 27], "bufsiz": [12, 23, 26], "vbv": [12, 26], "strict": [12, 20, 23, 26], "relax": [12, 23, 26], "dynamic_gop": [12, 26], "gop": [12, 23, 26, 27], "latency_m": [12, 26], "millisecond": [12, 26, 27], "60000": [12, 26, 27], "no_bll": [12, 24, 26], "stat": [12, 14, 19, 24], "csv": 12, "statist": [12, 19], "consult": [12, 26, 27], "out0": 12, "ma35_scaler_app": 12, "ingest": 12, "scaler_opt": 12, "reduc": [12, 14, 21, 22, 23, 24, 26], "resourc": [12, 17, 20, 21, 26, 27], "480p": 12, "360p": 12, "240p": 12, "848": [12, 16], "out2": 12, "out3": 12, "288": [12, 16], "160": [12, 16, 20], "out4": 12, "ma35_transcoder_app": 12, "scaler_ma": 12, "push": 12, "faster": [12, 14, 21], "than": [12, 13, 14, 20, 21, 22, 23, 24, 26, 27], "out_1_width": 12, "channel": [12, 21, 22, 24, 26, 27], "out_1_height": 12, "out_1_rat": 12, "out_2_width": 12, "out_2_height": 12, "out_2_rat": 12, "out_3_width": 12, "out_3_height": 12, "out_3_rat": 12, "out_4_width": 12, "out_4_height": 12, "out_4_rat": 12, "out_5_width": 12, "out_5_height": 12, "out_5_rat": 12, "out_6_width": 12, "out_6_height": 12, "out_6_rat": 12, "out_7_width": 12, "out_7_height": 12, "out_7_rat": 12, "out_8_width": 12, "out_8_height": 12, "out_8_rat": 12, "200kbp": 12, "350000000": 12, "automat": [12, 16, 21, 22, 26], "enc_hevc_main": 12, "enc_hevc_main_intra": 12, "main_intr": 12, "enc_hevc_main_10": 12, "enc_hevc_main10_intra": 12, "enc_h264_baselin": 12, "enc_h264_main": 12, "enc_h264_high": 12, "enc_h264_high_10": 12, "enc_h264_high_10_intra": 12, "aspect_ratio": 12, "aspect": [12, 17], "mpsoc": 12, "latency_mod": 12, "h264_av1_transcod": 12, "4000k": 12, "abr_ladder1": 12, "3000k": 12, "abr_ladder2": 12, "2500k": 12, "abr_ladder3": 12, "1250k": 12, "abr_ladder4": 12, "bio": [13, 20, 22], "sleep": [13, 20], "clock": [13, 20], "throttl": [13, 20], "4x4": [13, 21, 22], "bifurc": [13, 22], "io": 13, "sr": [13, 20], "iov": [13, 20], "secur": 13, "4g": 13, "ac": [13, 22], "gcc": [13, 28], "iommu": [13, 22, 28], "grub": 13, "grub_cmdline_linux_default": 13, "quiet": 13, "splash": 13, "amd_iommu": 13, "pt": [13, 17, 26], "intel_iommu": 13, "intel": [13, 28], "4gb": 13, "huge": [13, 28], "plu": [13, 28], "96": [13, 28], "2048": [13, 28], "4192": 13, "echo": [13, 18, 28], "nr_hugepag": [13, 28], "sysctl": [13, 28], "conf": [13, 28], "sum": 13, "12gb": [13, 21, 28], "2mb": 13, "36960": 13, "proc": 13, "cmdline": [13, 16], "boot_imag": 13, "vmlinuz": [13, 28], "mapper": 13, "vg00": 13, "rootlv": 13, "ro": 13, "meminfo": 13, "grep": [13, 28], "hugepages_tot": 13, "hugepages_fre": 13, "hugepages_rsvd": 13, "hugepages": 13, "kb": [13, 26], "establish": 13, "lspci": [13, 28], "vvvd": 13, "10ee": [13, 22, 28], "512mb": 13, "ppa": [13, 18, 22, 28], "debian": [13, 20, 22], "apt": [13, 18, 20, 22, 27, 28], "libhugetlbfs0": 13, "libboost": 13, "mark": [13, 20], "unhold": 13, "driver": [13, 18, 20, 21, 22, 28], "dpkg": 13, "awk": 13, "purg": 13, "hold": [13, 21], "fedora": [13, 20], "yum": [13, 18], "versionlock": 13, "lock": [13, 28], "exclud": 13, "dnf": 13, "modprob": [13, 22, 28], "parallel": [13, 16, 21, 27], "mamgmt": [13, 20, 22, 28], "asic": 13, "skip": [13, 26], "cold": [13, 20], "poweroff": 13, "confirm": [13, 28], "older": 13, "bash": [13, 16], "learn": [13, 20], "3rd": 14, "parti": 14, "conveni": [14, 18], "regard": 14, "stich": 14, "simplexma": 14, "collect": [14, 21], "simpl": [14, 15, 20, 21, 26], "startup": 14, "rung": [14, 17, 26], "stack": [15, 21], "seamlessli": [15, 21], "densiti": [15, 20, 21, 24, 26, 27], "live": [15, 21], "content": 15, "deliveri": [15, 21], "cdn": [15, 21], "compil": [15, 16, 21, 26], "ins": [15, 21], "offer": [15, 21, 24], "vpu": [15, 21], "aggreg": [15, 16, 21, 26], "4kp60": [15, 16, 20, 21, 26, 27], "notion": 16, "pool": [16, 17], "central": 16, "vari": [16, 21], "equival": 16, "heterogen": 16, "chassi": [16, 20, 21, 22, 28], "strictli": 16, "adher": 16, "subscript": [16, 22], "rest": 16, "identifi": [16, 27], "techniqu": 16, "submit": [16, 27], "bound": [16, 27], "rapidli": 16, "easi": [16, 24, 27], "straightforward": [16, 27], "entir": [16, 19, 26, 27], "method": [16, 18, 22, 27], "input1": 16, "ama_transcoder1": 16, "input2": 16, "therebi": 16, "failur": 16, "estim": 16, "percentag": [16, 26], "precis": 16, "mechan": 16, "dispatch": 16, "reli": [16, 28], "homogen": [16, 24, 26], "tail": 16, "var": 16, "jdf": 16, "With": [16, 20, 21], "well": [16, 26], "kei": [16, 18, 21, 24, 25], "pair": [16, 24], "vp9": [16, 17, 20, 21, 26, 27], "numer": [16, 26, 27], "denomin": 16, "load_factor": 16, "headroom": 16, "num_job_slot": 16, "absenc": 16, "additionalresources_": 16, "th": 16, "fit": 16, "throughput": [16, 20, 21, 24, 26, 27], "describe_job": 16, "example_2_core_encod": 16, "example_fast_preset": 16, "face": [16, 20, 24, 26], "text": [16, 20, 24, 26], "t10_transcode_multiscal": 16, "rendit": [16, 21, 26], "request": 16, "request_id": 16, "testjob": 16, "den": 16, "1600": 16, "900": 16, "1440": 16, "1360": 16, "768": 16, "1024": 16, "960": 16, "540": [16, 21], "352": 16, "jobslot_reserv": 16, "kind": 16, "intend": [16, 26], "xrm_jobreservation_timestamp_jdf": 16, "epoch": 16, "extens": 16, "uniqu": [16, 22], "xrm_reserve_id": 16, "retriev": 16, "dry_run": 16, "safe": 16, "ill": [16, 24], "syntact": 16, "fail": [16, 20, 22], "jobdescriptionfil": 16, "523634": 16, "6111": 16, "2777": 16, "dry": 16, "allot": 16, "xrm_jobreservation_79533431_t10_transcode_multiscal": 16, "aliv": 16, "press": 16, "enter": 16, "app": 16, "xrm_reserve_id_": 16, "xrm_reserve_id_0": 16, "xrm_reserve_id_1": 16, "distinct": [16, 28], "xrm_reserve_id_2": 16, "And": 16, "forth": [16, 20], "t27_2": 16, "dev_h264_4kp60_to_hevc_2kp60": 16, "var_dev_": 16, "var_dev_0_0": 16, "var_dev_0_1": 16, "orchestr": 16, "github": [16, 26, 27], "develop": [16, 18, 28], "tupl": [16, 26], "tjd": 16, "job_descript": 16, "jdf_path": 16, "ffmpeg_cmd": 16, "source1": 16, "job1": 16, "filter_hw_devic": 16, "dev0": 16, "offici": 16, "source2": 16, "job2": 16, "compon": [16, 23, 26], "relat": [16, 21, 25], "care": [16, 27], "enviro": 16, "xclbin": 16, "particularli": 16, "list_onedevice_cmd": 16, "requestid": 16, "usabl": 16, "load_xrm_plugins_cmd": 16, "loadxrmplugin": 16, "ok": [16, 28], "unload_xrm_plugins_cmd": 16, "unloadxrmplugin": 16, "notabl": 17, "asid": [17, 21], "convent": [17, 26], "xlnx_hwdev": 17, "xvbm_convert": 17, "force_key_fram": 17, "lowlat": 17, "splitbuff_mod": 17, "entropy_buffers_count": 17, "entropi": 17, "_width": 17, "_height": 17, "_rate": 17, "idx": 17, "delta": 17, "beta": 17, "tc": 17, "lscale": 17, "rc": 17, "pb": 17, "interpol": 17, "buf": 17, "splitbuff": 17, "unsplit": 17, "coef": 17, "coeffici": 17, "unlik": [17, 21, 28], "dbdf": [17, 28], "bdf": 17, "scheme": 17, "2d_ama": 17, "simpler": 17, "firmwar": [18, 20, 22], "robust": 18, "client": [18, 28], "remot": 18, "wget": 18, "qo": 18, "http": [18, 22, 26, 27], "www": [18, 26], "com": [18, 22, 27], "2018": 18, "master": [18, 21], "sign": 18, "asc": 18, "share": [18, 20, 26], "keyr": 18, "deb": 18, "arch": 18, "amd64": [18, 22], "artifactori": [18, 22], "lsb_releas": 18, "jammi": 18, "rpm": 18, "q": 18, "gpg": 18, "pubkei": 18, "qf": 18, "summari": 18, "repo": 18, "baseurl": 18, "basearch": 18, "gpgcheck": 18, "sslverifi": 18, "propos": 19, "matur": 19, "novel": 19, "design": [19, 27, 28], "optim": [19, 23, 24, 26, 27], "complex": [19, 26, 27], "signific": [19, 24], "compromis": [19, 23], "perceiv": 19, "predict": 19, "effici": [19, 21, 27, 28], "monitor": 19, "config": [19, 24, 27], "throughout": 19, "workaround": [20, 22], "toolchain": [20, 28], "preview": 20, "mlcae": 20, "v6": 20, "v5": 20, "span": 20, "avif": [20, 21], "dual": 20, "4kp120": [20, 26], "8kp30": 20, "min": [20, 24, 26, 27], "cea": 20, "708": 20, "dolbyvis": [20, 21], "t": [20, 26, 27, 28], "35": [20, 22, 24], "unifi": [20, 23], "inference_period": [20, 26], "our": 20, "n6": 20, "autom": 20, "balanc": [20, 21], "telemetri": 20, "heat": 20, "dissip": 20, "fine": [20, 24], "programm": 20, "hlg": 20, "denot": 20, "19": [20, 26, 28], "prefer": 20, "pf": [20, 22, 28], "bar0": 20, "bar2": 20, "bar4": 20, "512": 20, "server": [20, 26, 28], "scalabl": 20, "interlac": 20, "divis": [20, 21], "n5": [20, 22], "transport": [20, 26], "mpeg": [20, 21], "matrix": [20, 23], "8k": 20, "secondari": 20, "bu": [20, 28], "sbr": 20, "caus": [20, 24], "hang": [20, 22], "restor": 20, "ama_av1dec": [20, 27], "ivf": [20, 22], "ivfpars": 20, "demux": 20, "crash": [20, 22], "hl": [20, 22], "playback": 20, "slower": [20, 22], "recent": [20, 22], "2n6": 20, "player": [20, 22, 27], "vlc": [20, 22], "v3": [20, 22], "mux": [20, 22], "permit": [20, 22], "doesn": [20, 28], "1080x1920": 20, "complianc": 20, "downgrad": 20, "ga1": 20, "desktop": 20, "warm": 20, "attempt": [20, 22], "minut": [20, 22], "uptim": 20, "satellit": [20, 22], "roi_scal": 20, "innocu": 20, "boost": 20, "offload": 21, "intens": 21, "workload": 21, "popular": 21, "experi": 21, "suit": 21, "fed": 21, "special": [21, 23], "vcu": 21, "ycbcr": 21, "iso": [21, 28], "itu": 21, "constrain": [21, 22, 26, 27], "aom": 21, "aomedia": 21, "128x128": 21, "landscap": [21, 26], "8x": 21, "driven": [21, 24], "flexibl": 21, "hdr": 21, "popul": 21, "volum": 21, "light": 21, "charaterist": 21, "st2094_10": 21, "st2094_40": 21, "samsung": 21, "mdcv": 21, "cll": 21, "atc": 21, "sequenc": [21, 26], "constraint": [21, 23, 26], "ts_103572v010101p": 21, "pdf": 21, "whenev": 21, "a341s34": 21, "582r4": 21, "a341": 21, "amend": 21, "2094": 21, "smaller": 21, "pyramid": 21, "tap": 21, "stage": 21, "polyphas": 21, "luma": 21, "chroma": [21, 26], "2160p": 21, "larger": [21, 23, 24, 26], "intermediari": 21, "540p": 21, "initi": [21, 26], "latter": 21, "penalti": 21, "8x4kp60": 21, "8x1440p60": 21, "rich": [21, 27], "draw": [21, 26, 27], "blend": [21, 26, 27], "wherea": [21, 26], "intervent": 21, "fatal": [21, 25], "av1_1080p60": 21, "h264_1080p60": 21, "accompani": 21, "averag": 21, "npu": 21, "nomin": 21, "wide": [21, 26, 27], "vision": 21, "ai": 21, "art": 21, "awar": 21, "interchang": 21, "IFs": 21, "smallest": 21, "footprint": 21, "IF": 21, "packed10": [21, 26], "p010le": [21, 26], "p010_10le": [21, 27], "bgr0": 21, "argb": [21, 27], "uyv422": 21, "abgr": [21, 27], "uyvy422": 21, "yuyv422": 21, "270": [21, 26, 27], "422": [21, 26], "har": 21, "few": 21, "linearli": 21, "hyper": 21, "meet": [21, 26], "met": 21, "thing": 21, "4x1080p60": 21, "1x1080p240": 21, "vod": 21, "540p30": 21, "ftrt": 21, "turn": [21, 22, 24], "4kp75": [21, 26, 27], "84": 21, "136": 21, "1440p60": 21, "1440p30": 21, "540p60": 21, "2160p60": 21, "240p30": 21, "144p30": 21, "2160p30": 21, "dmesg": 22, "could": 22, "date": 22, "isol": [22, 28], "bifur": 22, "xxxxx": 22, "devicealloc": 22, "pressur": 22, "obviou": 22, "resolv": 22, "plai": 22, "videor": 22, "encount": [22, 26], "bitdepth": 22, "30fp": 22, "26": 22, "60fp": 22, "46": [22, 23], "greater": 22, "unavail": 22, "rmmod": 22, "reload": 22, "323": 22, "436842": 22, "05": 22, "hdma": 22, "hdma_link_rc2ep_xf": 22, "0x1": 22, "440802": 22, "rc2ep": 22, "element_cnt": 22, "link_table_pa": 22, "0x160000": 22, "443387": 22, "ctl": 22, "0x01": 22, "0x4": 22, "0x2": 22, "sl": 22, "0x97e00000": 22, "dh": 22, "0x0": 22, "dl": 22, "0x20831000": 22, "445538": 22, "0x06": 22, "rsv": 22, "llp_h": 22, "llp_l": 22, "447257": 22, "0x500": 22, "io_page_fault": 22, "mi": 22, "iommu_group": 22, "sort": 22, "34": 22, "appear": 22, "e2": 22, "bmc": 22, "msp432": 22, "pl": 22, "invalid": 22, "flac": 22, "aac": 22, "leav": 22, "0x564a3c67f580": 22, "good": 22, "exhibit": 22, "symptom": 22, "contact": 22, "err": 22, "focal": [22, 28], "2408071645": 22, "403": 22, "forbidden": 22, "162": 22, "443": 22, "bug": 22, "gpxbv": 22, "urlfix": 22, "trade": 23, "delai": [23, 24], "understood": [23, 24], "come": [23, 24], "let": 23, "unaccept": 23, "alwai": [23, 27], "overal": 23, "transmiss": 23, "restrict": [23, 26], "variat": 23, "expens": [23, 24], "Such": [23, 24], "log_ama_config": 23, "destin": [23, 25, 26], "max_siz": [23, 25], "1000mb": 23, "debug_file_lin": [23, 25], "debug_time_stamp": [23, 25], "debug_pid": [23, 25], "debug_thread": [23, 25], "perf_log": [23, 25], "log_ama_filter_perf": 23, "h264_1080p30": 23, "parse_log": 23, "0x564cbc07cc40": 23, "perfbeg": 23, "perfend": 23, "decsdk": 23, "dwlreservecmdbuf": 23, "rsv_osalsubmit": 23, "rsv_osalwait": 23, "dwldma_rc2ep": 23, "dwlenablecmdbuf": 23, "enc_0": 23, "431": 23, "0x560d0c196540": 23, "putfram": 23, "057": 23, "getpkt": 23, "009": 23, "postdecode_ch1": 23, "458": 23, "0x560d0c194980": 23, "end2end_ch1": 23, "168": 23, "958": 23, "985": 23, "primarili": 24, "pertain": [24, 28], "concept": 24, "analysi": 24, "score": 24, "necessarili": 24, "limit": [24, 26, 27], "spent": 24, "dure": [24, 28], "motion": 24, "vector": 24, "search": 24, "rdoq": 24, "term": 24, "bd": 24, "opportunist": 24, "degrad": [24, 26], "vq_offset": [24, 26], "neg": 24, "hierarch": 24, "unidirect": 24, "anchor": 24, "visibl": 24, "conferenc": 24, "occupi": 24, "area": [24, 27], "5x5": 24, "amen": 24, "sensit": 24, "reflect": 24, "lear": 24, "therein": 24, "flavor": 24, "stai": 24, "emploi": 24, "independ": 24, "concern": 24, "int_max": [24, 26], "consider": 24, "game": 24, "camera": 24, "pan": 24, "talk": 24, "head": 24, "exact": 24, "initil": 24, "compli": 24, "unexpect": 24, "dynamic_params_fil": [24, 26], "framenumbern1": 24, "key1": 24, "value1": 24, "framenumbern2": 24, "key2": 24, "value2": 24, "key3": 24, "value3": 24, "numb": 24, "minbrkbp": 24, "maxbrkbp": 24, "brkbp": 24, "taq": 24, "taqgain": 24, "saq": 24, "saqgain": 24, "qpoffseti": 24, "qpoffsetb": 24, "6000": 24, "1800": 24, "2400": 24, "10000": 24, "fakesrc": 24, "sizetyp": 24, "sizemax": 24, "4147200": 24, "4000": 24, "param1": 24, "ul": [25, 27], "aim": 25, "three": 25, "environment": 25, "global": [25, 26], "narrow": 25, "release_preset": 25, "debug_preset": 25, "async": 25, "10mb": 25, "log_ama_": 25, "pid": 25, "facil": 25, "local0": 25, "shortcut": 25, "debug_file_nam": 25, "1gb": 25, "asynchron": [25, 26], "trace": 25, "inclus": 25, "accel": 25, "vpi": [25, 26], "log_ama": 25, "100mb": 25, "want": [25, 26], "log_ama_perf": 25, "encapsul": 26, "n4": 26, "scope": [26, 27], "exhaust": [26, 27], "onlin": [26, 27], "org": [26, 27], "html": 26, "howto": 26, "infil": 26, "1000k": 26, "uri": 26, "vp9_ama": 26, "ljpeg_ama": 26, "hz": 26, "transact": [26, 27], "benign": 26, "0x5555b71aa980": 26, "492302": 26, "roman": 26, "max_bitr": 26, "5e": 26, "unspecifi": [26, 27], "uint32_max": 26, "400m": 26, "unless": 26, "control_mod": 26, "47": [26, 27], "treat": 26, "72": 26, "80": 26, "relative_load": 26, "const_qp": 26, "ii": 26, "disbal": 26, "iii": 26, "iv": 26, "empti": [26, 27, 28], "176x144": 26, "144x176": 26, "720x720": 26, "av1imag": 26, "av1if": 26, "coordin": [26, 27], "core_id": 26, "7680": 26, "except": 26, "drawbox_ama": 26, "multiscal": 26, "wxh": 26, "ordin": 26, "420": 26, "shortest": 26, "fals": [26, 27], "x_posit": 26, "y_posit": 26, "src_alpha": 26, "src": 26, "alpha": [26, 27], "dst_alpha": 26, "dst": 26, "raster": 26, "blit": 26, "solid": [26, 27], "mask": 26, "84467e": 26, "4895412794951729152": 26, "in_x": 26, "dsestin": 26, "horizon": 26, "a8r8g8b8": 26, "insid": 26, "outsid": 26, "eof_act": 26, "eof": 26, "endal": 26, "against": 26, "Its": 26, "nb_input": 26, "cutoff": 26, "100000": 26, "67": 26, "5670": 26, "shut": 26, "That": [26, 28], "spend": 26, "block": 26, "dqp": 26, "dqp_and_roi": 26, "static_map_fil": 26, "ceil": 26, "divid": 26, "boundari": 26, "shade": 26, "rectangl": 26, "skip_fram": 26, "toggl": 26, "highlight_threshold": 26, "introduc": 26, "worth": 26, "zip": [26, 27], "ma35d_sdk_v1": [26, 27], "0_ffmpeg": 26, "unzip": [26, 27], "ma35_ffmpeg": 26, "fork": 26, "wiki": 26, "libhugetlbf": 26, "nasm": 26, "yasm": 26, "navig": 26, "alsa": 26, "libxcb": 26, "xfix": 26, "shape": 26, "xlib": 26, "libmfx": 26, "vaapi": 26, "vulkan": 26, "prefix": 26, "pwd": 26, "strip": 26, "vpe": 26, "libxrm": 26, "lib": [26, 27, 28], "lvpi": 26, "lroi_scal": 26, "llog_ama": 26, "lxrm": 26, "lxrm_interfac": 26, "lhugetlbf": 26, "lpthread": 26, "lstdc": 26, "lm": 26, "ldl": 26, "lrt": 26, "cflag": 26, "dsupport_os": 26, "ldflag": 26, "wl": 26, "rpath": 26, "libavutil": 26, "libavfilt": 26, "libavcodec": 26, "libavformat": 26, "libavdevic": 26, "libswscal": 26, "libswresampl": 26, "libx264": 26, "gnu": 26, "81": 26, "workflow": 27, "editor": 27, "broadcast": 27, "freedesktop": 27, "ama_h265dec": 27, "ama_vp9dec": 27, "cropper": 27, "ama_jpegdec": 27, "ama_jpegenc": 27, "ama_ljpegenc": 27, "obu": 27, "One": 27, "nv12_4l4": 27, "nv12_10le32": 27, "p010_10e": 27, "i420_10l": 27, "nv12_10le_4l4": 27, "boolean": 27, "isn": 27, "consecut": 27, "distanc": 27, "analyz": 27, "account": 27, "35000000000": 27, "fquantiz": 27, "temporal": 27, "vma": 27, "bll": 27, "i420_10b": 27, "bgr": 27, "succeed": 27, "144": 27, "7580": 27, "0xff000000": 27, "side": 27, "i422": 27, "beld": 27, "float": 27, "0x00rrggbb": 27, "16777215": 27, "outer": 27, "90r": 27, "clockwis": 27, "90l": 27, "horiz": 27, "horzont": 27, "vert": 27, "lr": 27, "upper": 27, "diagon": 27, "ur": 27, "ll": 27, "orient": 27, "tag": 27, "unsign": 27, "unnecessari": 27, "upstream": 27, "larg": 27, "insuffici": 27, "0_gstreamer": 27, "ma35_gstream": 27, "prerequisit": 27, "ninja": 27, "flex": 27, "bison": 27, "pip": 27, "pkg": 27, "libjansson": 27, "uuid": 27, "snap": 27, "classic": 27, "pip3": 27, "meson": 27, "git": 27, "checkout": 27, "f6e672f27fcac06af58d7ac995551893d36944c": 27, "cp": 27, "ama_gstream": 27, "ln": 27, "subproject": 27, "c_include_path": 27, "library_path": 27, "technologi": 28, "kvm": 28, "qemu": 28, "libvirt": 28, "bridg": 28, "virt": 28, "lscpu": 28, "sbin": 28, "domain": 28, "corpor": 28, "5070": 28, "lsmod": 28, "831488": 28, "sriov_numvf": 28, "5071": 28, "physic": 28, "creation": 28, "libvirtd": 28, "wed": 28, "07": 28, "09": 28, "44": 28, "pdt": 28, "7h": 28, "ago": 28, "fossa": 28, "instanti": 28, "12288": 28, "vcpu": 28, "q35": 28, "qcow2": 28, "variant": 28, "ubuntu20": 28, "pty": 28, "target_typ": 28, "ttys0": 28, "casper": 28, "initrd": 28, "apic": 28, "ioapic": 28, "intremap": 28, "eim": 28, "caching_mod": 28, "memoryback": 28, "hugepag": 28, "nosharepag": 28, "hostdev": 28, "xx": 28, "vfio": 28, "storag": 28, "virsh": 28, "edit": 28, "kib": 28, "acpi": 28, "vmport": 28, "rng": 28, "ssh": 28, "openssh": 28, "net": 28, "dhcp": 28, "leas": 28, "6gb": 28, "3072": 28, "3168": 28, "dkm": 28, "essenti": 28, "procedur": 28, "sai": 28, "intent": 28, "nest": 28, "vsdk_vm_passthrough": 28, "sriov_drivers_autoprob": 28}, "objects": {"": [[0, 0, 1, "c.XmaDataBuffer", "XmaDataBuffer"], [0, 0, 1, "c.XmaDecoderProperties", "XmaDecoderProperties"], [0, 0, 1, "c.XmaDynamicEncParams", "XmaDynamicEncParams"], [0, 0, 1, "c.XmaDynamicEncParams_v2", "XmaDynamicEncParams_v2"], [0, 0, 1, "c.XmaEncoderProperties", "XmaEncoderProperties"], [0, 0, 1, "c.XmaFilterPortProperties", "XmaFilterPortProperties"], [0, 0, 1, "c.XmaFilterProperties", "XmaFilterProperties"], [0, 0, 1, "c.XmaFrame", "XmaFrame"], [0, 0, 1, "c.XmaFrameProperties", "XmaFrameProperties"], [0, 0, 1, "c.XmaParameter", "XmaParameter"], [0, 0, 1, "c.XmaScalerInOutProperties", "XmaScalerInOutProperties"], [0, 0, 1, "c.XmaScalerProperties", "XmaScalerProperties"], [0, 1, 1, "c.xma_data_buffer_alloc", "xma_data_buffer_alloc"], [0, 1, 1, "c.xma_data_buffer_free", "xma_data_buffer_free"], [0, 1, 1, "c.xma_data_from_buffer_clone", "xma_data_from_buffer_clone"], [0, 1, 1, "c.xma_dec_session_create", "xma_dec_session_create"], [0, 1, 1, "c.xma_dec_session_destroy", "xma_dec_session_destroy"], [0, 1, 1, "c.xma_dec_session_get_properties", "xma_dec_session_get_properties"], [0, 1, 1, "c.xma_dec_session_recv_frame", "xma_dec_session_recv_frame"], [0, 1, 1, "c.xma_dec_session_send_data", "xma_dec_session_send_data"], [0, 1, 1, "c.xma_dec_session_set_log", "xma_dec_session_set_log"], [0, 1, 1, "c.xma_enc_session_create", "xma_enc_session_create"], [0, 1, 1, "c.xma_enc_session_destroy", "xma_enc_session_destroy"], [0, 1, 1, "c.xma_enc_session_recv_data", "xma_enc_session_recv_data"], [0, 1, 1, "c.xma_enc_session_send_frame", "xma_enc_session_send_frame"], [0, 1, 1, "c.xma_enc_session_set_log", "xma_enc_session_set_log"], [0, 1, 1, "c.xma_filter_session_create", "xma_filter_session_create"], [0, 1, 1, "c.xma_filter_session_destroy", "xma_filter_session_destroy"], [0, 1, 1, "c.xma_filter_session_recv_frame", "xma_filter_session_recv_frame"], [0, 1, 1, "c.xma_filter_session_send_frame", "xma_filter_session_send_frame"], [0, 1, 1, "c.xma_filter_session_set_log", "xma_filter_session_set_log"], [0, 1, 1, "c.xma_frame_add_side_data", "xma_frame_add_side_data"], [0, 1, 1, "c.xma_frame_alloc", "xma_frame_alloc"], [0, 1, 1, "c.xma_frame_clear_all_side_data", "xma_frame_clear_all_side_data"], [0, 1, 1, "c.xma_frame_clone", "xma_frame_clone"], [0, 1, 1, "c.xma_frame_dec_ref", "xma_frame_dec_ref"], [0, 1, 1, "c.xma_frame_free", "xma_frame_free"], [0, 1, 1, "c.xma_frame_from_buffers_clone", "xma_frame_from_buffers_clone"], [0, 1, 1, "c.xma_frame_get_first_side_data", "xma_frame_get_first_side_data"], [0, 1, 1, "c.xma_frame_get_next_side_data", "xma_frame_get_next_side_data"], [0, 1, 1, "c.xma_frame_get_next_side_data_of_type", "xma_frame_get_next_side_data_of_type"], [0, 1, 1, "c.xma_frame_get_plane_height", "xma_frame_get_plane_height"], [0, 1, 1, "c.xma_frame_get_plane_size", "xma_frame_get_plane_size"], [0, 1, 1, "c.xma_frame_get_plane_stride", "xma_frame_get_plane_stride"], [0, 1, 1, "c.xma_frame_get_side_data", "xma_frame_get_side_data"], [0, 1, 1, "c.xma_frame_inc_ref", "xma_frame_inc_ref"], [0, 1, 1, "c.xma_frame_planes_get", "xma_frame_planes_get"], [0, 1, 1, "c.xma_frame_remove_side_data", "xma_frame_remove_side_data"], [0, 1, 1, "c.xma_frame_remove_side_data_type", "xma_frame_remove_side_data_type"], [0, 1, 1, "c.xma_initialize", "xma_initialize"], [0, 1, 1, "c.xma_log_init", "xma_log_init"], [0, 1, 1, "c.xma_log_release", "xma_log_release"], [0, 1, 1, "c.xma_logmsg", "xma_logmsg"], [0, 1, 1, "c.xma_release", "xma_release"], [0, 1, 1, "c.xma_scaler_session_create", "xma_scaler_session_create"], [0, 1, 1, "c.xma_scaler_session_destroy", "xma_scaler_session_destroy"], [0, 1, 1, "c.xma_scaler_session_recv_frame_list", "xma_scaler_session_recv_frame_list"], [0, 1, 1, "c.xma_scaler_session_send_frame", "xma_scaler_session_send_frame"], [0, 1, 1, "c.xma_side_data_alloc", "xma_side_data_alloc"], [0, 1, 1, "c.xma_side_data_dec_ref", "xma_side_data_dec_ref"], [0, 1, 1, "c.xma_side_data_free", "xma_side_data_free"], [0, 1, 1, "c.xma_side_data_get_metadata", "xma_side_data_get_metadata"], [0, 1, 1, "c.xma_side_data_get_refcount", "xma_side_data_get_refcount"], [0, 1, 1, "c.xma_side_data_inc_ref", "xma_side_data_inc_ref"], [0, 1, 1, "c.xma_side_data_read", "xma_side_data_read"], [0, 1, 1, "c.xma_side_data_set_metadata", "xma_side_data_set_metadata"], [0, 1, 1, "c.xma_side_data_write", "xma_side_data_write"], [0, 1, 1, "c.xrm_dec_release", "xrm_dec_release"], [0, 1, 1, "c.xrm_dec_release_v2", "xrm_dec_release_v2"], [0, 1, 1, "c.xrm_dec_reserve", "xrm_dec_reserve"], [0, 1, 1, "c.xrm_dec_reserve_v2", "xrm_dec_reserve_v2"], [0, 1, 1, "c.xrm_enc_release", "xrm_enc_release"], [0, 1, 1, "c.xrm_enc_release_v2", "xrm_enc_release_v2"], [0, 1, 1, "c.xrm_enc_reserve", "xrm_enc_reserve"], [0, 1, 1, "c.xrm_enc_reserve_v2", "xrm_enc_reserve_v2"], [0, 1, 1, "c.xrm_ml_release_v2", "xrm_ml_release_v2"], [0, 1, 1, "c.xrm_ml_reserve_v2", "xrm_ml_reserve_v2"], [0, 1, 1, "c.xrm_scale_release", "xrm_scale_release"], [0, 1, 1, "c.xrm_scale_release_v2", "xrm_scale_release_v2"], [0, 1, 1, "c.xrm_scale_reserve", "xrm_scale_reserve"], [0, 1, 1, "c.xrm_scale_reserve_v2", "xrm_scale_reserve_v2"], [10, 3, 1, "cmdoption-codectype", "--codectype"], [10, 3, 1, "cmdoption-devidx", "--devidx"], [10, 3, 1, "cmdoption-file", "--file"], [10, 3, 1, "cmdoption-forcekeyframe", "--forcekeyframe"], [10, 3, 1, "cmdoption-json", "--json"], [26, 3, 1, "cmdoption-b-v", "-b:v"], [26, 3, 1, "cmdoption-bf", "-bf"], [26, 3, 1, "cmdoption-bufsize", "-bufsize"], [10, 3, 1, "cmdoption-c", "-c"], [26, 3, 1, "cmdoption-c-v", "-c:v"], [26, 3, 1, "cmdoption-cabr", "-cabr"], [26, 3, 1, "cmdoption-control_rate", "-control_rate"], [26, 3, 1, "cmdoption-cores", "-cores"], [26, 3, 1, "cmdoption-crf", "-crf"], [26, 3, 1, "cmdoption-dynamic_gop", "-dynamic_gop"], [26, 3, 1, "cmdoption-dynamic_params_file", "-dynamic_params_file"], [10, 3, 1, "cmdoption-f", "-f"], [26, 3, 1, "cmdoption-filter_complex", "-filter_complex"], [26, 3, 1, "cmdoption-forced_idr", "-forced_idr"], [26, 3, 1, "cmdoption-g", "-g"], [26, 3, 1, "cmdoption-hwaccel", "-hwaccel"], [10, 3, 1, "cmdoption-i", "-i"], [10, 3, 1, "cmdoption-j", "-j"], [10, 3, 1, "cmdoption-k", "-k"], [26, 3, 1, "cmdoption-latency_ms", "-latency_ms"], [26, 3, 1, "cmdoption-level", "-level"], [26, 3, 1, "cmdoption-lookahead_depth", "-lookahead_depth"], [26, 3, 1, "cmdoption-low_latency", "-low_latency"], [26, 3, 1, "cmdoption-max_bitrate", "-max_bitrate"], [26, 3, 1, "cmdoption-max_qp", "-max_qp"], [26, 3, 1, "cmdoption-min_qp", "-min_qp"], [26, 3, 1, "cmdoption-no_bll", "-no_bll"], [26, 3, 1, "cmdoption-out_fmt", "-out_fmt"], [26, 3, 1, "cmdoption-preset", "-preset"], [26, 3, 1, "cmdoption-profile", "-profile"], [26, 3, 1, "cmdoption-qp", "-qp"], [26, 3, 1, "cmdoption-qp_b_offset", "-qp_b_offset"], [26, 3, 1, "cmdoption-qp_i_offset", "-qp_i_offset"], [26, 3, 1, "cmdoption-qp_mode", "-qp_mode"], [26, 3, 1, "cmdoption-quality", "-quality"], [26, 3, 1, "cmdoption-r", "-r"], [26, 3, 1, "cmdoption-resize", "-resize"], [26, 3, 1, "cmdoption-s", "-s"], [26, 3, 1, "cmdoption-slice", "-slice"], [26, 3, 1, "cmdoption-spatial_aq", "-spatial_aq"], [26, 3, 1, "cmdoption-spatial_aq_gain", "-spatial_aq_gain"], [26, 3, 1, "cmdoption-temporal_aq", "-temporal_aq"], [26, 3, 1, "cmdoption-temporal_aq_gain", "-temporal_aq_gain"], [26, 3, 1, "cmdoption-tier", "-tier"], [26, 3, 1, "cmdoption-tune_metrics", "-tune_metrics"], [26, 3, 1, "cmdoption-type", "-type"], [26, 3, 1, "cmdoption-vf", "-vf"], [27, 3, 1, "cmdoption-arg-allow-downscaling", "allow-downscaling"], [27, 3, 1, "cmdoption-arg-alpha", "alpha"], [27, 3, 1, "cmdoption-arg-ama_drawbox", "ama_drawbox"], [27, 3, 1, "cmdoption-arg-ama_overlay", "ama_overlay"], [27, 3, 1, "cmdoption-arg-ama_rotate", "ama_rotate"], [27, 3, 1, "cmdoption-arg-ama_tile", "ama_tile"], [27, 3, 1, "cmdoption-arg-ama_videoconvert", "ama_videoconvert"], [27, 3, 1, "cmdoption-arg-ama_videocrop", "ama_videocrop"], [27, 3, 1, "cmdoption-arg-ama_videopad", "ama_videopad"], [27, 3, 1, "cmdoption-arg-b-frames", "b-frames"], [27, 3, 1, "cmdoption-arg-background", "background"], [27, 3, 1, "cmdoption-arg-background-color", "background-color"], [27, 3, 1, "cmdoption-arg-bitrate", "bitrate"], [27, 3, 1, "cmdoption-arg-border-color", "border-color"], [27, 3, 1, "cmdoption-arg-border-inner-width", "border-inner-width"], [27, 3, 1, "cmdoption-arg-border-outer-width", "border-outer-width"], [26, 3, 1, "cmdoption-arg-colorspace_ama", "colorspace_ama"], [26, 3, 1, "cmdoption-arg-compositor_ama", "compositor_ama"], [27, 3, 1, "cmdoption-arg-core-id", "core-id"], [26, 3, 1, "cmdoption-arg-core_id", "core_id"], [27, 3, 1, "cmdoption-arg-crf", "crf"], [27, 3, 1, "cmdoption-arg-crop-bottom", "crop-bottom"], [27, 3, 1, "cmdoption-arg-crop-left", "crop-left"], [27, 3, 1, "cmdoption-arg-crop-right", "crop-right"], [27, 3, 1, "cmdoption-arg-crop-top", "crop-top"], [26, 3, 1, "cmdoption-arg-crop_ama", "crop_ama"], [26, 3, 1, "cmdoption-arg-cutoff", "cutoff"], [27, 3, 1, "cmdoption-arg-device", "device"], [27, 3, 1, "cmdoption-arg-device-type", "device-type"], [26, 3, 1, "cmdoption-arg-drawbox_ama", "drawbox_ama"], [27, 3, 1, "cmdoption-arg-dynamic-gop", "dynamic-gop"], [27, 3, 1, "cmdoption-arg-encoding-params-file", "encoding-params-file"], [27, 3, 1, "cmdoption-arg-forced-idr", "forced-idr"], [27, 3, 1, "cmdoption-arg-gop-length", "gop-length"], [27, 3, 1, "cmdoption-arg-height", "height"], [26, 3, 1, "cmdoption-arg-highlight_threshold", "highlight_threshold"], [26, 3, 1, "cmdoption-arg-hwdownload_ama", "hwdownload_ama"], [26, 3, 1, "cmdoption-arg-hwupload_ama", "hwupload_ama"], [27, 3, 1, "cmdoption-arg-idr-interval", "idr-interval"], [26, 3, 1, "cmdoption-arg-inference_period", "inference_period"], [27, 3, 1, "cmdoption-arg-latency-logging", "latency-logging"], [27, 3, 1, "cmdoption-arg-latency-ms", "latency-ms"], [27, 3, 1, "cmdoption-arg-lookahead-depth", "lookahead-depth"], [27, 3, 1, "cmdoption-arg-low-latency", "low-latency"], [27, 3, 1, "cmdoption-arg-max-bitrate", "max-bitrate"], [27, 3, 1, "cmdoption-arg-max-qp", "max-qp"], [27, 3, 1, "cmdoption-arg-min-qp", "min-qp"], [26, 3, 1, "cmdoption-arg-ml_ama", "ml_ama"], [26, 3, 1, "cmdoption-arg-model", "model"], [26, 3, 1, "cmdoption-arg-model_args", "model_args"], [26, 3, 1, "cmdoption-arg-nb_inputs", "nb_inputs"], [27, 3, 1, "cmdoption-arg-no-bll", "no-bll"], [26, 3, 1, "cmdoption-arg-overlay_ama", "overlay_ama"], [26, 3, 1, "cmdoption-arg-pad_ama", "pad_ama"], [27, 3, 1, "cmdoption-arg-preset", "preset"], [27, 3, 1, "cmdoption-arg-qp", "qp"], [27, 3, 1, "cmdoption-arg-qp-b-offset", "qp-b-offset"], [27, 3, 1, "cmdoption-arg-qp-i-offset", "qp-i-offset"], [27, 3, 1, "cmdoption-arg-qp-mode", "qp-mode"], [27, 3, 1, "cmdoption-arg-rate-control", "rate-control"], [26, 3, 1, "cmdoption-arg-roi_map_type", "roi_map_type"], [26, 3, 1, "cmdoption-arg-roi_overlay_ama", "roi_overlay_ama"], [26, 3, 1, "cmdoption-arg-roi_scale_ama", "roi_scale_ama"], [26, 3, 1, "cmdoption-arg-rotate_ama", "rotate_ama"], [26, 3, 1, "cmdoption-arg-scaler_ama", "scaler_ama"], [26, 3, 1, "cmdoption-arg-skip_frames", "skip_frames"], [27, 3, 1, "cmdoption-arg-slice", "slice"], [27, 3, 1, "cmdoption-arg-spatial-aq", "spatial-aq"], [27, 3, 1, "cmdoption-arg-spatial-aq-gain", "spatial-aq-gain"], [26, 3, 1, "cmdoption-arg-static_map_file", "static_map_file"], [26, 3, 1, "cmdoption-arg-still-picture", "still-picture"], [26, 3, 1, "cmdoption-arg-strength", "strength"], [26, 3, 1, "cmdoption-arg-subsample_ama", "subsample_ama"], [27, 3, 1, "cmdoption-arg-temporal-aq-gain", "temporal-aq-gain"], [27, 3, 1, "cmdoption-arg-temporall-aq", "temporall-aq"], [27, 3, 1, "cmdoption-arg-tier", "tier"], [26, 3, 1, "cmdoption-arg-tile_ama", "tile_ama"], [27, 3, 1, "cmdoption-arg-tune-metrics", "tune-metrics"], [27, 3, 1, "cmdoption-arg-video-direction", "video-direction"], [27, 3, 1, "cmdoption-arg-width", "width"], [27, 3, 1, "cmdoption-arg-xpos", "xpos"], [27, 3, 1, "cmdoption-arg-ypos", "ypos"], [27, 3, 1, "cmdoption-arg-zorder", "zorder"]], "xma_data_buffer_alloc": [[0, 2, 1, "c.xma_data_buffer_alloc", "dummy"], [0, 2, 1, "c.xma_data_buffer_alloc", "handle"], [0, 2, 1, "c.xma_data_buffer_alloc", "size"]], "xma_data_buffer_free": [[0, 2, 1, "c.xma_data_buffer_free", "data"]], "xma_data_from_buffer_clone": [[0, 2, 1, "c.xma_data_from_buffer_clone", "data"], [0, 2, 1, "c.xma_data_from_buffer_clone", "free_callback"], [0, 2, 1, "c.xma_data_from_buffer_clone", "handle"], [0, 2, 1, "c.xma_data_from_buffer_clone", "opaque"], [0, 2, 1, "c.xma_data_from_buffer_clone", "size"]], "xma_dec_session_create": [[0, 2, 1, "c.xma_dec_session_create", "dec_props"]], "xma_dec_session_destroy": [[0, 2, 1, "c.xma_dec_session_destroy", "session"]], "xma_dec_session_get_properties": [[0, 2, 1, "c.xma_dec_session_get_properties", "dec_session"], [0, 2, 1, "c.xma_dec_session_get_properties", "fprops"]], "xma_dec_session_recv_frame": [[0, 2, 1, "c.xma_dec_session_recv_frame", "frame"], [0, 2, 1, "c.xma_dec_session_recv_frame", "session"]], "xma_dec_session_send_data": [[0, 2, 1, "c.xma_dec_session_send_data", "data"], [0, 2, 1, "c.xma_dec_session_send_data", "data_used"], [0, 2, 1, "c.xma_dec_session_send_data", "session"]], "xma_dec_session_set_log": [[0, 2, 1, "c.xma_dec_session_set_log", "handle"], [0, 2, 1, "c.xma_dec_session_set_log", "session"]], "xma_enc_session_create": [[0, 2, 1, "c.xma_enc_session_create", "enc_props"]], "xma_enc_session_destroy": [[0, 2, 1, "c.xma_enc_session_destroy", "session"]], "xma_enc_session_recv_data": [[0, 2, 1, "c.xma_enc_session_recv_data", "data"], [0, 2, 1, "c.xma_enc_session_recv_data", "data_size"], [0, 2, 1, "c.xma_enc_session_recv_data", "session"]], "xma_enc_session_send_frame": [[0, 2, 1, "c.xma_enc_session_send_frame", "frame"], [0, 2, 1, "c.xma_enc_session_send_frame", "session"]], "xma_enc_session_set_log": [[0, 2, 1, "c.xma_enc_session_set_log", "handle"], [0, 2, 1, "c.xma_enc_session_set_log", "session"]], "xma_filter_session_create": [[0, 2, 1, "c.xma_filter_session_create", "props"]], "xma_filter_session_destroy": [[0, 2, 1, "c.xma_filter_session_destroy", "session"]], "xma_filter_session_recv_frame": [[0, 2, 1, "c.xma_filter_session_recv_frame", "frame"], [0, 2, 1, "c.xma_filter_session_recv_frame", "session"]], "xma_filter_session_send_frame": [[0, 2, 1, "c.xma_filter_session_send_frame", "frame"], [0, 2, 1, "c.xma_filter_session_send_frame", "session"]], "xma_filter_session_set_log": [[0, 2, 1, "c.xma_filter_session_set_log", "handle"], [0, 2, 1, "c.xma_filter_session_set_log", "session"]], "xma_frame_add_side_data": [[0, 2, 1, "c.xma_frame_add_side_data", "frame"], [0, 2, 1, "c.xma_frame_add_side_data", "side_data"]], "xma_frame_alloc": [[0, 2, 1, "c.xma_frame_alloc", "dummy"], [0, 2, 1, "c.xma_frame_alloc", "frame_props"], [0, 2, 1, "c.xma_frame_alloc", "handle"]], "xma_frame_clear_all_side_data": [[0, 2, 1, "c.xma_frame_clear_all_side_data", "frame"]], "xma_frame_clone": [[0, 2, 1, "c.xma_frame_clone", "handle"], [0, 2, 1, "c.xma_frame_clone", "xma_frame"]], "xma_frame_dec_ref": [[0, 2, 1, "c.xma_frame_dec_ref", "frame"]], "xma_frame_free": [[0, 2, 1, "c.xma_frame_free", "frame"]], "xma_frame_from_buffers_clone": [[0, 2, 1, "c.xma_frame_from_buffers_clone", "frame_data"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "frame_props"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "free_callback"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "handle"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "opaque"]], "xma_frame_get_first_side_data": [[0, 2, 1, "c.xma_frame_get_first_side_data", "frame"]], "xma_frame_get_next_side_data": [[0, 2, 1, "c.xma_frame_get_next_side_data", "frame"], [0, 2, 1, "c.xma_frame_get_next_side_data", "side_data"]], "xma_frame_get_next_side_data_of_type": [[0, 2, 1, "c.xma_frame_get_next_side_data_of_type", "frame"], [0, 2, 1, "c.xma_frame_get_next_side_data_of_type", "side_data"]], "xma_frame_get_plane_height": [[0, 2, 1, "c.xma_frame_get_plane_height", "frame_props"], [0, 2, 1, "c.xma_frame_get_plane_height", "handle"], [0, 2, 1, "c.xma_frame_get_plane_height", "plane"]], "xma_frame_get_plane_size": [[0, 2, 1, "c.xma_frame_get_plane_size", "frame_props"], [0, 2, 1, "c.xma_frame_get_plane_size", "handle"], [0, 2, 1, "c.xma_frame_get_plane_size", "plane"]], "xma_frame_get_plane_stride": [[0, 2, 1, "c.xma_frame_get_plane_stride", "frame_props"], [0, 2, 1, "c.xma_frame_get_plane_stride", "handle"], [0, 2, 1, "c.xma_frame_get_plane_stride", "plane"]], "xma_frame_get_side_data": [[0, 2, 1, "c.xma_frame_get_side_data", "frame"], [0, 2, 1, "c.xma_frame_get_side_data", "type"]], "xma_frame_inc_ref": [[0, 2, 1, "c.xma_frame_inc_ref", "frame"]], "xma_frame_planes_get": [[0, 2, 1, "c.xma_frame_planes_get", "frame_props"], [0, 2, 1, "c.xma_frame_planes_get", "handle"]], "xma_frame_remove_side_data": [[0, 2, 1, "c.xma_frame_remove_side_data", "frame"], [0, 2, 1, "c.xma_frame_remove_side_data", "side_data"]], "xma_frame_remove_side_data_type": [[0, 2, 1, "c.xma_frame_remove_side_data_type", "frame"], [0, 2, 1, "c.xma_frame_remove_side_data_type", "type"]], "xma_initialize": [[0, 2, 1, "c.xma_initialize", "handle"], [0, 2, 1, "c.xma_initialize", "init_params"], [0, 2, 1, "c.xma_initialize", "log"]], "xma_log_init": [[0, 2, 1, "c.xma_log_init", "handle"], [0, 2, 1, "c.xma_log_init", "log_level"], [0, 2, 1, "c.xma_log_init", "log_type"]], "xma_log_release": [[0, 2, 1, "c.xma_log_release", "handle"]], "xma_logmsg": [[0, 2, 1, "c.xma_logmsg", "handle"], [0, 2, 1, "c.xma_logmsg", "level"], [0, 2, 1, "c.xma_logmsg", "msg"], [0, 2, 1, "c.xma_logmsg", "name"]], "xma_release": [[0, 2, 1, "c.xma_release", "handle"]], "xma_scaler_session_create": [[0, 2, 1, "c.xma_scaler_session_create", "props"]], "xma_scaler_session_destroy": [[0, 2, 1, "c.xma_scaler_session_destroy", "session"]], "xma_scaler_session_recv_frame_list": [[0, 2, 1, "c.xma_scaler_session_recv_frame_list", "frame_list"], [0, 2, 1, "c.xma_scaler_session_recv_frame_list", "session"]], "xma_scaler_session_send_frame": [[0, 2, 1, "c.xma_scaler_session_send_frame", "frame"], [0, 2, 1, "c.xma_scaler_session_send_frame", "session"]], "xma_side_data_alloc": [[0, 2, 1, "c.xma_side_data_alloc", "buffer_type"], [0, 2, 1, "c.xma_side_data_alloc", "handle"], [0, 2, 1, "c.xma_side_data_alloc", "size"], [0, 2, 1, "c.xma_side_data_alloc", "type"]], "xma_side_data_dec_ref": [[0, 2, 1, "c.xma_side_data_dec_ref", "side_data"]], "xma_side_data_free": [[0, 2, 1, "c.xma_side_data_free", "side_data"]], "xma_side_data_get_metadata": [[0, 2, 1, "c.xma_side_data_get_metadata", "metadata"], [0, 2, 1, "c.xma_side_data_get_metadata", "side_data"]], "xma_side_data_get_refcount": [[0, 2, 1, "c.xma_side_data_get_refcount", "side_data"]], "xma_side_data_inc_ref": [[0, 2, 1, "c.xma_side_data_inc_ref", "side_data"]], "xma_side_data_read": [[0, 2, 1, "c.xma_side_data_read", "side_data"]], "xma_side_data_set_metadata": [[0, 2, 1, "c.xma_side_data_set_metadata", "metadata"], [0, 2, 1, "c.xma_side_data_set_metadata", "side_data"]], "xma_side_data_write": [[0, 2, 1, "c.xma_side_data_write", "side_data"]], "xrm_dec_release": [[0, 2, 1, "c.xrm_dec_release", "xrm_dec_ctx"]], "xrm_dec_release_v2": [[0, 2, 1, "c.xrm_dec_release_v2", "xrm_dec_ctx"]], "xrm_dec_reserve": [[0, 2, 1, "c.xrm_dec_reserve", "dev_index"], [0, 2, 1, "c.xrm_dec_reserve", "xrm_dec_ctx"], [0, 2, 1, "c.xrm_dec_reserve", "xrm_props"]], "xrm_dec_reserve_v2": [[0, 2, 1, "c.xrm_dec_reserve_v2", "xrm_dec_ctx"], [0, 2, 1, "c.xrm_dec_reserve_v2", "xrm_dec_props"]], "xrm_enc_release": [[0, 2, 1, "c.xrm_enc_release", "xrm_enc_ctx"]], "xrm_enc_release_v2": [[0, 2, 1, "c.xrm_enc_release_v2", "xrm_enc_ctx"]], "xrm_enc_reserve": [[0, 2, 1, "c.xrm_enc_reserve", "dev_index"], [0, 2, 1, "c.xrm_enc_reserve", "is_ull"], [0, 2, 1, "c.xrm_enc_reserve", "is_xav1"], [0, 2, 1, "c.xrm_enc_reserve", "slice_id"], [0, 2, 1, "c.xrm_enc_reserve", "xrm_enc_ctx"], [0, 2, 1, "c.xrm_enc_reserve", "xrm_props"]], "xrm_enc_reserve_v2": [[0, 2, 1, "c.xrm_enc_reserve_v2", "xrm_enc_ctx"], [0, 2, 1, "c.xrm_enc_reserve_v2", "xrm_enc_props"]], "xrm_ml_release_v2": [[0, 2, 1, "c.xrm_ml_release_v2", "xrm_ml_ctx"]], "xrm_ml_reserve_v2": [[0, 2, 1, "c.xrm_ml_reserve_v2", "xrm_ml_ctx"], [0, 2, 1, "c.xrm_ml_reserve_v2", "xrm_ml_props"]], "xrm_scale_release": [[0, 2, 1, "c.xrm_scale_release", "scaler_xrm_ctx"]], "xrm_scale_release_v2": [[0, 2, 1, "c.xrm_scale_release_v2", "scaler_xrm_ctx"]], "xrm_scale_reserve": [[0, 2, 1, "c.xrm_scale_reserve", "dev_index"], [0, 2, 1, "c.xrm_scale_reserve", "input_props"], [0, 2, 1, "c.xrm_scale_reserve", "num_outputs"], [0, 2, 1, "c.xrm_scale_reserve", "output_props"], [0, 2, 1, "c.xrm_scale_reserve", "scaler_xrm_ctx"]], "xrm_scale_reserve_v2": [[0, 2, 1, "c.xrm_scale_reserve_v2", "xrm_scale_ctx"], [0, 2, 1, "c.xrm_scale_reserve_v2", "xrm_scale_props"]]}, "objtypes": {"0": "c:struct", "1": "c:function", "2": "c:functionParam", "3": "std:cmdoption"}, "objnames": {"0": ["c", "struct", "C struct"], "1": ["c", "function", "C function"], "2": ["c", "functionParam", "C function parameter"], "3": ["std", "cmdoption", "program option"]}, "titleterms": {"c": [0, 16], "api": [0, 17], "program": [0, 16], "guid": [0, 16], "tabl": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "content": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "overview": [0, 1, 19, 20, 22, 27], "gener": [0, 16, 26], "applic": [0, 10, 11, 16], "develop": [0, 14], "resourc": [0, 1, 16], "initi": 0, "alloc": 0, "session": 0, "creation": [0, 1], "runtim": [0, 13], "process": [0, 7, 21], "cleanup": 0, "compil": 0, "link": [0, 15], "amd": [0, 6, 12, 13, 14, 15, 20, 21, 22], "ama": [0, 6, 12, 13, 14, 15, 20, 21, 22, 26], "video": [0, 5, 6, 7, 8, 12, 13, 16, 21, 24, 26], "sdk": [0, 6, 12, 13, 21], "plugin": [0, 16, 27], "common": 0, "xma": [0, 12], "data": [0, 27], "structur": 0, "refer": [0, 16], "log": [0, 25], "interfac": [0, 16], "buffer": 0, "frame": [0, 22], "side": 0, "band": 0, "1": [0, 2, 17], "0": 0, "decod": [0, 5, 7, 9, 12, 21, 23, 26, 27], "properti": 0, "scaler": [0, 12, 21, 26, 27], "encod": [0, 2, 4, 7, 9, 12, 19, 22, 23, 24, 26, 27], "dynam": [0, 24], "paramet": [0, 6, 24, 27], "filter": [0, 5, 8, 9, 26], "ultra": [0, 6, 23], "low": [0, 6, 7, 23], "latenc": [0, 6, 23, 24], "consider": [0, 17], "mode": [0, 7, 23, 24, 26], "sideband": 0, "multithread": 0, "upgrad": [0, 20], "2": [0, 2, 7, 17], "pixel": [0, 21], "format": [0, 21, 22], "xrm": [0, 16], "version": [0, 1, 20], "ml": [0, 7], "build": 0, "sampl": [0, 12], "exampl": [0, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 25, 26, 27], "card": [1, 13, 21, 22], "manag": [1, 16], "mautil": 1, "mamgmt": 1, "print_ma35_load": [1, 16], "xrmadm": 1, "xrmd": [1, 7], "devic": [1, 7, 9, 16, 22, 27], "identifi": 1, "bdf": 1, "bu": 1, "id": [1, 16], "firmwar": [1, 13], "number": [1, 21], "get": [1, 13], "report": [1, 16], "valid": [1, 24], "reset": 1, "vf": [1, 22], "destruct": 1, "flash": [1, 13, 22], "check": [1, 13, 16], "util": [1, 14], "compat": 2, "matrix": 2, "avc": [2, 6], "hevc": 2, "av1": [2, 6, 22, 24], "type": [2, 24], "tutori": [3, 4, 7, 9], "amf": 4, "ffmpeg": [5, 7, 16, 17, 22, 23, 26], "us": [5, 8, 16, 26, 27], "softwar": [5, 8, 16, 17], "environ": [5, 6, 7, 8, 9, 12, 13], "setup": [5, 6, 7, 8, 9, 12, 13, 16], "rotat": [5, 7, 8], "logo": [5, 8], "overlai": [5, 8, 26], "crop": [5, 7, 8], "shift": 5, "composit": [5, 7, 8, 24], "chroma": [5, 7], "subsampl": [5, 7], "de": 5, "interlac": 5, "text": [5, 7], "insert": 5, "qualiti": [6, 7, 21, 24], "introduct": [6, 10, 11, 16, 26, 27], "optim": 6, "set": [6, 13], "tune": [6, 23, 24], "vmaf": 6, "normal": 6, "medium": 6, "preset": [6, 24], "slow": [6, 22], "run": [6, 13], "psnr": 6, "ssim": 6, "score": 6, "select": [7, 9, 24], "simpl": [7, 9], "onli": [7, 9], "4": 7, "10": [7, 21], "bit": [7, 21, 22, 24], "convers": [7, 22], "constant": 7, "rate": [7, 22, 24], "factor": 7, "crf": 7, "high": 7, "basic": 7, "transcod": [7, 9, 12, 16, 21], "Into": 7, "multipl": [7, 9, 27], "resolut": [7, 9], "output": [7, 9, 27], "ull": [7, 23], "8kp30": 7, "multi": [7, 16], "slice": 7, "doubl": 7, "densiti": [7, 22], "without": 7, "full": 7, "imag": [7, 26], "2d": [7, 9, 21, 26, 27], "pad": [7, 27], "color": [7, 21], "space": 7, "pictur": 7, "In": 7, "pip": 7, "tile": 7, "thumbnail": 7, "base": 7, "face": 7, "roi": [7, 24, 26], "gain": 7, "ladder": [7, 10, 21], "detect": 7, "gstreamer": [8, 9, 10, 11, 17, 22, 27], "zoom": 8, "introductori": 9, "downscal": 9, "multidevic": 9, "abr": [10, 21], "host": [10, 11, 28], "system": [10, 11, 16], "requir": [10, 11, 16, 20], "usag": [10, 11, 12, 22], "compositor": [11, 27], "app": 12, "test": 12, "instruct": 12, "command": [12, 16, 26], "start": 13, "chassi": 13, "instal": [13, 22], "verif": 13, "up": [13, 27], "your": 13, "first": 13, "advanc": [14, 15, 20, 22], "media": [14, 15, 20, 22], "acceler": [14, 15, 16, 20, 22, 26, 27], "repositori": 14, "helper": 14, "quick": 15, "comput": 16, "assign": [16, 22], "job": [16, 21], "specif": 16, "explicit": 16, "manual": 16, "load": [16, 27], "insuffici": 16, "autom": 16, "descript": [16, 18], "The": [16, 21], "slot": 16, "reserv": 16, "tool": 16, "singl": [16, 22], "per": [16, 21, 22], "flow": 16, "launch": 16, "launcher": 16, "line": 16, "statu": 16, "unload": 16, "migrat": 17, "chang": 17, "from": [17, 20], "alveo": 17, "u30": 17, "cli": 17, "pcie": [17, 28], "address": 17, "distribut": [18, 20], "packag": 18, "feed": 18, "configur": [18, 23], "ubuntu": [18, 22], "debian": 18, "12": 18, "fedora": 18, "new": [19, 20], "featur": [19, 20, 21], "preview": 19, "machin": [19, 21, 26], "learn": [19, 21, 26], "awar": 19, "mlcae": 19, "releas": 20, "note": 20, "thi": 20, "highlight": 20, "support": [20, 21], "kernel": 20, "o": 20, "known": 20, "limit": 20, "issu": [20, 22], "previou": 20, "spec": 21, "ma35d": 21, "codec": [21, 22], "unit": 21, "adapt": [21, 24], "bitrat": 21, "downsampl": 21, "capac": 21, "engin": [21, 26, 27], "perform": 21, "8": 21, "real": 21, "time": 21, "scale": 21, "troubleshoot": 22, "No": 22, "show": 22, "lspci": 22, "memori": 22, "playback": 22, "mp4": 22, "30": 22, "fp": 22, "variabl": 22, "400": 22, "mbp": 22, "max": 22, "mani": 22, "parallel": 22, "hdr": 22, "spatialaqgain": 22, "nonrespons": 22, "vm": [22, 28], "cannot": 22, "unsupport": 22, "audio": 22, "led": 22, "red": 22, "light": 22, "On": 22, "20": 22, "04": 22, "guidelin": 23, "automat": 23, "look": 23, "ahead": 23, "depth": 23, "calcul": 23, "adjust": 23, "measur": 23, "metric": 24, "cabr": 24, "gop": 24, "control": 24, "combin": 24, "unifi": 25, "log_ama_config": 25, "log_ama_filt": 25, "log_ama_filter_perf": 25, "option": 26, "rc": 26, "infer": 26, "other": 26, "rebuild": [26, 27], "input": 27, "pipelin": 27, "sink": 27, "sourc": 27, "hardwar": 27, "down": 27, "dma": 27, "move": 27, "through": 27, "work": 27, "virtual": 28, "sr": 28, "iov": 28, "linux": 28, "guest": 28, "passthrough": 28}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"C API Programming Guide": [[0, "c-api-programming-guide"]], "Table of Contents": [[0, "table-of-contents"], [1, "table-of-contents"], [2, "table-of-contents"], [5, "table-of-contents"], [6, "table-of-contents"], [7, "table-of-contents"], [8, "table-of-contents"], [9, "table-of-contents"], [10, "table-of-contents"], [11, "table-of-contents"], [12, "table-of-contents"], [13, "table-of-contents"], [16, "table-of-contents"], [17, "table-of-contents"], [18, "table-of-contents"], [19, "table-of-contents"], [20, "table-of-contents"], [21, "table-of-contents"], [22, "table-of-contents"], [23, "table-of-contents"], [24, "table-of-contents"], [25, "table-of-contents"], [26, "table-of-contents"], [27, "table-of-contents"], [28, "table-of-contents"]], "Overview": [[0, "overview"], [1, "overview"], [19, "overview"], [20, "overview"], [22, "overview"]], "General Application Development Guide": [[0, "general-application-development-guide"]], "Resource Initialization and Allocation": [[0, "resource-initialization-and-allocation"]], "Session Creation": [[0, "session-creation"]], "Runtime Processing": [[0, "runtime-processing"]], "Cleanup": [[0, "cleanup"]], "Compiling and Linking with the AMD AMA Video SDK Plugins": [[0, "compiling-and-linking-with-the-sdk-plugins"]], "Common XMA Data Structures": [[0, "common-xma-data-structures"]], "Common XMA Data Reference": [[0, "common-xma-data-reference"]], "XMA Log Interface": [[0, "xma-log-interface"]], "XMA Session Interface": [[0, "xma-session-interface"]], "XMA Data Buffer Interface": [[0, "xma-data-buffer-interface"]], "XMA Frame Interface": [[0, "xma-frame-interface"]], "XMA Side Band Data": [[0, "xma-side-band-data"]], "1.0 SDK API": [[0, "sdk-api"]], "Decoder Plugin Reference": [[0, "decoder-plugin-reference"]], "Decoder Interface": [[0, "decoder-interface"]], "Decoder Properties": [[0, "decoder-properties"]], "Scaler Plugin Reference": [[0, "scaler-plugin-reference"]], "Scaler Interface": [[0, "scaler-interface"]], "Scaler Properties": [[0, "scaler-properties"]], "Encoder Plugin Reference": [[0, "encoder-plugin-reference"]], "Encoder Interface": [[0, "encoder-interface"]], "Encoder Properties": [[0, "encoder-properties"]], "Encoder Dynamic Parameters": [[0, "encoder-dynamic-parameters"]], "Filter Plugin Reference": [[0, "filter-plugin-reference"]], "Filter Interface": [[0, "filter-interface"]], "Filter Properties": [[0, "filter-properties"]], "Ultra Low Latency Considerations": [[0, "ultra-low-latency-considerations"]], "Decoder Low Latency Mode": [[0, "decoder-low-latency-mode"]], "Encoder Ultra Low Latency Mode": [[0, "encoder-ultra-low-latency-mode"]], "1.1 SDK API": [[0, "id3"]], "Sideband Data": [[0, "sideband-data"], [0, "id5"]], "Multithreading": [[0, "multithreading"]], "Logging": [[0, "logging"]], "Upgrading": [[0, "upgrading"]], "1.2 SDK API": [[0, "id4"]], "Pixel Formats": [[0, "pixel-formats"]], "Decoder": [[0, "decoder"], [0, "id7"], [0, "id9"]], "Encoder": [[0, "encoder"], [0, "id8"], [0, "id10"]], "Filters": [[0, "filters"]], "XRM API Reference": [[0, "xrm-api-reference"]], "Version 1.0": [[0, "version-1-0"]], "Scaler": [[0, "scaler"], [0, "id11"]], "Version 2.0": [[0, "version-2-0"]], "ML": [[0, "ml"]], "Building Sample Examples": [[0, "building-sample-examples"]], "Card Management": [[1, "card-management"]], "mautil, mamgmt and print_ma35_load": [[1, "mautil-mamgmt-and-print-ma35-load"]], "xrmadm and xrmd": [[1, "xrmadm-and-xrmd"]], "Card and Device Identifiers": [[1, "card-and-device-identifiers"]], "Device BDF": [[1, "device-bdf"]], "Bus ID": [[1, "bus-id"]], "Firmware Version Number": [[1, "firmware-version-number"]], "mautil": [[1, "mautil"]], "Getting Device Report": [[1, "getting-device-report"], [1, "id2"]], "Device Validation": [[1, "device-validation"]], "mamgmt": [[1, "mamgmt"]], "Device Reset": [[1, "device-reset"]], "VF Creation and Destruction": [[1, "vf-creation-and-destruction"]], "Flashing Firmware": [[1, "flashing-firmware"]], "Checking Resource Utilization": [[1, "checking-resource-utilization"]], "print_ma35_load": [[1, "print-ma35-load"], [16, "print-ma35-load"]], "Encoding Compatibility Matrix": [[2, "encoding-compatibility-matrix"]], "AVC and HEVC Encoders": [[2, "avc-and-hevc-encoders"]], "AV1 Type 1 Encoder": [[2, "av1-type-1-encoder"]], "AV1 Type 2 Encoder": [[2, "av1-type-2-encoder"]], "Tutorials and Examples": [[3, "tutorials-and-examples"]], "AMF Encoder Tutorial": [[4, "amf-encoder-tutorial"]], "FFmpeg Examples using Software Filters": [[5, "ffmpeg-examples-using-software-filters"]], "Environment Setup": [[5, "environment-setup"], [6, "environment-setup"], [7, "environment-setup"], [8, "environment-setup"], [9, "environment-setup"], [12, "environment-setup"]], "Video Rotation": [[5, "video-rotation"], [7, "video-rotation"], [8, "video-rotation"]], "Logo Overlay": [[5, "logo-overlay"], [8, "logo-overlay"]], "Crop and Shift": [[5, "crop-and-shift"]], "Video Composition": [[5, "video-composition"], [8, "video-composition"]], "Chroma Subsampling": [[5, "chroma-subsampling"], [7, "chroma-subsampling"]], "Decoding and De-interlacing": [[5, "decoding-and-de-interlacing"]], "Text Insertion": [[5, "text-insertion"]], "Video Quality Examples": [[6, "video-quality-examples"]], "Introduction to Video Quality": [[6, "introduction-to-video-quality"]], "Optimized Settings for the AMD AMA Video SDK": [[6, "optimized-settings-for-the-sdk"]], "Video Tuning Parameters": [[6, "id1"]], "AV1 VMAF - Normal Latency - Medium Preset": [[6, "av1-vmaf-normal-latency-medium-preset"]], "AVC VMAF - Normal Latency - Slow Preset": [[6, "avc-vmaf-normal-latency-slow-preset"]], "AV1 VMAF - Ultra Low Latency - Medium Preset": [[6, "av1-vmaf-ultra-low-latency-medium-preset"]], "AVC VMAF - Ultra Low Latency - Slow Preset": [[6, "avc-vmaf-ultra-low-latency-slow-preset"]], "Running PSNR/SSIM/VMAF Scores": [[6, "running-psnr-ssim-vmaf-scores"]], "FFmpeg Tutorials": [[7, "ffmpeg-tutorials"]], "Device Selection": [[7, "device-selection"], [9, "device-selection"]], "Simple FFmpeg Examples": [[7, "simple-ffmpeg-examples"]], "Decode Only": [[7, "decode-only"]], "Encode Only": [[7, "encode-only"]], "4:2:2 10 Bit Conversion": [[7, "bit-conversion"]], "Constant Rate Factor (CRF) Mode": [[7, "constant-rate-factor-crf-mode"]], "High Quality Encoding": [[7, "high-quality-encoding"]], "Low Quality Encoding": [[7, "low-quality-encoding"]], "Basic Transcode": [[7, "basic-transcode"]], "Decode Only Into Multiple-Resolution Outputs": [[7, "decode-only-into-multiple-resolution-outputs"]], "Encode Only Into Multiple-Resolution Outputs": [[7, "encode-only-into-multiple-resolution-outputs"]], "Transcode with Multiple-Resolution Outputs": [[7, "transcode-with-multiple-resolution-outputs"]], "Transcode in ULL Mode": [[7, "transcode-in-ull-mode"]], "8kp30 Transcode": [[7, "kp30-transcode"]], "Multi-slice Transcode": [[7, "multi-slice-transcode"]], "Multi-device Transcode": [[7, "multi-device-transcode"]], "Double Density Example with xrmd": [[7, "double-density-example-with-xrmd"]], "Double Density Example without xrmd": [[7, "double-density-example-without-xrmd"]], "Full Double Density": [[7, "full-double-density"]], "Image Decoding": [[7, "image-decoding"]], "Image Encoding": [[7, "image-encoding"]], "2D Processing": [[7, "d-processing"]], "Cropping": [[7, "cropping"]], "Padding": [[7, "padding"]], "Color Space Conversion": [[7, "color-space-conversion"]], "Picture In Picture (PIP)": [[7, "picture-in-picture-pip"]], "Tiling": [[7, "tiling"]], "Thumbnailing": [[7, "thumbnailing"]], "Composition": [[7, "composition"]], "ML Processing": [[7, "ml-processing"]], "ML Based Face ROI": [[7, "ml-based-face-roi"]], "ROI Gain Factor": [[7, "roi-gain-factor"]], "ROI Ladder Transcoding": [[7, "roi-ladder-transcoding"]], "ROI Face Detection": [[7, "roi-face-detection"]], "ML Based Text ROI": [[7, "ml-based-text-roi"]], "GStreamer Examples using Software Filters": [[8, "gstreamer-examples-using-software-filters"]], "Crop and Zoom": [[8, "crop-and-zoom"]], "GStreamer Introductory Tutorials": [[9, "gstreamer-introductory-tutorials"]], "Simple GStreamer Examples": [[9, "simple-gstreamer-examples"]], "Decode only": [[9, "decode-only"]], "Downscaling in decoder": [[9, "downscaling-in-decoder"]], "Encode only": [[9, "encode-only"]], "Transcode with Multiple-Resolution outputs": [[9, "transcode-with-multiple-resolution-outputs"]], "Multidevice Transcode": [[9, "multidevice-transcode"]], "2D Filters": [[9, "d-filters"]], "GStreamer ABR Ladder Application": [[10, "gstreamer-abr-ladder-application"]], "Introduction": [[10, "introduction"], [11, "introduction"], [16, "introduction"], [26, "introduction"], [27, "introduction"]], "Host System Requirement": [[10, "host-system-requirement"], [11, "host-system-requirement"]], "Usage": [[10, "usage"], [11, "usage"]], "Examples": [[10, "examples"], [11, "examples"], [25, "examples"]], "GStreamer Compositor Application": [[11, "gstreamer-compositor-application"]], "XMA Examples for the AMD AMA Video SDK": [[12, "xma-examples-for-the-sdk"]], "XMA Decoder App": [[12, "xma-decoder-app"]], "Decoder Test Instructions": [[12, "decoder-test-instructions"]], "Decoder Usage": [[12, "decoder-usage"]], "Sample Decoder Command": [[12, "sample-decoder-command"]], "XMA Encoder App": [[12, "xma-encoder-app"]], "Encoder Test Instructions": [[12, "encoder-test-instructions"]], "Encoder Usage": [[12, "encoder-usage"]], "Sample Encoder Commands": [[12, "sample-encoder-commands"]], "XMA Scaler App": [[12, "xma-scaler-app"]], "Scaler Test Instructions": [[12, "scaler-test-instructions"]], "Scaler Usage": [[12, "scaler-usage"]], "Sample Scaler Command": [[12, "sample-scaler-command"]], "XMA Transcoder App": [[12, "xma-transcoder-app"]], "Transcoder Test Instructions": [[12, "transcoder-test-instructions"]], "Transcoder Usage": [[12, "transcoder-usage"]], "Sample Transcoder Commands": [[12, "sample-transcoder-commands"]], "Getting Started with AMD AMA Video SDK Cards": [[13, "getting-started-with-sdk-cards"]], "Chassis Setup": [[13, "chassis-setup"]], "Check Cards": [[13, "check-cards"]], "Install the AMD AMA Video SDK": [[13, "install-the-sdk"]], "Flash Firmware": [[13, "flash-firmware"]], "Installation Verification": [[13, "installation-verification"]], "Set Up the Runtime Environment": [[13, "set-up-the-runtime-environment"]], "Run Your First Examples": [[13, "run-your-first-examples"]], "AMD Advanced Media Acceleration (AMA) Repository": [[14, "amd-advanced-media-acceleration-ama-repository"]], "Development & Helper Utilities": [[14, "id1"]], "AMD Advanced Media Acceleration (AMA)": [[15, "amd-advanced-media-acceleration-ama"]], "Quick Links": [[15, "quick-links"]], "Managing Video Acceleration Compute Resources": [[16, "managing-video-acceleration-compute-resources"]], "Assigning Jobs to Specific Devices": [[16, "assigning-jobs-to-specific-devices"]], "Examples using Explicit Device IDs": [[16, "examples-using-explicit-device-ids"]], "Manual Resource Management": [[16, "manual-resource-management"]], "Checking System Load": [[16, "checking-system-load"]], "Insufficient Resources": [[16, "insufficient-resources"]], "Job Resource Requirements": [[16, "job-resource-requirements"]], "Automated Resource Management": [[16, "automated-resource-management"]], "Video Transcode Job Descriptions": [[16, "video-transcode-job-descriptions"]], "The Job Slot Reservation Tool": [[16, "the-job-slot-reservation-tool"]], "Example requiring a single device per job": [[16, "example-requiring-a-single-device-per-job"]], "Multi-devices Flow": [[16, "multi-devices-flow"]], "Automated Job Launching": [[16, "automated-job-launching"]], "The FFmpeg Launcher Example": [[16, "the-ffmpeg-launcher-example"]], "XRM Reference Guide": [[16, "xrm-reference-guide"]], "Command Line Interface": [[16, "command-line-interface"]], "Setup": [[16, "setup"]], "Generating Status Reports": [[16, "generating-status-reports"]], "Loading/Unloading Software Plugins": [[16, "loading-unloading-software-plugins"]], "C Application Programming Interface": [[16, "c-application-programming-interface"]], "Software Migration Considerations": [[17, "software-migration-considerations"]], "API Changes from Alveo U30": [[17, "api-changes-from-alveo-u30"]], "FFmpeg API Changes": [[17, "ffmpeg-api-changes"]], "Gstreamer API Changes": [[17, "gstreamer-api-changes"]], "CLI Changes from 1.1.2 to 1.2": [[17, "cli-changes-from-1-1-2-to-1-2"]], "PCIe Addressing": [[17, "pcie-addressing"]], "FFmpeg CLI Changes": [[17, "ffmpeg-cli-changes"]], "Distribution Package Feed": [[18, "distribution-package-feed"]], "Package Descriptions": [[18, "package-descriptions"]], "Configuring the Package Feed": [[18, "configuring-the-package-feed"]], "Ubuntu": [[18, "ubuntu"]], "Debian 12": [[18, "debian-12"]], "Fedora": [[18, "fedora"]], "New Feature Preview": [[19, "new-feature-preview"]], "Machine Learning Content Aware Encoding (MLCAE)": [[19, "machine-learning-content-aware-encoding-mlcae"]], "AMD Advanced Media Acceleration (AMA) Release Notes": [[20, "amd-advanced-media-acceleration-ama-release-notes"]], "Release Requirements": [[20, "release-requirements"]], "New in This Release": [[20, "new-in-this-release"]], "Feature Highlight": [[20, "feature-highlight"]], "Supported Kernels and Distributions": [[20, "supported-kernels-and-distributions"]], "Supported OS & Kernel": [[20, "id1"]], "Known Limitations": [[20, "known-limitations"]], "Known Issues": [[20, "known-issues"]], "Upgrading from Previous Versions": [[20, "upgrading-from-previous-versions"]], "Specs and Features of the AMD AMA Video SDK": [[21, "specs-and-features-of-the-sdk"]], "The AMD AMA Video SDK": [[21, "the-sdk"]], "The AMD MA35D Card": [[21, "the-amd-ma35d-card"]], "Video Codec Unit": [[21, "video-codec-unit"]], "Adaptive Bitrate Scaler": [[21, "adaptive-bitrate-scaler"]], "Decoder Downsampler": [[21, "decoder-downsampler"]], "2D Pixel Processing": [[21, "d-pixel-processing"]], "Decoding Capacity": [[21, "decoding-capacity"]], "Video Quality": [[21, "video-quality"]], "Machine Learning Engine": [[21, "machine-learning-engine"]], "Pixel Format": [[21, "pixel-format"]], "Supported Pixel Formats": [[21, "id3"]], "Performance Tables": [[21, "performance-tables"]], "Performance Tables for 8-bit Color": [[21, "performance-tables-for-8-bit-color"]], "Number of Real-Time Transcode Jobs per Card (8-bit)": [[21, "id4"]], "Number of Real-Time Transcode with Scale Jobs per Card (8-bit)": [[21, "id5"]], "Number of Real-Time ABR Ladders (8-bit)": [[21, "id6"]], "Performance Tables for 10-bit Color": [[21, "performance-tables-for-10-bit-color"]], "Number of Real-Time Transcode Jobs per Card (10-bit)": [[21, "id7"]], "Number of Real-Time Transcode with Scale Jobs per Card (10-bit)": [[21, "id8"]], "Number of Real-Time ABR Ladders (10-bit)": [[21, "id9"]], "AMD Advanced Media Acceleration (AMA) Troubleshooting": [[22, "amd-advanced-media-acceleration-ama-troubleshooting"]], "No Device Showing in lspci": [[22, "no-device-showing-in-lspci"]], "Single Device per Card": [[22, "single-device-per-card"]], "Memory Usage": [[22, "memory-usage"]], "AV1 Slow Playback": [[22, "av1-slow-playback"]], "AV1 MP4 Playback": [[22, "av1-mp4-playback"]], "30 FPS Density": [[22, "fps-density"]], "Gstreamer Variable Frame Rate": [[22, "gstreamer-variable-frame-rate"]], "400 Mbps Max Bit Rate": [[22, "mbps-max-bit-rate"]], "Many Parallel Encodes": [[22, "many-parallel-encodes"]], "HDR & spatialAqGain": [[22, "hdr-spatialaqgain"]], "Nonresponsive Devices": [[22, "nonresponsive-devices"]], "Codec Issues in VM": [[22, "codec-issues-in-vm"]], "Cannot Assign a VF to a VM": [[22, "cannot-assign-a-vf-to-a-vm"]], "Cannot Flash the Card": [[22, "cannot-flash-the-card"]], "FFmpeg Unsupported Audio Format Conversion": [[22, "ffmpeg-unsupported-audio-format-conversion"]], "LED Red Lights On": [[22, "led-red-lights-on"]], "Ubuntu 20.04 Installation": [[22, "ubuntu-20-04-installation"]], "Tuning Latency": [[23, "tuning-latency"]], "Decoder Latency": [[23, "decoder-latency"]], "Encoder Latency": [[23, "encoder-latency"]], "Guidelines on Encoder Latency Configuration": [[23, "guidelines-on-encoder-latency-configuration"]], "Automatic Look Ahead Depth Calculation": [[23, "automatic-look-ahead-depth-calculation"]], "Ultra Low Latency (ULL) Mode": [[23, "ultra-low-latency-ull-mode"]], "Latency Adjustment": [[23, "latency-adjustment"]], "FFmpeg Latency Measurements": [[23, "ffmpeg-latency-measurements"]], "Tuning Video Quality": [[24, "tuning-video-quality"]], "Metrics": [[24, "metrics"]], "Latency": [[24, "latency"]], "Preset": [[24, "preset"]], "Content Adaptive Bit Rate (CABR)": [[24, "content-adaptive-bit-rate-cabr"]], "GOP Composition": [[24, "gop-composition"]], "ROI": [[24, "roi"]], "AV1 Type Selection": [[24, "av1-type-selection"]], "Dynamic Encoder Parameters": [[24, "dynamic-encoder-parameters"]], "Valid Rate Control Modes and Dynamic Parameters Combinations": [[24, "id4"]], "Unified Logging": [[25, "unified-logging"]], "LOG_AMA_CONFIG": [[25, "log-ama-config"]], "LOG_AMA_FILTER": [[25, "log-ama-filter"]], "LOG_AMA_FILTER_PERF": [[25, "log-ama-filter-perf"]], "Using FFmpeg": [[26, "using-ffmpeg"]], "Example Commands": [[26, "example-commands"]], "General FFmpeg Options": [[26, "general-ffmpeg-options"], [26, "id3"]], "Video Decoding": [[26, "video-decoding"]], "Video Decoding Options": [[26, "id4"]], "Video Encoding": [[26, "video-encoding"]], "Video Encoding Options": [[26, "id5"]], "RC Mode Options": [[26, "id6"]], "Image Encoding Options": [[26, "id7"]], "2D Engines": [[26, "d-engines"], [27, "d-engines"]], "2D Accelerator Engines": [[26, "id8"], [27, "id4"]], "Video Machine Learning": [[26, "video-machine-learning"]], "Inference Engine": [[26, "inference-engine"]], "Inference Engine Options": [[26, "id9"]], "ROI Scaler": [[26, "roi-scaler"]], "Scaler Options": [[26, "id10"]], "ROI Overlay": [[26, "roi-overlay"]], "Overlay Options": [[26, "id11"]], "Other AMA Filters": [[26, "other-ama-filters"], [26, "id12"]], "Rebuilding FFmpeg": [[26, "rebuilding-ffmpeg"]], "Using GStreamer": [[27, "using-gstreamer"]], "Overview of the GStreamer Plugins": [[27, "overview-of-the-gstreamer-plugins"]], "Decoder Plugin": [[27, "decoder-plugin"]], "Decoder Inputs and Outputs": [[27, "decoder-inputs-and-outputs"]], "Decoder Parameters": [[27, "decoder-parameters"]], "Decoder Example Pipelines": [[27, "decoder-example-pipelines"]], "Encoder Plugin": [[27, "encoder-plugin"]], "Encoder Inputs and Outputs": [[27, "encoder-inputs-and-outputs"]], "Encoder Parameters": [[27, "encoder-parameters"]], "Encoder Example Pipelines": [[27, "encoder-example-pipelines"]], "Scaler Plugin": [[27, "scaler-plugin"]], "Scaler Inputs and Outputs": [[27, "scaler-inputs-and-outputs"]], "Scaler Parameters": [[27, "scaler-parameters"]], "Sink Pad": [[27, "id3"], [27, "id5"]], "Scaler Example Pipelines": [[27, "scaler-example-pipelines"]], "Inputs and Outputs": [[27, "inputs-and-outputs"], [27, "id2"]], "2D Plugins": [[27, "d-plugins"]], "Compositor Plugin": [[27, "compositor-plugin"]], "Compositor Inputs and Outputs": [[27, "compositor-inputs-and-outputs"]], "Compositor Parameters": [[27, "compositor-parameters"]], "Source Pad": [[27, "id6"]], "Hardware Down and Up Loads": [[27, "hardware-down-and-up-loads"]], "DMA Parameters": [[27, "dma-parameters"]], "Moving Data through the Pipeline": [[27, "moving-data-through-the-pipeline"]], "Working with Multiple Devices": [[27, "working-with-multiple-devices"]], "Rebuilding GStreamer": [[27, "rebuilding-gstreamer"]], "Virtualization": [[28, "virtualization"]], "SR-IOV": [[28, "sr-iov"]], "Linux Host": [[28, "linux-host"]], "Linux VM Guest": [[28, "linux-vm-guest"]], "PCIe Passthrough": [[28, "pcie-passthrough"]]}, "indexentries": {"xmadatabuffer (c struct)": [[0, "c.XmaDataBuffer"]], "xmadecoderproperties (c struct)": [[0, "c.XmaDecoderProperties"]], "xmadynamicencparams (c struct)": [[0, "c.XmaDynamicEncParams"]], "xmadynamicencparams_v2 (c struct)": [[0, "c.XmaDynamicEncParams_v2"]], "xmaencoderproperties (c struct)": [[0, "c.XmaEncoderProperties"]], "xmafilterportproperties (c struct)": [[0, "c.XmaFilterPortProperties"]], "xmafilterproperties (c struct)": [[0, "c.XmaFilterProperties"]], "xmaframe (c struct)": [[0, "c.XmaFrame"]], "xmaframeproperties (c struct)": [[0, "c.XmaFrameProperties"]], "xmaparameter (c struct)": [[0, "c.XmaParameter"]], "xmascalerinoutproperties (c struct)": [[0, "c.XmaScalerInOutProperties"]], "xmascalerproperties (c struct)": [[0, "c.XmaScalerProperties"]], "xma_data_buffer_alloc (c function)": [[0, "c.xma_data_buffer_alloc"]], "xma_data_buffer_free (c function)": [[0, "c.xma_data_buffer_free"]], "xma_data_from_buffer_clone (c function)": [[0, "c.xma_data_from_buffer_clone"]], "xma_dec_session_create (c function)": [[0, "c.xma_dec_session_create"]], "xma_dec_session_destroy (c function)": [[0, "c.xma_dec_session_destroy"]], "xma_dec_session_get_properties (c function)": [[0, "c.xma_dec_session_get_properties"]], "xma_dec_session_recv_frame (c function)": [[0, "c.xma_dec_session_recv_frame"]], "xma_dec_session_send_data (c function)": [[0, "c.xma_dec_session_send_data"]], "xma_dec_session_set_log (c function)": [[0, "c.xma_dec_session_set_log"]], "xma_enc_session_create (c function)": [[0, "c.xma_enc_session_create"]], "xma_enc_session_destroy (c function)": [[0, "c.xma_enc_session_destroy"]], "xma_enc_session_recv_data (c function)": [[0, "c.xma_enc_session_recv_data"]], "xma_enc_session_send_frame (c function)": [[0, "c.xma_enc_session_send_frame"]], "xma_enc_session_set_log (c function)": [[0, "c.xma_enc_session_set_log"]], "xma_filter_session_create (c function)": [[0, "c.xma_filter_session_create"]], "xma_filter_session_destroy (c function)": [[0, "c.xma_filter_session_destroy"]], "xma_filter_session_recv_frame (c function)": [[0, "c.xma_filter_session_recv_frame"]], "xma_filter_session_send_frame (c function)": [[0, "c.xma_filter_session_send_frame"]], "xma_filter_session_set_log (c function)": [[0, "c.xma_filter_session_set_log"]], "xma_frame_add_side_data (c function)": [[0, "c.xma_frame_add_side_data"]], "xma_frame_alloc (c function)": [[0, "c.xma_frame_alloc"]], "xma_frame_clear_all_side_data (c function)": [[0, "c.xma_frame_clear_all_side_data"]], "xma_frame_clone (c function)": [[0, "c.xma_frame_clone"]], "xma_frame_dec_ref (c function)": [[0, "c.xma_frame_dec_ref"]], "xma_frame_free (c function)": [[0, "c.xma_frame_free"]], "xma_frame_from_buffers_clone (c function)": [[0, "c.xma_frame_from_buffers_clone"]], "xma_frame_get_first_side_data (c function)": [[0, "c.xma_frame_get_first_side_data"]], "xma_frame_get_next_side_data (c function)": [[0, "c.xma_frame_get_next_side_data"]], "xma_frame_get_next_side_data_of_type (c function)": [[0, "c.xma_frame_get_next_side_data_of_type"]], "xma_frame_get_plane_height (c function)": [[0, "c.xma_frame_get_plane_height"]], "xma_frame_get_plane_size (c function)": [[0, "c.xma_frame_get_plane_size"]], "xma_frame_get_plane_stride (c function)": [[0, "c.xma_frame_get_plane_stride"]], "xma_frame_get_side_data (c function)": [[0, "c.xma_frame_get_side_data"]], "xma_frame_inc_ref (c function)": [[0, "c.xma_frame_inc_ref"]], "xma_frame_planes_get (c function)": [[0, "c.xma_frame_planes_get"]], "xma_frame_remove_side_data (c function)": [[0, "c.xma_frame_remove_side_data"]], "xma_frame_remove_side_data_type (c function)": [[0, "c.xma_frame_remove_side_data_type"]], "xma_initialize (c function)": [[0, "c.xma_initialize"]], "xma_log_init (c function)": [[0, "c.xma_log_init"]], "xma_log_release (c function)": [[0, "c.xma_log_release"]], "xma_logmsg (c function)": [[0, "c.xma_logmsg"]], "xma_release (c function)": [[0, "c.xma_release"]], "xma_scaler_session_create (c function)": [[0, "c.xma_scaler_session_create"]], "xma_scaler_session_destroy (c function)": [[0, "c.xma_scaler_session_destroy"]], "xma_scaler_session_recv_frame_list (c function)": [[0, "c.xma_scaler_session_recv_frame_list"]], "xma_scaler_session_send_frame (c function)": [[0, "c.xma_scaler_session_send_frame"]], "xma_side_data_alloc (c function)": [[0, "c.xma_side_data_alloc"]], "xma_side_data_dec_ref (c function)": [[0, "c.xma_side_data_dec_ref"]], "xma_side_data_free (c function)": [[0, "c.xma_side_data_free"]], "xma_side_data_get_metadata (c function)": [[0, "c.xma_side_data_get_metadata"]], "xma_side_data_get_refcount (c function)": [[0, "c.xma_side_data_get_refcount"]], "xma_side_data_inc_ref (c function)": [[0, "c.xma_side_data_inc_ref"]], "xma_side_data_read (c function)": [[0, "c.xma_side_data_read"]], "xma_side_data_set_metadata (c function)": [[0, "c.xma_side_data_set_metadata"]], "xma_side_data_write (c function)": [[0, "c.xma_side_data_write"]], "xrm_dec_release (c function)": [[0, "c.xrm_dec_release"]], "xrm_dec_release_v2 (c function)": [[0, "c.xrm_dec_release_v2"]], "xrm_dec_reserve (c function)": [[0, "c.xrm_dec_reserve"]], "xrm_dec_reserve_v2 (c function)": [[0, "c.xrm_dec_reserve_v2"]], "xrm_enc_release (c function)": [[0, "c.xrm_enc_release"]], "xrm_enc_release_v2 (c function)": [[0, "c.xrm_enc_release_v2"]], "xrm_enc_reserve (c function)": [[0, "c.xrm_enc_reserve"]], "xrm_enc_reserve_v2 (c function)": [[0, "c.xrm_enc_reserve_v2"]], "xrm_ml_release_v2 (c function)": [[0, "c.xrm_ml_release_v2"]], "xrm_ml_reserve_v2 (c function)": [[0, "c.xrm_ml_reserve_v2"]], "xrm_scale_release (c function)": [[0, "c.xrm_scale_release"]], "xrm_scale_release_v2 (c function)": [[0, "c.xrm_scale_release_v2"]], "xrm_scale_reserve (c function)": [[0, "c.xrm_scale_reserve"]], "xrm_scale_reserve_v2 (c function)": [[0, "c.xrm_scale_reserve_v2"]], "--codectype": [[10, "cmdoption-codectype"]], "--devidx": [[10, "cmdoption-devidx"]], "--file": [[10, "cmdoption-file"]], "--forcekeyframe": [[10, "cmdoption-forcekeyframe"]], "--json": [[10, "cmdoption-json"]], "-c": [[10, "cmdoption-c"]], "-f": [[10, "cmdoption-f"], [26, "cmdoption-f"]], "-i": [[10, "cmdoption-i"], [26, "cmdoption-i"]], "-j": [[10, "cmdoption-j"]], "-k": [[10, "cmdoption-k"]], "command line option": [[10, "cmdoption-c"], [10, "cmdoption-codectype"], [10, "cmdoption-devidx"], [10, "cmdoption-f"], [10, "cmdoption-file"], [10, "cmdoption-forcekeyframe"], [10, "cmdoption-i"], [10, "cmdoption-j"], [10, "cmdoption-json"], [10, "cmdoption-k"], [26, "cmdoption-arg-0"], [26, "cmdoption-arg-colorspace_ama"], [26, "cmdoption-arg-compositor_ama"], [26, "cmdoption-arg-core_id"], [26, "cmdoption-arg-crop_ama"], [26, "cmdoption-arg-cutoff"], [26, "cmdoption-arg-drawbox_ama"], [26, "cmdoption-arg-highlight_threshold"], [26, "cmdoption-arg-hwdownload_ama"], [26, "cmdoption-arg-hwupload_ama"], [26, "cmdoption-arg-inference_period"], [26, "cmdoption-arg-ml_ama"], [26, "cmdoption-arg-model"], [26, "cmdoption-arg-model_args"], [26, "cmdoption-arg-nb_inputs"], [26, "cmdoption-arg-overlay_ama"], [26, "cmdoption-arg-pad_ama"], [26, "cmdoption-arg-roi_map_type"], [26, "cmdoption-arg-roi_overlay_ama"], [26, "cmdoption-arg-roi_scale_ama"], [26, "cmdoption-arg-rotate_ama"], [26, "cmdoption-arg-scaler_ama"], [26, "cmdoption-arg-skip_frames"], [26, "cmdoption-arg-static_map_file"], [26, "cmdoption-arg-still-picture"], [26, "cmdoption-arg-strength"], [26, "cmdoption-arg-subsample_ama"], [26, "cmdoption-arg-tile_ama"], [26, "cmdoption-b-v"], [26, "cmdoption-bf"], [26, "cmdoption-bufsize"], [26, "cmdoption-c-v"], [26, "cmdoption-cabr"], [26, "cmdoption-control_rate"], [26, "cmdoption-cores"], [26, "cmdoption-crf"], [26, "cmdoption-dynamic_gop"], [26, "cmdoption-dynamic_params_file"], [26, "cmdoption-f"], [26, "cmdoption-filter_complex"], [26, "cmdoption-forced_idr"], [26, "cmdoption-g"], [26, "cmdoption-hwaccel"], [26, "cmdoption-i"], [26, "cmdoption-latency_ms"], [26, "cmdoption-level"], [26, "cmdoption-lookahead_depth"], [26, "cmdoption-low_latency"], [26, "cmdoption-max_bitrate"], [26, "cmdoption-max_qp"], [26, "cmdoption-min_qp"], [26, "cmdoption-no_bll"], [26, "cmdoption-out_fmt"], [26, "cmdoption-preset"], [26, "cmdoption-profile"], [26, "cmdoption-qp"], [26, "cmdoption-qp_b_offset"], [26, "cmdoption-qp_i_offset"], [26, "cmdoption-qp_mode"], [26, "cmdoption-quality"], [26, "cmdoption-r"], [26, "cmdoption-resize"], [26, "cmdoption-s"], [26, "cmdoption-slice"], [26, "cmdoption-spatial_aq"], [26, "cmdoption-spatial_aq_gain"], [26, "cmdoption-temporal_aq"], [26, "cmdoption-temporal_aq_gain"], [26, "cmdoption-tier"], [26, "cmdoption-tune_metrics"], [26, "cmdoption-type"], [26, "cmdoption-vf"], [27, "cmdoption-arg-0"], [27, "cmdoption-arg-1"], [27, "cmdoption-arg-2"], [27, "cmdoption-arg-3"], [27, "cmdoption-arg-4"], [27, "cmdoption-arg-allow-downscaling"], [27, "cmdoption-arg-alpha"], [27, "cmdoption-arg-ama_drawbox"], [27, "cmdoption-arg-ama_overlay"], [27, "cmdoption-arg-ama_rotate"], [27, "cmdoption-arg-ama_tile"], [27, "cmdoption-arg-ama_videoconvert"], [27, "cmdoption-arg-ama_videocrop"], [27, "cmdoption-arg-ama_videopad"], [27, "cmdoption-arg-b-frames"], [27, "cmdoption-arg-background"], [27, "cmdoption-arg-background-color"], [27, "cmdoption-arg-bitrate"], [27, "cmdoption-arg-border-color"], [27, "cmdoption-arg-border-inner-width"], [27, "cmdoption-arg-border-outer-width"], [27, "cmdoption-arg-core-id"], [27, "cmdoption-arg-crf"], [27, "cmdoption-arg-crop-bottom"], [27, "cmdoption-arg-crop-left"], [27, "cmdoption-arg-crop-right"], [27, "cmdoption-arg-crop-top"], [27, "cmdoption-arg-device"], [27, "cmdoption-arg-device-type"], [27, "cmdoption-arg-dynamic-gop"], [27, "cmdoption-arg-encoding-params-file"], [27, "cmdoption-arg-forced-idr"], [27, "cmdoption-arg-gop-length"], [27, "cmdoption-arg-height"], [27, "cmdoption-arg-idr-interval"], [27, "cmdoption-arg-latency-logging"], [27, "cmdoption-arg-latency-ms"], [27, "cmdoption-arg-lookahead-depth"], [27, "cmdoption-arg-low-latency"], [27, "cmdoption-arg-max-bitrate"], [27, "cmdoption-arg-max-qp"], [27, "cmdoption-arg-min-qp"], [27, "cmdoption-arg-no-bll"], [27, "cmdoption-arg-preset"], [27, "cmdoption-arg-qp"], [27, "cmdoption-arg-qp-b-offset"], [27, "cmdoption-arg-qp-i-offset"], [27, "cmdoption-arg-qp-mode"], [27, "cmdoption-arg-rate-control"], [27, "cmdoption-arg-slice"], [27, "cmdoption-arg-spatial-aq"], [27, "cmdoption-arg-spatial-aq-gain"], [27, "cmdoption-arg-temporal-aq-gain"], [27, "cmdoption-arg-temporall-aq"], [27, "cmdoption-arg-tier"], [27, "cmdoption-arg-tune-metrics"], [27, "cmdoption-arg-video-direction"], [27, "cmdoption-arg-width"], [27, "cmdoption-arg-xpos"], [27, "cmdoption-arg-ypos"], [27, "cmdoption-arg-zorder"]], "xrm_reserve_id": [[16, "index-0"], [16, "index-2"]], "xrm_reserve_id_{n}": [[16, "index-1"], [16, "index-3"]], "environment variable": [[16, "index-0"], [16, "index-1"], [16, "index-2"], [16, "index-3"]], "-b:v": [[26, "cmdoption-b-v"]], "-bf": [[26, "cmdoption-bf"]], "-bufsize": [[26, "cmdoption-bufsize"]], "-c:v": [[26, "cmdoption-c-v"]], "-cabr": [[26, "cmdoption-cabr"]], "-control_rate": [[26, "cmdoption-control_rate"]], "-cores": [[26, "cmdoption-cores"]], "-crf": [[26, "cmdoption-crf"]], "-dynamic_gop": [[26, "cmdoption-dynamic_gop"]], "-dynamic_params_file": [[26, "cmdoption-dynamic_params_file"]], "-filter_complex": [[26, "cmdoption-filter_complex"]], "-forced_idr": [[26, "cmdoption-forced_idr"]], "-g": [[26, "cmdoption-g"]], "-hwaccel": [[26, "cmdoption-hwaccel"]], "-latency_ms": [[26, "cmdoption-latency_ms"]], "-level": [[26, "cmdoption-level"]], "-lookahead_depth": [[26, "cmdoption-lookahead_depth"]], "-low_latency": [[26, "cmdoption-low_latency"]], "-max_bitrate": [[26, "cmdoption-max_bitrate"]], "-max_qp": [[26, "cmdoption-max_qp"]], "-min_qp": [[26, "cmdoption-min_qp"]], "-no_bll": [[26, "cmdoption-no_bll"]], "-out_fmt": [[26, "cmdoption-out_fmt"]], "-preset": [[26, "cmdoption-preset"]], "-profile": [[26, "cmdoption-profile"]], "-qp": [[26, "cmdoption-qp"]], "-qp_b_offset": [[26, "cmdoption-qp_b_offset"]], "-qp_i_offset": [[26, "cmdoption-qp_i_offset"]], "-qp_mode": [[26, "cmdoption-qp_mode"]], "-quality": [[26, "cmdoption-quality"]], "-r": [[26, "cmdoption-r"]], "-resize": [[26, "cmdoption-resize"]], "-s": [[26, "cmdoption-s"]], "-slice": [[26, "cmdoption-slice"]], "-spatial_aq": [[26, "cmdoption-spatial_aq"]], "-spatial_aq_gain": [[26, "cmdoption-spatial_aq_gain"]], "-temporal_aq": [[26, "cmdoption-temporal_aq"]], "-temporal_aq_gain": [[26, "cmdoption-temporal_aq_gain"]], "-tier": [[26, "cmdoption-tier"]], "-tune_metrics": [[26, "cmdoption-tune_metrics"]], "-type": [[26, "cmdoption-type"]], "-vf": [[26, "cmdoption-vf"]], "colorspace_ama": [[26, "cmdoption-arg-colorspace_ama"]], "compositor_ama": [[26, "cmdoption-arg-compositor_ama"]], "core_id": [[26, "cmdoption-arg-core_id"]], "crop_ama": [[26, "cmdoption-arg-crop_ama"]], "cutoff": [[26, "cmdoption-arg-cutoff"]], "drawbox_ama": [[26, "cmdoption-arg-drawbox_ama"]], "highlight_threshold": [[26, "cmdoption-arg-highlight_threshold"]], "hwdownload_ama": [[26, "cmdoption-arg-hwdownload_ama"]], "hwupload_ama": [[26, "cmdoption-arg-hwupload_ama"]], "inference_period": [[26, "cmdoption-arg-inference_period"]], "ml_ama": [[26, "cmdoption-arg-ml_ama"]], "model": [[26, "cmdoption-arg-model"]], "model_args": [[26, "cmdoption-arg-model_args"]], "nb_inputs": [[26, "cmdoption-arg-0"], [26, "cmdoption-arg-nb_inputs"]], "overlay_ama": [[26, "cmdoption-arg-overlay_ama"]], "pad_ama": [[26, "cmdoption-arg-pad_ama"]], "roi_map_type": [[26, "cmdoption-arg-roi_map_type"]], "roi_overlay_ama": [[26, "cmdoption-arg-roi_overlay_ama"]], "roi_scale_ama": [[26, "cmdoption-arg-roi_scale_ama"]], "rotate_ama": [[26, "cmdoption-arg-rotate_ama"]], "scaler_ama": [[26, "cmdoption-arg-scaler_ama"]], "skip_frames": [[26, "cmdoption-arg-skip_frames"]], "static_map_file": [[26, "cmdoption-arg-static_map_file"]], "still-picture": [[26, "cmdoption-arg-still-picture"]], "strength": [[26, "cmdoption-arg-strength"]], "subsample_ama": [[26, "cmdoption-arg-subsample_ama"]], "tile_ama": [[26, "cmdoption-arg-tile_ama"]], "allow-downscaling": [[27, "cmdoption-arg-allow-downscaling"]], "alpha": [[27, "cmdoption-arg-alpha"]], "ama_drawbox": [[27, "cmdoption-arg-ama_drawbox"]], "ama_overlay": [[27, "cmdoption-arg-ama_overlay"]], "ama_rotate": [[27, "cmdoption-arg-ama_rotate"]], "ama_tile": [[27, "cmdoption-arg-ama_tile"]], "ama_videoconvert": [[27, "cmdoption-arg-ama_videoconvert"]], "ama_videocrop": [[27, "cmdoption-arg-ama_videocrop"]], "ama_videopad": [[27, "cmdoption-arg-ama_videopad"]], "b-frames": [[27, "cmdoption-arg-b-frames"]], "background": [[27, "cmdoption-arg-background"]], "background-color": [[27, "cmdoption-arg-background-color"]], "bitrate": [[27, "cmdoption-arg-bitrate"]], "border-color": [[27, "cmdoption-arg-border-color"]], "border-inner-width": [[27, "cmdoption-arg-border-inner-width"]], "border-outer-width": [[27, "cmdoption-arg-2"], [27, "cmdoption-arg-border-outer-width"]], "core-id": [[27, "cmdoption-arg-core-id"]], "crf": [[27, "cmdoption-arg-crf"]], "crop-bottom": [[27, "cmdoption-arg-crop-bottom"]], "crop-left": [[27, "cmdoption-arg-crop-left"]], "crop-right": [[27, "cmdoption-arg-crop-right"]], "crop-top": [[27, "cmdoption-arg-crop-top"]], "device": [[27, "cmdoption-arg-0"], [27, "cmdoption-arg-1"], [27, "cmdoption-arg-3"], [27, "cmdoption-arg-4"], [27, "cmdoption-arg-device"]], "device-type": [[27, "cmdoption-arg-device-type"]], "dynamic-gop": [[27, "cmdoption-arg-dynamic-gop"]], "encoding-params-file": [[27, "cmdoption-arg-encoding-params-file"]], "forced-idr": [[27, "cmdoption-arg-forced-idr"]], "gop-length": [[27, "cmdoption-arg-gop-length"]], "height": [[27, "cmdoption-arg-height"]], "idr-interval": [[27, "cmdoption-arg-idr-interval"]], "latency-logging": [[27, "cmdoption-arg-latency-logging"]], "latency-ms": [[27, "cmdoption-arg-latency-ms"]], "lookahead-depth": [[27, "cmdoption-arg-lookahead-depth"]], "low-latency": [[27, "cmdoption-arg-low-latency"]], "max-bitrate": [[27, "cmdoption-arg-max-bitrate"]], "max-qp": [[27, "cmdoption-arg-max-qp"]], "min-qp": [[27, "cmdoption-arg-min-qp"]], "no-bll": [[27, "cmdoption-arg-no-bll"]], "preset": [[27, "cmdoption-arg-preset"]], "qp": [[27, "cmdoption-arg-qp"]], "qp-b-offset": [[27, "cmdoption-arg-qp-b-offset"]], "qp-i-offset": [[27, "cmdoption-arg-qp-i-offset"]], "qp-mode": [[27, "cmdoption-arg-qp-mode"]], "rate-control": [[27, "cmdoption-arg-rate-control"]], "slice": [[27, "cmdoption-arg-slice"]], "spatial-aq": [[27, "cmdoption-arg-spatial-aq"]], "spatial-aq-gain": [[27, "cmdoption-arg-spatial-aq-gain"]], "temporal-aq-gain": [[27, "cmdoption-arg-temporal-aq-gain"]], "temporall-aq": [[27, "cmdoption-arg-temporall-aq"]], "tier": [[27, "cmdoption-arg-tier"]], "tune-metrics": [[27, "cmdoption-arg-tune-metrics"]], "video-direction": [[27, "cmdoption-arg-video-direction"]], "width": [[27, "cmdoption-arg-width"]], "xpos": [[27, "cmdoption-arg-xpos"]], "ypos": [[27, "cmdoption-arg-ypos"]], "zorder": [[27, "cmdoption-arg-zorder"]]}}) \ No newline at end of file diff --git a/latest/specs_and_features.html b/latest/specs_and_features.html new file mode 100644 index 00000000..0b64e533 --- /dev/null +++ b/latest/specs_and_features.html @@ -0,0 +1,817 @@ + + + + + + + + + + + + + + + Specs and Features of the AMD AMA Video SDK — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Specs and Features of the AMD AMA Video SDK
  • +
  • +
  • +
+
+
+
+
+ +
+

Specs and Features of the AMD AMA Video SDK

+ +
+

The AMD AMA Video SDK

+

The AMD AMA Video SDK is a complete software stack allowing users to seamlessly leverage the features of AMD video acceleration units such as MA35D. It includes the following elements:

+
    +
  • Pre-compiled versions of FFmpeg and GStreamer which integrate key video transcoding plug-ins, enabling simple hardware offloading of compute-intensive workloads using these two popular frameworks. These custom versions of FFmpeg and GStreamer link to a host driver which communicates with the hardware on the PCIe card. No hardware experience is required to run FFmpeg or GStreamer commands with the AMD AMA Video SDK.

  • +
  • The Xilinx Resource Manager (XRM) which is the software used to manage and allocate all the hardware-accelerated features available in the system. XRM allows running multiple video processing jobs across multiple devices and multiple AMD video acceleration cards.

  • +
  • A C-based application programming interface (API) which facilitates the integration of AMD video transcoding capabilities in proprietary frameworks. This API is provided in the form plugins which can be called from external application using the Xilinx Media Accelerator (XMA) interface.

  • +
  • A suite of card management tools used to perform actions such as programming, resetting, or querying the status of AMD video acceleration cards.

  • +
  • Many examples and tutorials illustrating how to use and make the most of the AMD AMA Video SDK.

  • +
+MA35D Pipeline +
+
+

The AMD MA35D Card

+

The MA35D, which is compatible with AMD AMA Video SDK, is a low-profile, PCI™-based media accelerator card that delivers a high-density real-time transcoding solution for live streaming video service providers, OEMs, and Content Delivery Network (CDNs).

+

The MA35D card is targeted for both real-time and faster than real-time video workloads. It is expected that one or more sources of video input, either from files or from live video streams, are fed into the transcode pipeline. The encoder encodes one or more output streams from each scaled rendition of the input.

+
+

Video Codec Unit

+

The MA35D accelerator card has 2 VPUs, where each VPU is made of 2 video processing slices.

+MA35D VPU +

Functionally, slices are made of specialized decode, scale, GPU, ML, look ahead, pixel processing, and encode units.

+MA35D VPU +

Video Codec Unit (VCU) cores are capable of:

+
    +
  • Video format: YCbCr 4:2:0, 8 or 10-bit per color channel

  • +
  • Multi-standard encoding/decoding support, including:

    +
      +
    • ISO MPEG-4 Part 10: Advanced Video Coding (AVC)/ITU H.264 - Baseline, Constrained Baseline, High, High-10, High-10-Intra up to Level 5.2

    • +
    • ISO MPEG-H Part 2: High Efficiency Video Coding (HEVC)/ITU H.265 - Main, Main-Intra, Main10, Main-10-Intra, up to Level 5.2

    • +
    • AOM AV1: AOMedia Video 1 - Main, High up to Level 5.3

    • +
    +
  • +
  • Supports resolutions from 128x128 to 3840x2160 portrait and landscape

  • +
  • Simultaneous transcoding with a maximum aggregated bandwidth of 4x 4Kp60 per card for AVC or HEVC and 8x 4Kp60 for AV1

  • +
  • Look-ahead driven video quality improvements through temporal adaptive and spatial adaptive quantization

  • +
  • Low latency rate control

  • +
  • Flexible rate control: CBR, VBR, CVBR, and Constant QP

  • +
  • Progressive support for H.264, H.265 and AV1

  • +
  • HDR10/10+: HDR data is automatically populated by the decoder and passed to other accelerators in the transcode pipeline.

    +
      +
    • The following HDR10 SEI are supported:

      +
        +
      • Mastering Display Color Volume (SEI ITU)

      • +
      • Content Light Level (SEI ITU)

      • +
      • Alternative Transfer Charateristics (SEI ITU)

      • +
      +
    • +
    • The following HDR10+ SEI are supported:

      +
        +
      • ST2094_10 (DolbyVision, User defined SEI)

      • +
      • ST2094_40 (Samsung, User defined SEI)

      • +
      +
    • +
    • Behavior for HDR10/10+ SEI is as follows:

      +
        +
      • Static HDR SEI (MDCV, CLL & ATC) will not change in-between IDRs (and even in the video sequence according the HDR standards).

      • +
      • MDCV, CLL & ATC will be written only on IDRs, according to the persistency of MDCV, CLL & ATC SEIs.

      • +
      • ST2094_10 will be written on each access unit as per constraint of section A.2.1 ts_103572v010101p.pdf.

      • +
      • ST2094_40 will be written on IDRs, and whenever the user changes its content, according to the persistency specification in A341S34-1-582r4-A341-Amendment-2094-40.pdf

      • +
      +
    • +
    • JPEG and AV1 AVIF still image encoding, along with JPEG decoding. Note that still image decoders and encoders are not controlled by xrmd and, as such, load balancing and resource allocation must be done manually, e.g., see -slice.

    • +
    +
  • +
+
+
+

Adaptive Bitrate Scaler

+

For streaming applications, video is distributed in different resolutions and bit rates to adapt to varying network bandwidth conditions. All adaptive bitrate (ABR) transcoding systems require an ABR scaler that downscales an input video stream to several different smaller resolutions that are then re-encoded. These smaller resolutions are referred to as an image pyramid or an ABR ladder.

+

The MA35D ABR scaler is an accelerator capable of generating up to 16 lower resolution output images from a single input image. The ABR scaler supports the following features:

+
    +
  • Supports up to 12 taps in both horizontal and vertical direction per stage

  • +
  • High quality polyphase scaling with 64 phases and up to 12 taps in both horizontal and vertical direction per stage

  • +
  • Supports 8 and 10-bit 4:2:0

  • +
  • Luma and Chroma processed in parallel

  • +
  • Supports resolutions from 128x128 to 3840x2160, in multiples of 4

  • +
  • The scaler is tuned for downscaling and expects non-increasing resolutions in an ABR ladder. Increasing resolutions between outputs is supported but will reduce video quality.

  • +
+
+

Note

+

The MA35D ABR scaler is tuned for downscale ratios of up to 3, e.g., from 2160p to 1080p or 720p. For larger ratios, it is recommended to generate intermediary scales, of ratios below 3.

+

As an example, the following FFmpeg command downscales a HEVC 4k content to 540p, by creating an intermediary step, where input is initially scaled from 4k to 1080p:

+

ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v hevc_ama -i <4K INPUT> -filter_complex "[0:v]scaler_ama=outputs=2:out_res=(1920x1080|full)(960x540|full)[n][f]" -map '[f]' -c:v h264_ama -y -f mp4 <540 OUTPUT> -map '[n]' -f null /dev/null

+
+
+

Decoder Downsampler

+

Along with the above dedicated ABR scaler, MA35D's decoder also offers downsampling capabilities, e.g., see -resize. Given that the latter is part the decoding engine, unlike the ABR scaler, there are no bandwidth penalties associated with this downsampler. As such, it's usage is recommended for high throughput use cases, e.g., transcoding 8x4kp60 to 8x1440p60, in single density mode.

+
+
+
+

2D Pixel Processing

+

MA35D offers a rich collection of accelerated 2D pixel processing. These include:

+
    +
  1. Cropping

  2. +
  3. Padding

  4. +
  5. Box drawing

  6. +
  7. Rotate

  8. +
  9. Color space conversion

  10. +
  11. Chroma subsampling

  12. +
  13. Blend

  14. +
  15. Overlay

  16. +
  17. Tiling

  18. +
+

As an example, see 2D Engine for how to use these filters in FFmpeg. Note that the input resolution, to these filters, must be divisible by 4.

+
+
+

Decoding Capacity

+

Each decoder in a MA35D card, where 4 exist per card, is made out of 2 engines. Cores 0 and 1 delineate one engine; whereas, cores 2 and 3 the other. Each engine is capable of 8 and 10 bit 4x4kp60 aggregated throughput. Both engines support AVC, HEVC and VP9 decoding; however, only cores 1 and 2 support AV1 decoding. It is noted that load balancing between the engines is done in a transparent manner and does not require user intervention.

+

As an example, the following command shows a fully loaded decoder, on device 1, where cores 1 and 2 are decoding 16 AV1 streams, while cores 2 and 3 are decoding 16 AVC streams:

+
for i in `seq 1 16`; do \
+ ffmpeg -nostdin -hide_banner -loglevel fatal -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -re -c:v av1_ama -i av1_1080p60.mp4 -f null /dev/null & \
+ ffmpeg -nostdin -hide_banner -loglevel fatal -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -re -c:v h264_ama -i h264_1080p60.mp4 -f null /dev/null & \
+done
+
+
+

The accompanying mautil examine -d all -r utilization shows:

+
===================================================================================================
+1/4 [01:00.0] : MA35 Device
+---------------------------------------------------------------------------------------------------
+Accelerator Utilization Info [01:00.0]
+---------------------------------------------------------------------------------------------------
+Accelerator                    Average     Core-0     Core-1     Core-2     Core-3
+                                   (%)        (%)        (%)        (%)        (%)
+--------------------------   ---------  ---------  ---------  ---------  ---------
+  Decoder                  :       100        100        100        100        100
+  Scaler                   :         0          0          0         --         --
+  Encoder Type-1           :         0          0          0         --         --
+  Encoder Type-2           :         0          0          0         --         --
+  2D GPU                   :         0          0          0         --         --
+  ML NPU                   :         0          0          0          0          0
+
+
+

To demonstrate the auto load balancing feature, the following command shows decoding of 32 AVC streams:

+
for i in `seq 1 32`; do \
+ ffmpeg -nostdin -hide_banner -loglevel fatal -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -re -c:v h264_ama -i h264_1080p60.mp4 -f null /dev/null & \
+done
+
+
+

The accompanying mautil examine -d all -r utilization shows:

+
===================================================================================================
+1/4 [01:00.0] : MA35 Device
+---------------------------------------------------------------------------------------------------
+Accelerator Utilization Info [01:00.0]
+---------------------------------------------------------------------------------------------------
+Accelerator                    Average     Core-0     Core-1     Core-2     Core-3
+                                   (%)        (%)        (%)        (%)        (%)
+--------------------------   ---------  ---------  ---------  ---------  ---------
+  Decoder                  :       100        100        100        100        100
+  Scaler                   :         0          0          0         --         --
+  Encoder Type-1           :         0          0          0         --         --
+  Encoder Type-2           :         0          0          0         --         --
+  2D GPU                   :         0          0          0         --         --
+  ML NPU                   :         0          0          0          0          0
+
+
+

Note that once again decoding engines, on device 1, are fully utilized; however, this time, all the cores are performing AVC decoding.

+
+
+

Video Quality

+

The MA35D card nominally produces video quality (VQ) that is closely correlated to x264 medium, x265 medium and x265 slow presets, with respect to its accelerated AVC, HEVC and AV1 encoders. Furthermore, in case of AV1 encoders, -type-1 AV1 matches a similar VQ as x265 slow; whereas, -type-2 that of x265 medium. This video quality is highly dependent on video content so actual results may vary.

+
+
+

Machine Learning Engine

+

The ML engine in each device is capable of supporting a wide range of vision and AI related tasks. Each engine has built in hardware accelerated instruction sets, which support tensor processing, hardware tiling, and enhanced vision processing. With 11 TOPs processing throughput, per device, MA35D is capable of performing state of art ML encoding as demonstrated in ROI Encoding and in Machine Learning Content Aware Encoding.

+
+
+

Pixel Format

+

While AMA accelerator engines support various pixel formats; however, Interchange Formats (IFs) are the most suitable ones for in-between engine communication, as they offer the smallest memory footprint and the highest throughput. The following table lists the supported pixel formats, including IF ones:

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Supported Pixel Formats

Engine Name

8-Bit

10-Bit

Notes

Decoder

+
nv12-tile (IF)
+
yuv420p (IF)
+
nv12
+
yuv420p
+
rgbp
+
+
+
packed10 (IF)
+
packed10-tile (IF)
+
p010le
+
yuv420p10le
+
+
+
p010le, i.e., P010_10LE is not supported in Gstreamer.
+
+

Scaler

+
nv12-tile (IF)
+
yuv420p (IF)
+
nv12
+
rgbp
+
+
+
packed10 (IF)
+
packed10-tile (IF)
+
p010le
+
yuv420p10le
+
+
+

+
+

Encoder

+
nv12-tile (IF)
+
yuv420p (IF)
+
+
+
packed10 (IF)
+
p010le-tile (IF)
+
yuv420p10le
+
+
+
JPEG encode does not support 10 bit format
+
+

DMA

+
nv12
+
yuv420p
+
bgr0
+
bgra
+
argb
+
rgbp
+
uyv422
+
+
+
packed10
+
p010le
+
yuv420p10le
+
+
+

+
+

2D Engine

+
nv12-tile (IF)
+
yuv420p (IF)
+
nv12
+
yuv420p
+
bgra
+
rgba
+
argb
+
abgr
+
rgbp
+
uyvy422
+
yuyv422
+
+
+
packed10 (IF)
+
p010le-tile (IF)
+
p010le
+
yuv420p10le
+
+
+
yuv420p10le does not support 90/270 rotation
+
rgbp is supported only at the output
+
422, rgba, and abgr formats are not supported in FFmpeg
+
+
+

, where tiles are 4x4 pixels.

+
+
+

Performance Tables

+

The video processing power of the MA35D cards can be harnessed in many different ways, from running a few high-definition jobs to running many low-resolution ones, with or without scaling. The tables below show how many jobs can be run at real-time speed based on the use case and the number of cards available. All these configurations have been tested and validated by AMD and assume normal operating ranges.

+
+

Note

+
    +
  1. In the following tables, density numbers linearly scale to up to 16 devices.

  2. +
  3. It is assumed that per device, host chassis has set aside 8 hyper-threaded cores with 12GB of RAM.

  4. +
+
+
+

Note

+

To meet the following density numbers for 30 FPS pipelines or VP9 decoding, it is recommended to decrease LA depth incrementally, until target density objectives are met. Refer to Automatic Look Ahead Depth Calculation for valid range of LA depth.

+
+

The following tables present density numbers for typical video renditions. However, it should be noted that encode capability of each engine, 4 per device, is best described as aggregated 4kp60. This, among other things, implies that densities of 4x1080p60 or rate of 1x1080p240 can be achieved. The latter implies that a 1080p60 VOD asset can be encoded at 4 times the speed. Furthermore, speed up rate holds linearly for renditions down to 540p30. To encode two Faster Than Real Time (FTRT) jobs on a single device, each job must be assigned to a dedicated slice. See -slice for details.

+

In tables, below, Single Density refers to any combination of AVC, HEVC or AV1 Type-2 encoders, whereas, Double Density refers to any combination of AVC, HEVC or AV1 Type-2 encoders along with AV1 Type-1 encoder.

+

It is noted that with respect to Transcode with Scale Jobs Tables, below, the output of a decoder can be split and encoded with any combination of AMA encoders. This in turn implies that the expected density numbers can vary from reported Single Density to Double Density, depending on encoder selection, for each output of the scaler.

+

To fully utilize all devices on a card and reach the stated densities, device selection needs to be explicitly done in a command line. See -hwaccel and Using Explicit Device IDs for more details. Refer to Full Double Density for an example on how to deploy double density pipelines.

+
+

Performance Tables for 8-bit Color

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode Jobs per Card (8-bit)

Transcode Use Case

Single Density -preset fast

Single Density -preset [ medium | slow ]

Double Density

4kp75 (See -preset fast)

4

0

0

4kp60

4

4

8

4kp30

8

8

16

1080p60

20

16

32

1080p30

40

32

64

720p60

40

32

64

720p30

84

68

136

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode with Scale Jobs per Card (8-bit)

Transcode with Scale Use Case

Single Density

Double Density

4kp60 to 1440p60

4

8

4kp30 to 1440p30

8

16

1080p60 to 720p60

16

32

1080p30 to 720p30

32

64

720p60 to 540p60

32

64

720p30 to 540p30

68

136

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time ABR Ladders (8-bit)

ABR Ladders Use Case

1 Card

2160p60 to 1440p60, 1080p60, 720p30, 480p30, 360p30, 240p30, 144p30

4

2160p30 to 2160p30, 1440p30, 1080p30, 720p30, 480p30, 360p30, 240p30, 144p30

4

1080p60 to 1080p60, 720p60, 720p30, 480p30, 360p30, 160p30

8

1080p60 to 720p60, 720p30, 480p30, 360p30, 160p30

16

1080p30 to 1080p30, 720p30, 480p30, 240p30

16

720p30 to 720p30, 480p30, 240p30

40

+
+
+

Performance Tables for 10-bit Color

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode Jobs per Card (10-bit)

Transcode Use Case

Single Density -preset fast

Single Density -preset [ medium | slow ]

Double Density

4kp75 (See -preset fast)

4

0

0

4kp60

4

4

8

4kp30

8

8

16

1080p60

20

16

32

1080p30

40

32

64

720p60

40

32

64

720p30

84

68

136

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode with Scale Jobs per Card (10-bit)

Transcode with Scale Use Case

Single Density

Double Density

4kp60 to 1440p60

4

8

4kp30 to 1440p30

8

16

1080p60 to 720p60

16

32

1080p30 to 720p30

32

64

720p60 to 540p60

32

64

720p30 to 540p30

68

136

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time ABR Ladders (10-bit)

ABR Ladders Use Case

1 Card

2160p60 to 1440p60, 1080p60, 720p30, 480p30, 360p30, 240p30, 144p30

4

2160p30 to 2160p30, 1440p30, 1080p30, 720p30, 480p30, 360p30, 240p30, 144p30

4

1080p60 to 1080p60, 720p60, 720p30, 480p30, 360p30, 160p30

8

1080p60 to 720p60, 720p30, 480p30, 360p30, 160p30

16

1080p30 to 1080p30, 720p30, 480p30, 240p30

16

720p30 to 720p30, 480p30, 240p30

40

+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/troubleshooting.html b/latest/troubleshooting.html new file mode 100644 index 00000000..7e9fc429 --- /dev/null +++ b/latest/troubleshooting.html @@ -0,0 +1,399 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) Troubleshooting — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA) Troubleshooting
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA) Troubleshooting

+ +
+

Overview

+

This section describes various troubleshooting methods and workarounds for some known issues such as out of memory errors, low frame-rate, etc.

+
+

No Device Showing in lspci

+

If lspci -d 10ee: does not show any of MA35D devices and dmesg has no indication of such devices being detected, then this could indicate issues with:

+
    +
  1. BIOS

  2. +
  3. PCIe slot

  4. +
+
+
Workaround:

Ensure that your BIOS is up to date and properly configured. See BIOS setting.

+

Switch to a known working PCIe slot, to isolate possible PCIe slot issues.

+
+
+
+
+

Single Device per Card

+

If SDK has access to only a single device on a card, i.e.,:

+
lspci -d 10ee:
+
+
+

returns half the expected devices, then bifurication has not been enabled in the BIOS.

+

Workaround: Check your BIOS and enable 4x4 PCIe bifurcation on each slot with a MA35 card.

+
+
+

Memory Usage

+

Messages such as:

+
    +
  • ERROR: from element xxxxx: Internal data stream error.

  • +
  • ERROR [Channel] Cannot create channel: DeviceAllocate failed

  • +
+

...

+

, indicate memory pressure on the accelerator card.

+

Workaround: Other than the obvious over-subscription use-cases, these issues can be resolved by decrementing the lookahead buffer size.

+
+
+

AV1 Slow Playback

+

An AV1 HLS stream may playback at slower than real time speeds.

+

Workaround: Recommend explicitly setting of FPS playback frame rate when using ffplay or use ffplay from FFmpeg 5.1.2 or 6.0.

+
+
+

AV1 MP4 Playback

+

AV1 muxed into an MP4 container may not play back properly.

+

Workaround: Recommend playback of raw video using more recent versions of ffplay (n5.1.2 or later) or more recent versions of media players such as VLC v3.0.17.4. Alternatively, muxing the raw video into an IVF container format is also permitted.

+
+
+

30 FPS Density

+

30 FPS transcodes and below can not run at full density with default lookahead depth.

+

Workaround: Decrease lookahead depth or density. Required decrease is dependent upon resolution/frame rate. See Performance Tables Section for details.

+
+
+

Gstreamer Variable Frame Rate

+

Variable frame rate files are not supported by the Gstreamer AMA plugins.

+

Workaround: Turn XRM off and add a videorate filter and caps filter before the encoder to set a fixed frame rate.

+
+
+

400 Mbps Max Bit Rate

+

Encoders do not support a target or max bitrate above 400 Mbps.

+

Workaround: This issue can be avoided by constraining the bitrate values below to 400 Mbps.

+
+
+

Many Parallel Encodes

+

Encountering Cannot create channel: DeviceAllocate failed error, when running high number of encoding operations in parallel.

+

Workaround: Reduce the memory requirements by lowering the lookahead depth of the encoding operation. This can be controlled with the -lookahead_depth argument. Default values depend on the FPS and bitdepth of the input source. The following are some starting points:

+
+

30fps: -lookahead_depth 26 (reduce by steps of 2)

+

60fps: -lookahead_depth 46 (reduce by steps of 4)

+
+
+
+

HDR & spatialAqGain

+

Encoding HDR content with a spatialAqGain of 1 or 2 is not supported.

+

Workaround: Using the default values of spatialAqGain is recommended for best video quality when possible. If it is desirable to reduce the spatialAqGain from the recommended range of 60 - 100, using a value of 3 or greater will avoid this issue.

+
+
+

Nonresponsive Devices

+

It is possible that codec services and utilities may become unavailable, due to crashed SDK driver and as such mamgmt reset will not be able to reset any of the available devices.

+

Workaround: Execute the following commands:

+
sudo rmmod ama_transcoder
+sudo modprobe ama_transcoder
+
+
+

If removal and reloading of the driver does not work, then system reboot is required.

+
+
+

Codec Issues in VM

+

If codec operations are hanging in a VM, while the following sudo dmesg -w output log is observed:

+
...
+[  323.436842] ama_transcoder0 0000:05:00.0 hdma: warning:hdma_link_rc2ep_xfer status is done, c:2,status=0x1,condition=0
+[  323.440802] ama_transcoder0 0000:05:00.0 hdma: dir:rc2ep element_cnt=1 channel:2 link_table_pa:0x160000
+[  323.443387] ama_transcoder0 0000:05:00.0 hdma: ctl:0x01 size:0x4 sh:0x2 sl:0x97e00000 dh:0x0 dl:0x20831000
+[  323.445538] ama_transcoder0 0000:05:00.0 hdma: end ctrl:0x06 rsv:0x0 llp_h:0x0 llp_l:0x160000
+[  323.447257] ama_transcoder0 0000:05:00.0 hdma: rc2ep PF c=2 0x500 = 0x1
+...
+
+
+

, with host reporting IO_PAGE_FAULT in its dmesg logs, then this is an indication of a mis-configured VM.

+

Workaround: Ensure that VM has been properly created as per Virtualization.

+
+
+

Cannot Assign a VF to a VM

+

If passing a VF to a VM fails, this could be due to VF not getting its own IOMMU group. To check this, run the following command:

+
for a in /sys/kernel/iommu_groups/*; do find $a -type l; done | sort --version-sort
+
+
+

, and ensure that VF is assign to a unique group. As an example, the following output shows that VF associated with device 0000:02:00.0 , i.e., 0000:02:00.1, has its own unique group 34:

+
...
+/sys/kernel/iommu_groups/34/devices/0000:02:00.1
+...
+
+
+

Workaround: Ensure that ACS has been enabled in the BIOS.

+
+
+

Cannot Flash the Card

+

While attempting to update the firmware with satellite controller version 9.7.35, the following message may appear:

+
...
+Device: 0000:e2:00.0
+**** ERROR Programming BMC-MSP432.bin of type [SC] SC is accessing flash, pls try FW update after sometime.
+...
+
+
+

Workaround: Wait for 10 minutes and try to flash again.

+
+
+

FFmpeg Unsupported Audio Format Conversion

+

FFmpeg may attempt to automatically convert an audio track to an invalid format, based on the specified container type, e.g., from FLAC to AAC 5.1, for MP4 container. This may leave the transcoded stream with an invalid audio track:

+
...
+[aac @ 0x564a3c67f580] Unsupported channel layout "6 channels"
+...
+
+
+

Workaround: Explicitly specify the audio encoder type, e.g., -c:a copy, -c:a ac3, ... .

+
+
+

LED Red Lights On

+

If LED lights are red, this may be an indication of a hardware issue with the card or with the host chassis. Note that while chassis is in its off-state, the red LED lights are expected.

+

Workaround: Switch to a known working PCIe slot, to isolate possible PCIe slot issues. If issue is not due to chassis's PCIe slot, i.e., a known good slot continues to exhibits the same symptoms, contact AMD support for further instructions.

+
+
+

Ubuntu 20.04 Installation

+

If you are not able to install some of the SDK packages, on Ubuntu 20.04, and are seeing a message similar to the following:

+
Err:10 https://packages.xilinx.com/artifactory/debian-packages focal/main amd64 amd-ama-core amd64 1.2.0-2408071645
+403  Forbidden [IP: 3.162.7.75 443]
+
+
+

This is due to a known bug in apt version of Ubuntu 20.04 release.

+

Workaround: Update your apt version using ppa:gpxbv/apt-urlfix PPA, by following the instructions noted below:

+
    +
  1. sudo apt install software-properties-common

  2. +
  3. sudo add-apt-repository ppa:gpxbv/apt-urlfix

  4. +
  5. sudo apt install apt apt-utils

  6. +
  7. Proceed with the SDK installation

  8. +
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/tuning_pipeline_latency.html b/latest/tuning_pipeline_latency.html new file mode 100644 index 00000000..d9df6e47 --- /dev/null +++ b/latest/tuning_pipeline_latency.html @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + Tuning Latency — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tuning Latency
  • +
  • +
  • +
+
+
+
+
+ +
+

Tuning Latency

+ +

Latency tuning allows for trade off among end to end delay, video bit rate, GOP composition, etc. Interactive applications that require low latency, can do so by setting relevant parameters in the video pipeline. It is understood that lowering the latency comes at the cost of increased bit rate, for a given visual quality.

+
+

Decoder Latency

+

Decoding latency can be reduced by enabling the -low_latency option, in FFmpeg.

+
+
+

Encoder Latency

+

AMD AMA Video SDK encoder performs multi-objective optimization with set constraints on bit rate, GOP topology, visual quality measures, etc. As such, it may be tuned to achieve a compromise between latency and quality or be specialized to ultra low latency.

+
+

Guidelines on Encoder Latency Configuration

+

Encoding latency can also be reduced by trading off compression rate or visual quality. The following table lists the encoder options which can used to reduce to that effect.

+ ++++ + + + + + + + + + + + + + +

Encode Options

Notes

Look Ahead Depth

+
For best visual quality, it is recommend to let the buffer depth be determined automatically. If it is found that the selected depth adds unacceptable delay, then this option can be set explicitly. Supported range is 0 - 46+number of B frames.
+
+

Number of B frames

+
It is understood that for every inserted B frame there will be a frame period delay.
+
+
+

See Encoding Compatibility Matrix combination of allowable parameters.

+
+
+

Automatic Look Ahead Depth Calculation

+

The default VQ optimized look ahead buffer depths are:

+
+
    +
  1. 800 ms for 8 bit

  2. +
  3. 600 ms for 10 bit

  4. +
+
+
+
+

Ultra Low Latency (ULL) Mode

+

Ultra Low Latency (ULL) encoding is enabled by setting -lookahead_depth flag to 0.

+

Notes

+
    +
  • In ULL encoding mode, frames are always processed in display order. As such, this mode is not compatible with B frames. Furthermore, only Constant Quantization Parameter (CQP) and Constant Bit Rate (CBR) options are allowed. See -control_rate.

  • +
+
+

Latency Adjustment

+

The overall latency can be further tuned by adjusting the -bufsize parameter. This parameter allows for tuning strict and relaxed ULL modes. Both relaxed ULL and strict ULL modes have the lowest achievable encoding latency, in AMD AMA SDK. Strict ULL has lower transmission latency than relaxed ULL, by restricting frame size variations at the expense of lower VQ. Relaxed ULL has better VQ than strict ULL, by allowing larger frame size variations. Such variations may results in higher transmission latency, depending on network bandwidth.

+
+
+
+
+

FFmpeg Latency Measurements

+

Latency measurements can be obtained by configuring Unified Logging. The following example demonstrates how to measure decoder, encoder and end to end latencies:

+
export LOG_AMA_CONFIG="destination=file, location=log.txt, max_size=1000MB | log_level=WARN | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=1"
+export LOG_AMA_FILTER_PERF="*.*=INFO"
+ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoder0   -re -c:v h264_ama  -low_latency 1 -i h264_1080p30.mp4 -c:v av1_ama -lookahead_depth 0 -f null /dev/null
+
+
+

The log file tracks all timing info for all components of the pipeline. To generate a human readable output, use the parse_logs.py utility. This script will generate an output the looks like the following:

+
============================ INSTANCE INFO START ===============================
+
+DEC ::
+     0. h264_ama@0x564cbc07cc40
+             DECODER { PerfBeg, PerfEnd }
+             DECSDK::DWLReserveCmdBuf { PerfBeg, PerfEnd }
+             DECSDK::rsv_osalsubmit { PerfBeg, PerfEnd }
+             DECSDK::rsv_osalwait { PerfBeg, PerfEnd }
+             DECSDK::DWLDMA_RC2EP { PerfBeg, PerfEnd }
+             DECSDK::DWLEnableCmdBuf { PerfBeg, PerfEnd }
+             ...
+ENC_0.ENCODER latency = 33.431 ms (APPLICATION LEVEL)
+      (PerfBeg@av1_ama@0x560d0c196540-ENCODER --> PerfEnd@av1_ama@0x560d0c196540-ENCODER)
+ENC_0.ENCODER::PutFrame latency = 0.057 ms
+      (PerfBeg@av1_ama@0x560d0c196540-ENCODER::PutFrame --> PerfEnd@av1_ama@0x560d0c196540-ENCODER::PutFrame)
+ENC_0.Encoder::SDK latency = 4.442 ms
+      (PerfBeg@av1_ama@0x560d0c196540-Encoder::SDK --> PerfEnd@av1_ama@0x560d0c196540-Encoder::SDK)
+ENC_0.ENCODER::GetPkt latency = 0.009 ms
+     (PerfBeg@av1_ama@0x560d0c196540-ENCODER::GetPkt --> PerfEnd@av1_ama@0x560d0c196540-ENCODER::GetPkt)
+PostDecode_CH1 latency = 33.458 ms
+     (PerfEnd@h264_ama@0x560d0c194980-DECODER --> PerfEnd@av1_ama@0x560d0c196540-ENCODER)
+
+End2End_CH1 latency = 168.958 ms
+     (PerfBeg@h264_ama@0x560d0c194980-DECODER --> PerfEnd@av1_ama@0x560d0c196540-ENCODER))
+
+
+

The above delineates component based and end to end timing information. In this example, the end to end delay is 168.985 [ms] and the encoder delay of 33.431 [ms].

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/tuning_video_quality.html b/latest/tuning_video_quality.html new file mode 100644 index 00000000..a5487fbc --- /dev/null +++ b/latest/tuning_video_quality.html @@ -0,0 +1,735 @@ + + + + + + + + + + + + + + + Tuning Video Quality — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tuning Video Quality
  • +
  • +
  • +
+
+
+
+
+ +
+

Tuning Video Quality

+ +

The quality of encoded video depends on various factors. It is primarily a function of the target bit rate and the type of video content. However, there are some encoder parameters which can be used to adjust the video quality. This document describes the major parameters impacting video quality, as they specifically pertain to AMA SDK compatible devices. These parameters and the underlying concepts are applicable whether using FFmpeg or the C example programs.

+

Currently, there are 3 significant parameters that effect the visual quality of the video:

+
    +
  1. Metric, which is specified by -tune_metrics

  2. +
  3. Latency, which is specified by -lookahead_depth

  4. +
  5. Preset, which is specified by -preset

  6. +
+

Sections below will describe each of these parameters in detail.

+

Various examples illustrating the effect of these settings can be found here:

+ +
+

Metrics

+

This parameters defines means of scoring the observed video quality, for both subjective and objective measures. To control this parameter, set -tune_metrics to its desired target value. It is important to note that the encode engine has specific optimizations per mode, e.g., while setting the -tune_metrics parameter to 1, will optimize the visual quality, it may not necessarily provide the best PSNR, SSIM or VMAF scores.

+
+
+

Latency

+

Through this parameter one has the ability to control the end to end delay, within a transcode pipeline. See Tuning Latency of Transcode Pipeline for more details. It is understood that typically allowing for more delay in a pipeline, results in a better visual quality, e.g., increasing the depth of the look ahead buffer, results in a higher score, for a given bit rate. This parameter is controlled -lookahead_depth. See FFmpeg Video Quality for example usage. Note that look ahead depth can be reduced to 15 frames with (limited) impact to video quality.

+
+
+

Preset

+

Speed preset determines the amount of time that is spent in encoding the incoming bit stream. This time in turn is determined by the number of encode optimization tools deployed, during the encoding process. Specifically, for this release, motion vector search range, Rate-Distortion Optimized Quantization (RDOQ) and other such tools are used to enhance the visual quality, at the expense of processing time. For example, -preset slow provides about 2% improvement, in terms of BD Rate, for AVC encoding, while decreasing the throughput by 20%. It should be noted that slow preset also increases the ULL mode latency, by 25%. See FFmpeg quality analysis examples for example usage. Note that the specific values noted in these example are the only ones that are recommended for usage.

+
+
+

Content Adaptive Bit Rate (CABR)

+

CABR, -cabr, opportunistically lowers bitrate for easy contents, without causing any noticeable visual quality degradation. Given that the threshold for noticeable visual degradation is around VMAF 90, CABR is set such that it targets the VMAF-90 point. CABR operates by lowering bitrate in sections of the content that exceed the VMAF-90 point. vq_offset allows for fine tuning CABR. Specifically, a positive value will decrease the encoded bit rate, but will also lower the maximum VQ. Similarly, a negative value will increase the encoded bit rate, but will increase the maximum VQ. CABR modifier is applicable to all rate control, metrics, and preset modes.

+
+
+

GOP Composition

+

By default, the GOP structure of all AMD AMA encoders is configured to ensure optimal VQ. This implies that GOP topologies among different encoders may not be the same or the GOP itself may not have a homogeneous structure. As an example, while both AVC and HEVC encoders use hierarchical B frames, to further enhance AVC's VQ measure, unidirectional B frames that only reference prior anchor frames are also used. See -no_bll for how to turn this option off.

+
+
+

ROI

+

AMA SDK allows for further enhancement, in subjective VQ, by utilizing ML driven encoding. This is achieved by encoding regions with high probability of face and text classes, with lower QP values. Such improvements are most visible, when encoding high resolution video streams with low bit rates. As such, video conferencing applications, where faces do not occupy the majority of the frame area and are larger than 5x5 pixels, are most amenable to ROI based encoding. ROI model sensitivity, i.e., its probability mapping to QP gain, can be tuned by strength parameter. It should be noted, as with all subjective improvements, the resulting objective measures, e.g., SSIM, VMAF, etc. may not reflect such improvements. See Video Machine Learing and examples therein for sample usage.

+
+
+

AV1 Type Selection

+

AMD AMA Video SDK offers 2 flavors of AV1 encoding: the default type 1 and type 2. For most use-cases, it is recommended to stay with the default value, as it not only provides better visual quality, but also provides per frame objective stats. However, given that these 2 encoders employ 2 independent pipelines if the primary concern is to increase the number of encoded streams, then addition of type 2 AV1 will increase the channel density.

+
+
+

Dynamic Encoder Parameters

+

Dynamic parameters are parameters which can be changed during runtime. This is useful to optimize video quality and compression rate for different segments of the video. This capability is supported for FFmpeg and GStreamer.

+

The following encoder parameters can be dynamically modified:

+
    +
  • Number of B frames (0 to 4)

  • +
  • Min/Max bitrate (0 to INT_MAX)

  • +
  • Bitrate (0 to INT_MAX) (Should be in Min-Max bit rates range)

  • +
  • Temporal AQ mode (0 to 1)

  • +
  • Temporal AQ gain (0 to 255)

  • +
  • Spatial AQ mode (0 to 1)

  • +
  • Spatial AQ gain (0 to 255)

  • +
  • Min/Max QP (See QP Ranges)

  • +
  • QP (See QP Ranges) (Should be in Min and Max QP range)

  • +
  • QP I frame offset (See QP Ranges) (Should be in Min and Max QP range)

  • +
  • QP B frame offset (See QP Ranges) (Should be in Min and Max QP range)

  • +
+
+

Note

+

AVC and HEVC QP ranges are 0-51

+

AV1 QP range is 0-255

+
+

When using FFmpeg or GStreamer, the encoder parameters which should be changed are specified in a configuration file as key-value pairs. This means that these key-value pairs must be known ahead of time.

+

Dynamic Parameters Considerations

+
    +
  • Recommended settings for dynamic B frames are:

    +
      +
    • 0 for gaming clips with fast motion, camera pan/rotation scenes

    • +
    • 2 for static or slow moving scenes, talking heads, or video conferencing type of content

    • +
    • 1 for all medium motion and all other content

    • +
    +
  • +
  • B frames changes do not happen at the exact frame number specified. Instead, the change comes into effect one or two frames from the actual frame number specified in the config file.

  • +
  • The maximum value for the number of B frames is the value configured at initilization

  • +
  • The configuration files for dynamic parameters must comply with the format specified above. Ill-formed files may result in unexpected behavior.

  • +
+

The following table shows supported combinations of rate control modes and dynamic parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Valid Rate Control Modes and Dynamic Parameters Combinations

Parameter

CQP

CBR

VBR

CVBR

CRF

CABR

Temporal AQ Mode

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

Temporal AQ Gain

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

Spatial AQ Mode

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

Spatial AQ Gain

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

Bit Rate

+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

Min Bit Rate

+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+

Max Bit Rate

+
Y
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

Number of B Frames

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

Min QP

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

Max QP

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

QP

+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+

QP I Offset

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

QP B Offset

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+

FFmpeg

+

Encoder parameters which should be changed dynamically are specified as key-value pairs in a configuration file. This configuration file is provided to FFmpeg using the -dynamic_params_file encoder option.

+

The -dynamic_params_file option is specific to an encoded output. For use cases with multiple encoded outputs (such as ABR ladders), each output can have its own -dynamic_params_file option and associated configuration file.

+

The configuration file should contain one line for each frame where one or more parameters are changed. Each line should start with the frame number followed by a list of key-value pairs for all the modified parameters:

+
<frameNumberN1>:<key1>=<value1>
+<frameNumberN2>:<key2>=<value2>,<key3>=<value3>
+
+
+

Below is a table listing the parameters which can be changed at runtime, the corresponding key and valid values.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Dynamic Parameter

Key

Valid Values

Number of B frames

NumB=<int>

0 to 4

Min/Max bit rate

MinBRkbps=<int>

0 to INT_MAX

Max bit rate

MaxBRkbps=<int>

0 to INT_MAX

Bitrate (in bits per second)

BRkbps=<int>

0 to INT_MAX

Temporal AQ mode

tAQ=<int>

0 to 1

Temporal AQ gain

tAQGain=<int>

0 to 255

Spatial AQ mode

sAQ=<int>

0 to 1

Spatial AQ gain

sAQGain=<int>

0 to 255

Min/Max QP

MinQP=<int>,MaxQP=<int>

See QP Ranges

QP

QP=<int>

See QP Ranges

QP I frame offset

QPOffsetI

See QP Ranges

QP B frame offset

QPOffsetB

See QP Ranges

+

Sample FFmpeg encode command:

+
ffmpeg -hwaccel ama -re -f lavfi -i testsrc=duration=60:size=1920x1080:rate=60,format=yuv420p -f rawvideo  -vf "hwupload" -c:v hevc_ama -b:v 5M  -dynamic_params_file ./param.txt -y -f rawvideo  output.h265
+
+
+

Sample configuration file for dynamic parameters:

+
300:NumB=1
+600:BRkbps=6000
+1200:sAQ=1,sAQGain=50
+1800:tAQ=1,tAQGain=50
+2400:NumB=0,BRkbps=10000,sAQ=0,sAQGain=50,tAQ=0
+5000:MinQP=30,MaxQP=35
+
+
+

GStreamer

+

Gstreamer uses the same formated configuration file as FFmpeg:

+
gst-launch-1.0 fakesrc sizetype=fixed sizemax=4147200 num-buffers=4000 ! capsfilter caps='video/x-raw' ! rawvideoparse width=1920 height=1080 format=i420 framerate=60/1 ! ama_upload ! ama_h265enc encoding-params-file=./param1.txt ! fakesink
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/unified_logging.html b/latest/unified_logging.html new file mode 100644 index 00000000..d04b1b7b --- /dev/null +++ b/latest/unified_logging.html @@ -0,0 +1,419 @@ + + + + + + + + + + + + + + + Unified Logging — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Unified Logging
  • +
  • +
  • +
+
+
+
+
+ +
+

Unified Logging

+ +

Unified Logging (UL) utility is aimed at providing an identical logging output, configuration and interaction for different video frameworks provided by AMD AMA Video SDK. Three environmental variables LOG_AMA_CONFIG, LOG_AMA_FILTER and LOG_AMA_FILTER_PERF control interactions with UL. LOG_AMA_CONFIG variable controls the global setting of logging, which includes log destination, max size, log source info, and log levels. LOG_AMA_FILTER variable filters the global configuration and narrows down the logging output to specific software layer, accelerator type or level. LOG_AMA_FILTER_PERF variable controls the flow of performance related logs. The following sections describe the configuration parameters of each variable.

+
+

LOG_AMA_CONFIG

+

LOG_AMA_CONFIG is utilized as follows:

+
export LOG_AMA_CONFIG="[key=value | ...]"
+
+
+

, where key and value are defined as:

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key

value

Description

destination

console, file, syslog, release_preset or debug_preset

Determines the target destination of output logs.

+

console: Terminal output

+

file: Defaults to "async=1, max_size=10MB, location=log_ama_<pid>_<timestamp>.txt"

+

syslog: Defaults to "async=1, location=localhost, facility=LOCAL0"

+

release_preset: Shortcut for "destination=syslog, async=1 | log_level = WARN| perf_log=0 | debug_file_name=0 | debug_thread = 0 | debug_pid=0 | debug_time_stamp=0"

+

debug_preset: Shortcut for "destination=file, max_size=1GB | log_level = DEBUG | async=1 | perf_log=1 | debug_file_name=1 | debug_thread = 1 | debug_pid=1 | debug_time_stamp=1"

+

async refers to asynchronous mode of write operation

+

location refers to output path of logs

+

log_level

FATAL, ERROR, WARN, INFO, DEBUG, TRACE or ALL

Determines the log level.

+

Defaults to WARN

+

perf_log

0 or 1

Enables or disables performance measurements. If enabled, minimal information log level is set. Otherwise, log level is set by log_level.

+

Defaults to 0

+

debug_file_name

0 or 1

Enables or disables addition of log file names.

+

Defaults to 0

+

debug_file_line

0 or 1

Enables or disables inclusion of log line numbers.

+

Defaults to 0

+

debug_time_stamp

0 or 1

Enables or disables addition of timestamps.

+

Defaults to 0

+

debug_pid

0 or 1

Enables or disables reporting of process id.

+

Defaults to 0

+

debug_thread

0 or 1

Enables or disables reporting of thread id.

+

Defaults to 0

+
+
+
+

LOG_AMA_FILTER

+

LOG_AMA_FILTER is utilized as follows:

+
export LOG_AMA_FILTER="[LAYER.ACCEL=log_level | ...]"
+
+
+

, where LAYER and ACCEL are defined as:

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LAYER

Description

SDK

Any user space library

VPI

Video processing plugins

XMA

XMA library

FFMPEG

FFmpeg plugins

GST

Gstreamer plugins

GEN

General and common layers

XRM

XRM library

+ ++++ + + + + + + + + + + + + + + + + + + + +

ACCEL

Description

ABR

ABR ladder

DEC

Decoder

ENC

Encoder

GEN

General hardware logs

+
+
+

LOG_AMA_FILTER_PERF

+

LOG_AMA_FILTER_PERF is utilized as follows:

+
export LOG_AMA_FILTER_PERF="[LAYER.ACCEL=log_level | ...]"
+
+
+

, where LAYER and ACCEL are defined as above.

+
+
+

Examples

+
    +
  1. Send output to log_ama_<pid>_<timestamp>.txt file, and set log_level to warning:

    +
    export LOG_AMA_CONFIG="destination=file | log_level=WARN | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  2. +
  3. Send output to /tmp/log_ama.txt file, and set log_level to info:

    +
    export LOG_AMA_CONFIG="destination=file, location=/tmp/log_ama.txt | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  4. +
  5. Send output to /tmp/log_ama.txt file, and set log_level to info, with max log file size equal to 100MB:

    +
    export LOG_AMA_CONFIG="destination=file, max_size=100MB, location=/tmp/log_ama.txt | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  6. +
  7. Get output on console, with log_level set to info:

    +
    export LOG_AMA_CONFIG="destination=console | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  8. +
  9. Assume log_level was WARN in LOG_AMA_CONFIG, the following filter will additionally enable TRACE log level of VPI layer for ABR plugins:

    +
    export LOG_AMA_FILTER=" VPI.ABR=TRACE"
    +
    +
    +
  10. +
  11. If we want all layers logs for ABR:

    +
    export LOG_AMA_FILTER=" *.ABR=TRACE"
    +
    +
    +
  12. +
  13. If we want all layers logs for ABR & ENC:

    +
    export LOG_AMA_FILTER=" *.ABR=TRACE | *.ENC=TRACE"
    +
    +
    +
  14. +
  15. Force all logs to ERROR, and generate debug logs from SDK for ABR type:

    +
    export LOG_AMA_FILTER=" *.*=ERROR | *.ABR=DEBUG"
    +
    +
    +
  16. +
  17. Set performance logs to info level:

    +
    export LOG_AMA_CONFIG="destination=file, location=log_ama_perf.txt | log_level=WARN | perf_log=1"
    +
    +
    +
  18. +
  19. Set performance log level to DEBUG for ABR at SDK layer:

    +
    export LOG_AMA_FILTER_PERF="SDK.ABR=DEBUG"
    +
    +
    +
  20. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/using_ffmpeg.html b/latest/using_ffmpeg.html new file mode 100644 index 00000000..c87aa764 --- /dev/null +++ b/latest/using_ffmpeg.html @@ -0,0 +1,1689 @@ + + + + + + + + + + + + + + + Using FFmpeg — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Using FFmpeg
  • +
  • +
  • +
+
+
+
+
+ +
+

Using FFmpeg

+

This page documents how to use FFmpeg with the AMD AMA Video SDK.

+ +
+

+
+
+

Introduction

+

FFmpeg is an industry standard, open source, widely used utility for handling video. FFmpeg has many capabilities, including encoding and decoding of all video compression formats, encoding and decoding of audio, encapsulating, and extracting audio, and video from transport streams, and many more. The AMD AMA Video SDK includes an enhanced version of FFmpeg, version n4.4, which communicates with the hardware accelerated transcode pipeline.

+

It is not within the scope of this document to provide an exhaustive guide on the usage of FFmpeg. Various resources can be found online, for example:

+ +

The following sections describe the options used with FFmpeg to configure the various hardware accelerators available on an MA35 device.

+
+

+
+
+

Example Commands

+

To obtain the FFmpeg version used in this SDK, issue the following command:

+
ffmpeg -version
+
+
+

A simple FFmpeg command for accelerated transcoding with the AMD AMA Video SDK will look like the following:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i infile.mp4 -c:v hevc_ama -b:v 1000K -r 60 -f mp4 -y transcoded.mp4
+
+
+

There are many other ways in which FFmpeg can be used to leverage the video transcoding features of an MA35 device. Examples illustrating how to run FFmpeg for encoding, decoding, and transcoding with or without ABR scaling, video composition and ML are included in FFmpeg tutorials.

+

To

+
+
+

General FFmpeg Options

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
General FFmpeg Options

Options

Descriptions

+
+-i
+
+ +
+
Input video URI.
+
+
+
+-c:v
+
+ +
+
Specify video or image codec
+
This option must be set for any input processed on an MA35 device.
+
Valid video decode values are vp9_ama, h264_ama, hevc_ama, and av1_ama for VP9, H.264, HEVC, and AV1, respectively.
+
Valid video encode values are h264_ama, hevc_ama, and av1_ama for H.264, HEVC, and AV1, respectively.
+
Valid image decode value is jpeg_ama for JPEG images.
+
Valid image encode values are jpeg_ama, ljpeg_ama, and av1_ama for JPEG, lossless JPEG and AV1 images. See Image Encoding Options for details.
+
+
+
+-s
+
+ +
+
The frame size (WidthxHeight). For example 1920x1080 or 3840x2160.
+
+
+
+-f
+
+ +
+
The container format.
+
+
+
+-r
+
+ +
+
The frame rate in fps (Hz).
+
+
+
+-filter_complex
+
+ +
+
Used for frame filtering operation.
+
+
+
+-hwaccel
+
+ +
+
Global option used to specify on which MA35 device the FFmpeg job should run. Consult Using Explicit Device IDs for more details on how to use this option. Valid values are positive integers in [0..N-1] range. Default is device 0.
+
+
+
+-vf
+
+ +
+
Used for simple filtering operations, e.g., hwdownload and hwupload, for DMA transfer of data to and from the host, respectively. Note that transaction directions are with respect to the host.
+
+
+
+

Note

+

Detailed help for encoder, decoder and scaler is obtained through FFmpeg extended help, e.g. ffmpeg -h encoder=h264_ama, ffmpeg -h decoder=hevc_ama or ffmpeg -h filter=scaler_ama.

+
+
+

Note

+

Using -stream_loop option along with jpeg_ama, results in the following benign error message:

+
[ERROR] AMA.VPI.DEC.jpeg_ama@0x5555b71aa980:{492302} Can't find valid pts info
+
+
+
+

The following conventions are used in the following tables:

+
    +
  1. When parameters can be specified as both numerical and string values, they are noted as:

    +
    (<number>) <string>
    +
    +
    +

    Conversely, when this is not the case, options are noted with Roman numerals as:

    +
    <Roman numeral>) <option>
    +
    +
    +
  2. +
  3. auto or -1 note that values are selected by the SDK to optimally meet the specified constraints.

  4. +
+
+

+
+
+
+
+

Video Decoding

+

For the complete list of features and capabilities of the AMD AMA Video SDK decoder, refer to Release Notes chapter of the documentation.

+

The table below describes all the options for the AMD AMA Video SDK decoder.

+ + ++++ + + + + + + + + + + + + + + + + +
Video Decoding Options

Options

Descriptions

+
+-resize
+
+ +
+
Decoder down scaler
+
Valid global values are of the for WidthxHeight.
+
Note that this parameter must be specified before the intended input.
+
+
+
+-out_fmt
+
+ +
+
Decoder output pixel format
+
Valid global values for pixel format: nv12, p010le, packed10, rgbp, yuv420p, and yuv420p10le.
+
Note that an identical pixel format must be specified as value to format option, within -vf. See Decode Only for an example.
+
+
+
+-low_latency
+
+ +
+
Enable/Disable single frame level decode
+
When enabled, the decoding latency of streams not containing any B frames is reduced. This option has no impact on streams that include B frames.
+
Valid values: 0 or 1. (default is 0)
+
+
(0) disable - default
+
(1) enable
+
+
+
+
+

+
+
+
+

Video Encoding

+

For the complete list of features and capabilities of the AMD AMA Video SDK encoder, refer to Release Notes chapter of the documentation.

+

The table below describes all the options for the AMD AMA Video SDK encoder.

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Video Encoding Options

Options

Descriptions

+
+-b:v
+
+ +
+
Specify the video bitrate
+
You can specify this in Mb or Kb. For example -b:v 1M or -b:v 1000K.
+
+
+
+-max_bitrate
+
+ +
+
Maximum bitrate
+
Valid values: 0 to 3.5e+10
+
You may want to use this to limit encoding bitrate if you have not specified a -b:v bitrate
+
Default value -1 implies unspecified.
+
+
+
+-g
+
+ +
+
GOP size
+
Valid values: 0 to UINT32_MAX
+
Default value is -1, implying 2[s] gop duration, i.e., twice the frame rate
+
+
+
+-level
+
+ +
+
Encoding level restriction
+
Valid values for H.264: 1, 1.1, 1.2, 1.3, 2, 2.1, 2.2, 3, 3.1, 3.2, 4, 4.1, 4.2, 5, 5.1, 5.2 6, 6.1, 6.2
+
Valid values for HEVC: 1, 2, 2.1, 3, 3.1, 4, 4.1, 5, 5.1,5.2, 6, 6.1, 6.2
+
Valid values for AV1: 2, 2.1, 3, 4, 4.1, 5, 5.1, 5.2, 5.3 6, 6.1, 6.2, 6.3
+
Default value is auto.
+
+
+
+-profile
+
+ +
+
Set the encoding profile
+
Valid values for H.264: baseline, main, high
+
Valid values for HEVC: main, main-intra, main-10 and main-10-intra
+
Valid values for AV1: main
+
Default value is auto.
+
+
+
+-tier
+
+ +
+
Set the encoding tier (AV1 and HEVC only)
+
Valid values: -1, 0, 1
+
+
(-1) auto
+
(0) main
+
(1) high
+
+
Default value is auto
+
+
+
+-bufsize
+
+ +
+
Rate control (VBV) buffer size
+
Valid values: -1, 400M [bits] (default is -1)
+
+
(-1) For auto selection
+
+
This option is ignored unless:
+
+
1) lookahead_depth is 0 (ULL)
+
2) control_rate is CBR
+
3) Encoder is set to one of h264_ama, hevc_ama or av1_ama Type 2
+
+
Value 0 implies strict ULL, whereas, larger values imply relaxed ULL. See Latency Adjustment.
+
+
+
+-crf
+
+ +
+
Constant Rate Factor
+
Valid values: -1 to 63
+
+
(-1) disable
+
+
This option uses -qp for its quality assignment.
+
Note that this option ignores all other options that may impose restrictions on qp values. These include -min_qp, -max_qp, -b:v, and -control_mode.
+
+
+
+-qp
+
+ +
+
Quantization Parameter
+
Valid values for H.264 and HEVC 0-51
+
Valid values for AV1 0-255
+
Default value -1 implies not used. Note that if this option is used, it implies Constant QP for -control_rate option.
+
+
+
+-bf
+
+ +
+
Number of B frames
+
Valid values for H.264, HEVC and type-2 AV1: 0-3
+
Valid values for type-1 AV1: 0-7
+
Default auto selection value is -1.
+
+
+
+-lookahead_depth
+
+ +
+
Number of frames to lookahead for qp maps
+
Valid values: -1 to 47+Maximum number of B frames -bf
+
Lookahead depth of 0 implies ULL mode
+
Default auto selection value, based on frame rate, is -1.
+
+
+
+-spatial_aq
+
+ +
+
Enable spatial AQ
+
Valid values: auto, disable or enable
+
+
(-1) auto
+
(0) disable
+
(1) enable
+
+
Default value is auto.
+
When qp_mode is uniform, this parameter is ignored and treated as disable.
+
+
+
+-spatial_aq_gain
+
+ +
+
Scale for spatial AQ gain
+
Valid values: 0 to 255
+
+
(255) For auto selection
+
+
Default value for H264, HEVC and AV1 is 64
+
Default value for type-1 AV1 is 72
+
+
+
+-temporal_aq
+
+ +
+
Enable temporal AQ
+
Valid values: auto, disable or enable
+
+
(-1) auto
+
(0) disable
+
(1) enable
+
+
Default value is auto.
+
+
When qp_mode is uniform, this parameter is ignored and treated as disable.
+
+
+
+
+-temporal_aq_gain
+
+ +
+
Scale for temporal AQ gain
+
Valid values: 0 to 255
+
+
(255) For auto selection
+
+
Default value for H264, HEVC and AV1 is 80
+
Default value for type-1 AV1 is 0
+
+
+
+-qp_mode
+
+ +
+
QP control mode
+
Valid values: auto, relative_load and uniform.
+
+
(0) auto for best VQ
+
(1) relative_load implying both spatial and temporal AQ
+
(2) uniform meaning no AQ
+
+
Default value is auto.
+
+
+
+-control_rate
+
+ +
+
Set the rate control mode
+
Valid values: -1 to 4
+
+
(-1) auto
+
(0) const_qp for Constant QP
+
(1) cbr for Constant Bitrate
+
(2) vbr for Variable Bitrate
+
(3) cvbr for Capped Variable Bitrate
+
See RC Mode Table for details.
+
+
Default value is auto.
+
+
+
+-cabr
+
+ +
+
CABR parameters
+
Valid values:
+
+
i) enable
+
ii) disbale
+
iii) auto - The same as disable
+
iv) vq_offset =x, where x is in -63 - 63 range. If not specified, vq_offset =0.
+
+
See CABR for details.
+
+
+
+-min_qp
+
+ +
+
Minimum QP value allowed for rate control
+
Valid values for H264 and HEVC: 0 to 51
+
Valid values for AV1: 0 to 255
+
Default auto selection value is -1.
+
This option has no effect when -control_rate is set to Constant QP (0).
+
+
+
+-max_qp
+
+ +
+
Maximum QP value allowed for rate control
+
Valid values for H264 and HEVC: 0 to 51
+
Valid values for AV1: 0 to 255
+
Default auto selection value is -1.
+
+
+
+-qp_i_offset
+
+ +
+
QP Offset for I Frames
+
Valid values: -51 to 51
+
Auto selection mode is -1.
+
Default 0.
+
+
+
+-qp_b_offset
+
+ +
+
QP Offset for B or P Frames
+
Valid values: -51 to 51
+
Auto selection mode is -1.
+
Default 0.
+
This option has no effect when -control_rate is set to Constant QP (0).
+
+
+
+-forced_idr
+
+ +
+
Force insertion of IDR frames
+
Valid values: 0, 1 (default is 1)
+
+
(0) disable
+
(1) enable - default
+
+
Encodes all the intra frames as IDR
+
+
+
+-slice
+
+ +
+
Select a slice to run an encode job
+
Valid values if xrmd is not used are: 0, 1 (default is 0). If xrmd is active and this option is not set, xrmd will make the slice selection.
+
+
+
+-tune_metrics
+
+ +
+
Enable tuning video quality for the best objective metrics
+
This option optimizes the encoder for the selected tuning metric. See Tuning Video Quality for details.
+
Valid values: 1 to 4 (default is 1)
+
+
(1) vq - default
+
(2) psnr
+
(3) ssim
+
(4) vmaf
+
+
+
+
+-type
+
+ +
+
Applicable to AV1 encoders only
+
Valid values: 1 or 2.
+
+
i) 1 - default
+
ii) 2
+
+
Default value is 1.
+
Consult the AV1 Selection section for more details on how to use this option.
+
+
+
+-preset
+
+ +
+
Encoder VQ-Density preset
+
Valid values: fast, medium or slow. (default is medium)
+
+
(fast) Allows for increase in total throughput from 4kp60 to 4kp75 , when 2 or more channels are used. Does not apply to AV1 -type 1 encoding. Not applicable under ULL setting. Note lower VQ than medium preset is to be expected.
+
(medium) Full density with medium VQ - default
+
(slow) High VQ at lower density. Applicable to 10 bit contents only.
+
+
Consult the Tuning Video Quality section for more details on how to use this option.
+
+
+
+-dynamic_gop
+
+ +
+
Enable dynamic GOP
+
Valid values: -1, 0 or 1.
+
+
(-1) auto
+
(0) disabled
+
(1) enable
+
+
Default value is auto.
+
+
+
+-dynamic_params_file
+
+ +
+
Dynamic configuration file
+
Path to dynamic file location (default is empty)
+
Consult the Dynamic Encoder Parameters section for more details on how to use this option.
+
+
+
+-cores
+
+ +
+
AV1 Type 1 Cores
+
Valid values: 1 or 2
+
+
i) 1 - default, with minimum resolution of 176x144 or 144x176, and aggregate rate of 4kp60
+
ii) 2 - minimum resolution of 720x720, with with aggregate rate of 4kp120
+
+
+
+
+-latency_ms
+
+ +
+
Look ahead depth in milliseconds
+
Valid values: 0 to 60000
+
Default auto selection value, based on frame rate, is -1.
+
+
+
+-no_bll
+
+ +
+
Disable low latency B frames
+
Valid value: 1
+
Value 1 ensures that the generated GOP has a homogeneous structure. See GOP Composition.
+
+
+

The following table describes relevant parameters that are applicable to each RC mode

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + +
RC Mode Options

RC Mode

Allowed Options

const_qp

+
Constant QP
+
+
-qp <QP>
+
+
+

cbr

+
Constant Bit Rate
+
+
-b:v <Bit Rate> (ABR mode)
+
-b:v <Bit Rate> -max_bitrate <Bit Rate> (CBR mode)
+
-b:v <Bit Rate> -bufsize 0 ULL mode
+
+
+

vbr

+
Variable Bit Rate
+
+
-b:v <Bit Rate>
+
+
+

cvbr

+
Constrained Variable Bit Rate
+
+
-b:v <Bit Rate> [-min_qp <QP> | -max_qp <QP> | -max_bitrate <max_bitrate>]
+
+
+

crf

+
Constant Rate Factor
+
+
-crf <Value>
+
+
+
+

The table below describes all the options for the AMD AMA Video SDK encoder that are applicable to images only.

+ + ++++ + + + + + + + + + + + + + + + + +
Image Encoding Options

Options

Descriptions

-slice

+
See -slice
+
+
+
+-quality
+
+ +
+
Specify JPEG encoding quality
+
Valid values: 1 to 100. Larger values indicate higher quality.
+
Default 80.
+
+
+
+still-picture
+
+ +
+
Specify AV1image format AV1IF
+
Valid value: 1
+
+
+
+

+
+
+
+

2D Engines

+

This section describes different hardware accelerated 2D processing engines that are available in AMA SDK. These processing engines are leveraged in FFmpeg by using the FFmpeg filter graph syntax.

+

In the following table, it is assumed:

+
    +
  1. 0,0 coordinates refer to top-left.

  2. +
  3. Each engine can execute on either of core 0 or 1, within each device, which is specified through core_id [0|1] option, where default is 0.

  4. +
  5. Where applicable, output video rendition resolution can be specified by w and h parameters, which are in 0 to 7680 range. Exceptions are scaler_ama, where w and h are not applicable, and drawbox_ama, where w and h are as noted below.

  6. +
  7. [Video 1] ... [Video N] sequence refers to each one of the N video inputs, e.g., [0:v].

  8. +
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
2D Accelerator Engines

Engine Name

Description

Options

+
+scaler_ama
+
+ +
+
ABR multiscaler
+
Takes one input and generates up to 16 output streams.
+
+
+
outputs specifies the number of scaler outputs.
+
Valid values are integers between 1 and desired number of outputs.
+
out_res specifies ABR ladder rungs <1>*<16>(WxH|Rate|Format).
+
List of up to 16 tuples of form (Resolution|Rate|Pixel Format). Note that no spaces are allowed before or after |.
+
Valid values for resolution: 176x144 to 3840x2160 - default 1920x1080
+
Valid values for frame rate: half and full - default full, where full refers to the incoming frame rate and half to the half of the incoming frame rate. Note that the first entry in this option must be full rate.
+
Valid global values for pixel format: nv12, p010le, packed10, rgbp, yuv420p, and yuv420p10le
+
This plugin can be combined with other plugins, without any degradation in pixel throughput.
+
+
+
+crop_ama
+
+ +
+
Video crop
+
Takes size, coordinates and rendition resolution.
+
+
+
b_left sets the crop box x min co-ordinates (from 0 to INT_MAX) (default 0)
+
b_top sets the crop box y min co-ordinates (from 0 to INT_MAX) (default 0)
+
b_w sets the crop box width (from 10 to INT_MAX) (default 10)
+
b_h sets the crop box height (from 10 to INT_MAX) (default 10)
+
+
+
+pad_ama
+
+ +
+
Video pad
+
Takes size, coordinates, rendition resolution and pad color.
+
+
+
p_left sets the pad box x min co-ordinates (from 0 to INT_MAX) (default 0)
+
p_top sets the pad box y min co-ordinates (from 0 to INT_MAX) (default 0)
+
p_w sets the pad box width (from 10 to INT_MAX) (default 10)
+
p_h sets the pad box height (from 10 to INT_MAX) (default 10)
+
color sets the color of the box (default "black")
+
+
+
+drawbox_ama
+
+ +
+
Draw box
+
Takes size, coordinates, line thickness and color.
+
+
+
color sets the color of the box (default "black")
+
thickness sets box thickness (from 2 to 16) (default 2)
+
x sets box x min co-ordinates (from 0 to INT_MAX) (default 0)
+
y sets box y min co-ordinates (from 0 to INT_MAX) (default 0)
+
w sets box width (from 0 to INT_MAX) (default 10)
+
h sets box height (from 0 to INT_MAX) (default 10)
+
+
+
+rotate_ama
+
+ +
+
Rotate frame
+
Takes angle, and rendition resolution.
+
+
+
angle one of 0, 90, 180 or 270
+
+
+
+colorspace_ama
+
+ +
+
Color space conversion
+
Converts between RGB and YUV.
+
+
+
csc
+
+
i) rgb2yuv converts from rgb input to yuv420p
+
ii) yuv2rgb converts from yuv420p input to rgb
+
+
+
+
+subsample_ama
+
+ +
+
Chroma subsampling
+
Converts from 422 to 420
+
+
+

+
+
+
+overlay_ama
+
+ +
+
Video overlay
+
Overlays 1 picture over another
+
Inputs are specified as [Background][Overlay]overlay_ama
+
+
+
shortest forces termination when the shortest input terminates (default false)
+
x overlay's x_position (from 0 to INT_MAX) (default 0)
+
y overlay's y_position (from 0 to INT_MAX) (default 0)
+
out_fmt sets the YUV output format [optional] (default ""). See -out_fmt.
+
src_alpha sets src alpha value (from 0 to 1) (default 1)
+
dst_alpha sets dst alpha value (from 0 to 1) (default 1)
+
+
+
+tile_ama
+
+ +
+
Video tile
+
Maps input streams to specified layout
+
Inputs are specified as [Video 1]...[Video N]tile_ama, in raster order.
+
+
+
inputs sets number of inputs (from 1 to 32) (default 2)
+
shortest forces termination when the shortest input terminates (default false)
+
layout sets grid size [Max 32 inputs] (default "2x2")
+
+
+
+compositor_ama
+
+ +
+
Video compositions
+
Composites inputs together
+
The compositor supports up to 64 inputs. Each input will be "blit" in a user defined z order on top of a solid background color with specified output width and height.
+
The compositor supports dynamic changes to any of the input properties, as well as allowing inputs to be enabled/disabled.
+
The dynamic behavior has been implemented in FFmpeg using the sendcmd option which allows passing in a file that can script the dynamic behavior.
+
For asynchronous property changes, commands can also be send through a message queue. See Composition for usage sample.
+
+
+
inputs_enabled sets the inputs to enable / disable (mask) (from 0 to 1.84467e+19) (default 4895412794951729152)
+
inputs sets number of inputs (from 1 to 64) (default 1)
+
input_params sets input parameter initial values. Example: input_params=(res=1920x1080|ypos=1080|alpha=0.8)
+
input sets current input to which parameters apply.
+
in_x input's x position
+
in_y input's y position
+
out_res dsestination's resolution (such as 1920x1080)
+
out_x destination's x position
+
out_y destination's y position
+
alpha Alpha blend value
+
zorder zorder of the input
+
angle one of 0, 90, 180, 270
+
flip flip the input. Values: v, h (vertical, horizonal)
+
border_color the color of the border in A8R8G8B8 format
+
border_inner_size the inside border thickness in pixels
+
border_outer_size the outside border thickness in pixels
+
eof_action the action to take when an input encounters EOF (from 0 to 2) (default repeat)
+
+
(0) disable disables inputs that reach EOF. End once all input have reached EOF
+
(1) repeat repeats the last frame of the input that reaches EOF
+
(2) endall ends the output stream once the first input reaches EOF
+
+
out_res sets the output resolution
+
format color space conversion
+
+
i) rgb RGB format
+
ii) 420 YUV 420 format
+
iii) 420-tile YUV 420 tiled format
+
+
enable_background enables / disables the background (default false)
+
background sets the background color (default "black")
+
+
+
+

Note

+

For plugins that accept multiple video streams, i.e., compositor_ama, tile_ama, and overlay_ama, only a single audio track can be added the each output video stream. To select the desired audio, use the -map x:a -c:a copy syntax, where x refers to the selected audio stream number, e.g., -map 1:a -c:a copy.

+
+
+

+
+
+
+

Video Machine Learning

+

This section describes various video ML complex filters of AMA SDK that are utilized using FFmpeg filter graph syntax. Note that supported ROI models are 1080p in landscape mode, 720p in both landscape and portrait modes.

+
+

Inference Engine

+

The AMD AMA Video SDK ML inference engine is leveraged in FFmpeg by using the ml_ama complex filter.

+
+
+ml_ama
+

Filter implementing the AMD AMA Video SDK ML inference engine that executes against a supplied rgbp input and detects face or text classes. Its output is used by downstream components in the pipeline.

+
+ + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
Inference Engine Options

Options

Descriptions

+
+model
+
+ +
+
Specify engine model
+
Valid value roi
+
+
+
+model_args
+
+ +
+
Model specific arguments
+
Valid values for roi: type=face and type=text
+
+
i) type=text - for text detection VQ improvements
+
ii) type=face - for face detection VQ improvements
+
+
+
+
+core_id
+
+ +
+
Specify engine number
+
Valid values: range -1 to 3 or none
+
i) If xrmd is enabled, this will be selected automatically
+
ii) If xrmd is disabled, and core_id is set to -1, then one of 0 to 3 cores will be selected
+
ii) Otherwise, value in 0-3 range will be selected
+
+
+
+nb_inputs
+
+ +
+
Specify number of inputs
+
Valid value: 1
+
Default 1
+
+
+
+inference_period
+
+ +
+
Specify frame skip period
+
Valid value: 1-64
+
Default 1
+
+
+
+
+

ROI Scaler

+

The AMD AMA Video SDK ROI scaler is leveraged in FFmpeg by using software plugin roi_scale_ama complex filter.

+
+
+roi_scale_ama
+

Filter implementing the AMD AMA Video SDK ROI scaler engine that applies ml_ama ROI map to the input video. This engine generates metadata used by downstream encoder within the pipeline.

+
+ + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
Scaler Options

Options

Descriptions

+
+cutoff
+
+ +
+
Specify cutoff threshold
+
Valid value range 0-100000
+
Default 5000
+
0-100% range is mapped to 0-100000, e.g., 5.67% is represented as 5670, and is used as shut off threshold for detected ROI regions. That is, if the percentages of detected ROI regions is above cutoff, then ROI directed encoding is disabled..
+
+
+
+strength
+
+ +
+
Specify probability-to-QP conversion gain factor
+
Valid values are low, normal, and high
+
Default is normal
+
Providing high value generates higher QP modulation that signals to encoder to spend more bits on the associated block.
+
+
+
+nb_inputs
+
+ +
+
Specify number of inputs
+
Valid values: range 2 to 4
+
Default 2
+
+
+
+roi_map_type
+
+ +
+
Specify probability-to-QP mapping
+
Valid values are dqp, roi, dqp_and_roi
+
Default dqp
+
+
+
+static_map_file
+
+ +
+
Specify static map file
+
Valid value is the path to rgbp map file.
+
The size of this file is ceil of width and height of incoming video divided by 16, in each dimension.
+
This file contains values in 0-255 range, for each channel, and servers as the lower boundary of probability-to-QP mapping, i.e., maximum of values in this file and ml_ama is used for QP mapping
+
+
+
+
+

ROI Overlay

+

The AMD AMA Video SDK ROI overlay is leveraged in FFmpeg by using software plugin roi_overlay_ama complex filter.

+
+
+roi_overlay_ama
+

Filter implementing the AMD AMA Video SDK ROI overlay that overlays shaded probability rectangles on detected classes.

+
+ + + ++++ + + + + + + + + + + + + + +
Overlay Options

Options

Descriptions

+
+skip_frames
+
+ +
+
Specify overlay period
+
Valid value range 0-255
+
The value toggles overlay rectangles after the specified number of frames.
+
+
+
+highlight_threshold
+
+ +
+
Specify activation threshold
+
Valid value range 0-255
+
Default 128
+
+
+

See ML Based Face ROI and ML Based Text ROI for sample usage.

+
+

+
+
+
+
+

Other AMA Filters

+ + +++++ + + + + + + + + + + + + + + + + +
Other AMA Filters

Filter Name

Description

Options

+
+hwupload_ama
+
+ +
+
AMA device upload
+
Takes the target device number as an argument and upload data to it.
+
+
+
device specifies the device number.
+
Valid values are integers between 0 and available number of devices minus 1.
+
+
+
+hwdownload_ama
+
+ +
+
AMA host download
+
Takes a argument to enable or disable pipelining
+
+
+
pipeline enables pipelining
+
Note that while enabling pipelining increases the throughput; however, it introduces 2 frames worth of latency.
+
+
+
+

+
+
+
+

Rebuilding FFmpeg

+

Obtain the zipped version of SDK's FFmpeg source code, from ma35d_sdk_v1.2.0_ffmpeg.zip. Unzip this file into ma35_ffmpeg folder. This folder contains the entire source code for the FFmpeg executable, which is a fork of the main FFmpeg GitHub (release 6.1.1) with AMD plugins patches applied. Due to licensing restrictions, the FFmpeg executable included in the Video SDK is enabled with the AMD AMA Video SDK plugins only.

+

You can rebuild the FFmpeg executable with optional plugins by following the instructions below. Additionally, comprehensive instructions for compiling FFmpeg can be found on the FFmpeg wiki page.

+
    +
  1. Make sure libhugetlbfs-dev, nasm and yasm are installed on your machine.

  2. +
  3. Unzip the downloaded zip file:

    +
    unzip ma35d_sdk_v1.2.0_ffmpeg.zip
    +
    +
    +
  4. +
+
+

and navigate to root folder of the unzipped file.

+
+
    +
  1. Execute the following:

    +
    ./configure --disable-alsa --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --disable-libxcb-shape --disable-xlib --disable-libmfx --disable-vaapi --disable-vulkan --prefix=$PWD --disable-stripping --enable-shared --enable-vpe --enable-libxrm --extra-libs="-L/opt/amd/ama/ma35/lib -lvpi -lroi_scale -llog_ama -lxrm -lxrm_interface -lhugetlbfs -lpthread -lstdc++ -lm -ldl -lrt  /opt/amd/ama/ma35/lib/libxrm.so.1.6.0" --extra-cflags="-I/usr/include -I$PWD -I/opt/amd/ama/ma35/include/xrm_interface/ -I/opt/amd/ama/ma35/include/xrm/ -DSUPPORT_OSAL" --extra-ldflags="-Wl,-rpath=$PWD/libavutil:$PWD/libavfilter:$PWD/libavcodec:$PWD/libavformat:$PWD/libavdevice:$PWD/libswscale:$PWD/libswresample:$PWD:/opt/amd/ama/ma35/lib/"
    +
    +
    +
  2. +
  3. Add any other plugins such as libx264 to the above configure line. (See FFmpeg Compilation Guide for details.) A list of configure options is printed by running configure --help.

  4. +
  5. Type make -j to build FFmpeg. GNU Make 3.81 or later is required.

  6. +
  7. To build the example folder, type make examples.

  8. +
  9. Type make install to install all binaries and libraries you built.

  10. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/using_gstreamer.html b/latest/using_gstreamer.html new file mode 100644 index 00000000..fb39a62e --- /dev/null +++ b/latest/using_gstreamer.html @@ -0,0 +1,1509 @@ + + + + + + + + + + + + + + + Using GStreamer — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Using GStreamer
  • +
  • +
  • +
+
+
+
+
+ +
+

Using GStreamer

+ +
+

Introduction

+

GStreamer is a pipeline-based multimedia framework that links together a wide variety of media processing systems to complete complex workflows. The pipeline design serves as a base to create many types of multimedia applications such as video editors, transcoders, streaming media broadcasters and media players. The AMD AMA Video SDK includes an enhanced version of GStreamer which can communicate with the hardware accelerated transcode pipeline in AMD devices.

+

It is not within the scope of this document to provide an exhaustive guide on the usage of GStreamer. Various resources can be found online, for example:

+ +
+

Overview of the GStreamer Plugins

+

The AMD AMA Video SDK provides the following GStreamer plugins for building hardware-accelerated video pipelines using AMA compatible devices:

+
    +
  • ama_av1dec av1 decoder

  • +
  • ama_av1enc av1 encoder

  • +
  • ama_h264dec h264 decoder

  • +
  • ama_h264enc h264 encoder

  • +
  • ama_h265dec h264 decoder

  • +
  • ama_h264enc h265 encoder

  • +
  • ama_vp9dec VP9 decoder

  • +
  • ama_scaler hardware accelerated scaler and cropper

  • +
  • ama_download data downloader, from device to host

  • +
  • ama_upload data uploader, from host to device

  • +
  • ama_compositor feature rich compositor

  • +
  • ama_jpegdec JPEG decoder

  • +
  • ama_jpegenc JPEG encoder

  • +
  • ama_ljpegenc Lossless JPEG encoder

  • +
  • ama_videoconvert accelerated pixel converter

  • +
+

The following sections describe the options used with GStreamer to configure and use the various hardware accelerators available on AMA compatible devices.

+
+

+
+
+
+
+

Decoder Plugin

+

The ama_av1dec, ama_h264dec, ama_h265dec, and ama_vp9dec plugins provide support for hardware-accelerated decoding using AMA compatible devices, for AV1, AVC, HEVC and VP9.

+

SDK also supports JPEG decoding through ama_jpegdec plugin.

+
+

Decoder Inputs and Outputs

+

Video Decoders:

+
    +
  • Input: 8 or 10 bits AV1, AVC, HEVC and VP9 encoded stream, in OBU format for AV1, byte-stream format for AVC or HEVC, or VP9 stream format for VP9.

  • +
  • Output: One of NV12_4L4, NV12, I420, NV12_10LE32, P010_10E, I420_10LE, RGBP, or NV12_10LE_4L4 formats

  • +
+

JPEG Decoder:

+
    +
  • Input: Standard JPEG file

  • +
  • Output: One of NV12_4L4, NV12,I420, or RGBP

  • +
+
+
+

Decoder Parameters

+ ++++ + + + + + + + + + + + + + + + + + + + +

Property Name

Description

+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Default: -1 (auto)
+
Range -1 to 2147483647
+
+
+
+low-latency
+
+ +
+
Whether to enable low latency decoding
+
Type: Boolean
+
Default: false
+
+
+
+latency-logging
+
+ +
+
Log latency info to syslog
+
Type: Boolean
+
Default: false
+
+
+
+allow-downscaling
+
+ +
+
Downscale through decoder
+
Allow the decoder to downscale the output if negotiated with downstream. When FALSE, the decoder always outputs video in its native resolution. Scaling RGBP format isn't supported. | Type: Boolean
+
Default: false
+
+
+
+
+

Decoder Example Pipelines

+

Refer to the Decoder Pipeline example for an illustration of how to use this plugin.

+
+
+
+

Encoder Plugin

+

The ama_av1enc, ama_h264enc and ama_h265enc plugins provide support for hardware-accelerated encoding using AMA compatible devices, for AV1, AVC and HEVC.

+
+

Encoder Inputs and Outputs

+
    +
  • Input: NV12_4L4, I420, NV12_10LE32, P010_10LE, I420_10LE, or NV12_10LE_4L4

  • +
  • Output: One of AV1, AVC or HEVC 8-bit/10-bit encoded stream, in OBU format for AV1 and byte-stream for AVC and HEVC

  • +
+
+
+

Encoder Parameters

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Property Name

Description

+
+b-frames
+
+ +
+
Number of B-frames between two consecutive P-frames
+
Type: Integer
+
Range: -1 - 7, for AV1
+
Range: -1 - 3, for AVC and HEVC
+
Default: -1 (auto)
+
+
+
+bitrate
+
+ +
+
Fixed output bitrate in bits per second
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 5000000
+
+
+
+crf
+
+ +
+
If specified, enable CRF mode
+
Type: Boolean
+
Default: False
+
+
+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+dynamic-gop
+
+ +
+
Enable Dynamic B Frame Insertion
+
Type: Integer
+
Range: -1 - 1
+
Default: -1 (auto)
+
+
+
+device-type
+
+ +
+
AV1 device type to use
+
Type: Enum
+
+
(0): any
+
(1): Type 1
+
(2): Type 2
+
+
Default: 1
+
+
+
+forced-idr
+
+ +
+
Encode all intra frames as IDR
+
Type: Boolean
+
Default: True
+
+
+
+gop-length
+
+ +
+
Maximum distance between two consecutive I frames
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+idr-interval
+
+ +
+
The periodicity of IDR frames
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 4294967295
+
+
+
+lookahead-depth
+
+ +
+
Number of frames in the future of the currently encoded frame that the encoder will analyze and take into account
+
Type: Integer
+
Range: 0 - 47+Maximum number of B frames b-frames
+
Default: -1 (auto)
+
+
+
+max-bitrate
+
+ +
+
Use to limit encoding bitrate if you have not specified bitrate parameter
+
Type: Integer
+
Range: 0 - 35000000000
+
Default: -1 (auto)
+
+
+
+max-qp
+
+ +
+
Maximum QP value allowed for the rate control
+
Type: Integer
+
Range: 0 - 51, for AVC and HEVC
+
Range: 0 - 255, for AV1
+
Default: 51, for AVC and HEVC
+
Default: 255, for AV1
+
+
+
+min-qp
+
+ +
+
Minimum QP value allowed for the rate control
+
Type: Integer
+
Range: 0 - 51, for AVC and HEVC
+
Range: 0 - 255, for AV1
+
Default: 0
+
+
+
+qp
+
+ +
+
Fixed quantization value. When constant quality is enabled, bitrate must be set to 0
+
Type: Integer
+
Range: -1 - 255
+
Default: -1 (disable)
+
+
+
+qp-b-offset
+
+ +
+
FQuantization offset value - P/B
+
Type: Integer
+
Range: -51 - 51
+
Auto selection mode is -1.
+
Default: 0
+
+
+
+qp-i-offset
+
+ +
+
FQuantization offset value - I
+
Type: Integer
+
Range: -51 - 51
+
Auto selection mode is -1.
+
Default: 0
+
+
+
+qp-mode
+
+ +
+
QP control mode.
+
Type: Enum
+
+
(0): auto - Auto
+
(1): relative-load - Relative load (spatial AQ + temporal AQ)
+
(2): uniform - Uniform (AQ off)
+
+
+
+
+rate-control
+
+ +
+
Rate control mode to use for encoding
+
Type: Enum
+
+
(-1): auto - Auto
+
(0): cqp - Constant QP
+
(1): cbr - Constant bitrate
+
(2): vbr - Variable bitrate
+
(3): cvbr - Constrained variable bitrate
+
+
+
+
+slice
+
+ +
+
Which slice of the XMA device to use
+
Type: Integer
+
Range: -1 - 1
+
Default: -1
+
+
+
+spatial-aq
+
+ +
+
Enable spatial AQ
+
Type: Boolean
+
Default: True
+
+
+
+spatial-aq-gain
+
+ +
+
Spatial AQ gain scale factor
+
Type: Integer
+
Range: 0 -255
+
Default: 255
+
+
+
+temporall-aq
+
+ +
+
Enable temporal AQ
+
Type: Boolean
+
Default: True
+
+
+
+temporal-aq-gain
+
+ +
+
Temporal AQ gain scale factor
+
Type: Integer
+
Range: 0 -255
+
Default: 255
+
Default: 1
+
+
+
+tier
+
+ +
+
Tier
+
Type: Boolean
+
+
(-1): auto - Auto
+
(0): main - Main
+
(1): high - High
+
+
+
+
+preset
+
+ +
+
Encoder VQ-Density preset
+
Valid values: medium or slow. (default is medium)
+
+
(medium) Full density with medium VQ - default
+
(fast) Allows for increase in total throughput from 4kp60 to 4kp75 , when 2 or more channels are used. Does not apply to AV1 device-type 1 encoding. Not applicable under ULL setting. Note lower VQ than medium preset is to be expected.
+
(slow) High VQ at lower density
+
+
Consult the Tuning Video Quality section for more details on how to use this option.
+
Note that this option has no effects on AV1 device-type 1 encoding.
+
+
+
+tune-metrics
+
+ +
+
Tune VQ for objective metrics
+
Type: Enum
+
+
(1): vq - Best visual quality
+
(2): psnr - Best PSNR
+
(3): ssim - Best SSIM
+
(4): vmaf - Best VMA
+
+
+
+
+encoding-params-file
+
+ +
+
Dynamic Configuration File
+
Path to dynamic file location (default is empty)
+
Consult the Dynamic Encoder Parameters section for more details on how to use this option.
+
+
+
+latency-ms
+
+ +
+
Encoder latency in milliseconds that the encoder will analyze and take into account
+
Type: Integer
+
Range: -1 - 60000
+
Default: -1 (auto)
+
+
+
+no-bll
+
+ +
+
No low latency B Frames
+
Type: Integer
+
Range: -1 - 1
+
Default: -1 (auto)
+
+
+
+
+

Encoder Example Pipelines

+

Refer to the Encoder Pipeline example for an illustration of how to use this plugin.

+
+
+
+

Scaler Plugin

+

The ama_scaler plugin provides support for hardware-accelerated resizing.

+
+

Scaler Inputs and Outputs

+
    +
  • Input: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
  • Output: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
+
+
+

Scaler Parameters

+ + ++++ + + + + + + + + + + +
Sink Pad

Property Name

Description

+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+

The output width, height and frame rate are set through the succeeding cap filter.

+ ++++ + + + + + + + + + + + + + + + + +

Pad Property

Description

width

+
Output width
+
Type: Integer
+
Range: 144 - 7580
+
+

height

+
Output height
+
Type: Integer
+
Range: 144 - 7580
+
+

framerate

+
Output frame rate
+
Type: Enum
+
Range: -1 - 1
+
+
(-1): auto - Full rate
+
(0): full - Full rate
+
(1): half - Half rate
+
+
+
+
+
+

Scaler Example Pipelines

+

Refer to the Transcode with Multiple-Resolution Outputs example for an illustration of how to use this plugin.

+
+
+
+

2D Engines

+

This section describes different hardware accelerated 2D processing engines that are available in AMA SDK. The following plugins may take core-id and device as configuration parameters to specify the target core and device, respectively.

+
+

Inputs and Outputs

+
    +
  • Input: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
  • Output: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
+
+
+

2D Plugins

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
2D Accelerator Engines

Engine Name

Description

Options

+
+ama_videocrop
+
+ +
+
Video crop
+
Takes coordinates.
+
+
+
bottom Pixels to crop at the bottom (from 0 to 2147483647) (default 0)
+
top Pixels to crop at the top (from 0 to 2147483647) (default 0)
+
left Pixels to crop on the left (from 0 to 2147483647) (default 0)
+
right Pixels to crop on the right (from 0 to 2147483647) (default 0)
+
+
+
+ama_videopad
+
+ +
+
Video pad
+
Takes size, coordinates, and pad color.
+
+
+
bottom Pixels to add at the bottom (from 0 to 2147483647) (default 0)
+
top Pixels to add at the top (from 0 to 2147483647) (default 0)
+
left Pixels to add on the left (from 0 to 2147483647) (default 0)
+
right Pixels to add on the right (from 0 to 2147483647) (default 0)
+
color Padded area color in ARGB format (e.g. 0xFF000000 for black)
+
+
+
+ama_drawbox
+
+ +
+
Draw box
+
Takes size, coordinates, and pad color.
+
+
+
height Height of the box (from 0 to 2147483647) (default 10)
+
width Width of the box (from 0 to 2147483647) (default 10)
+
top Number of pixels from the top of the video to the top of the box (from 0 to 2147483647) (default 0)
+
left Number of pixels from the left side of the video to the left side of the box (from 0 to 2147483647) (default 0)
+
thickness Box line thickness (from 2 to 16) (default 2)
+
color Box line color in ARGB format (e.g. 0xFF000000 for black)
+
+
+
+ama_rotate
+
+ +
+
Rotate frame
+
Takes an angle.
+
+
+
angle one of 0, 90, 180 or 270 (default 0)
+
+
+
+ama_videoconvert
+
+ +
+
Color space conversion ans subsampling
+
Converts between RGB and YUV.
+
Converts from I422 to I420
+
+
+

+
+
+
+ama_overlay
+
+ +
+
Video overlay
+
Overlays 1 picture over another
+
+
+
alpha-blend Enable alpha blend (Boolean) default false
+
offset-x Horizontal offset of the overlay in pixels from the left of the main video (from 0 to 2147483647) (default 0)
+
offset-y Vertical offset of the overlay in pixels from the top of the main video (from 0 to 2147483647) (default 0)
+
+
+
+ama_tile
+
+ +
+
Video tile
+
Maps input streams to specified layout
+
+
+
grid-x Number of video tiles per line of the grid (from 1 to 16) (default 2)
+
grid-y Number of lines in the video grid (from 1 to 16) (default 2)
+
+
+
+
+
+

Compositor Plugin

+

The ama_compositor plugin provides support for hardware-accelerated video composition operations such as alpha-belding, rotation, drawbox, etc.

+
+

Compositor Inputs and Outputs

+
    +
  • Input: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
  • Output: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
+
+
+

Compositor Parameters

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Sink Pad

Property Name

Description

+
+alpha
+
+ +
+
Alpha blending of the picture.
+
Type: float
+
Rang: 0 - 1
+
Default: 1
+
+
+
+border-color
+
+ +
+
Border color of the picture encoded as 0x00RRGGBB
+
Type: Integer
+
Range: 0 - 16777215
+
Default: 0
+
+
+
+border-inner-width
+
+ +
+
Inner width of the picture's border in pixels
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+border-outer-width
+
+ +
+
Outer width of the picture's border in pixels
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+border-outer-width
+
+ +
+
Outer width of the picture's border in pixels
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+crop-bottom
+
+ +
+
Pixels to crop at the bottom
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+crop-left
+
+ +
+
Pixels to crop on the left
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+crop-right
+
+ +
+
Pixels to crop on the right
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+crop-top
+
+ +
+
Pixels to crop at the top
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+height
+
+ +
+
Height of the picture
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+video-direction
+
+ +
+
Video direction's rotation and flip
+
Type: Enum
+
+
(0): identity - No rotation
+
(1): 90r - Rotate clockwise 90 degrees
+
(2): 180 - 180 degrees
+
(3): 90l - Rotate counter-clockwise 90 degrees
+
(4): horiz - Horzontal flip
+
(5): vert - Vertical flip
+
(6): ul-lr - Flip across upper left/lower right diagonal
+
(7): ur-ll - Flip across upper right/lower left diagonal
+
(8): auto - Select flip method based on image-orientation tag
+
(9): custom - Current status depends on plugin internal setup
+
+
+
+
+width
+
+ +
+
Width of the picture
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+xpos
+
+ +
+
X Position of the picture
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+ypos
+
+ +
+
Y Position of the picture
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+zorder
+
+ +
+
Z Order of the picture
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+ + ++++ + + + + + + + + + + + + + + + + + + + +
Source Pad

Property Name

Description

+
+background
+
+ +
+
Background type
+
Type: Enum
+
+
(0) transparent - Transparent Background to enable further compositing
+
(0) color - Solid Color Background
+
+
+
+
+background-color
+
+ +
+
Color of the composition's background encoded as 0x00RRGGBB
+
Type: Unsigned Integer
+
Range: 0 - 16777215
+
Default: 0
+
+
+
+core-id
+
+ +
+
ID of the device core to use
+
Type: Integer
+
Range: 0 - 1
+
Default: 0
+
+
+
+device
+
+ +
+
Numeric ID of an XMA device (-1 = unspecified)
+
Type: Integer.
+
Range: -1 - 2147483647
+
Default: -1
+
+
+
+
+
+

Hardware Down and Up Loads

+

The ama_download and ama_upload plugins provide support for DMA transfer of data to and from the host, respectively. Note that transaction directions are with respect to the host.

+
+

Inputs and Outputs

+
    +
  • Input: I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, BGR

  • +
  • Output: I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, BGR

  • +
+
+
+

DMA Parameters

+ ++++ + + + + + + + + + + +

Property Name

Description

+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+
+
+

Moving Data through the Pipeline

+

The GStreamer plugins included in the AMD AMA Video SDK take care of efficiently moving data through the video processing pipeline. For optimal performance, video buffers will be moved between the host and the appropriate device only if needed by plugins in the pipeline. This is known as "zero-copy".

+
    +
  • The decoder plugin will only copy the output buffer from the device to the host if a downstream element (e.g. filesink) running on the host needs to access the decoded frame. This allows downstream hardware-accelerated plugins (e.g. scaler, encoder) running on the same AMD device to process the decoded frames without unnecessary data transfers.

  • +
  • The encoder plugin will only copy the input buffer from host to the device if it is allocated in user-space memory on the host or in a different device. This allows the encoder to process frames produced by upstream hardware-accelerated plugins (e.g. decoder, scaler) running on the same AMD device without unnecessary data transfers.

  • +
+
+
+

Working with Multiple Devices

+

By default, if no device identifier is specified, a job is submitted to device 0. When running large jobs or multiple jobs in parallel, device 0 is bound to run out of resources and additional jobs will error out due to insufficient resources. +By using the device option of the GStreamer plugins, included in the AMD AMA Video SDK, different functionalities such as decode, scale, etc. of a pipeline can be individually submitted to a specific device. This allows for an easy and straightforward way to leverage the entire video acceleration capacity of your system.

+
+
+

Rebuilding GStreamer

+

Obtain the zipped version of SDK's Gstreamer code from ma35d_sdk_v1.2.0_gstreamer.zip. Unzip this file into ma35_gstreamer folder. This folder will contain the source code for AMA SDK plugins and a patch for Gstreamer.

+

You can rebuild the Gstreamer executable with optional plugins by following the instructions below.

+
    +
  1. Install the prerequisite packages:

    +
    sudo apt install ninja-build flex bison python3-pip unzip pkg-config libjansson-dev uuid-dev
    +sudo snap install cmake --classic
    +sudo pip3 install meson ninja
    +
    +
    +
  2. +
  3. Unzip the downloaded zip file:

    +
    unzip ma35d_sdk_v1.2.0_gstreamer.zip -d ma35_gstreamer
    +
    +
    +
  4. +
  5. Get Gstreamer:

    +
    git clone https://github.com/GStreamer/gstreamer.git
    +cd gstreamer
    +git checkout f6e672f27fcac06af58d7ac995551893d36944ce
    +
    +
    +
  6. +
  7. Apply the patch to Gstreamer:

    +
    cp ../ma35_gstreamer/ama_gstreamer.patch .
    +git apply ama_gstreamer.patch
    +
    +
    +
  8. +
  9. Build Gstreamer and AMA SDK plugins:

    +
    cd ../ma35_gstreamer
    +ln -s ../gstreamer/subprojects ./
    +export C_INCLUDE_PATH=/opt/amd/ama/ma35/include/xma/:/opt/amd/ama/ma35/include/xrm/:/opt/amd/ama/ma35/include/xrm_interface/:$C_INCLUDE_PATH
    +export LIBRARY_PATH=/opt/amd/ama/ma35/lib/:$LIBRARY_PATH
    +meson setup build
    +cd build
    +ninja
    +
    +
    +
  10. +
  11. Install Gstreamer and plugins:

    +
    ninja install
    +
    +
    +
  12. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/latest/virtualization.html b/latest/virtualization.html new file mode 100644 index 00000000..85af2a18 --- /dev/null +++ b/latest/virtualization.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + Virtualization — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Virtualization
  • +
  • +
  • +
+
+
+
+
+ +
+

Virtualization

+ +
+

SR-IOV

+

AMA virtualization support allows for isolated interaction of clients' operating systems with AMA compatible cards, in Linux. Specifically, isolation is achieved by relying on I/O Memory Management Unit (IOMMU) and Single Root I/O virtualization (SR-IOV) technologies. As such, AMA virtualization support provides an efficient interaction path between client applications and AMA compatible cards. This section describes Linux virtualization setup.

+
+

Linux Host

+
    +
  1. Ensure that host system is setup as per On Premises.

  2. +
  3. Install CPU checker and KVM packages on the host. For an Ubuntu host, do the following:

    +
    sudo apt install -y cpu-checker qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
    +
    +
    +
  4. +
  5. Ensure that virtualization is enabled on the host:

    +
    lscpu | grep Virtualization
    +Virtualization:                  AMD-V
    +$ kvm-ok
    +INFO: /dev/kvm exists
    +KVM acceleration can be used
    +
    +
    +
  6. +
  7. If /etc/modules-load.d/ama_transcoder.conf doesn't exists, execute the following:

    +
    echo ama_transcoder | sudo tee /etc/modules-load.d/ama_transcoder.conf
    +
    +
    +
  8. +
  9. If /etc/modprobe.d/ama_transcoder.conf doesn't exists, execute the following:

    +
    echo 'install ama_transcoder /sbin/modprobe --ignore-install ama_transcoder && /opt/amd/ama/ma35/bin/mamgmt --force -d <DBDF> numvfs -v 1 && <REPEAT>' | sudo tee /etc/modprobe.d/ama_transcoder.conf
    +echo 'remove ama_transcoder /sbin/modprobe -r --ignore-install ama_transcoder; /opt/amd/ama/ma35/bin/mamgmt --force -d <DBDF> numvfs -v 0; <REPEAT>' | sudo tee -a /etc/modprobe.d/ama_transcoder.conf
    +
    +
    +

    , where DBDF is PCIe Domain:Bus:Device.Function designation of the device(s) and REPEAT indicates that the /opt/amd/ama/ma35/bin/mamgmt commands are to be repeated for all devices that are meant to be passed to a VM.

    +

    As an example, in a system with 2 cards:

    +
    lspci -d 10ee:
    +01:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +02:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +03:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +04:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +
    +
    +

    , in order to make one device, of each card, available to 2 distinct VMs, /etc/modprobe.d/ama_transcoder.conf will have the following content:

    +
    install ama_transcoder /sbin/modprobe --ignore-install ama_transcoder && /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:02:00.0 numvfs -v 1 && /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:04:00.0 numvfs -v 1
    +remove  ama_transcoder /sbin/modprobe --ignore-install ama_transcoder;   /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:02:00.0 numvfs -v 0;   /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:04:00.0 numvfs -v 0
    +
    +
    +
  10. +
  11. Reboot the host. After reboot execute and confirm the following:

    +
    lsmod | grep ama_transcoder
    +  ama_transcoder        831488  0
    +
    +
    +

    If the above returns empty, then insert the module manually, by sudo modprobe ama_transcoder. Otherwise, confirm that driver is properly configured:

    +
    cat /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
    +1
    +
    +$ lspci -d 10ee:
    +01:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +01:00.1 Multimedia controller: Xilinx Corporation Device 5071
    +...
    +
    +
    +

    The first command confirms that VM guest's Virtual Function (VF) that is associated with host's Physical Function (PF) is enabled and the second one confirms its creation. Note that this snippet assumes target device is 01.00.0.

    +
  12. +
  13. Setup KVM on the host and confirm that it is running:

    +
    sudo systemctl enable libvirtd
    +sudo systemctl start libvirtd
    +systemctl status libvirtd
    +libvirtd.service - Virtualization daemon
    +   Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
    +   Active: active (running) since Wed 2023-06-07 09:19:44 PDT; 7h ago
    +   ...
    +
    +
    +
  14. +
  15. Obtain Ubuntu 20.04 server image, from Ubuntu Focal Fossa.

  16. +
  17. Instantiate the VM guest, by allocating it at least 8 CPU cores and 12GB of RAM.

    +

    Check virt-install version:

    +
    virt-install --version
    +
    +
    +

    If it is 4.0.0 or above, execute the following:

    +
    sudo virt-install --name <VM name> \
    +--ram 12288 --vcpu 8 --virt-type kvm --machine q35 \
    +--disk path=<Path to qcow2 disk file>,size=128 \
    +--os-type linux --os-variant ubuntu20.04 --network network:default --graphics none --console pty,target_type=serial --extra-args "console=ttyS0" \
    +--location <Path to Ubuntu 20.04 ISO file>,kernel=casper/vmlinuz,initrd=casper/initrd \
    +--force --debug --features  apic=on,ioapic.driver=qemu --iommu model=intel,driver.intremap=on,driver.eim=on,driver.caching_mode=on --memorybacking hugepages.page.size=2,hugepages.page.unit=M,nosharepages=1,locked=1 \
    +--hostdev 0<xx>:00.1,driver.name=vfio
    +
    +
    +

    , where VM name is the name of the VM image and Path to qcow2 disk file is the path to VM's disk storage, which will be created. Note that this file will be owned by libvirt-qemu user and kvm group. Also, Path to Ubuntu 20.04 ISO file is the path to the downloaded ISO image and xx is part of DBDF designation as described above. Repeat this step for as many VMs that have been defined in /etc/modprobe.d/ama_transcoder.conf.

    +

    Otherwise, first create the VM without ioapic.driver and --iommu parameters:

    +
    sudo virt-install --name <VM name> \
    +--ram 12288 --vcpu 8 --virt-type kvm --machine q35 \
    +--disk path=<Path to qcow2 disk file>,size=128 \
    +--os-type linux --os-variant ubuntu20.04 --network network:default --graphics none --console pty,target_type=serial --extra-args "console=ttyS0" \
    +--location <Path to Ubuntu 20.04 ISO file>,kernel=casper/vmlinuz,initrd=casper/initrd \
    +--force --debug --hostdev 0<xx>:00.1,driver.name=vfio
    +
    +
    +

    and after VM creation add ioapic.driver and --iommu parameters, via virsh edit:

    +
    virsh edit <VM name>
    +<domain type='kvm'>
    +   ...
    +   <memoryBacking>
    +    <hugepages>
    +      <page size='2048' unit='KiB'/>
    +    </hugepages>
    +    <nosharepages/>
    +    <locked/>
    +  </memoryBacking>
    +   ...
    +   <features>
    +     <acpi/>
    +     <apic/>
    +     <vmport state='off'/>
    +     <ioapic driver='qemu'/>
    +   </features>
    + ...
    +   </rng>
    +   <iommu model='intel'>
    +     <driver intremap='on' caching_mode='on'/>
    +   </iommu>
    + </devices>
    +</domain>
    +
    +
    +

    During or after creation of a VM, it is helpful to install ssh server on the guest VM, in order to be able to connect to the instance:

    +
    sudo apt-get install openssh-server
    +
    +
    +

    (To find the IP address of the running VM, run sudo virsh net-dhcp-leases default or attach to the instance virsh --connect qemu:///system console <VM name> and issue the ip a command)

    +
  18. +
+
+
+

Linux VM Guest

+

On the running VM instance execute the following:

+
+
    +
  1. Set the huge table pages to 6GB, plus an extra 96 pages, i.e. 3072+96:

    +
    sudo sh -c "echo 'vm.nr_hugepages=3168' >> /etc/sysctl.conf"
    +
    +
    +
  2. +
  3. Note that if you are running 20.04 Server edition, you may need to install generic kernel 5.15, dkms and gcc-11:

  4. +
+
+
+
+
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
+sudo apt install -y gcc-11 linux-image-5.15.0-60-generic dkms build-essential linux-headers-5.15.0-60-generic
+
+
+
+
    +
  1. Reboot the VM

  2. +
  3. Install the AMD AMA Video SDK and run through Tutorials and Examples

  4. +
+
+
+
+
+

PCIe Passthrough

+

Unlike the procedure delineated in SR-IOV, where administrative tasks can only be performed through the host, PCIe passthrough allows for complete control of assigned devices, within the guest VM. That is to say, for all intent and purposes, the guest VM behaves as the host bare-metal. However, note that nested VMs are not supported. As an example, the following steps create a Ubuntu Focal Fossa VM guest, with a single assigned device:

+
    +
  1. Proceed by following Steps 1-7 of Chassis Setup (Enabling SR-IOV is optional.)

  2. +
  3. Ensure virtualization is enabled and relevant packages are installed, by following Steps 2 & 3 of Linux Host

  4. +
  5. Execute the following command: (KVM 4.0.0 or higher is assumed.)

    +
    sudo virt-install --name vsdk_vm_passthrough --ram 12288 --vcpu 8 --virt-type kvm \
    +--machine q35 --disk path=<Path to qcow2 disk file>,size=128 \
    +--os-type linux --os-variant ubuntu20.04  --network network:default --graphics none \
    +--console pty,target_type=serial \
    +--features  apic=on,ioapic.driver=qemu --iommu model=intel,driver.intremap=on,driver.eim=on,driver.caching_mode=on \
    +--memorybacking hugepages.page.size=2,hugepages.page.unit=M,nosharepages=1,locked=1 \
    +--hostdev <xx>:00.0 --location <Path to Ubuntu 20.04 ISO file> \
    +--extra-args "console=ttyS0" --force --debug
    +
    +
    +
  6. +
+

, where Path to Ubuntu 20.04 ISO file is the path to the downloaded ISO image. Customize the installation packages as needed. It is useful to include development packages and ssh server.

+
    +
  1. Set huge pages as per Step 1 of Linux VM Guest.

  2. +
  3. Proceed by following Steps 3 & 4 of Linux VM Guest.

  4. +
+
+

Note

+

Ignore messages pertaining to sriov_drivers_autoprobe file not found .

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/.buildinfo b/v1.0/.buildinfo new file mode 100644 index 00000000..3249ca34 --- /dev/null +++ b/v1.0/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: a809b0b89c516137803265fe839d1bdc +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/v1.0/.nojekyll b/v1.0/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/v1.0/_images/MA35D_VPU.png b/v1.0/_images/MA35D_VPU.png new file mode 100644 index 00000000..d55cabf6 Binary files /dev/null and b/v1.0/_images/MA35D_VPU.png differ diff --git a/v1.0/_images/MA35D_pipeline.png b/v1.0/_images/MA35D_pipeline.png new file mode 100644 index 00000000..fc17564b Binary files /dev/null and b/v1.0/_images/MA35D_pipeline.png differ diff --git a/v1.0/_images/gst_xabrladder.png b/v1.0/_images/gst_xabrladder.png new file mode 100644 index 00000000..75d9d2ba Binary files /dev/null and b/v1.0/_images/gst_xabrladder.png differ diff --git a/v1.0/_images/gst_xcompositor.png b/v1.0/_images/gst_xcompositor.png new file mode 100644 index 00000000..1848b6b3 Binary files /dev/null and b/v1.0/_images/gst_xcompositor.png differ diff --git a/v1.0/_static/_sphinx_javascript_frameworks_compat.js b/v1.0/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/v1.0/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/v1.0/_static/basic.css b/v1.0/_static/basic.css new file mode 100644 index 00000000..30fee9d0 --- /dev/null +++ b/v1.0/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/v1.0/_static/css/badge_only.css b/v1.0/_static/css/badge_only.css new file mode 100644 index 00000000..e380325b --- /dev/null +++ b/v1.0/_static/css/badge_only.css @@ -0,0 +1 @@ +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/v1.0/_static/css/fonts/Roboto-Slab-Bold.woff b/v1.0/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/v1.0/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/v1.0/_static/css/fonts/Roboto-Slab-Bold.woff2 b/v1.0/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/v1.0/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/v1.0/_static/css/fonts/Roboto-Slab-Regular.woff b/v1.0/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/v1.0/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/v1.0/_static/css/fonts/Roboto-Slab-Regular.woff2 b/v1.0/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/v1.0/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/v1.0/_static/css/fonts/fontawesome-webfont.eot b/v1.0/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/v1.0/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/v1.0/_static/css/fonts/fontawesome-webfont.svg b/v1.0/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/v1.0/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v1.0/_static/css/fonts/fontawesome-webfont.ttf b/v1.0/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/v1.0/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/v1.0/_static/css/fonts/fontawesome-webfont.woff b/v1.0/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/v1.0/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/v1.0/_static/css/fonts/fontawesome-webfont.woff2 b/v1.0/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/v1.0/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/v1.0/_static/css/fonts/lato-bold-italic.woff b/v1.0/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/v1.0/_static/css/fonts/lato-bold-italic.woff differ diff --git a/v1.0/_static/css/fonts/lato-bold-italic.woff2 b/v1.0/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/v1.0/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/v1.0/_static/css/fonts/lato-bold.woff b/v1.0/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/v1.0/_static/css/fonts/lato-bold.woff differ diff --git a/v1.0/_static/css/fonts/lato-bold.woff2 b/v1.0/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/v1.0/_static/css/fonts/lato-bold.woff2 differ diff --git a/v1.0/_static/css/fonts/lato-normal-italic.woff b/v1.0/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/v1.0/_static/css/fonts/lato-normal-italic.woff differ diff --git a/v1.0/_static/css/fonts/lato-normal-italic.woff2 b/v1.0/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/v1.0/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/v1.0/_static/css/fonts/lato-normal.woff b/v1.0/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/v1.0/_static/css/fonts/lato-normal.woff differ diff --git a/v1.0/_static/css/fonts/lato-normal.woff2 b/v1.0/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/v1.0/_static/css/fonts/lato-normal.woff2 differ diff --git a/v1.0/_static/css/theme.css b/v1.0/_static/css/theme.css new file mode 100644 index 00000000..c073ee06 --- /dev/null +++ b/v1.0/_static/css/theme.css @@ -0,0 +1,4772 @@ +html{ + box-sizing:border-box +} +*,:after,:before{ + box-sizing:inherit +} +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{ + display:block +} +audio,canvas,video{ + display:inline-block; + *display:inline; + *zoom:1 +} +[hidden],audio:not([controls]){ + display:none +} +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box +} +html{ + font-size:100%; + -webkit-text-size-adjust:100%; + -ms-text-size-adjust:100% +} +body{ + margin:0 +} +a:active,a:hover{ + outline:0 +} +abbr[title]{ + border-bottom:1px dotted +} +b,strong{ + font-weight:700 +} +blockquote{ + margin:0 +} +dfn{ + font-style:italic +} +ins{ + background:#ff9; + text-decoration:none +} +ins,mark{ + color:#000 +} +mark{ + background:#ff0; + font-style:italic; + font-weight:700 +} +.rst-content code,.rst-content tt,code,kbd,pre,samp{ + font-family:monospace,serif; + _font-family:courier new,monospace; + font-size:1em +} +pre{ + white-space:pre +} +q{ + quotes:none +} +q:after,q:before{ + content:""; + content:none +} +small{ + font-size:85% +} +sub,sup{ + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline +} +sup{ + top:-.5em +} +sub{ + bottom:-.25em +} +dl,ol,ul{ + margin:0; + padding:0; + list-style:none; + list-style-image:none +} +li{ + list-style:none +} +dd{ + margin:0 +} +img{ + border:0; + -ms-interpolation-mode:bicubic; + vertical-align:middle; + max-width:100% +} +svg:not(:root){ + overflow:hidden +} +figure,form{ + margin:0 +} +label{ + cursor:pointer +} +button,input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle +} +button,input{ + line-height:normal +} +button,input[type=button],input[type=reset],input[type=submit]{ + cursor:pointer; + -webkit-appearance:button; + *overflow:visible +} +button[disabled],input[disabled]{ + cursor:default +} +input[type=search]{ + -webkit-appearance:textfield; + -moz-box-sizing:content-box; + -webkit-box-sizing:content-box; + box-sizing:content-box +} +textarea{ + resize:vertical +} +table{ + border-collapse:collapse; + border-spacing:0 +} +td{ + vertical-align:top +} +.chromeframe{ + margin:.2em 0; + background:#ccc; + color:#000; + padding:.2em 0 +} +.ir{ + display:block; + border:0; + text-indent:-999em; + overflow:hidden; + background-color:transparent; + background-repeat:no-repeat; + text-align:left; + direction:ltr; + *line-height:0 +} +.ir br{ + display:none +} +.hidden{ + display:none!important; + visibility:hidden +} +.visuallyhidden{ + border:0; + clip:rect(0 0 0 0); + height:1px; + margin:-1px; + overflow:hidden; + padding:0; + position:absolute; + width:1px +} +.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{ + clip:auto; + height:auto; + margin:0; + overflow:visible; + position:static; + width:auto +} +.invisible{ + visibility:hidden +} +.relative{ + position:relative +} +big,small{ + font-size:100% +} +@media print{ + body,html,section{ + background:none!important + } + *{ + box-shadow:none!important; + text-shadow:none!important; + filter:none!important; + -ms-filter:none!important + } + a,a:visited{ + text-decoration:underline + } + .ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{ + content:"" + } + blockquote,pre{ + page-break-inside:avoid + } + thead{ + display:table-header-group + } + img,tr{ + page-break-inside:avoid + } + img{ + max-width:100%!important + } + @page{ + margin:.5cm + } + .rst-content .toctree-wrapper>p.caption,h2,h3,p{ + orphans:3; + widows:3 + } + .rst-content .toctree-wrapper>p.caption,h2,h3{ + page-break-after:avoid + } +} +.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{ + -webkit-font-smoothing:antialiased +} +/*! * Custome CSS styles for Xilinx GitHub Tutorials */ + p .footerinfo { + font-size:small; +} + footer .sphinxfooter{ + z-index:0; + background:#ffffff; +} + .sphinxhide { + display:none; +} + a:visited { + color: #9b59b6; +} + a:link { + color: blue; +} + .wy-nav-side a:hover { + color: white; +} + .headerlink { + padding-top: 60px; + margin-top: -50px; +} +/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ +@font-face{ + font-family:FontAwesome; + src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713); + src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg"); + font-weight:400; + font-style:normal +} +.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{ + display:inline-block; + font:normal normal normal 14px/1 FontAwesome; + font-size:inherit; + text-rendering:auto; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale +} +.fa-lg{ + font-size:1.33333em; + line-height:.75em; + vertical-align:-15% +} +.fa-2x{ + font-size:2em +} +.fa-3x{ + font-size:3em +} +.fa-4x{ + font-size:4em +} +.fa-5x{ + font-size:5em +} +.fa-fw{ + width:1.28571em; + text-align:center +} +.fa-ul{ + padding-left:0; + margin-left:2.14286em; + list-style-type:none +} +.fa-ul>li{ + position:relative +} +.fa-li{ + position:absolute; + left:-2.14286em; + width:2.14286em; + top:.14286em; + text-align:center +} +.fa-li.fa-lg{ + left:-1.85714em +} +.fa-border{ + padding:.2em .25em .15em; + border:.08em solid #eee; + border-radius:.1em +} +.fa-pull-left{ + float:left +} +.fa-pull-right{ + float:right +} +.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{ + margin-right:.3em +} +.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{ + margin-left:.3em +} +.pull-right{ + float:right +} +.pull-left{ + float:left +} +.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{ + margin-right:.3em +} +.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{ + margin-left:.3em +} +.fa-spin{ + -webkit-animation:fa-spin 2s linear infinite; + animation:fa-spin 2s linear infinite +} +.fa-pulse{ + -webkit-animation:fa-spin 1s steps(8) infinite; + animation:fa-spin 1s steps(8) infinite +} +@-webkit-keyframes fa-spin{ + 0%{ + -webkit-transform:rotate(0deg); + transform:rotate(0deg) + } + to{ + -webkit-transform:rotate(359deg); + transform:rotate(359deg) + } +} +@keyframes fa-spin{ + 0%{ + -webkit-transform:rotate(0deg); + transform:rotate(0deg) + } + to{ + -webkit-transform:rotate(359deg); + transform:rotate(359deg) + } +} +.fa-rotate-90{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform:rotate(90deg); + -ms-transform:rotate(90deg); + transform:rotate(90deg) +} +.fa-rotate-180{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform:rotate(180deg); + -ms-transform:rotate(180deg); + transform:rotate(180deg) +} +.fa-rotate-270{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform:rotate(270deg); + -ms-transform:rotate(270deg); + transform:rotate(270deg) +} +.fa-flip-horizontal{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform:scaleX(-1); + -ms-transform:scaleX(-1); + transform:scaleX(-1) +} +.fa-flip-vertical{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform:scaleY(-1); + -ms-transform:scaleY(-1); + transform:scaleY(-1) +} +:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{ + filter:none +} +.fa-stack{ + position:relative; + display:inline-block; + width:2em; + height:2em; + line-height:2em; + vertical-align:middle +} +.fa-stack-1x,.fa-stack-2x{ + position:absolute; + left:0; + width:100%; + text-align:center +} +.fa-stack-1x{ + line-height:inherit +} +.fa-stack-2x{ + font-size:2em +} +.fa-inverse{ + color:#fff +} +.fa-glass:before{ + content:"" +} +.fa-music:before{ + content:"" +} +.fa-search:before,.icon-search:before{ + content:"" +} +.fa-envelope-o:before{ + content:"" +} +.fa-heart:before{ + content:"" +} +.fa-star:before{ + content:"" +} +.fa-star-o:before{ + content:"" +} +.fa-user:before{ + content:"" +} +.fa-film:before{ + content:"" +} +.fa-th-large:before{ + content:"" +} +.fa-th:before{ + content:"" +} +.fa-th-list:before{ + content:"" +} +.fa-check:before{ + content:"" +} +.fa-close:before,.fa-remove:before,.fa-times:before{ + content:"" +} +.fa-search-plus:before{ + content:"" +} +.fa-search-minus:before{ + content:"" +} +.fa-power-off:before{ + content:"" +} +.fa-signal:before{ + content:"" +} +.fa-cog:before,.fa-gear:before{ + content:"" +} +.fa-trash-o:before{ + content:"" +} +.fa-home:before,.icon-home:before{ + content:"" +} +.fa-file-o:before{ + content:"" +} +.fa-clock-o:before{ + content:"" +} +.fa-road:before{ + content:"" +} +.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{ + content:"" +} +.fa-arrow-circle-o-down:before{ + content:"" +} +.fa-arrow-circle-o-up:before{ + content:"" +} +.fa-inbox:before{ + content:"" +} +.fa-play-circle-o:before{ + content:"" +} +.fa-repeat:before,.fa-rotate-right:before{ + content:"" +} +.fa-refresh:before{ + content:"" +} +.fa-list-alt:before{ + content:"" +} +.fa-lock:before{ + content:"" +} +.fa-flag:before{ + content:"" +} +.fa-headphones:before{ + content:"" +} +.fa-volume-off:before{ + content:"" +} +.fa-volume-down:before{ + content:"" +} +.fa-volume-up:before{ + content:"" +} +.fa-qrcode:before{ + content:"" +} +.fa-barcode:before{ + content:"" +} +.fa-tag:before{ + content:"" +} +.fa-tags:before{ + content:"" +} +.fa-book:before,.icon-book:before{ + content:"" +} +.fa-bookmark:before{ + content:"" +} +.fa-print:before{ + content:"" +} +.fa-camera:before{ + content:"" +} +.fa-font:before{ + content:"" +} +.fa-bold:before{ + content:"" +} +.fa-italic:before{ + content:"" +} +.fa-text-height:before{ + content:"" +} +.fa-text-width:before{ + content:"" +} +.fa-align-left:before{ + content:"" +} +.fa-align-center:before{ + content:"" +} +.fa-align-right:before{ + content:"" +} +.fa-align-justify:before{ + content:"" +} +.fa-list:before{ + content:"" +} +.fa-dedent:before,.fa-outdent:before{ + content:"" +} +.fa-indent:before{ + content:"" +} +.fa-video-camera:before{ + content:"" +} +.fa-image:before,.fa-photo:before,.fa-picture-o:before{ + content:"" +} +.fa-pencil:before{ + content:"" +} +.fa-map-marker:before{ + content:"" +} +.fa-adjust:before{ + content:"" +} +.fa-tint:before{ + content:"" +} +.fa-edit:before,.fa-pencil-square-o:before{ + content:"" +} +.fa-share-square-o:before{ + content:"" +} +.fa-check-square-o:before{ + content:"" +} +.fa-arrows:before{ + content:"" +} +.fa-step-backward:before{ + content:"" +} +.fa-fast-backward:before{ + content:"" +} +.fa-backward:before{ + content:"" +} +.fa-play:before{ + content:"" +} +.fa-pause:before{ + content:"" +} +.fa-stop:before{ + content:"" +} +.fa-forward:before{ + content:"" +} +.fa-fast-forward:before{ + content:"" +} +.fa-step-forward:before{ + content:"" +} +.fa-eject:before{ + content:"" +} +.fa-chevron-left:before{ + content:"" +} +.fa-chevron-right:before{ + content:"" +} +.fa-plus-circle:before{ + content:"" +} +.fa-minus-circle:before{ + content:"" +} +.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{ + content:"" +} +.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{ + content:"" +} +.fa-question-circle:before{ + content:"" +} +.fa-info-circle:before{ + content:"" +} +.fa-crosshairs:before{ + content:"" +} +.fa-times-circle-o:before{ + content:"" +} +.fa-check-circle-o:before{ + content:"" +} +.fa-ban:before{ + content:"" +} +.fa-arrow-left:before{ + content:"" +} +.fa-arrow-right:before{ + content:"" +} +.fa-arrow-up:before{ + content:"" +} +.fa-arrow-down:before{ + content:"" +} +.fa-mail-forward:before,.fa-share:before{ + content:"" +} +.fa-expand:before{ + content:"" +} +.fa-compress:before{ + content:"" +} +.fa-plus:before{ + content:"" +} +.fa-minus:before{ + content:"" +} +.fa-asterisk:before{ + content:"" +} +.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{ + content:"" +} +.fa-gift:before{ + content:"" +} +.fa-leaf:before{ + content:"" +} +.fa-fire:before,.icon-fire:before{ + content:"" +} +.fa-eye:before{ + content:"" +} +.fa-eye-slash:before{ + content:"" +} +.fa-exclamation-triangle:before,.fa-warning:before{ + content:"" +} +.fa-plane:before{ + content:"" +} +.fa-calendar:before{ + content:"" +} +.fa-random:before{ + content:"" +} +.fa-comment:before{ + content:"" +} +.fa-magnet:before{ + content:"" +} +.fa-chevron-up:before{ + content:"" +} +.fa-chevron-down:before{ + content:"" +} +.fa-retweet:before{ + content:"" +} +.fa-shopping-cart:before{ + content:"" +} +.fa-folder:before{ + content:"" +} +.fa-folder-open:before{ + content:"" +} +.fa-arrows-v:before{ + content:"" +} +.fa-arrows-h:before{ + content:"" +} +.fa-bar-chart-o:before,.fa-bar-chart:before{ + content:"" +} +.fa-twitter-square:before{ + content:"" +} +.fa-facebook-square:before{ + content:"" +} +.fa-camera-retro:before{ + content:"" +} +.fa-key:before{ + content:"" +} +.fa-cogs:before,.fa-gears:before{ + content:"" +} +.fa-comments:before{ + content:"" +} +.fa-thumbs-o-up:before{ + content:"" +} +.fa-thumbs-o-down:before{ + content:"" +} +.fa-star-half:before{ + content:"" +} +.fa-heart-o:before{ + content:"" +} +.fa-sign-out:before{ + content:"" +} +.fa-linkedin-square:before{ + content:"" +} +.fa-thumb-tack:before{ + content:"" +} +.fa-external-link:before{ + content:"" +} +.fa-sign-in:before{ + content:"" +} +.fa-trophy:before{ + content:"" +} +.fa-github-square:before{ + content:"" +} +.fa-upload:before{ + content:"" +} +.fa-lemon-o:before{ + content:"" +} +.fa-phone:before{ + content:"" +} +.fa-square-o:before{ + content:"" +} +.fa-bookmark-o:before{ + content:"" +} +.fa-phone-square:before{ + content:"" +} +.fa-twitter:before{ + content:"" +} +.fa-facebook-f:before,.fa-facebook:before{ + content:"" +} +.fa-github:before,.icon-github:before{ + content:"" +} +.fa-unlock:before{ + content:"" +} +.fa-credit-card:before{ + content:"" +} +.fa-feed:before,.fa-rss:before{ + content:"" +} +.fa-hdd-o:before{ + content:"" +} +.fa-bullhorn:before{ + content:"" +} +.fa-bell:before{ + content:"" +} +.fa-certificate:before{ + content:"" +} +.fa-hand-o-right:before{ + content:"" +} +.fa-hand-o-left:before{ + content:"" +} +.fa-hand-o-up:before{ + content:"" +} +.fa-hand-o-down:before{ + content:"" +} +.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{ + content:"" +} +.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{ + content:"" +} +.fa-arrow-circle-up:before{ + content:"" +} +.fa-arrow-circle-down:before{ + content:"" +} +.fa-globe:before{ + content:"" +} +.fa-wrench:before{ + content:"" +} +.fa-tasks:before{ + content:"" +} +.fa-filter:before{ + content:"" +} +.fa-briefcase:before{ + content:"" +} +.fa-arrows-alt:before{ + content:"" +} +.fa-group:before,.fa-users:before{ + content:"" +} +.fa-chain:before,.fa-link:before,.icon-link:before{ + content:"" +} +.fa-cloud:before{ + content:"" +} +.fa-flask:before{ + content:"" +} +.fa-cut:before,.fa-scissors:before{ + content:"" +} +.fa-copy:before,.fa-files-o:before{ + content:"" +} +.fa-paperclip:before{ + content:"" +} +.fa-floppy-o:before,.fa-save:before{ + content:"" +} +.fa-square:before{ + content:"" +} +.fa-bars:before,.fa-navicon:before,.fa-reorder:before{ + content:"" +} +.fa-list-ul:before{ + content:"" +} +.fa-list-ol:before{ + content:"" +} +.fa-strikethrough:before{ + content:"" +} +.fa-underline:before{ + content:"" +} +.fa-table:before{ + content:"" +} +.fa-magic:before{ + content:"" +} +.fa-truck:before{ + content:"" +} +.fa-pinterest:before{ + content:"" +} +.fa-pinterest-square:before{ + content:"" +} +.fa-google-plus-square:before{ + content:"" +} +.fa-google-plus:before{ + content:"" +} +.fa-money:before{ + content:"" +} +.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{ + content:"" +} +.fa-caret-up:before{ + content:"" +} +.fa-caret-left:before{ + content:"" +} +.fa-caret-right:before{ + content:"" +} +.fa-columns:before{ + content:"" +} +.fa-sort:before,.fa-unsorted:before{ + content:"" +} +.fa-sort-desc:before,.fa-sort-down:before{ + content:"" +} +.fa-sort-asc:before,.fa-sort-up:before{ + content:"" +} +.fa-envelope:before{ + content:"" +} +.fa-linkedin:before{ + content:"" +} +.fa-rotate-left:before,.fa-undo:before{ + content:"" +} +.fa-gavel:before,.fa-legal:before{ + content:"" +} +.fa-dashboard:before,.fa-tachometer:before{ + content:"" +} +.fa-comment-o:before{ + content:"" +} +.fa-comments-o:before{ + content:"" +} +.fa-bolt:before,.fa-flash:before{ + content:"" +} +.fa-sitemap:before{ + content:"" +} +.fa-umbrella:before{ + content:"" +} +.fa-clipboard:before,.fa-paste:before{ + content:"" +} +.fa-lightbulb-o:before{ + content:"" +} +.fa-exchange:before{ + content:"" +} +.fa-cloud-download:before{ + content:"" +} +.fa-cloud-upload:before{ + content:"" +} +.fa-user-md:before{ + content:"" +} +.fa-stethoscope:before{ + content:"" +} +.fa-suitcase:before{ + content:"" +} +.fa-bell-o:before{ + content:"" +} +.fa-coffee:before{ + content:"" +} +.fa-cutlery:before{ + content:"" +} +.fa-file-text-o:before{ + content:"" +} +.fa-building-o:before{ + content:"" +} +.fa-hospital-o:before{ + content:"" +} +.fa-ambulance:before{ + content:"" +} +.fa-medkit:before{ + content:"" +} +.fa-fighter-jet:before{ + content:"" +} +.fa-beer:before{ + content:"" +} +.fa-h-square:before{ + content:"" +} +.fa-plus-square:before{ + content:"" +} +.fa-angle-double-left:before{ + content:"" +} +.fa-angle-double-right:before{ + content:"" +} +.fa-angle-double-up:before{ + content:"" +} +.fa-angle-double-down:before{ + content:"" +} +.fa-angle-left:before{ + content:"" +} +.fa-angle-right:before{ + content:"" +} +.fa-angle-up:before{ + content:"" +} +.fa-angle-down:before{ + content:"" +} +.fa-desktop:before{ + content:"" +} +.fa-laptop:before{ + content:"" +} +.fa-tablet:before{ + content:"" +} +.fa-mobile-phone:before,.fa-mobile:before{ + content:"" +} +.fa-circle-o:before{ + content:"" +} +.fa-quote-left:before{ + content:"" +} +.fa-quote-right:before{ + content:"" +} +.fa-spinner:before{ + content:"" +} +.fa-circle:before{ + content:"" +} +.fa-mail-reply:before,.fa-reply:before{ + content:"" +} +.fa-github-alt:before{ + content:"" +} +.fa-folder-o:before{ + content:"" +} +.fa-folder-open-o:before{ + content:"" +} +.fa-smile-o:before{ + content:"" +} +.fa-frown-o:before{ + content:"" +} +.fa-meh-o:before{ + content:"" +} +.fa-gamepad:before{ + content:"" +} +.fa-keyboard-o:before{ + content:"" +} +.fa-flag-o:before{ + content:"" +} +.fa-flag-checkered:before{ + content:"" +} +.fa-terminal:before{ + content:"" +} +.fa-code:before{ + content:"" +} +.fa-mail-reply-all:before,.fa-reply-all:before{ + content:"" +} +.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{ + content:"" +} +.fa-location-arrow:before{ + content:"" +} +.fa-crop:before{ + content:"" +} +.fa-code-fork:before{ + content:"" +} +.fa-chain-broken:before,.fa-unlink:before{ + content:"" +} +.fa-question:before{ + content:"" +} +.fa-info:before{ + content:"" +} +.fa-exclamation:before{ + content:"" +} +.fa-superscript:before{ + content:"" +} +.fa-subscript:before{ + content:"" +} +.fa-eraser:before{ + content:"" +} +.fa-puzzle-piece:before{ + content:"" +} +.fa-microphone:before{ + content:"" +} +.fa-microphone-slash:before{ + content:"" +} +.fa-shield:before{ + content:"" +} +.fa-calendar-o:before{ + content:"" +} +.fa-fire-extinguisher:before{ + content:"" +} +.fa-rocket:before{ + content:"" +} +.fa-maxcdn:before{ + content:"" +} +.fa-chevron-circle-left:before{ + content:"" +} +.fa-chevron-circle-right:before{ + content:"" +} +.fa-chevron-circle-up:before{ + content:"" +} +.fa-chevron-circle-down:before{ + content:"" +} +.fa-html5:before{ + content:"" +} +.fa-css3:before{ + content:"" +} +.fa-anchor:before{ + content:"" +} +.fa-unlock-alt:before{ + content:"" +} +.fa-bullseye:before{ + content:"" +} +.fa-ellipsis-h:before{ + content:"" +} +.fa-ellipsis-v:before{ + content:"" +} +.fa-rss-square:before{ + content:"" +} +.fa-play-circle:before{ + content:"" +} +.fa-ticket:before{ + content:"" +} +.fa-minus-square:before{ + content:"" +} +.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{ + content:"" +} +.fa-level-up:before{ + content:"" +} +.fa-level-down:before{ + content:"" +} +.fa-check-square:before{ + content:"" +} +.fa-pencil-square:before{ + content:"" +} +.fa-external-link-square:before{ + content:"" +} +.fa-share-square:before{ + content:"" +} +.fa-compass:before{ + content:"" +} +.fa-caret-square-o-down:before,.fa-toggle-down:before{ + content:"" +} +.fa-caret-square-o-up:before,.fa-toggle-up:before{ + content:"" +} +.fa-caret-square-o-right:before,.fa-toggle-right:before{ + content:"" +} +.fa-eur:before,.fa-euro:before{ + content:"" +} +.fa-gbp:before{ + content:"" +} +.fa-dollar:before,.fa-usd:before{ + content:"" +} +.fa-inr:before,.fa-rupee:before{ + content:"" +} +.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{ + content:"" +} +.fa-rouble:before,.fa-rub:before,.fa-ruble:before{ + content:"" +} +.fa-krw:before,.fa-won:before{ + content:"" +} +.fa-bitcoin:before,.fa-btc:before{ + content:"" +} +.fa-file:before{ + content:"" +} +.fa-file-text:before{ + content:"" +} +.fa-sort-alpha-asc:before{ + content:"" +} +.fa-sort-alpha-desc:before{ + content:"" +} +.fa-sort-amount-asc:before{ + content:"" +} +.fa-sort-amount-desc:before{ + content:"" +} +.fa-sort-numeric-asc:before{ + content:"" +} +.fa-sort-numeric-desc:before{ + content:"" +} +.fa-thumbs-up:before{ + content:"" +} +.fa-thumbs-down:before{ + content:"" +} +.fa-youtube-square:before{ + content:"" +} +.fa-youtube:before{ + content:"" +} +.fa-xing:before{ + content:"" +} +.fa-xing-square:before{ + content:"" +} +.fa-youtube-play:before{ + content:"" +} +.fa-dropbox:before{ + content:"" +} +.fa-stack-overflow:before{ + content:"" +} +.fa-instagram:before{ + content:"" +} +.fa-flickr:before{ + content:"" +} +.fa-adn:before{ + content:"" +} +.fa-bitbucket:before,.icon-bitbucket:before{ + content:"" +} +.fa-bitbucket-square:before{ + content:"" +} +.fa-tumblr:before{ + content:"" +} +.fa-tumblr-square:before{ + content:"" +} +.fa-long-arrow-down:before{ + content:"" +} +.fa-long-arrow-up:before{ + content:"" +} +.fa-long-arrow-left:before{ + content:"" +} +.fa-long-arrow-right:before{ + content:"" +} +.fa-apple:before{ + content:"" +} +.fa-windows:before{ + content:"" +} +.fa-android:before{ + content:"" +} +.fa-linux:before{ + content:"" +} +.fa-dribbble:before{ + content:"" +} +.fa-skype:before{ + content:"" +} +.fa-foursquare:before{ + content:"" +} +.fa-trello:before{ + content:"" +} +.fa-female:before{ + content:"" +} +.fa-male:before{ + content:"" +} +.fa-gittip:before,.fa-gratipay:before{ + content:"" +} +.fa-sun-o:before{ + content:"" +} +.fa-moon-o:before{ + content:"" +} +.fa-archive:before{ + content:"" +} +.fa-bug:before{ + content:"" +} +.fa-vk:before{ + content:"" +} +.fa-weibo:before{ + content:"" +} +.fa-renren:before{ + content:"" +} +.fa-pagelines:before{ + content:"" +} +.fa-stack-exchange:before{ + content:"" +} +.fa-arrow-circle-o-right:before{ + content:"" +} +.fa-arrow-circle-o-left:before{ + content:"" +} +.fa-caret-square-o-left:before,.fa-toggle-left:before{ + content:"" +} +.fa-dot-circle-o:before{ + content:"" +} +.fa-wheelchair:before{ + content:"" +} +.fa-vimeo-square:before{ + content:"" +} +.fa-try:before,.fa-turkish-lira:before{ + content:"" +} +.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{ + content:"" +} +.fa-space-shuttle:before{ + content:"" +} +.fa-slack:before{ + content:"" +} +.fa-envelope-square:before{ + content:"" +} +.fa-wordpress:before{ + content:"" +} +.fa-openid:before{ + content:"" +} +.fa-bank:before,.fa-institution:before,.fa-university:before{ + content:"" +} +.fa-graduation-cap:before,.fa-mortar-board:before{ + content:"" +} +.fa-yahoo:before{ + content:"" +} +.fa-google:before{ + content:"" +} +.fa-reddit:before{ + content:"" +} +.fa-reddit-square:before{ + content:"" +} +.fa-stumbleupon-circle:before{ + content:"" +} +.fa-stumbleupon:before{ + content:"" +} +.fa-delicious:before{ + content:"" +} +.fa-digg:before{ + content:"" +} +.fa-pied-piper-pp:before{ + content:"" +} +.fa-pied-piper-alt:before{ + content:"" +} +.fa-drupal:before{ + content:"" +} +.fa-joomla:before{ + content:"" +} +.fa-language:before{ + content:"" +} +.fa-fax:before{ + content:"" +} +.fa-building:before{ + content:"" +} +.fa-child:before{ + content:"" +} +.fa-paw:before{ + content:"" +} +.fa-spoon:before{ + content:"" +} +.fa-cube:before{ + content:"" +} +.fa-cubes:before{ + content:"" +} +.fa-behance:before{ + content:"" +} +.fa-behance-square:before{ + content:"" +} +.fa-steam:before{ + content:"" +} +.fa-steam-square:before{ + content:"" +} +.fa-recycle:before{ + content:"" +} +.fa-automobile:before,.fa-car:before{ + content:"" +} +.fa-cab:before,.fa-taxi:before{ + content:"" +} +.fa-tree:before{ + content:"" +} +.fa-spotify:before{ + content:"" +} +.fa-deviantart:before{ + content:"" +} +.fa-soundcloud:before{ + content:"" +} +.fa-database:before{ + content:"" +} +.fa-file-pdf-o:before{ + content:"" +} +.fa-file-word-o:before{ + content:"" +} +.fa-file-excel-o:before{ + content:"" +} +.fa-file-powerpoint-o:before{ + content:"" +} +.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{ + content:"" +} +.fa-file-archive-o:before,.fa-file-zip-o:before{ + content:"" +} +.fa-file-audio-o:before,.fa-file-sound-o:before{ + content:"" +} +.fa-file-movie-o:before,.fa-file-video-o:before{ + content:"" +} +.fa-file-code-o:before{ + content:"" +} +.fa-vine:before{ + content:"" +} +.fa-codepen:before{ + content:"" +} +.fa-jsfiddle:before{ + content:"" +} +.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{ + content:"" +} +.fa-circle-o-notch:before{ + content:"" +} +.fa-ra:before,.fa-rebel:before,.fa-resistance:before{ + content:"" +} +.fa-empire:before,.fa-ge:before{ + content:"" +} +.fa-git-square:before{ + content:"" +} +.fa-git:before{ + content:"" +} +.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{ + content:"" +} +.fa-tencent-weibo:before{ + content:"" +} +.fa-qq:before{ + content:"" +} +.fa-wechat:before,.fa-weixin:before{ + content:"" +} +.fa-paper-plane:before,.fa-send:before{ + content:"" +} +.fa-paper-plane-o:before,.fa-send-o:before{ + content:"" +} +.fa-history:before{ + content:"" +} +.fa-circle-thin:before{ + content:"" +} +.fa-header:before{ + content:"" +} +.fa-paragraph:before{ + content:"" +} +.fa-sliders:before{ + content:"" +} +.fa-share-alt:before{ + content:"" +} +.fa-share-alt-square:before{ + content:"" +} +.fa-bomb:before{ + content:"" +} +.fa-futbol-o:before,.fa-soccer-ball-o:before{ + content:"" +} +.fa-tty:before{ + content:"" +} +.fa-binoculars:before{ + content:"" +} +.fa-plug:before{ + content:"" +} +.fa-slideshare:before{ + content:"" +} +.fa-twitch:before{ + content:"" +} +.fa-yelp:before{ + content:"" +} +.fa-newspaper-o:before{ + content:"" +} +.fa-wifi:before{ + content:"" +} +.fa-calculator:before{ + content:"" +} +.fa-paypal:before{ + content:"" +} +.fa-google-wallet:before{ + content:"" +} +.fa-cc-visa:before{ + content:"" +} +.fa-cc-mastercard:before{ + content:"" +} +.fa-cc-discover:before{ + content:"" +} +.fa-cc-amex:before{ + content:"" +} +.fa-cc-paypal:before{ + content:"" +} +.fa-cc-stripe:before{ + content:"" +} +.fa-bell-slash:before{ + content:"" +} +.fa-bell-slash-o:before{ + content:"" +} +.fa-trash:before{ + content:"" +} +.fa-copyright:before{ + content:"" +} +.fa-at:before{ + content:"" +} +.fa-eyedropper:before{ + content:"" +} +.fa-paint-brush:before{ + content:"" +} +.fa-birthday-cake:before{ + content:"" +} +.fa-area-chart:before{ + content:"" +} +.fa-pie-chart:before{ + content:"" +} +.fa-line-chart:before{ + content:"" +} +.fa-lastfm:before{ + content:"" +} +.fa-lastfm-square:before{ + content:"" +} +.fa-toggle-off:before{ + content:"" +} +.fa-toggle-on:before{ + content:"" +} +.fa-bicycle:before{ + content:"" +} +.fa-bus:before{ + content:"" +} +.fa-ioxhost:before{ + content:"" +} +.fa-angellist:before{ + content:"" +} +.fa-cc:before{ + content:"" +} +.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{ + content:"" +} +.fa-meanpath:before{ + content:"" +} +.fa-buysellads:before{ + content:"" +} +.fa-connectdevelop:before{ + content:"" +} +.fa-dashcube:before{ + content:"" +} +.fa-forumbee:before{ + content:"" +} +.fa-leanpub:before{ + content:"" +} +.fa-sellsy:before{ + content:"" +} +.fa-shirtsinbulk:before{ + content:"" +} +.fa-simplybuilt:before{ + content:"" +} +.fa-skyatlas:before{ + content:"" +} +.fa-cart-plus:before{ + content:"" +} +.fa-cart-arrow-down:before{ + content:"" +} +.fa-diamond:before{ + content:"" +} +.fa-ship:before{ + content:"" +} +.fa-user-secret:before{ + content:"" +} +.fa-motorcycle:before{ + content:"" +} +.fa-street-view:before{ + content:"" +} +.fa-heartbeat:before{ + content:"" +} +.fa-venus:before{ + content:"" +} +.fa-mars:before{ + content:"" +} +.fa-mercury:before{ + content:"" +} +.fa-intersex:before,.fa-transgender:before{ + content:"" +} +.fa-transgender-alt:before{ + content:"" +} +.fa-venus-double:before{ + content:"" +} +.fa-mars-double:before{ + content:"" +} +.fa-venus-mars:before{ + content:"" +} +.fa-mars-stroke:before{ + content:"" +} +.fa-mars-stroke-v:before{ + content:"" +} +.fa-mars-stroke-h:before{ + content:"" +} +.fa-neuter:before{ + content:"" +} +.fa-genderless:before{ + content:"" +} +.fa-facebook-official:before{ + content:"" +} +.fa-pinterest-p:before{ + content:"" +} +.fa-whatsapp:before{ + content:"" +} +.fa-server:before{ + content:"" +} +.fa-user-plus:before{ + content:"" +} +.fa-user-times:before{ + content:"" +} +.fa-bed:before,.fa-hotel:before{ + content:"" +} +.fa-viacoin:before{ + content:"" +} +.fa-train:before{ + content:"" +} +.fa-subway:before{ + content:"" +} +.fa-medium:before{ + content:"" +} +.fa-y-combinator:before,.fa-yc:before{ + content:"" +} +.fa-optin-monster:before{ + content:"" +} +.fa-opencart:before{ + content:"" +} +.fa-expeditedssl:before{ + content:"" +} +.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{ + content:"" +} +.fa-battery-3:before,.fa-battery-three-quarters:before{ + content:"" +} +.fa-battery-2:before,.fa-battery-half:before{ + content:"" +} +.fa-battery-1:before,.fa-battery-quarter:before{ + content:"" +} +.fa-battery-0:before,.fa-battery-empty:before{ + content:"" +} +.fa-mouse-pointer:before{ + content:"" +} +.fa-i-cursor:before{ + content:"" +} +.fa-object-group:before{ + content:"" +} +.fa-object-ungroup:before{ + content:"" +} +.fa-sticky-note:before{ + content:"" +} +.fa-sticky-note-o:before{ + content:"" +} +.fa-cc-jcb:before{ + content:"" +} +.fa-cc-diners-club:before{ + content:"" +} +.fa-clone:before{ + content:"" +} +.fa-balance-scale:before{ + content:"" +} +.fa-hourglass-o:before{ + content:"" +} +.fa-hourglass-1:before,.fa-hourglass-start:before{ + content:"" +} +.fa-hourglass-2:before,.fa-hourglass-half:before{ + content:"" +} +.fa-hourglass-3:before,.fa-hourglass-end:before{ + content:"" +} +.fa-hourglass:before{ + content:"" +} +.fa-hand-grab-o:before,.fa-hand-rock-o:before{ + content:"" +} +.fa-hand-paper-o:before,.fa-hand-stop-o:before{ + content:"" +} +.fa-hand-scissors-o:before{ + content:"" +} +.fa-hand-lizard-o:before{ + content:"" +} +.fa-hand-spock-o:before{ + content:"" +} +.fa-hand-pointer-o:before{ + content:"" +} +.fa-hand-peace-o:before{ + content:"" +} +.fa-trademark:before{ + content:"" +} +.fa-registered:before{ + content:"" +} +.fa-creative-commons:before{ + content:"" +} +.fa-gg:before{ + content:"" +} +.fa-gg-circle:before{ + content:"" +} +.fa-tripadvisor:before{ + content:"" +} +.fa-odnoklassniki:before{ + content:"" +} +.fa-odnoklassniki-square:before{ + content:"" +} +.fa-get-pocket:before{ + content:"" +} +.fa-wikipedia-w:before{ + content:"" +} +.fa-safari:before{ + content:"" +} +.fa-chrome:before{ + content:"" +} +.fa-firefox:before{ + content:"" +} +.fa-opera:before{ + content:"" +} +.fa-internet-explorer:before{ + content:"" +} +.fa-television:before,.fa-tv:before{ + content:"" +} +.fa-contao:before{ + content:"" +} +.fa-500px:before{ + content:"" +} +.fa-amazon:before{ + content:"" +} +.fa-calendar-plus-o:before{ + content:"" +} +.fa-calendar-minus-o:before{ + content:"" +} +.fa-calendar-times-o:before{ + content:"" +} +.fa-calendar-check-o:before{ + content:"" +} +.fa-industry:before{ + content:"" +} +.fa-map-pin:before{ + content:"" +} +.fa-map-signs:before{ + content:"" +} +.fa-map-o:before{ + content:"" +} +.fa-map:before{ + content:"" +} +.fa-commenting:before{ + content:"" +} +.fa-commenting-o:before{ + content:"" +} +.fa-houzz:before{ + content:"" +} +.fa-vimeo:before{ + content:"" +} +.fa-black-tie:before{ + content:"" +} +.fa-fonticons:before{ + content:"" +} +.fa-reddit-alien:before{ + content:"" +} +.fa-edge:before{ + content:"" +} +.fa-credit-card-alt:before{ + content:"" +} +.fa-codiepie:before{ + content:"" +} +.fa-modx:before{ + content:"" +} +.fa-fort-awesome:before{ + content:"" +} +.fa-usb:before{ + content:"" +} +.fa-product-hunt:before{ + content:"" +} +.fa-mixcloud:before{ + content:"" +} +.fa-scribd:before{ + content:"" +} +.fa-pause-circle:before{ + content:"" +} +.fa-pause-circle-o:before{ + content:"" +} +.fa-stop-circle:before{ + content:"" +} +.fa-stop-circle-o:before{ + content:"" +} +.fa-shopping-bag:before{ + content:"" +} +.fa-shopping-basket:before{ + content:"" +} +.fa-hashtag:before{ + content:"" +} +.fa-bluetooth:before{ + content:"" +} +.fa-bluetooth-b:before{ + content:"" +} +.fa-percent:before{ + content:"" +} +.fa-gitlab:before,.icon-gitlab:before{ + content:"" +} +.fa-wpbeginner:before{ + content:"" +} +.fa-wpforms:before{ + content:"" +} +.fa-envira:before{ + content:"" +} +.fa-universal-access:before{ + content:"" +} +.fa-wheelchair-alt:before{ + content:"" +} +.fa-question-circle-o:before{ + content:"" +} +.fa-blind:before{ + content:"" +} +.fa-audio-description:before{ + content:"" +} +.fa-volume-control-phone:before{ + content:"" +} +.fa-braille:before{ + content:"" +} +.fa-assistive-listening-systems:before{ + content:"" +} +.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{ + content:"" +} +.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{ + content:"" +} +.fa-glide:before{ + content:"" +} +.fa-glide-g:before{ + content:"" +} +.fa-sign-language:before,.fa-signing:before{ + content:"" +} +.fa-low-vision:before{ + content:"" +} +.fa-viadeo:before{ + content:"" +} +.fa-viadeo-square:before{ + content:"" +} +.fa-snapchat:before{ + content:"" +} +.fa-snapchat-ghost:before{ + content:"" +} +.fa-snapchat-square:before{ + content:"" +} +.fa-pied-piper:before{ + content:"" +} +.fa-first-order:before{ + content:"" +} +.fa-yoast:before{ + content:"" +} +.fa-themeisle:before{ + content:"" +} +.fa-google-plus-circle:before,.fa-google-plus-official:before{ + content:"" +} +.fa-fa:before,.fa-font-awesome:before{ + content:"" +} +.fa-handshake-o:before{ + content:"" +} +.fa-envelope-open:before{ + content:"" +} +.fa-envelope-open-o:before{ + content:"" +} +.fa-linode:before{ + content:"" +} +.fa-address-book:before{ + content:"" +} +.fa-address-book-o:before{ + content:"" +} +.fa-address-card:before,.fa-vcard:before{ + content:"" +} +.fa-address-card-o:before,.fa-vcard-o:before{ + content:"" +} +.fa-user-circle:before{ + content:"" +} +.fa-user-circle-o:before{ + content:"" +} +.fa-user-o:before{ + content:"" +} +.fa-id-badge:before{ + content:"" +} +.fa-drivers-license:before,.fa-id-card:before{ + content:"" +} +.fa-drivers-license-o:before,.fa-id-card-o:before{ + content:"" +} +.fa-quora:before{ + content:"" +} +.fa-free-code-camp:before{ + content:"" +} +.fa-telegram:before{ + content:"" +} +.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{ + content:"" +} +.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{ + content:"" +} +.fa-thermometer-2:before,.fa-thermometer-half:before{ + content:"" +} +.fa-thermometer-1:before,.fa-thermometer-quarter:before{ + content:"" +} +.fa-thermometer-0:before,.fa-thermometer-empty:before{ + content:"" +} +.fa-shower:before{ + content:"" +} +.fa-bath:before,.fa-bathtub:before,.fa-s15:before{ + content:"" +} +.fa-podcast:before{ + content:"" +} +.fa-window-maximize:before{ + content:"" +} +.fa-window-minimize:before{ + content:"" +} +.fa-window-restore:before{ + content:"" +} +.fa-times-rectangle:before,.fa-window-close:before{ + content:"" +} +.fa-times-rectangle-o:before,.fa-window-close-o:before{ + content:"" +} +.fa-bandcamp:before{ + content:"" +} +.fa-grav:before{ + content:"" +} +.fa-etsy:before{ + content:"" +} +.fa-imdb:before{ + content:"" +} +.fa-ravelry:before{ + content:"" +} +.fa-eercast:before{ + content:"" +} +.fa-microchip:before{ + content:"" +} +.fa-snowflake-o:before{ + content:"" +} +.fa-superpowers:before{ + content:"" +} +.fa-wpexplorer:before{ + content:"" +} +.fa-meetup:before{ + content:"" +} +.sr-only{ + position:absolute; + width:1px; + height:1px; + padding:0; + margin:-1px; + overflow:hidden; + clip:rect(0,0,0,0); + border:0 +} +.sr-only-focusable:active,.sr-only-focusable:focus{ + position:static; + width:auto; + height:auto; + margin:0; + overflow:visible; + clip:auto +} +.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{ + font-family:inherit +} +.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{ + font-family:FontAwesome; + display:inline-block; + font-style:normal; + font-weight:400; + line-height:1; + text-decoration:inherit +} +.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{ + display:inline-block; + text-decoration:inherit +} +.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{ + display:inline +} +.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{ + line-height:.9em +} +.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{ + display:inline-block +} +.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{ + opacity:.5; + -webkit-transition:opacity .05s ease-in; + -moz-transition:opacity .05s ease-in; + transition:opacity .05s ease-in +} +.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{ + opacity:1 +} +.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{ + font-size:14px; + vertical-align:-15% +} +.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{ + padding:12px; + line-height:24px; + margin-bottom:24px; + background:#e7f2fa +} +.rst-content .admonition-title,.wy-alert-title{ + font-weight:700; + display:block; + color:#fff; + background:#6ab0de; + padding:6px 12px; + margin:-12px -12px 12px +} +.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{ + background:#fdf3f2 +} +.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{ + background:#f29f97 +} +.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{ + background:#ffedcc +} +.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{ + background:#f0b37e +} +.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{ + background:#e7f2fa +} +.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{ + background:#6ab0de +} +.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{ + background:#dbfaf4 +} +.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{ + background:#1abc9c +} +.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{ + background:#f3f6f6 +} +.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{ + color:#404040; + background:#e1e4e5 +} +.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{ + color:#2980b9 +} +.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{ + margin-bottom:0 +} +.wy-tray-container{ + position:fixed; + bottom:0; + left:0; + z-index:600 +} +.wy-tray-container li{ + display:block; + width:300px; + background:transparent; + color:#fff; + text-align:center; + box-shadow:0 5px 5px 0 rgba(0,0,0,.1); + padding:0 24px; + min-width:20%; + opacity:0; + height:0; + line-height:56px; + overflow:hidden; + -webkit-transition:all .3s ease-in; + -moz-transition:all .3s ease-in; + transition:all .3s ease-in +} +.wy-tray-container li.wy-tray-item-success{ + background:#27ae60 +} +.wy-tray-container li.wy-tray-item-info{ + background:#2980b9 +} +.wy-tray-container li.wy-tray-item-warning{ + background:#e67e22 +} +.wy-tray-container li.wy-tray-item-danger{ + background:#e74c3c +} +.wy-tray-container li.on{ + opacity:1; + height:56px +} +@media screen and (max-width:768px){ + .wy-tray-container{ + bottom:auto; + top:0; + width:100% + } + .wy-tray-container li{ + width:100% + } +} +button{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle; + cursor:pointer; + line-height:normal; + -webkit-appearance:button; + *overflow:visible +} +button::-moz-focus-inner,input::-moz-focus-inner{ + border:0; + padding:0 +} +button[disabled]{ + cursor:default +} +.btn{ + display:inline-block; + border-radius:2px; + line-height:normal; + white-space:nowrap; + text-align:center; + cursor:pointer; + font-size:100%; + padding:6px 12px 8px; + color:#fff; + border:1px solid rgba(0,0,0,.1); + background-color:#27ae60; + text-decoration:none; + font-weight:400; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1); + outline-none:false; + vertical-align:middle; + *display:inline; + zoom:1; + -webkit-user-drag:none; + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; + -webkit-transition:all .1s linear; + -moz-transition:all .1s linear; + transition:all .1s linear +} +.btn-hover{ + background:#2e8ece; + color:#fff +} +.btn:hover{ + background:#2cc36b; + color:#fff +} +.btn:focus{ + background:#2cc36b; + outline:0 +} +.btn:active{ + box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1); + padding:8px 12px 6px +} +.btn:visited{ + color:#fff +} +.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:.4; + cursor:not-allowed; + box-shadow:none +} +.btn::-moz-focus-inner{ + padding:0; + border:0 +} +.btn-small{ + font-size:80% +} +.btn-info{ + background-color:#2980b9!important +} +.btn-info:hover{ + background-color:#2e8ece!important +} +.btn-neutral{ + background-color:#f3f6f6!important; + color:#404040!important +} +.btn-neutral:hover{ + background-color:#e5ebeb!important; + color:#404040 +} +.btn-neutral:visited{ + color:#404040!important +} +.btn-success{ + background-color:#27ae60!important +} +.btn-success:hover{ + background-color:#295!important +} +.btn-danger{ + background-color:#e74c3c!important +} +.btn-danger:hover{ + background-color:#ea6153!important +} +.btn-warning{ + background-color:#e67e22!important +} +.btn-warning:hover{ + background-color:#e98b39!important +} +.btn-invert{ + background-color:#222 +} +.btn-invert:hover{ + background-color:#2f2f2f!important +} +.btn-link{ + background-color:transparent!important; + color:#2980b9; + box-shadow:none; + border-color:transparent!important +} +.btn-link:active,.btn-link:hover{ + background-color:transparent!important; + color:#409ad5!important; + box-shadow:none +} +.btn-link:visited{ + color:#9b59b6 +} +.wy-btn-group .btn,.wy-control .btn{ + vertical-align:middle +} +.wy-btn-group{ + margin-bottom:24px; + *zoom:1 +} +.wy-btn-group:after,.wy-btn-group:before{ + display:table; + content:"" +} +.wy-btn-group:after{ + clear:both +} +.wy-dropdown{ + position:relative; + display:inline-block +} +.wy-dropdown-active .wy-dropdown-menu{ + display:block +} +.wy-dropdown-menu{ + position:absolute; + left:0; + display:none; + float:left; + top:100%; + min-width:100%; + background:#fcfcfc; + z-index:100; + border:1px solid #cfd7dd; + box-shadow:0 2px 2px 0 rgba(0,0,0,.1); + padding:12px +} +.wy-dropdown-menu>dd>a{ + display:block; + clear:both; + color:#404040; + white-space:nowrap; + font-size:90%; + padding:0 12px; + cursor:pointer +} +.wy-dropdown-menu>dd>a:hover{ + background:#2980b9; + color:#fff +} +.wy-dropdown-menu>dd.divider{ + border-top:1px solid #cfd7dd; + margin:6px 0 +} +.wy-dropdown-menu>dd.search{ + padding-bottom:12px +} +.wy-dropdown-menu>dd.search input[type=search]{ + width:100% +} +.wy-dropdown-menu>dd.call-to-action{ + background:#e3e3e3; + text-transform:uppercase; + font-weight:500; + font-size:80% +} +.wy-dropdown-menu>dd.call-to-action:hover{ + background:#e3e3e3 +} +.wy-dropdown-menu>dd.call-to-action .btn{ + color:#fff +} +.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{ + bottom:100%; + top:auto; + left:auto; + right:0 +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{ + background:#fcfcfc; + margin-top:2px +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{ + padding:6px 12px +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{ + background:#2980b9; + color:#fff +} +.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{ + right:0; + left:auto; + text-align:right +} +.wy-dropdown-arrow:before{ + content:" "; + border-bottom:5px solid #f5f5f5; + border-left:5px solid transparent; + border-right:5px solid transparent; + position:absolute; + display:block; + top:-4px; + left:50%; + margin-left:-3px +} +.wy-dropdown-arrow.wy-dropdown-arrow-left:before{ + left:11px +} +.wy-form-stacked select{ + display:block +} +.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle +} +.wy-form-aligned .wy-control-group>label{ + display:inline-block; + vertical-align:middle; + width:10em; + margin:6px 12px 0 0; + float:left +} +.wy-form-aligned .wy-control{ + float:left +} +.wy-form-aligned .wy-control label{ + display:block +} +.wy-form-aligned .wy-control select{ + margin-top:6px +} +fieldset{ + margin:0 +} +fieldset,legend{ + border:0; + padding:0 +} +legend{ + width:100%; + white-space:normal; + margin-bottom:24px; + font-size:150%; + *margin-left:-7px +} +label,legend{ + display:block +} +label{ + margin:0 0 .3125em; + color:#333; + font-size:90% +} +input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle +} +.wy-control-group{ + margin-bottom:24px; + max-width:1200px; + margin-left:auto; + margin-right:auto; + *zoom:1 +} +.wy-control-group:after,.wy-control-group:before{ + display:table; + content:"" +} +.wy-control-group:after{ + clear:both +} +.wy-control-group.wy-control-group-required>label:after{ + content:" *"; + color:#e74c3c +} +.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{ + padding-bottom:12px +} +.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{ + width:100% +} +.wy-control-group .wy-form-full{ + float:left; + display:block; + width:100%; + margin-right:0 +} +.wy-control-group .wy-form-full:last-child{ + margin-right:0 +} +.wy-control-group .wy-form-halves{ + float:left; + display:block; + margin-right:2.35765%; + width:48.82117% +} +.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){ + margin-right:0 +} +.wy-control-group .wy-form-halves:nth-of-type(odd){ + clear:left +} +.wy-control-group .wy-form-thirds{ + float:left; + display:block; + margin-right:2.35765%; + width:31.76157% +} +.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){ + margin-right:0 +} +.wy-control-group .wy-form-thirds:nth-of-type(3n+1){ + clear:left +} +.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{ + margin:6px 0 0; + font-size:90% +} +.wy-control-no-input{ + display:inline-block +} +.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{ + width:100% +} +.wy-form-message-inline{ + padding-left:.3em; + color:#666; + font-size:90% +} +.wy-form-message{ + display:block; + color:#999; + font-size:70%; + margin-top:.3125em; + font-style:italic +} +.wy-form-message p{ + font-size:inherit; + font-style:italic; + margin-bottom:6px +} +.wy-form-message p:last-child{ + margin-bottom:0 +} +input{ + line-height:normal +} +input[type=button],input[type=reset],input[type=submit]{ + -webkit-appearance:button; + cursor:pointer; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + *overflow:visible +} +input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{ + -webkit-appearance:none; + padding:6px; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + box-shadow:inset 0 1px 3px #ddd; + border-radius:0; + -webkit-transition:border .3s linear; + -moz-transition:border .3s linear; + transition:border .3s linear +} +input[type=datetime-local]{ + padding:.34375em .625em +} +input[disabled]{ + cursor:default +} +input[type=checkbox],input[type=radio]{ + padding:0; + margin-right:.3125em; + *height:13px; + *width:13px +} +input[type=checkbox],input[type=radio],input[type=search]{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box +} +input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{ + -webkit-appearance:none +} +input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{ + outline:0; + outline:thin dotted\9; + border-color:#333 +} +input.no-focus:focus{ + border-color:#ccc!important +} +input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{ + outline:thin dotted #333; + outline:1px auto #129fea +} +input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{ + cursor:not-allowed; + background-color:#fafafa +} +input:focus:invalid,select:focus:invalid,textarea:focus:invalid{ + color:#e74c3c; + border:1px solid #e74c3c +} +input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{ + border-color:#e74c3c +} +input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{ + outline-color:#e74c3c +} +input.wy-input-large{ + padding:12px; + font-size:100% +} +textarea{ + overflow:auto; + vertical-align:top; + width:100%; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif +} +select,textarea{ + padding:.5em .625em; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + box-shadow:inset 0 1px 3px #ddd; + -webkit-transition:border .3s linear; + -moz-transition:border .3s linear; + transition:border .3s linear +} +select{ + border:1px solid #ccc; + background-color:#fff +} +select[multiple]{ + height:auto +} +select:focus,textarea:focus{ + outline:0 +} +input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{ + cursor:not-allowed; + background-color:#fafafa +} +input[type=checkbox][disabled],input[type=radio][disabled]{ + cursor:not-allowed +} +.wy-checkbox,.wy-radio{ + margin:6px 0; + color:#404040; + display:block +} +.wy-checkbox input,.wy-radio input{ + vertical-align:baseline +} +.wy-form-message-inline{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle +} +.wy-input-prefix,.wy-input-suffix{ + white-space:nowrap; + padding:6px +} +.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{ + line-height:27px; + padding:0 8px; + display:inline-block; + font-size:80%; + background-color:#f3f6f6; + border:1px solid #ccc; + color:#999 +} +.wy-input-suffix .wy-input-context{ + border-left:0 +} +.wy-input-prefix .wy-input-context{ + border-right:0 +} +.wy-switch{ + position:relative; + display:block; + height:24px; + margin-top:12px; + cursor:pointer +} +.wy-switch:before{ + left:0; + top:0; + width:36px; + height:12px; + background:#ccc +} +.wy-switch:after,.wy-switch:before{ + position:absolute; + content:""; + display:block; + border-radius:4px; + -webkit-transition:all .2s ease-in-out; + -moz-transition:all .2s ease-in-out; + transition:all .2s ease-in-out +} +.wy-switch:after{ + width:18px; + height:18px; + background:#999; + left:-3px; + top:-3px +} +.wy-switch span{ + position:absolute; + left:48px; + display:block; + font-size:12px; + color:#ccc; + line-height:1 +} +.wy-switch.active:before{ + background:#1e8449 +} +.wy-switch.active:after{ + left:24px; + background:#27ae60 +} +.wy-switch.disabled{ + cursor:not-allowed; + opacity:.8 +} +.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{ + color:#e74c3c +} +.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{ + border:1px solid #e74c3c +} +.wy-inline-validate{ + white-space:nowrap +} +.wy-inline-validate .wy-input-context{ + padding:.5em .625em; + display:inline-block; + font-size:80% +} +.wy-inline-validate.wy-inline-validate-success .wy-input-context{ + color:#27ae60 +} +.wy-inline-validate.wy-inline-validate-danger .wy-input-context{ + color:#e74c3c +} +.wy-inline-validate.wy-inline-validate-warning .wy-input-context{ + color:#e67e22 +} +.wy-inline-validate.wy-inline-validate-info .wy-input-context{ + color:#2980b9 +} +.rotate-90{ + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -ms-transform:rotate(90deg); + -o-transform:rotate(90deg); + transform:rotate(90deg) +} +.rotate-180{ + -webkit-transform:rotate(180deg); + -moz-transform:rotate(180deg); + -ms-transform:rotate(180deg); + -o-transform:rotate(180deg); + transform:rotate(180deg) +} +.rotate-270{ + -webkit-transform:rotate(270deg); + -moz-transform:rotate(270deg); + -ms-transform:rotate(270deg); + -o-transform:rotate(270deg); + transform:rotate(270deg) +} +.mirror{ + -webkit-transform:scaleX(-1); + -moz-transform:scaleX(-1); + -ms-transform:scaleX(-1); + -o-transform:scaleX(-1); + transform:scaleX(-1) +} +.mirror.rotate-90{ + -webkit-transform:scaleX(-1) rotate(90deg); + -moz-transform:scaleX(-1) rotate(90deg); + -ms-transform:scaleX(-1) rotate(90deg); + -o-transform:scaleX(-1) rotate(90deg); + transform:scaleX(-1) rotate(90deg) +} +.mirror.rotate-180{ + -webkit-transform:scaleX(-1) rotate(180deg); + -moz-transform:scaleX(-1) rotate(180deg); + -ms-transform:scaleX(-1) rotate(180deg); + -o-transform:scaleX(-1) rotate(180deg); + transform:scaleX(-1) rotate(180deg) +} +.mirror.rotate-270{ + -webkit-transform:scaleX(-1) rotate(270deg); + -moz-transform:scaleX(-1) rotate(270deg); + -ms-transform:scaleX(-1) rotate(270deg); + -o-transform:scaleX(-1) rotate(270deg); + transform:scaleX(-1) rotate(270deg) +} +@media only screen and (max-width:480px){ + .wy-form button[type=submit]{ + margin:.7em 0 0 + } + .wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{ + margin-bottom:.3em; + display:block + } + .wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{ + margin-bottom:0 + } + .wy-form-aligned .wy-control-group label{ + margin-bottom:.3em; + text-align:left; + display:block; + width:100% + } + .wy-form-aligned .wy-control{ + margin:1.5em 0 0 + } + .wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{ + display:block; + font-size:80%; + padding:6px 0 + } +} +@media screen and (max-width:768px){ + .tablet-hide{ + display:none + } +} +@media screen and (max-width:480px){ + .mobile-hide{ + display:none + } +} +.float-left{ + float:left +} +.float-right{ + float:right +} +.full-width{ + width:100% +} +.rst-content table.docutils,.rst-content table.field-list,.wy-table{ + border-collapse:collapse; + border-spacing:0; + empty-cells:show; + margin-bottom:24px +} +.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; + text-align:center +} +.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{ + font-size:90%; + margin:0; + overflow:visible; + padding:8px 16px +} +.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{ + border-left-width:0 +} +.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{ + color:#000; + text-align:left; + vertical-align:bottom; + white-space:nowrap +} +.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{ + font-weight:700; + border-bottom:2px solid #e1e4e5 +} +.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{ + background-color:transparent; + vertical-align:middle +} +.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{ + line-height:18px +} +.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{ + margin-bottom:0 +} +.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{ + width:1%; + padding-right:0 +} +.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{ + margin:0 +} +.wy-table-secondary{ + color:grey; + font-size:90% +} +.wy-table-tertiary{ + color:grey; + font-size:80% +} +.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{ + background-color:#f3f6f6 +} +.rst-content table.docutils,.wy-table-bordered-all{ + border:1px solid #e1e4e5 +} +.rst-content table.docutils td,.wy-table-bordered-all td{ + border-bottom:1px solid #e1e4e5; + border-left:1px solid #e1e4e5 +} +.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-bordered{ + border:1px solid #e1e4e5 +} +.wy-table-bordered-rows td{ + border-bottom:1px solid #e1e4e5 +} +.wy-table-bordered-rows tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-horizontal td,.wy-table-horizontal th{ + border-width:0 0 1px; + border-bottom:1px solid #e1e4e5 +} +.wy-table-horizontal tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-responsive{ + margin-bottom:24px; + max-width:100%; + overflow:auto +} +.wy-table-responsive table{ + margin-bottom:0!important +} +.wy-table-responsive table td,.wy-table-responsive table th{ + white-space:auto +} +a{ + color:#2980b9; + text-decoration:none; + cursor:pointer +} +a:hover{ + color:#3091d1 +} +a:visited{ + color:#9b59b6 +} +html{ + height:100% +} +body,html{ + overflow-x:hidden +} +body{ + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + font-weight:400; + color:#404040; + min-height:100%; + background:#edf0f2 +} +.wy-text-left{ + text-align:left +} +.wy-text-center{ + text-align:center +} +.wy-text-right{ + text-align:right +} +.wy-text-large{ + font-size:120% +} +.wy-text-normal{ + font-size:100% +} +.wy-text-small,small{ + font-size:80% +} +.wy-text-strike{ + text-decoration:line-through +} +.wy-text-warning{ + color:#e67e22!important +} +a.wy-text-warning:hover{ + color:#eb9950!important +} +.wy-text-info{ + color:#2980b9!important +} +a.wy-text-info:hover{ + color:#409ad5!important +} +.wy-text-success{ + color:#27ae60!important +} +a.wy-text-success:hover{ + color:#36d278!important +} +.wy-text-danger{ + color:#e74c3c!important +} +a.wy-text-danger:hover{ + color:#ed7669!important +} +.wy-text-neutral{ + color:#404040!important +} +a.wy-text-neutral:hover{ + color:#595959!important +} +.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{ + margin-top:0; + font-weight:700; + font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif +} +p{ + line-height:24px; + font-size:16px; + margin:0 0 24px; +} +h1{ + font-size:175% +} +.rst-content .toctree-wrapper>p.caption,h2{ + font-size:150% +} +h3{ + font-size:125% +} +h4{ + font-size:115% +} +h5{ + font-size:110% +} +h6{ + font-size:100% +} +hr{ + display:block; + height:1px; + border:0; + border-top:1px solid #e1e4e5; + margin:24px 0; + padding:0 +} +.rst-content code,.rst-content tt,code{ + white-space:nowrap; + max-width:100%; + background:#fff; + border:1px solid #e1e4e5; + font-size:75%; + padding:0 5px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + color:#e74c3c; + overflow-x:auto +} +.rst-content tt.code-large,code.code-large{ + font-size:90% +} +.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{ + list-style:disc; + line-height:24px; + margin-bottom:24px +} +.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{ + list-style:disc; + margin-left:24px +} +.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{ + margin-bottom:0 +} +.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{ + list-style:circle +} +.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{ + list-style:square +} +.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{ + list-style:decimal +} +.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{ + list-style:decimal; + line-height:24px; + margin-bottom:24px +} +.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{ + list-style:decimal; + margin-left:24px +} +.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{ + margin-bottom:0 +} +.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{ + list-style:disc +} +.wy-breadcrumbs{ + *zoom:1 +} +.wy-breadcrumbs:after,.wy-breadcrumbs:before{ + display:table; + content:"" +} +.wy-breadcrumbs:after{ + clear:both +} +.wy-breadcrumbs li{ + display:inline-block +} +.wy-breadcrumbs li.wy-breadcrumbs-aside{ + float:right +} +.wy-breadcrumbs li a{ + display:inline-block; + padding:5px +} +.wy-breadcrumbs li a:first-child{ + padding-left:0 +} +.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{ + padding:5px; + border:none; + background:none +} +.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{ + color:#404040 +} +.wy-breadcrumbs-extra{ + margin-bottom:0; + color:#b3b3b3; + font-size:80%; + display:inline-block +} +@media screen and (max-width:480px){ + .wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none + } +} +@media print{ + .wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none + } +} +html{ + font-size:16px +} +.wy-affix{ + position:fixed; + top:1.618em +} +.wy-menu a:hover{ + text-decoration:none +} +.wy-menu-horiz{ + *zoom:1 +} +.wy-menu-horiz:after,.wy-menu-horiz:before{ + display:table; + content:"" +} +.wy-menu-horiz:after{ + clear:both +} +.wy-menu-horiz li,.wy-menu-horiz ul{ + display:inline-block +} +.wy-menu-horiz li:hover{ + background:hsla(0,0%,100%,.1) +} +.wy-menu-horiz li.divide-left{ + border-left:1px solid #404040 +} +.wy-menu-horiz li.divide-right{ + border-right:1px solid #404040 +} +.wy-menu-horiz a{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 16px +} +.wy-menu-vertical{ + width:300px + margin-bottom: 20px; +} +.wy-menu-vertical header,.wy-menu-vertical p.caption{ + color:#007C97; + height:32px; + line-height:32px; + padding:0 1.618em; + margin:12px 0 0; + display:block; + font-weight:700; + text-transform:uppercase; + font-size:100%; + white-space:nowrap; +} +.wy-menu-vertical ul{ + margin-bottom:0 +} +.wy-menu-vertical li.divide-top{ + border-top:1px solid #404040 +} +.wy-menu-vertical li.divide-bottom{ + border-bottom:1px solid #404040 +} +.wy-menu-vertical li.current{ + background:#e3e3e3 +} +.wy-menu-vertical li.current a{ + color:grey; + border-right:1px solid #c9c9c9; + padding:.4045em 2.427em +} +.wy-menu-vertical li.current a:hover{ + background:#d6d6d6 +} +.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{ + border:none; + background:inherit; + color:inherit; + padding-left:0; + padding-right:0 +} +.wy-menu-vertical li button.toctree-expand{ + display:block; + float:left; + margin-left:-1.2em; + line-height:18px; + color:#4d4d4d; + border:none; + background:none; + padding:0 +} +.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{ + color:#404040; + font-weight:700; + position:relative; + background:#fcfcfc; + border:none; + padding:.4045em 1.618em +} +.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{ + background:#fcfcfc +} +.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{ + color:grey +} +.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{ + display:block; + line-height:18px; + color:#333 +} +.wy-menu-vertical li.toctree-l1.current>a{ + border-bottom:1px solid #c9c9c9; + border-top:1px solid #c9c9c9 +} +.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{ + display:none +} +.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{ + display:block +} +.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{ + font-size:.9em +} +.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{ + color:#404040 +} +.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{ + color:grey +} +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{ + display:block +} +.wy-menu-vertical li.toctree-l2.current>a{ + padding:.4045em 2.427em +} +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{ + padding:.4045em 1.618em .4045em 4.045em +} +.wy-menu-vertical li.toctree-l3.current>a{ + padding:.4045em 4.045em +} +.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{ + padding:.4045em 1.618em .4045em 5.663em +} +.wy-menu-vertical li.toctree-l4.current>a{ + padding:.4045em 5.663em +} +.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{ + padding:.4045em 1.618em .4045em 7.281em +} +.wy-menu-vertical li.toctree-l5.current>a{ + padding:.4045em 7.281em +} +.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{ + padding:.4045em 1.618em .4045em 8.899em +} +.wy-menu-vertical li.toctree-l6.current>a{ + padding:.4045em 8.899em +} +.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{ + padding:.4045em 1.618em .4045em 10.517em +} +.wy-menu-vertical li.toctree-l7.current>a{ + padding:.4045em 10.517em +} +.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{ + padding:.4045em 1.618em .4045em 12.135em +} +.wy-menu-vertical li.toctree-l8.current>a{ + padding:.4045em 12.135em +} +.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{ + padding:.4045em 1.618em .4045em 13.753em +} +.wy-menu-vertical li.toctree-l9.current>a{ + padding:.4045em 13.753em +} +.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{ + padding:.4045em 1.618em .4045em 15.371em +} +.wy-menu-vertical li.toctree-l10.current>a{ + padding:.4045em 15.371em +} +.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{ + padding:.4045em 1.618em .4045em 16.989em +} +.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{ + background:#c9c9c9 +} +.wy-menu-vertical li.toctree-l2 button.toctree-expand{ + color:#a3a3a3 +} +.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{ + background:#bdbdbd +} +.wy-menu-vertical li.toctree-l3 button.toctree-expand{ + color:#969696 +} +.wy-menu-vertical li.current ul{ + display:block +} +.wy-menu-vertical li ul{ + margin-bottom:0; + display:none +} +.wy-menu-vertical li ul li a{ + margin-bottom:0; + color:#d9d9d9; + font-weight:400 +} +.wy-menu-vertical a{ + line-height:18px; + padding:.4045em 1.618em; + display:block; + position:relative; + font-size:90%; + color:#d9d9d9 +} +.wy-menu-vertical a:hover{ + background-color:#4e4a4a; + cursor:pointer +} +.wy-menu-vertical a:hover button.toctree-expand{ + color:#d9d9d9 +} +.wy-menu-vertical a:active{ + background-color:#2980b9; + cursor:pointer; + color:#fff +} +.wy-menu-vertical a:active button.toctree-expand{ + color:#fff +} +.wy-side-nav-search{ + display:block; + width:300px; + padding:.809em; + margin-bottom:.809em; + z-index:200; + background-color:#171c2d; + text-align:center; + color:#fcfcfc +} +.wy-side-nav-search input[type=text]{ + width:100%; + border-radius:50px; + padding:6px 12px; + border-color:#2472a4 +} +.wy-side-nav-search img{ + display:block; + margin:auto auto .809em; + height:45px; + width:45px; + background-color:#171c2d; + padding:5px; + border-radius:100% +} +.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{ + color:#fcfcfc; + font-size:100%; + font-weight:700; + display:inline-block; + padding:4px 6px; + margin-bottom:.809em; + max-width:100% +} +.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{ + background:hsla(0,0%,100%,.1) +} +.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{ + display:block; + margin:0 auto; + height:auto; + width:auto; + border-radius:0; + max-width:100%; + background:transparent +} +.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{ + margin-top:.85em +} +.wy-side-nav-search>div.version{ + margin-top:-.4045em; + margin-bottom:.809em; + font-weight:400; + color:hsla(0,0%,100%,.3) +} +.wy-nav .wy-menu-vertical header{ + color:#2980b9 +} +.wy-nav .wy-menu-vertical a{ + color:#b3b3b3 +} +.wy-nav .wy-menu-vertical a:hover{ + background-color:#2980b9; + color:#fff +} +[data-menu-wrap]{ + -webkit-transition:all .2s ease-in; + -moz-transition:all .2s ease-in; + transition:all .2s ease-in; + position:absolute; + opacity:1; + width:100%; + opacity:0 +} +[data-menu-wrap].move-center{ + left:0; + right:auto; + opacity:1 +} +[data-menu-wrap].move-left{ + right:auto; + left:-100%; + opacity:0 +} +[data-menu-wrap].move-right{ + right:-100%; + left:auto; + opacity:0 +} +.wy-body-for-nav{ + background:#fcfcfc +} +.wy-grid-for-nav{ + position:absolute; + width:100%; + height:100% +} +.wy-nav-side{ + position:fixed; + top:0; + bottom:0; + left:0; + padding-bottom:2em; + width:300px; + overflow-x:hidden; + overflow-y:hidden; + min-height:100%; + color:#9b9b9b; + background:#171c2d; + z-index:200 +} +.wy-side-scroll{ + width:320px; + position:relative; + overflow-x:hidden; + overflow-y:scroll; + height:100%; +} +.wy-nav-top{ + display:none; + background:#E9102B; + color:#fff; + padding:.4045em .809em; + position:relative; + line-height:50px; + text-align:center; + font-size:100%; + *zoom:1 +} +.wy-nav-top:after,.wy-nav-top:before{ + display:table; + content:"" +} +.wy-nav-top:after{ + clear:both +} +.wy-nav-top a{ + color:#fff; + font-weight:700 +} +.wy-nav-top img{ + margin-right:12px; + height:45px; + width:45px; + background-color:#2980b9; + padding:5px; + border-radius:100% +} +.wy-nav-top i{ + font-size:30px; + float:left; + cursor:pointer; + padding-top:inherit +} +.wy-nav-content-wrap{ + margin-left:300px; + background:#fcfcfc; + min-height:100% +} +.wy-nav-content{ + padding:1.618em 3.236em; + height:100%; + max-width:800px; + margin:auto +} +.wy-body-mask{ + position:fixed; + width:100%; + height:100%; + background:rgba(0,0,0,.2); + display:none; + z-index:499 +} +.wy-body-mask.on{ + display:block +} +footer{ + color:grey +} +footer p{ + margin-bottom:12px +} +.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{ + padding:0; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + font-size:1em; + background:none; + border:none; + color:grey +} +.rst-footer-buttons{ + *zoom:1 +} +.rst-footer-buttons:after,.rst-footer-buttons:before{ + width:100%; + display:table; + content:"" +} +.rst-footer-buttons:after{ + clear:both +} +.rst-breadcrumbs-buttons{ + margin-top:12px; + *zoom:1 +} +.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{ + display:table; + content:"" +} +.rst-breadcrumbs-buttons:after{ + clear:both +} +#search-results .search li{ + margin-bottom:24px; + border-bottom:1px solid #e1e4e5; + padding-bottom:24px +} +#search-results .search li:first-child{ + border-top:1px solid #e1e4e5; + padding-top:24px +} +#search-results .search li a{ + font-size:120%; + margin-bottom:12px; + display:inline-block +} +#search-results .context{ + color:grey; + font-size:90% +} +.genindextable li>ul{ + margin-left:24px +} +@media screen and (max-width:768px){ + .wy-body-for-nav{ + background:#fcfcfc + } + .wy-nav-top{ + display:block + } + .wy-nav-side{ + left:-300px + } + .wy-nav-side.shift{ + width:85%; + left:0 + } + .wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{ + width:auto + } + .wy-nav-content-wrap{ + margin-left:0 + } + .wy-nav-content-wrap .wy-nav-content{ + padding:1.618em + } + .wy-nav-content-wrap.shift{ + position:fixed; + min-width:100%; + left:85%; + top:0; + height:100%; + overflow:hidden + } +} +@media screen and (min-width:1100px){ + .wy-nav-content-wrap{ + /* background:rgba(0,0,0,.05) */ + } + .wy-nav-content{ + margin:0; + background:#fcfcfc + } +} +@media print{ + .rst-versions,.wy-nav-side,footer{ + display:none + } + .wy-nav-content-wrap{ + margin-left:0 + } +} +.rst-versions{ + position:fixed; + bottom:0; + left:0; + width:300px; + color:#fcfcfc; + background:#1f1d1d; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + z-index:400 +} +.rst-versions a{ + color:#2980b9; + text-decoration:none +} +.rst-versions .rst-badge-small{ + display:none +} +.rst-versions .rst-current-version{ + padding:12px; + background-color:#272525; + display:block; + text-align:right; + font-size:90%; + cursor:pointer; + color:#27ae60; + *zoom:1 +} +.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{ + display:table; + content:"" +} +.rst-versions .rst-current-version:after{ + clear:both +} +.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{ + color:#fcfcfc +} +.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{ + float:left +} +.rst-versions .rst-current-version.rst-out-of-date{ + background-color:#e74c3c; + color:#fff +} +.rst-versions .rst-current-version.rst-active-old-version{ + background-color:#f1c40f; + color:#000 +} +.rst-versions.shift-up{ + height:auto; + max-height:100%; + overflow-y:scroll +} +.rst-versions.shift-up .rst-other-versions{ + display:block +} +.rst-versions .rst-other-versions{ + font-size:90%; + padding:12px; + color:grey; + display:none +} +.rst-versions .rst-other-versions hr{ + display:block; + height:1px; + border:0; + margin:20px 0; + padding:0; + border-top:1px solid #413d3d +} +.rst-versions .rst-other-versions dd{ + display:inline-block; + margin:0 +} +.rst-versions .rst-other-versions dd a{ + display:inline-block; + padding:6px; + color:#fcfcfc +} +.rst-versions.rst-badge{ + width:auto; + bottom:20px; + right:20px; + left:auto; + border:none; + max-width:300px; + max-height:90% +} +.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{ + float:none; + line-height:30px +} +.rst-versions.rst-badge.shift-up .rst-current-version{ + text-align:right +} +.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{ + float:left +} +.rst-versions.rst-badge>.rst-current-version{ + width:auto; + height:30px; + line-height:30px; + padding:0 6px; + display:block; + text-align:center +} +@media screen and (max-width:768px){ + .rst-versions{ + width:85%; + display:none + } + .rst-versions.shift{ + display:block + } +} +.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{ + margin-bottom:24px +} +.rst-content img{ + max-width:100%; + height:auto +} +.rst-content div.figure,.rst-content figure{ + margin-bottom:24px +} +.rst-content div.figure .caption-text,.rst-content figure .caption-text{ + font-style:italic +} +.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{ + margin-bottom:0 +} +.rst-content div.figure.align-center,.rst-content figure.align-center{ + text-align:center +} +.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{ + margin-bottom:24px +} +.rst-content abbr[title]{ + text-decoration:none +} +.rst-content.style-external-links a.reference.external:after{ + font-family:FontAwesome; + content:"\f08e"; + color:#b3b3b3; + vertical-align:super; + font-size:60%; + margin:0 .2em +} +.rst-content blockquote{ + margin-left:24px; + line-height:24px; + margin-bottom:24px +} +.rst-content pre.literal-block{ + white-space:pre; + margin:0; + padding:12px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + display:block; + overflow:auto +} +.rst-content div[class^=highlight],.rst-content pre.literal-block{ + border:1px solid #e1e4e5; + overflow-x:auto; + margin:1px 0 24px +} +.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{ + padding:0; + border:none; + margin:0 +} +.rst-content div[class^=highlight] td.code{ + width:100% +} +.rst-content .linenodiv pre{ + border-right:1px solid #e6e9ea; + margin:0; + padding:12px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + user-select:none; + pointer-events:none +} +.rst-content div[class^=highlight] pre{ + white-space:pre; + margin:0; + padding:12px; + display:block; + overflow:auto +} +.rst-content div[class^=highlight] pre .hll{ + display:block; + margin:0 -12px; + padding:0 12px +} +.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + font-size:12px; + line-height:1.4 +} +.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{ + user-select:none; + pointer-events:none +} +.rst-content div.highlight span.linenos{ + display:inline-block; + padding-left:0; + padding-right:12px; + margin-right:12px; + border-right:1px solid #e6e9ea +} +.rst-content .code-block-caption{ + font-style:italic; + font-size:85%; + line-height:1; + padding:1em 0; + text-align:center +} +@media print{ + .rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{ + white-space:pre-wrap + } +} +.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{ + clear:both +} +.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{ + margin-bottom:0 +} +.rst-content .admonition-title:before{ + margin-right:4px +} +.rst-content .admonition table{ + border-color:rgba(0,0,0,.1) +} +.rst-content .admonition table td,.rst-content .admonition table th{ + background:transparent!important; + border-color:rgba(0,0,0,.1)!important +} +.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{ + list-style:lower-alpha +} +.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{ + list-style:upper-alpha +} +.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{ + margin-top:12px; + margin-bottom:12px +} +.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{ + margin-top:0 +} +.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{ + margin-bottom:12px +} +.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{ + margin-bottom:0 +} +.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{ + margin-bottom:12px +} +.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{ + margin-top:0; + margin-bottom:0 +} +.rst-content .line-block{ + margin-left:0; + margin-bottom:24px; + line-height:24px +} +.rst-content .line-block .line-block{ + margin-left:24px; + margin-bottom:0 +} +.rst-content .topic-title{ + font-weight:700; + margin-bottom:12px +} +.rst-content .toc-backref{ + color:#404040 +} +.rst-content .align-right{ + float:right; + margin:0 0 24px 24px +} +.rst-content .align-left{ + float:left; + margin:0 24px 24px 0 +} +.rst-content .align-center{ + margin:auto +} +.rst-content .align-center:not(table){ + display:block +} +.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{ + opacity:0; + font-size:14px; + font-family:FontAwesome; + margin-left:.5em +} +.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{ + opacity:1 +} +.rst-content .btn:focus{ + outline:2px solid +} +.rst-content table>caption .headerlink:after{ + font-size:12px +} +.rst-content .centered{ + text-align:center +} +.rst-content .sidebar{ + float:right; + width:40%; + display:block; + margin:0 0 24px 24px; + padding:24px; + background:#f3f6f6; + border:1px solid #e1e4e5 +} +.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{ + font-size:90% +} +.rst-content .sidebar .last,.rst-content .sidebar>:last-child{ + margin-bottom:0 +} +.rst-content .sidebar .sidebar-title{ + display:block; + font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif; + font-weight:700; + background:#e1e4e5; + padding:6px 12px; + margin:-24px -24px 24px; + font-size:100% +} +.rst-content .highlighted{ + background:#f1c40f; + box-shadow:0 0 0 2px #f1c40f; + display:inline; + font-weight:700 +} +.rst-content .citation-reference,.rst-content .footnote-reference{ + vertical-align:baseline; + position:relative; + top:-.4em; + line-height:0; + font-size:90% +} +.rst-content .hlist{ + width:100% +} +.rst-content dl dt span.classifier:before{ + content:" : " +} +.rst-content dl dt span.classifier-delimiter{ + display:none!important +} +html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{ + background:none; + border:none +} +html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{ + border:none; + background-color:transparent!important; + white-space:normal +} +html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{ + padding-left:0; + padding-right:0; + vertical-align:top +} +html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{ + display:grid; + grid-template-columns:max-content auto +} +html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{ + padding-left:1rem +} +html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{ + content:":" +} +html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{ + margin-bottom:0 +} +html.writer-html5 .rst-content dl.footnote{ + font-size:.9rem +} +html.writer-html5 .rst-content dl.footnote>dt{ + margin:0 .5rem .5rem 0; + line-height:1.2rem; + word-break:break-all; + font-weight:400 +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets{ + margin-right:.5rem +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{ + content:"[" +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{ + content:"]" +} +html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{ + font-style:italic +} +html.writer-html5 .rst-content dl.footnote>dd{ + margin:0 0 .5rem; + line-height:1.2rem +} +html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{ + font-size:.9rem +} +.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{ + color:grey +} +.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{ + color:#555 +} +.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{ + margin-bottom:0 +} +.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){ + margin-top:24px +} +.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{ + margin-bottom:24px +} +.rst-content table.docutils th{ + border-color:#e1e4e5 +} +html.writer-html5 .rst-content table.docutils th{ + border:1px solid #e1e4e5 +} +html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{ + line-height:1rem; + margin-bottom:0; + font-size:.9rem +} +.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{ + margin-bottom:0 +} +.rst-content table.field-list,.rst-content table.field-list td{ + border:none +} +.rst-content table.field-list td p{ + font-size:inherit; + line-height:inherit +} +.rst-content table.field-list td>strong{ + display:inline-block +} +.rst-content table.field-list .field-name{ + padding-right:10px; + text-align:left; + white-space:nowrap +} +.rst-content table.field-list .field-body{ + text-align:left +} +.rst-content code,.rst-content tt{ + color:#000; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + padding:2px 5px +} +.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{ + font-size:100%!important; + line-height:normal +} +.rst-content code.literal,.rst-content tt.literal{ + color:#e74c3c; + white-space:normal +} +.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{ + font-weight:700; + color:#404040 +} +.rst-content kbd,.rst-content pre,.rst-content samp{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace +} +.rst-content a code,.rst-content a tt{ + color:#2980b9 +} +.rst-content dl{ + margin-bottom:24px +} +.rst-content dl dt{ + font-weight:700; + margin-bottom:12px +} +.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{ + margin-bottom:12px +} +.rst-content dl dd{ + margin:0 0 12px 24px; + line-height:24px +} +html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){ + margin-bottom:24px +} +html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{ + display:table; + margin:6px 0; + font-size:90%; + line-height:normal; + background:#e7f2fa; + color:#2980b9; + border-top:3px solid #6ab0de; + padding:6px; + position:relative +} +html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{ + color:#6ab0de +} +html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{ + color:#404040; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{ + margin-bottom:6px; + border:none; + border-left:3px solid #ccc; + background:#f0f0f0; + color:#555 +} +html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{ + color:#404040; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{ + margin-top:0 +} +html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{ + background-color:transparent; + border:none; + padding:0; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{ + font-weight:700 +} +html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{ + display:inline-block; + padding:0 4px; + color:#000; + font-weight:700 +} +html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{ + display:inline-block; + padding-right:8px; + max-width:100% +} +html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{ + font-style:italic +} +html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + color:#000 +} +.rst-content .viewcode-back,.rst-content .viewcode-link{ + display:inline-block; + color:#27ae60; + font-size:80%; + padding-left:24px +} +.rst-content .viewcode-back{ + display:block; + float:right +} +.rst-content p.rubric{ + margin-bottom:12px; + font-weight:700 +} +.rst-content code.download,.rst-content tt.download{ + background:inherit; + padding:inherit; + font-weight:400; + font-family:inherit; + font-size:inherit; + color:inherit; + border:inherit; + white-space:inherit +} +.rst-content code.download span:first-child,.rst-content tt.download span:first-child{ + -webkit-font-smoothing:subpixel-antialiased +} +.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{ + margin-right:4px +} +.rst-content .guilabel{ + border:1px solid #7fbbe3; + background:#e7f2fa; + font-size:80%; + font-weight:700; + border-radius:4px; + padding:2.4px 6px; + margin:auto 2px +} +.rst-content .versionmodified{ + font-style:italic +} +@media screen and (max-width:480px){ + .rst-content .sidebar{ + width:100% + } +} +span[id*=MathJax-Span]{ + color:#404040 +} +.math{ + text-align:center +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff"); + font-weight:400; + font-style:normal; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff"); + font-weight:700; + font-style:normal; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff"); + font-weight:700; + font-style:italic; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff"); + font-weight:400; + font-style:italic; + font-display:block +} +@font-face{ + font-family:Roboto Slab; + font-style:normal; + font-weight:400; + src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff"); + font-display:block +} +@font-face{ + font-family:Roboto Slab; + font-style:normal; + font-weight:700; + src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff"); + font-display:block +} diff --git a/v1.0/_static/custom.css b/v1.0/_static/custom.css new file mode 100644 index 00000000..1cadbe76 --- /dev/null +++ b/v1.0/_static/custom.css @@ -0,0 +1,24 @@ +/* + * custom.css + * ~~~~~~~~~ + * + * Custom stylesheet. + * + * :copyright: Copyright 2022 by Xilinx, Inc. + * + */ + +/* -- main layout ----------------------------------------------------------- */ +@media screen and (max-width: 950px){ + .wy-body-for-nav{background:#000000} + .wy-nav-top{display:block} + .wy-nav-side{left:300px} + .wy-nav-side.shift{width:85%;left:0} + .wy-side-scroll{width:auto} + .wy-side-nav-search{width:auto} + .wy-menu.wy-menu-vertical{width:auto} + .wy-nav-content-wrap{margin-left:0} + .wy-nav-content-wrap + .wy-nav-content{padding:1.618em} + .wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden} +} \ No newline at end of file diff --git a/v1.0/_static/doctools.js b/v1.0/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/v1.0/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/v1.0/_static/documentation_options.js b/v1.0/_static/documentation_options.js new file mode 100644 index 00000000..062b50c1 --- /dev/null +++ b/v1.0/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.0', + LANGUAGE: 'English', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/v1.0/_static/file.png b/v1.0/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/v1.0/_static/file.png differ diff --git a/v1.0/_static/jquery.js b/v1.0/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/v1.0/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v1.0/_static/js/html5shiv.min.js b/v1.0/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/v1.0/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v1.0/_static/js/theme.js b/v1.0/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/v1.0/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/v1.0/_static/layout.html b/v1.0/_static/layout.html new file mode 100644 index 00000000..81ae0134 --- /dev/null +++ b/v1.0/_static/layout.html @@ -0,0 +1,14 @@ +{% extends "!layout.html" %} + {% block footer %} {{ super() }} + + +{% endblock %} \ No newline at end of file diff --git a/v1.0/_static/minus.png b/v1.0/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/v1.0/_static/minus.png differ diff --git a/v1.0/_static/plus.png b/v1.0/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/v1.0/_static/plus.png differ diff --git a/v1.0/_static/pygments.css b/v1.0/_static/pygments.css new file mode 100644 index 00000000..84ab3030 --- /dev/null +++ b/v1.0/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/v1.0/_static/searchtools.js b/v1.0/_static/searchtools.js new file mode 100644 index 00000000..7918c3fa --- /dev/null +++ b/v1.0/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/v1.0/_static/sphinx_highlight.js b/v1.0/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/v1.0/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/v1.0/_static/xilinx-header-logo.png b/v1.0/_static/xilinx-header-logo.png new file mode 100644 index 00000000..00372830 Binary files /dev/null and b/v1.0/_static/xilinx-header-logo.png differ diff --git a/v1.0/_static/xilinx-header-logo.svg b/v1.0/_static/xilinx-header-logo.svg new file mode 100644 index 00000000..6b15297d --- /dev/null +++ b/v1.0/_static/xilinx-header-logo.svg @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + Page-1 + + + Sheet.1 + + + + + + diff --git a/v1.0/c_apis.html b/v1.0/c_apis.html new file mode 100644 index 00000000..4b9440f4 --- /dev/null +++ b/v1.0/c_apis.html @@ -0,0 +1,1125 @@ + + + + + + + + + + + + + + + C API Programming Guide — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • C API Programming Guide
  • +
  • +
  • +
+
+
+
+
+ +
+

C API Programming Guide

+ +
+

Overview

+

The AMD AMA Video SDK provides a C-based application programming interface (API) which facilitates the integration of AMD transcoding capabilities in proprietary frameworks. This API is provided in the form of plugins leveraging the Xilinx Media Accelerator (XMA) library and the Xilinx Resource Manager (XRM) library.

+

The XMA Library

+

The XMA library (libxma) is meant to simplify the development of applications managing and controlling video accelerators such as decoders, scalers, filters, and encoders.

+

The XRM Library

+

The XRM library is used to manage the hardware accelerators available in the system. XRM keeps track of total system capacity for each of the compute units such as the decoder, scaler, and encoder. The XRM library makes it possible to perform actions such as reserving, allocating and releasing resources; calculating resource load and max capacity.

+

The AMD AMA Video SDK Plugins

+

The AMD AMA Video SDK provides 4 different plugins, each corresponding to a specific hardware accelerated feature of the card:

+
    +
  • The decoder plugin

  • +
  • The encoder plugin

  • +
  • The filter plugin

  • +
  • The scaler plugin

  • +
+

Any combination of plugins can be used when integrating with a proprietary framework.

+
+

+
+
+
+

General Application Development Guide

+

Integration layers for applications using the AMD AMA Video SDK are organized around the following steps:

+
    +
  1. Initialization

  2. +
  3. Resource Reservation

  4. +
  5. Session Creation

  6. +
  7. Runtime Processing

  8. +
  9. Cleanup

  10. +
+
+

Resource Initialization and Allocation

+

Applications using the plugins must first create a XRM plugin using the xrm_PLUGIN_reserve(), where PLUGIN is one of dec, enc, or scale. This is done using the XRM APIs, as described in detail in the XRM API Reference Guide below.

+
+
+

Session Creation

+

Once the resources have been allocated, the application must create dedicated plugin sessions for each of the hardware accelerators that need to be used (decoder, scaler, encoder, filter).

+

To create a session, the application must first initialize all the required properties and parameters of the particular plugin. It must then call the corresponding session creation function. A complete reference for all the plugins is provided below.

+
+
+

Runtime Processing

+

The plugins provide functions to send data from the host and receive data from the device. The data is in the form of video frames (XmaFrame). It is also possible to do zero-copy operations where frames are passed from one hardware accelerator to the next without being copied back to the host. The send and receive functions are specific to each plugin and the return code should be used to determine the next suitable action. A complete reference for all the plugins is provided below.

+
+
+

Cleanup

+

When the application finishes, it should destroy each plugin session using the corresponding destroy function. Doing so will free the resources on the AMD devices for other jobs and ensure that everything is released and cleaned-up properly.

+

The application should also use the xrm_PLUGIN_release(), where PLUGIN is one of dec, enc, or scale to release allocated resources. This is done using the XRM APIs, as described in detail in the XRM API Reference Guide below.

+
+

+
+
+
+
+

Compiling and Linking with the AMD AMA Video SDK Plugins

+

The plugins can be dynamically linked to the application. The required package to build applications is XRM. This package is provided as part of the AMD AMA Video SDK.

+

To provide the necessary declarations in your application, include the following header in your source code:

+
#include <xrm.h>
+
+
+

To compile and link your application with the plugins, add the following lines to your CMakeList.txt file:

+
target_link_libraries (${PROJECT_NAME} PUBLIC xma PUBLIC xrm_interface)
+target_include_directories (${PROJECT_NAME}
+  PUBLIC "${PROJECT_SOURCE_DIR}/include"
+  PUBLIC "$<TARGET_PROPERTY:xrm,INTERFACE_INCLUDE_DIRECTORIES>")
+
+
+
+

+
+
+
+

Common XMA Data Structures

+
+
+struct XmaParameter
+
+ +

Type-Length-Value data structure used for passing custom arguments to a plugin. The declaration of XmaParameter can be found in the /opt/amd/ama/ma35/include/xma/xmaparam.h file.

+
+
+struct XmaFrameProperties
+
+ +

Data structure describing the frame dimensions for XmaFrame. The declaration of XmaFrameProperties can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+struct XmaFrame
+
+ +

Data structure describing a raw video frame and its buffers. XmaFrame structures can be received from the decoder or sent to the encoder. They are also used as input and outputs for the scaler and the look-ahead. The declaration of XmaFrame can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+

The AMD AMA Video SDK plugins supports 3 types of frames:

+
    +
  • XMA_HOST_BUFFER_TYPE frames must be copied to the device using the upload filter before they can be used by the device..

  • +
  • XMA_DEVICE_ONLY_BUFFER_TYPE frames must be copied to the host using the download filter before they can be used by the host application.

  • +
  • NO_BUFFER frames do not contain buffer data and are used as place holders to be filled in by XMA plugins..

  • +
+

The upload filter plugin send function only supports XMA_HOST_BUFFER_TYPE frames, while all other send frame functions only support XMA_DEVICE_BUFFER_TYPE frames. All frames used in receive functions must contain "dummy" data. All parameters in those frames will be filled in by the respective receive functions. All frames must be allocated using the provided XMA functions.

+
+
+struct XmaDataBuffer
+
+ +

Data structure describing a buffer containing encoded video data. XmaDataBuffer structures can be sent to the decoder or received from the encoder. The declaration of XmaDataBuffer can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+

All XmaDataBuffer structures must be allocated using one of the provided functions. XmaDataBuffer structures used in the encoder receive function must be allocated with "dummy" data and will be filled in by the encoder.

+
+

Note

+

Xma[Scaler|Encoder|Filter]Properties.sw_format

+
+

sw_format, which is a member of XmaScalerProperties, XmaEncoderProperties, and XmaFilterProperties structures, represents the pixel format of a frame on the device. Therefore, its assigned value is determined by the direction of data flow. Specifically:

+
+
+
XMA_NV12_FMT_TYPE and XMA_P010LE_FMT_TYPE, with flags = XMA_FRAME_PROPERTY_FLAG_TILE_4x4, are internal formats that can only be generated by decoder/scaler and not by the upload filter.
+
XMA_PACKED10_FMT_TYPE is an internal format that can only be generated by decoder/scaler and not the upload filter.
+
XMA_RGB24_FMT_TYPE is reserved for future use.
+
XMA_YUV420P_FMT_TYPE and XMA_YUV420P10LE_FMT_TYPE are external formats that can be used by the upload filter
+
+
+
+
+
+

+
+
+
+

Common XMA Data Reference

+

This section describes the commonly used calls and APIs that are required in most applications.

+
+

XMA Log Interface

+

The external interface to the xma logging consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmalogger.h file.

+
+
+int32_t xma_log_init(XmaLogLevelType log_level, XmaLogType log_type, XmaLogHandle *handle, ...)
+
+ +

This function creates a log session and must be called prior to logging. (See /opt/amd/ama/ma35/include/xma/xmalogger.h for details on variadic usage.)

+
+
+void xma_logmsg(XmaLogHandle handle, XmaLogLevelType level, const char *name, const char *msg, ...)
+
+ +

This function logs a message.

+
+
+void xma_log_release(XmaLogHandle handle)
+
+ +

This function releases a log session that was previously created with the xma_log_init() function.

+
+
+

XMA Session Interface

+

The external interface to the xma session consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xma.h file.

+
+
+int32_t xma_initialize(XmaLogHandle log, XmaInitParameter *init_params, XmaHandle *handle)
+
+ +

This function creates a XMA session and must be called prior to creating any plugins.

+
+
+void xma_release(XmaHandle handle)
+
+ +

This function releases a XMA session that was previously created with the xma_initialize() function.

+
+
+

XMA Data Buffer Interface

+

The external interface to the xma data buffer consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+XmaDataBuffer *xma_data_buffer_alloc(XmaHandle handle, size_t size, bool dummy)
+
+ +

This function creates a XmaDataBuffer of the given size.

+
+
+XmaDataBuffer *xma_data_from_buffer_clone(XmaHandle handle, uint8_t *data, size_t size, xma_data_buffer_clone_free_callback_function free_callback, void *opaque)
+
+ +

This function creates a XmaDataBuffer that points to the provided buffer. xma_data_buffer_clone_free_callback_function will be called, when the buffer is no longer needed.

+
+
+void xma_data_buffer_free(XmaDataBuffer *data)
+
+ +

This function releases a previously created XmaDataBuffer.

+
+
+

XMA Frame Interface

+

The external interface to the xma Frame consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+int32_t xma_frame_planes_get(XmaHandle handle, XmaFrameProperties *frame_props)
+
+ +

This returns the number of planes for a given pixel format.

+
+
+int32_t xma_frame_get_plane_height(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the height of the plane based on the frame height, pixel format, and plane.

+
+
+int32_t xma_frame_get_plane_stride(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the stride of the plane based on the frame width, pixel format, and plane.

+
+
+int32_t xma_frame_get_plane_size(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the size of the plane based on the frame width, height, pixel format, and plane.

+
+
+XmaFrame *xma_frame_alloc(XmaHandle handle, XmaFrameProperties *frame_props, bool dummy)
+
+ +

This function creates a XmaFrame with the given properties.

+
+
+XmaFrame *xma_frame_from_buffers_clone(XmaHandle handle, XmaFrameProperties *frame_props, XmaFrameData *frame_data, xma_frame_clone_free_callback_function free_callback, void *opaque)
+
+ +

This function creates a XmaFrame that points to the provided data and with the given properties. xma_frame_clone_free_callback_function will be called when the data is no longer needed.

+
+
+XmaFrame *xma_frame_clone(XmaHandle handle, XmaFrame *xma_frame)
+
+ +

This function creates a XmaFrame that uses the same buffers as the provided XmaFrame, but can have side data added or removed without affecting the original XmaFrame.

+
+
+int32_t xma_frame_inc_ref(XmaFrame *frame)
+
+ +

This function increases the reference count of the given XmaFrame.

+
+
+int32_t xma_frame_dec_ref(XmaFrame *frame)
+
+ +

This function decreases the reference count of the given XmaFrame.

+
+
+void xma_frame_free(XmaFrame *frame)
+
+ +

This function releases a XmaFrame that was created with the previous functions.

+
+

+
+
+
+
+

Decoder Plugin Reference

+
+

Decoder Interface

+

The external interface to the decoder plugin consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmadecoder.h file.

+
+
+XmaDecoderSession *xma_dec_session_create(XmaDecoderProperties *dec_props)
+
+ +

This function creates a decoder session and must be called prior to decoding data. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_dec_session_set_log(XmaDecoderSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_dec_session_send_data(XmaDecoderSession *session, XmaDataBuffer *data, int32_t *data_used)
+
+ +

This function sends input frame data to the hardware decoder by way of the plugin. The application needs to parse the input encoded stream and send one frame of data at a time in a XmaDataBuffer data structure.

+

The data_used value indicates the amount of input data consumed by the decoder.

+

If the function returns XMA_SUCCESS, then the decoder was able to consume the entirety of the available data and data_used will be set accordingly. In this case, the application can proceed with fetching decoded data using the xma_dec_session_recv_frame() API.

+

If the function returns XMA_TRY_AGAIN, then the decoder was did not consume any of the input data and data_used will be reported as 0. In this case, the application can proceed with fetching previously decoded data with the xma_dec_session_recv_frame() function but must send the same input again using using xma_dec_session_send_data() until the function returns XMA_SUCCESS.

+

If the function returns XMA_SEND_MORE_DATA, then the data sent is being processed, but more is required before any frames will be available.

+

Once the application has sent all the input frames to the decoder, it must notify the decoder by sending a null buffer. The application should then continue sending null buffers in order to flush out all the output YUV frames.

+
+
+int32_t xma_dec_session_get_properties(XmaDecoderSession *dec_session, XmaFrameProperties *fprops);
+
+ +

This function returns the decoder properties such as width, height, output format, and frame rate.

+
+
+int32_t xma_dec_session_recv_frame(XmaDecoderSession *session, XmaFrame *frame)
+
+ +

This function tries to fetch a decoded YUV frame from the hardware accelerator.

+

If the function returns XMA_SUCCESS, a valid YUV frame pointer is available in the buffer pointer of the XmaFrame argument.

+

If the function returns XMA_TRY_AGAIN, then the decoder still needs some input data to produce a complete YUV output frame.

+

If the function returns XMA_EOS, then the decoder has flushed out all the frames.

+
+
+int32_t xma_dec_session_destroy(XmaDecoderSession *session)
+
+ +

This function destroys a decoder session that was previously created with the xma_dec_session_create() function.

+
+
+

Decoder Properties

+

The AMD AMA Video SDK decoder is configured using a combination of standard XMA decoder properties and custom decoder parameters, both of which are specified using a XmaDecoderProperties data structure. The declaration of XmaDecoderProperties can be found in the /opt/amd/ama/ma35/include/xma/xmadecoder.h file.

+
+

+
+
+
+struct XmaDecoderProperties
+
+ +

This data structure is used to configure the AMD AMA Video SDK decoder.

+
+

+
+

Standard XMA Decoder Properties

+

When using the decoder plugin, the following members of the XmaDecoderProperties data structure must be set by the application:

+
+
hwdecoder_type

Specifying type of decoder to reserve.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the decoder plugin.

+
+
param_cnt

Count of custom parameters.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840. +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
bits_per_pixel

Bits per pixel for primary plane of output video. +Must be set to 8 or 10 bits per pixel.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS.

+
+
handle

handle to XMA device.

+
+
+

Custom Decoder Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the decoder plugin:

+
+
"out_fmt"

XMA pixel format. See -out_fmt for available options.

+
+
“low_latency”

Set to 1 to enable low latency mode, i.e., no buffering for I and P frames (source must not contain B-frames).

+
+
"latency_logging"

Set to 1 to enable logging of latency information to the xma log.

+
+
+
+

+
+
+
+
+

Scaler Plugin Reference

+
+

Scaler Interface

+

The external interface to the scaler plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+
+XmaScalerSession *xma_scaler_session_create(XmaScalerProperties *props)
+
+ +

This function creates scaler session and must be called prior to sending input frames. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_scaler_session_send_frame(XmaScalerSession *session, XmaFrame *frame)
+
+ +

This function sends a YUV frame to the underlying XMA plugin( and eventually to hardware to scale the input frame to one or multiple resolutions.

+

The application can take further action depending upon the return value from this API.

+

If the function returns XMA_SUCCESS, then the application can proceed to fetch scaled output frames.

+

If the function returns XMA_SEND_MORE_DATA, then the application should proceed with sending next YUV frame.

+

If the function returns XMA_FLUSH_AGAIN it means that the application should keep flushing the scaler.

+

Once the application has sent all the input frames to the scaler, it must notify the scaler by sending a null frame to flush the scaler.

+
+
+int32_t xma_scaler_session_recv_frame_list(XmaScalerSession *session, XmaFrame **frame_list)
+
+ +

This function is called after calling the xma_scaler_session_send_frame(). This function returns a list of output frames with every call until it reaches end of scaling. Return codes can only be XMA_SUCCESS and XMA_ERROR.

+
+
+int32_t xma_scaler_session_destroy(XmaScalerSession *session)
+
+ +

This function destroys scaler session that was previously created with the xma_scaler_session_create() function.

+
+

+
+
+
+

Scaler Properties

+

The AMD AMA Video SDK scaler is configured using a combination of standard XMA scaler properties, standard XMA scaler input and output properties and custom scaler parameters, all of which are specified using XmaScalerProperties and XmaScalerInOutProperties data structures.

+
+

+
+
+
+struct XmaScalerProperties
+
+ +

This data structure is used to configure the video scaler. The declaration of XmaScalerProperties can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+
+struct XmaScalerInOutProperties
+
+ +

This data structure is used to configure the input and outputs of the video scaler. The XmaScalerFilterProperties data structure contains one XmaScalerInOutProperties for the scaler input and an array of 16 XmaScalerInOutProperties for the scaler outputs. The declaration of XmaScalerInOutProperties can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+

+
+

Standard XMA Scaler Properties

+

When using the scaler plugin, the following members of the XmaScalerProperties data structure must be set by the application:

+
+
hwscaler_type

Type of scaler. Must be set to XMA_ABR_SCALER_TYPE.

+
+
num_outputs

Number of scaler outputs.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the scaler plugin.

+
+
param_cnt

Count of custom parameters.

+
+
input

Input property of type XmaScalerInOutProperties

+
+
output

Output properties an array of type XmaScalerInOutProperties of size num_outputs

+
+
+

XMA Scaler Input and Output Properties

+

When configuring the scaler input and outputs, the following members of the XmaScalerInOutProperties data structure must be set by the application:

+
+
format

Host side input video format. +Must be set to XMA_VPE_FMT_TYPE

+
+
sw_format

Device side video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of video stream/data. +Valid values are integers between 128 and 3840, in multiples of 4. +Portrait mode is supported.

+
+
height

Height in pixels of video stream/data. +Valid values are even integers between 128 and 2160, in multiples of 4.

+
+
framerate

Framerate data structure specifying frame rate per second.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
+

Other members of XmaScalerInOutProperties are not applicable to the scaler plugin and should not be used.

+

Custom Scaler Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the scaler plugin:

+
+
"mix_rate"

This parameter is used to configure mix-rate sessions where some scaler outputs are configured at the input frame rate and some other outputs will be configured at half the rate.

+
+
“top”

Cropping the top of the video before scaling.

+
+
“width”

Cropping the width of the video before scaling.

+
+
“height”

Cropping the height of the video before scaling.

+
+
"latency_logging"

Set to 1 to enable logging of latency information to XMA logs. Set to 0 to disable logging.

+
+
+
+

+
+
+
+
+

Encoder Plugin Reference

+
+

Encoder Interface

+

The external interface to the encoder plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmaencoder.h file.

+
+
+XmaEncoderSession *xma_enc_session_create(XmaEncoderProperties *enc_props)
+
+ +

This function creates an encoder session and must be called prior to encoding input YUV. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_enc_session_set_log(XmaEncoderSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_enc_session_send_frame(XmaEncoderSession *session, XmaFrame *frame)
+
+ +

This function sends a YUV frame to the hardware encoder by way of the plugin.

+

Each time the application calls this function, it must provide a XmaFrame containing YUV data and information about this frame (XmaFrameProperties).

+

If the function returns XMA_SUCCESS, then the application can proceed to fetch the encoded data using the :c:func`xma_enc_session_recv_data()` API.

+

If the function returns XMA_SEND_MORE_DATA, then the application must send the next YUV frame before calling :c:func`xma_enc_session_recv_data()`.

+

Once the application has sent all the input frames to the encoder, it should notify the hardware by sending a null frame. If the API returns XMA_SUCCESS after a null frame is sent, then the application can call :c:func`xma_enc_session_recv_data()` but must send a null frame again.

+
+
+int32_t xma_enc_session_recv_data(XmaEncoderSession *session, XmaDataBuffer *data, int32_t *data_size)
+
+ +

This function is called after calling the function :c:func`xma_enc_session_send_frame()`. The application is responsible for allocating the "dummy" XmaDataBuffer using one of the provided functions. It is also responsible for releasing it when done.

+

If the function returns XMA_SUCCESS, then valid output data is available.

+

If the function returns XMA_RESEND_AND_RECV, a data buffer is not ready to be returned and the length of the data buffer is set to 0. The XmaDataBuffer is untouched and can either be reused or released.

+

If the function returns XMA_EOS, the encoder has flushed all the output frames. The XmaDataBuffer is untouched and must be released.

+
+
+int32_t xma_enc_session_destroy(XmaEncoderSession *session)
+
+ +

This function destroys an encoder session that was previously created with the xma_enc_session_create() function.

+
+
+

Encoder Properties

+

The AMD AMA Video SDK encoder is configured using a combination of standard XMA encoder properties and custom encoder parameters, both of which are specified using a XmaEncoderProperties data structure.

+
+

+
+
+
+struct XmaEncoderProperties
+
+ +

This data structure is used to configure the video encoder. The declaration of XmaEncoderProperties can be found in the /opt/amd/ama/ma35/include/xma/xmaencoder.h file.

+

Standard XMA Encoder Properties

+

When using the encoder plugin, the following members of the XmaEncoderProperties data structure must be set by the application:

+
+
hwencoder_type

Specify type of encoder to reserve.

+
+
format

Host side input video format. +Must be set to XMA_VPE_FMT_TYPE

+
+
sw_format

Device side input video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840. +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
framerate

Framerate data structure specifying frame rate per second

+
+
lookahead_depth

The lookahead module depth to give start giving lookahead data. +Supported values are 0 to 40.

+
+
rc_mode

Rate control mode for custom rate control +Supported values are 0 (constant QP), 1 (CBR), 2 (VBR), and 3 (CVBR).

+
+
bitrate

Bitrate of output data (in kbps).

+
+
qp

Fixed quantization value. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
gop_size

Maximum group of pictures size in frames.

+
+
temp_aq_gain

Temporal AQ Gain. Valid values are 0-255.

+
+
spat_aq_gain

Spatial AQ Gain. Valid values are 0-255.

+
+
minQP

Minimum QP. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
maxQP

Maximum QP. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
profile

Encoding profile. Valid values are 0 (Baseline), 1 (Main), 2 (High), 3 (High 10), or 4 (High 10 Intra) for H.264, 100 (Main), 101 (Main Intra), 102 (Main 10), or 103 (Main 10 Intra) for HEVC, or 200 (Main) for AV1, or -1 (Auto) for any codec.

+
+
level

Encoding level.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the encoder plugin.

+
+
param_cnt

Count of custom parameters.

+
+
+

Custom Encoder Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the encoder plugin:

+
+
"slice"

Slice to perform the encode.

+
+
"latency_logging"

When enabled, it logs latency information to XMA log.

+
+
"spatial_aq"

Enables or disables adaptive spatial qp.

+
+
"temporal_aq"

Enables or disables adaptive temporal qp.

+
+
"qp_mode"

Sets qp mode to auto, relative load or uniform.

+
+
"tune_metrics"

Sets the tuning metric to none, VQ, PSNR, SSIM or VMAF.

+
+
"forced_idr"

Forces insertion of an IDR.

+
+
"crf"

Enables or disables CRF.

+
+
"expert_options"

sets encoder's expert option.

+
+
"device_type"

For AV1 encoder selects between Type 1 and Type 2.

+
+
+
+

+
+
+
+
+

Filter Plugin Reference

+
+

Filter Interface

+

The filter plugin is based on the Filter XMA plugin type. The external interface to the filter plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+
+
+XmaFilterSession *xma_filter_session_create(XmaFilterProperties *props)
+
+ +

This function creates a filter session and must be called prior to sending YUV frames to the filter. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_filter_session_set_log(XmaFilterSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_filter_session_send_frame(XmaFilterSession *session, XmaFrame *frame)
+
+ +

This function sends YUV frames to the filter module in hardware. After sending a frame, the application can take further action depending upon the return value from this API.

+

If this function returns XMA_SUCCESS, then the application can proceed to recieve a frame from this filter.

+

If this function returns XMA_TRY_AGAIN, it means the input frame has not been consumed and needs to re-send the same input frame after calling receive frame.

+

Once the application sends all input frames to the filter module, it should continue sending null frames until all the frames have been flushed out from the filter.

+
+
+int32_t xma_filter_session_recv_frame(XmaFilterSession *session, XmaFrame *frame)
+
+ +

This function is called after calling the function xma_filter_session_send_frame().

+

If this function returns XMA_SUCCESS, then the "dummy" frame provided by the application has been filled in and can be sent to the next plugin.

+

If this function returns XMA_RESEND_AND_RECV, then no frames have been sent to the filter for processing. The XmaFrame is untouched and may be reused or released. +If this function returns XMA_TRY_AGAIN, then frames have been sent and are currently being processed, but are not yet ready. The c:struct:XmaFrame is untouched and may be reused or released. +If this function returns XMA_EOS, then all frames have been processed. The c:struct:XmaFrame is untouched and must be released.

+
+
+int32_t xma_filter_session_destroy(XmaFilterSession *session)
+
+ +

This function destroys the filter session that was previously created with the xma_filter_session_create() function.

+
+
+

Filter Properties

+

The AMD AMA Video SDK filter is configured using a combination of standard XMA filter properties, standard XMA filter input and output properties and custom filter parameters, all of which are specified using XmaFilterProperties and XmaFilterPortProperties data structures.

+
+
+struct XmaFilterProperties
+
+ +

This data structure is used to configure the filter function. The declaration of XmaFilterProperties can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+
+
+struct XmaFilterPortProperties
+
+ +

This data structure is used to configure the input and output of the filter. The XmaFilterProperties data structure contains one XmaFilterPortProperties for the filter input and one XmaFilterPortProperties for the output output. The declaration of XmaFilterPortProperties can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+

Standard XMA Filter Properties

+

When using the filter plugin, the following members of the XmaFilterPortProperties data structure must be set by the application:

+
+
hwfilter_type

Sets the direction of stream entry to XMA_UPLOAD_FILTER_TYPE or XMA_DOWNLOAD_FILTER_TYPE.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the filter plugin.

+
+
param_cnt

Count of custom parameters.

+
+
input

Input property of type XmaFilterPortProperties

+
+
output

Output property of type XmaFilterPortProperties

+
+
+

Standard XMA Filter Port Properties

+

When configuring the filter input or output, the following members of the XmaFilterPortProperties data structure must be set by the application:

+
+
format

Input video format. +Must be set to XMA_VPE_FMT_TYPE.

+
+
sw_format

Device side input video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840 +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
framerate

Framerate data structure specifying frames per second.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
framerate

Framerate data structure specifying frame rate per second.

+
+
+

Custom Filter Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the filter plugin:

+
+
"latency_logging"

When enabled, it logs latency information to XMA log.

+
+
+
+

+
+
+
+
+

Ultra Low Latency Considerations

+
+

Decoder Low Latency Mode

+

To enable low latency in the decoder, add a XmaParameter with the name low_latency, of type XMA_INT32, and value of 1. Note, the source must not contain B-frames or an error will occur. After each frame is sent to the decoder, the decoder will return XMA_SUCCESS. The application can immediately call xma_dec_session_recv_frame(). It will return either XMA_SUCCESS (indicating a frame has been returned), XMA_EOS (indicating the end of stream has been reached), or XMA_RESEND_AND_RECV (indicating the frame is still being processed and xma_dec_session_recv_frame() must keep being called until it is ready).

+
+
+

Encoder Ultra Low Latency Mode

+

To enable Ultra Low Latency in the encoder, set XmaEncoderProperties.lookahead_depth = 0. After each frame is sent to the encoder, the encoder will return XMA_SUCCESS. The application can immediately call xma_enc_session_recv_data(). It will return either XMA_SUCCESS (indicating a frame has been returned), XMA_EOS (indicating the end of stream has been reached), or XMA_RESEND_AND_RECV (indicating the frame is still being processed and xma_enc_session_recv_data() must keep being called until it is ready).

+
+

+
+
+
+
+

XRM API Reference

+

The Xilinx® FPGA Resource Manager (XRM) library is used to manage the hardware accelerators available in the system. XRM keeps track of total system capacity for each of the compute units such as the decoder, scaler, and encoder.

+

The XRM library includes a daemon, a command line tool and a C application programming interface (API). Using the library API, external applications can communicate with the XRM daemon and perform actions such as reserving, allocating and releasing resources.

+

More details on the XRM command line tool (xrmadm) and the XRM daemon (xrmd) can be found in the XRM Reference Guide section of the documentation.

+

The XRM C APIs are defined in /opt/amd/ama/ma35/include/xrm/xrm.h.

+
+

Decoder Resource Reservation with XRM

+

The decoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file.

+
+
+int xrm_dec_reserve(XrmDecodeContext *xrm_dec_ctx, int dev_index, XrmInterfaceProperties *xrm_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant decoder parameters

+
+
+void xrm_dec_release(XrmDecodeContext *xrm_dec_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmDecodeContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file.

+
+
+

Encoder Resource Reservation with XRM

+

The encoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+int32_t xrm_enc_reserve(XrmEncodeContext *xrm_enc_ctx, int dev_index, int slice_id, bool is_xav1, bool is_ull, XrmInterfaceProperties *xrm_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_enc_release(XrmEncodeContext *xrm_enc_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmEncodeContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+

Scaler Resource Reservation with XRM

+

The scaler plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+
+int32_t xrm_scale_reserve(XrmScaleContext *scaler_xrm_ctx, int dev_index, XrmInterfaceProperties *input_props, XrmInterfaceProperties *output_props, int num_outputs)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_scale_release(XrmScaleContext *scaler_xrm_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmScaleContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+

+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/card_management.html b/v1.0/card_management.html new file mode 100644 index 00000000..86af409e --- /dev/null +++ b/v1.0/card_management.html @@ -0,0 +1,579 @@ + + + + + + + + + + + + + + + Card Management — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Card Management
  • +
  • +
  • +
+
+
+
+
+ +
+

Card Management

+ +
+

Overview

+

The AMD AMA Video SDK builds on the Xilinx Resource Manager (XRM) to interface with AMD video acceleration cards. The AMD AMA Video SDK includes the mautil, mamgmt , maflash and xrmadm command line tools for card installation, upgrade, and management.

+
+

mautil, maflash and mamgmt

+

The AMD Board Utility (mautil), the AMD Flash Utility, (maflash) and the AMD Board Management Utility (mamgmt) are standalone command line tools used to query, flash and administer AMD acceleration cards.

+
    +
  • mautil is used to examine and identify the installed accelerator card(s).

  • +
  • maflash is used to flash card(s) firmware.

  • +
  • mamgmt is used to examine devices, reset and administer the installed accelerator card(s).

  • +
+

The mautil, maflash and mamgmt commands target one device at a time using a PCIe DBDF (Domain:Bus:Device.Function) identifier. The DBDF notation works as follows:

+
    +
  • PCI Domain number, often padded using leading zeros to four digits

  • +
  • A colon (:)

  • +
  • PCI Bus number in hexadecimal, often padded using a leading zeros to two or four digits

  • +
  • A colon (:)

  • +
  • PCI Device number in hexadecimal, often padded using a leading zero to two digits . Sometimes this is also referred to as the slot number.

  • +
  • A decimal point (.)

  • +
  • PCI Function number in hexadecimal.

  • +
+
+
+

xrmadm and xrmd

+

XRM is the software which manages the hardware accelerators available in the system. The XRM daemon (xrmd) is a background process supporting reservation, allocation, and release of hardware acceleration resources. The XRM xrmadm command line tool is used to interact with the XRM daemon (xrmd) in order to check status and generate resource utilization reports.

+

For more details about the XRM commands specific to the AMD AMA Video SDK refer to the XRM Command Reference Guide.

+
+
+
+

Card and Device Identifiers

+
+

Device DBDF (mautil)

+

The list of all installed AMD AMA Video SDK compatible devices, including their DBDF is obtained with the mautil examine command.

+

For example, the command below detected 2 devices and lists their BDFs:

+
$ mautil examine
+List of available devices:
+0000:01:00.0
+0000:02:00.0
+Info: No action taken, no reports given.
+Info: Use --help to check cmd options to use for reports
+
+
+

The last device listed has DBDF of 0000:02:00.0, which describes Domain 0, Bus 02, Device 00, Function 0.

+
+
+

Device DBDF (mamgmt)

+

The list of all installed AMD AMA Video SDK compatible devices, including their DBDF can also be obtained with the mamgmt examine command.

+

For example, the command below detected 2 devices and lists their DBDF designations:

+
$ mamgmt examine
+
+
+  List of available devices:
+  0000:01:00.0
+  0000:02:00.0
+  Info: No action taken, no reports given.
+  Info: Use --help to check cmd options to use for reports
+
+
+

The last device listed has DBDF of 0000:02:00.0, which describes Domain 0, Bus 2, Device 00, Function 0.

+
+
+

Bus ID

+

You can look-up the PCIe bus ID of a device through the following command:

+
cat /sys/class/misc/ama_transcoder{x}/bus_id
+
+
+

, where x is a number between 0 to total number of devices minus 1.

+

Example

+
    +
  • Bus id of /sys/class/misc/ama_transcoder0 is:

    +
    $ cat /sys/class/misc/ama_transcoder0/bus_id
    +  0000:01:00.0
    +
    +
    +
  • +
  • This can be verified by mautil examine command.

  • +
+
+
+

Firmware Version Number

+

To look-up the version number of each installed firmware, proceed as follows:

+
+
cat /sys/class/misc/ama_transcoder0/version_information
+
+
+

It should return:

+
<<<Version Info>>>
+ZSP Version = 1.0.5
+SC Version = 9.7.10
+eSecure Version = 1.0.0
+PCIe FW Version = 2.1.0
+PCIe CTRL Patch Version = 1.0.3
+PCIe PHY Patch A Version = 1.0.0
+
+
+
+
+
+
+

Checking System Status - mautil

+

The mautil commands provides useful details about your environment and can be used to ensure that your cards and devices are properly detected.:

+
mautil -d [<DBDF> | all] command, where "command" is one of the following: ("all" refers to every card in the chassis.)
+   examine    - Status of the system and device.
+   reset      - Resets the given device
+   validate   - Validates the basic shell acceleration functionality
+
+
+
+

Note

+
    +
  • Running validate sub-command on a device running a video pipeline will impact the performance of the pipeline.

  • +
  • Running reset sub-command on a device running a video pipeline will result in a non-deterministic behavior of the pipeline.

  • +
+
+

The list of applicable devices, for mautil sub-commands, can be obtained via mautil examine.

+

Note that reset sub-command is to be executed from VM instances only, with root privileges.

+

For more details on examine command, see Checking Device Status.

+
+
+

Checking Device Status

+

The mautil examine -d <DBDF> --report <type> commands provides additional details about the status of each AMD AMA Video SDK compatible device installed.

+

The --report (or -r) switch is used to view specific report(s) of interest:

+
    +
  • electrical: Reports Electrical and power sensors present on the device

  • +
  • device-hw: Provides information on the device's hardware

  • +
  • error-cnt: Reports on device's error counter

  • +
  • flash-info: Prints device's flash information

  • +
  • memory: Reports memory topology of the device

  • +
  • pcie-info: PCIe information of the device

  • +
  • thermal: Reports thermal sensors present on the device

  • +
  • all: Prints all the known status

  • +
+

These reports can also be generated in a JSON file, by adding --format JSON -o <filename> to the mautil examine command.

+

An example usage for thermal and electrical reports, for the device with DBDF 0000:02:00.0 is:

+
mautil examine -r thermal electrical -d 0000:02:00.0
+
+---------------------------------
+1/1 [0000:01:00.0] : MA35 Device
+---------------------------------
+MA35 Thermal Info:
+Device Temperature:
+  id: ma35_temp_s2 [85 C]
+Board Temperature:
+  id: board_temp [44 C]
+MA35 Electrical Info:
+Device Electrical Info:
+  id: aux [732 mV]
+  id: ddr0 [868 mV]
+  id: ml_engine [747 mV]
+  id: enc [748 mV]
+Board Electrical Info:
+  id: 3V PEX Voltage [3304 mV]
+  id: 3V AUX Voltage [3320 mV]
+  id: 12V PEX Voltage [12040 mV]
+  id: 3V PEX Current [293 mA]
+  id: 3V AUX Current [93 mA]
+  id: 12V PEX Current [426 mA]
+  id: board_power [6405 mW]
+
+
+
+
+

Checking Device Configuration - mamgmt

+

The mamgmt provides administrative commands for managing the installed devices. In addition to commands that are provided by mautil, mamgmt also allows for managing Virtual Functions (VF) on a device:

+
mamgmt -d [<DBDF> | all] command, where "command" is one of the following: ("all" refers to every card in the chassis.)
+  examine      - Status of the system and device
+  numvfs       - Create a VF. Or destroys the active VF
+  reset        - Resets the given device
+
+
+

An example usage for all available reports on 0000:01:00.0 is:

+
mamgmt examine -d 0000:01:00.0 -r all
+System Configuration
+  OS Name              : Linux
+  Release              : 5.15.0-60-generic
+  Version              : #66-Ubuntu SMP Fri Jan 20 14:29:49 UTC 2023
+  Machine              : x86_64
+  CPU Cores            : 24
+  Memory               : 63450 MB
+  glibc                : 2.35
+
+
+Devices present
+  device bdf: [0000:04:00.0]
+  device bdf: [0000:01:00.0]
+  device bdf: [0000:02:00.0]
+  device bdf: [0000:03:00.0]
+  device bdf: [0000:02:00.1]
+
+---------------------------------
+1/1 [0000:01:00.0] : MA35 Device
+---------------------------------
+
+Memory Bandwidths:
+         Tag                 Current (MBps)
+  s2_dfi_w_MBps             : 0
+  s2_dfi_r_MBps             : 0
+  s2_axi_w_MBps             : 0
+  s2_axi_r_MBps             : 0
+  s1_dfi_w_MBps             : 0
+  s1_dfi_r_MBps             : 0
+  s1_axi_w_MBps             : 0
+  s1_axi_r_MBps             : 0
+
+Pcie Info:
+  Vendor                 : 0x10ee
+  Device                 : 0x5070
+  PCIe                   : 16GT/s, Width 4
+
+MA35 Thermal Info:
+Device Temperature:
+  id: Device Temp [114 C]
+Board Temperature:
+  id: board_temp [59 C]
+
+MA35 Electrical Info:
+Device Electrical Info:
+  id: aux [740 mV]
+  id: ddr0 [868 mV]
+  id: ml_engine [750 mV]
+  id: enc [747 mV]
+Board Electrical Info:
+  id: 3V PEX Voltage [3304 mV]
+  id: 3V AUX Voltage [3296 mV]
+  id: 12V PEX Voltage [12216 mV]
+  id: 3V PEX Current [266 mA]
+  id: 3V AUX Current [80 mA]
+  id: 12V PEX Current [1026 mA]
+  id: board_power [13676 mW]
+
+Device Hardware Info:
+Device uptime (sec):5620
+Device Firmware Info:
+  PciePhyPatch:  1.0.0
+  PcieCtlPatch:  1.0.3
+  PCIe:  2.1.0
+  eSecure:  1.0.0
+  SC:  9.7.6
+  ZSP:  1.0.5
+Device Threshold Info:
+  shutdown_temp_C:  110
+  max_operating_temp_C:  105
+  threshold_temp_C:  85
+Device Hardware Info:
+  oem_id:  0xe78
+  sku_number:  01
+  part_number:  05105-01
+  Product_Name:  ALVEO MA35D ENG
+  Product_Revision:  B01
+  Product_SN:  51051A32C24K
+  Processor_Type:  VPU (Video Processing Unit)
+
+MA35 Error Counter Info:
+         Tag                 Uncorrectable       Correctable
+    THS2_axi_sram            0                   0
+    THS1_axi_sram            0                   0
+    ddr_ch7                  0                   0
+    ddr_ch6                  0                   0
+    ddr_ch3                  0                   0
+    ddr_ch2                  0                   0
+    ddr_ch1                  0                   0
+    ddr_ch5                  0                   0
+    ddr_ch0                  0                   0
+    ddr_ch4                  0                   0
+    pcie                     0                   0
+
+
+

An example usage to reset device 0000:01:00.0 is:

+
mamgmt reset -d 0000:01:00.0
+Are you sure you wish to proceed? [Y/n]: y
+****************************************************
+Reset command completed
+****************************************************
+
+
+

To create and destroy a VF device, issue the following commands, respectively:

+
$ sudo mamgmt -d <DBDF> numvfs -v 1 # Create VF device
+$ sudo mamgmt -d <DBDF> numvfs -v 0 # Destroy VF device
+
+
+
+
+

Programming a Device - maflash

+

The maflash utility provides means of programming and verifying flash images from a target device or for getting meta-data from a binary image file.

+

To flash program or verify a flashing process, specify the <DBDF> of a target device or all for all devices in a chassis:

+
sudo maflash <sub-command> [-d [<DBDF> | all] | -p | -s | -b] <path_to_flash_image>
+    -d | --device         a comma separated list of PCIe DBDFs *or* the keyword "all" which will use all detected ma35 devices
+    -p | --parallel       perform the program or verify operation simultaneous across all specified devices
+    -s | --stop-on-error  for non-parallel operations, stop at the first error detected.  The default is to continue on error
+    -b | --backup         specify that the program or verify operation should use the backup regions (where appropriate)
+
+
+

, where sub-command is one of:

+
program             - To flash an image
+verify              - To verify proper image flashing
+
+
+

For example, the following command programs the ZSP system controller of 0000:01:00.0 device with zsp_firmware_packed_v104.bin flash image.:

+
sudo /opt/amd/ama/ma35/bin/maflash program -d 0000:01:00.0 zsp_firmware_packed_v104.bin
+
+Using flash image: zsp_firmware_packed_es.bin [type: ZSP, version: 1.0.4, package_timestamp: 2023-08-29_21:52:31+00:00, keyset: ES, md5sum: 8bba16f5a321bc5710fea5106bb14f45, schema: 1]
+  Device: 0000:01:00.0
+EraseFlash Started..
+9%  18%  27%  36%  45%  54%  63%  72%  81%  90%  100%
+
+WriteFlash Started, please Wait..
+flash_progress:
+10%  20%  30%  40%  50%  60%  70%  80%  90%  100%
+
+    Operation completed successfully
+
+
+

To verify proper programming of the primary ZSP flash, issue the following command:

+
sudo /opt/amd/ama/ma35/bin/maflash verify -d 0000:01:00.0  zsp_firmware_packed_v104.bin
+
+Using flash image: zsp_firmware_packed_es.bin [type: ZSP, version: 1.0.4, package_timestamp: 2023-08-29_21:52:31+00:00, keyset: ES, md5sum: 8bba16f5a321bc5710fea5106bb14f45, schema: 1]
+  Device: 0000:01:00.0
+    Operation completed successfully
+
+
+

To get meta-data from a binary file, use the info sub-command:

+
 sudo /opt/amd/ama/ma35/bin/maflash info zsp_firmware_packed_v104.bin
+
+zsp_firmware_packed_es.bin: type: ZSP, version: 1.0.4, package_timestamp: 2023-08-29_21:52:31+00:00, keyset: ES, md5sum: 8bba16f5a321bc5710fea5106bb14f45, schema: 1
+
+
+
+
+

Checking Resource Utilization

+

Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

+
source /opt/amd/ama/ma35/scripts/setup.sh
+
+
+

Note that this command should be run only once per boot.

+

To check the current loading of all the devices in your system, use the following command:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

This will generate a report in JSON format containing the load information for all the compute unit (CU) resources. The report contains a section for each device in the system. The device sections contain sub-sections for each of the CUs (decoder, scaler, lookahead, encoder) in that device. For example, the load information for the encoder on device 0 may look as follows:

+
"device_0": {
+  ...
+  "cu_2": {
+       "cuId         ": "2",
+       "cuType       ": "IP Kernel",
+       "kernelName   ": "encoder",
+       "kernelAlias  ": "ENCODER_TYPE1_AMA",
+       "instanceName ": "encoder_1",
+       "cuName       ": "encoder:encoder_1",
+       "kernelPlugin ": "",
+       "maxCapacity  ": "497664000",
+       "numChanInuse ": "0",
+       "usedLoad     ": "0 of 1000000",
+       "reservedLoad ": "0 of 1000000",
+       "resrvUsedLoad": "0 of 1000000"
+   },
+
+
+

The usedLoad value indicates how much of that resource is currently being used. The value will range from 0 (nothing running) to 1000000 (fully loaded). The reservedLoad value indicates how much of that resource is being reserved using XRM. The resrvUsedLoad value indicates how much of the reserved load is actually being used.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/examples.html b/v1.0/examples.html new file mode 100644 index 00000000..d4d52fbe --- /dev/null +++ b/v1.0/examples.html @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + Tutorials and Examples — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v1.0/examples/amf/amf_encoder.html b/v1.0/examples/amf/amf_encoder.html new file mode 100644 index 00000000..dd42aec3 --- /dev/null +++ b/v1.0/examples/amf/amf_encoder.html @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + AMF Encoder Tutorial — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMF Encoder Tutorial
  • +
  • +
  • +
+
+
+
+
+ +

Under Construction

+
+

AMF Encoder Tutorial

+

The examples in the /opt/amd/ama/ma35/bin folder illustrate how C-based applications can perform encoding in AMD AMA Video SDK devices, using the AMF (Advanced Media Framework) APIs.

+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/examples/ffmpeg/filters.html b/v1.0/examples/ffmpeg/filters.html new file mode 100644 index 00000000..bdd2eca7 --- /dev/null +++ b/v1.0/examples/ffmpeg/filters.html @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + FFmpeg Examples using Software Filters — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

FFmpeg Examples using Software Filters

+ +

Examples shown in this section describe how to use FFmpeg combining both AMD accelerated functions and software filters. In all these examples, an AMA compatible device, e.g., MA35D, is used to decode the input stream, the decoded frames are transfered back to the host using the hwdownload filter, one or more software filters are applied to the decoded frames and the filtered frames are transfered back to the device using hwupload for encoding. It should be noted that, when possible, zero-copy filters such as split and fps should be used, to minimize the traffic between the host CPU and target device.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Video Rotation

+

The following example demonstrates how to generate multiple flip-over operations on the host CPU and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "split=2[a][b]; \
+  [a]hwdownload,transpose=dir=1:passthrough=none,hwupload[a1]; \
+  [b]hwdownload,transpose=dir=2:passthrough=none,hwupload[b1]" \
+ -map "[a1]" -c:v h264_ama  -f mp4 <OUT DIR>/90_flip.mp4 \
+ -map "[b1]" -c:v h264_ama  -f mp4 <OUT DIR>/270_flip.mp4
+
+
+

, where INPUT is the path to the input AVC clip and OUT DIR is the name of the output directory. See FFmpeg's filters for details on passthrough and split filters.

+
+
+

Logo Overlay

+

The following example demonstrates how to overlay a yuv420p image on a decoded video, through host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -i <y4M LOGO> -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "[1]hwdownload[vid],[vid][0]overlay=x=0:y=0[l],[l]format=yuv420p[lay],[lay]hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/overlay.mp4
+
+
+

Note that input to accelerated encoder, h264_ama, is in yuv420p format. See FFmpeg's overlay filter for detail usage.

+
+
+

Crop and Shift

+

The following example demonstrates how to crop a decoded video, at a given x and y offsets, through host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "hwdownload,crop=640:480:(in_w-800):(in_h-out_h)/2,hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/crop.mp4
+
+
+
+
+

Video Composition

+

The following example demonstrates how to compose a tiled video on the host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -out_fmt yuv420p -i <INPUT_1> -c:v h264_ama -out_fmt yuv420p -i <INPUT_2> \
+ -c:v h264_ama -out_fmt yuv420p -i <INPUT_3> -c:v h264_ama -out_fmt yuv420p -i <INPUT_4> \
+ -filter_complex "[0]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[00];[1]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[11];\
+  [2]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[22];[3]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[33]; [00][11]hstack[top];\
+  [22][33]hstack[bot]; [top][bot] vstack,hwupload" \
+ -c:v h264_ama -b:v 15M -vframes 600 -f mp4 <OUT DIR>/compose.mp4
+
+
+
+

Note

+

For 10-bit support, the following changes are required to the provided examples:

+
    +
  1. Replace -out_fmt yuv420p with -out_fmt yuv420p10le

  2. +
  3. Add format=yuv420p10le to the filter graph.

  4. +
+

As an example, the following command shows 10-bit crop and shift:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p10le -i <INPUT> \
+ -filter_complex "hwdownload,format=yuv420p10le,crop=640:480:(in_w-800):(in_h-out_h)/2,hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/crop_10b.mp4
+
+
+
+
+
+

Chroma Subsampling

+

The following example demonstrates how to perform 4:2:2 to 4:2:0 chroma subsampling on the host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -i <INPUT>  -vf "format=yuv420p,hwupload" -c:v h264_ama -b:v 1M -f mp4 <OUTPUT>
+
+
+

, where <INPUT> is path to the 442 input raw file and <OUTPUT> is the encoded video file.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/examples/ffmpeg/quality_analysis.html b/v1.0/examples/ffmpeg/quality_analysis.html new file mode 100644 index 00000000..7d7f39c1 --- /dev/null +++ b/v1.0/examples/ffmpeg/quality_analysis.html @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + Video Quality Examples — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Video Quality Examples

+

This page is dedicated to explaining some of the details behind Video Quality (VQ), how it is measured, and how you can optimize your FFmpeg commands with the AMD AMA Video SDK to maximize its performance.

+

Further documentation on this topic can be found in the Tuning Video Quality section of the AMD AMA Video SDK user guide.

+ +
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Introduction to Video Quality

+

There has been a longstanding goal for video engineers to quantitatively determine the output quality of an encoder without having to watch and inspect every individual frame. This has led to an evolution of algorithmic solutions, the most common of which are:

+ +

Many people will argue which metric is best (although PSNR is commonly considered the least accurate). Jan Ozer from the Streaming Media Center posted his experimental correlation of MOS vs the above metrics. You can review the findings here.

+

Furthermore, due to the industry standard of tracking encoder "performance" to quantitative metrics like the ones listed above, many encoders have "taught to the test"; that is, they provide different command-line arguments that will give higher scores but may look worse to the human eye. For example, common CPU encoders x264 and x265 have a tune parameter which optimizes to objective metrics.

+

This page discusses the AMD AMA Video SDK command line flags used to optimize for objective quality (scores) and subjective quality (visual appeal) and provides additional details as to what is happening behind the scenes and why.

+
+
+

Optimized Settings for the AMD AMA Video SDK

+

It is highly recommended to perform encoding on raw video clips; that is, clips that have not undergone a transform/compression/encoding in the past. This ensures that the clips are in a universally known state in order to fairly compare encoders.

+

Alternatively, you can add the flags to decode before encoding, and the results will remain accurate as long as the same pre-encoded file is used as the source across all encoders under test. Information on this process can be found on the FFmpeg tutorial page.

+

Flags not illustrated in this page are covered in the Using FFmpeg chapter of the AMD AMA Video SDK user guide.

+

The following table demonstrates various encoder parameters that effect VQ and latency.

+ + ++++++ + + + + + + + + + + + + + + +
Video Tuning Parameters

Tune Mode

Latency Setting

Preset Type

Encoder

VMAF

+

VQ

+

SSIM

+

PSNR

+

(See -tune_metrics)

+

Normal

+

Ultra Low Latency

+

(See -lookahead_depth)

+

Medium

+

Slow

+

(See -preset)

+

h264_ama

+

hevc_ama

+

av1_ama

+

(See -c:v)

+
+

Various permutations of Metrics, Latency and Preset are possible. The following sections provide demonstrative examples.

+
+

AV1 VMAF - Normal Latency - Medium Preset

+

In this mode, which is the default mode, the only adjustable parameter is the tuning mode. The following example, illustrates the VMAF tune mode, for AV1 encoder

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v av1_ama -tune_metrics 4 -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -tune_metrics 4 specifies VMAF optimization mode.

+
+
+

AVC VMAF - Normal Latency - Slow Preset

+

In this mode, real-time performance at capacity is not guaranteed; however, better results are obtained, with respect to the selected tune metric. Note that this mode is not applicable to either types of AV1.

+

The following example, illustrates the VMAF tune mode, for AVC encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v h264_ama -tune_metrics 4 -preset slow -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -preset slow optimizes the objective tuning modes.

+
+
+

AV1 VMAF - Ultra Low Latency - Medium Preset

+

Ultra Low Latency (ULL) is achieved by setting the -lookahead_depth to 0. The following example, illustrates the VMAF tune ULL mode, for AV1 encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v av1_ama -tune_metrics 4 -b:v 2000k -lookahead_depth 0 -f rawvideo <OUTPUT>
+
+
+
+
+

AVC VMAF - Ultra Low Latency - Slow Preset

+

This mode is the combination of ULL and metric optimized options. Note that this mode is not applicable to either types of AV1.

+

The following example, illustrates the VMAF tune ULL mode, for AVC encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v h264_ama -tune_metrics 4 -lookahead_depth 0 -preset slow -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -preset slow optimizes the objective tuning modes.

+
+
+
+

Running PSNR/SSIM/VMAF Scores

+

Due to licensing reasons, the FFmpeg binary delivered in this package does not include a comprehensive set of codecs or plugins required for scoring video quality. You have many options:

+
    +
  1. (Easiest) Download a static FFmpeg build from John Van Sickle which has VMAF (among other plugins) precompiled + installed

  2. +
  3. Recompile another version FFmpeg and include the VMAF library

  4. +
  5. Recompile the FFmpeg starting from the source code included in this repository and include the VMAF library. For instructions on how to customize and rebuild the FFmpeg provided with the AMD AMA Video SDK, see the Rebuilding FFmpeg section

  6. +
+

The following sample command line demonstrates a typical VMAF calculation, through FFmpeg:

+
<FFMPEG PATH>/ffmpeg -i <DISTORTED FILE> -framerate <FRAME RATE> -s <RESOLUTION> -pix_fmt yuv420p -i <ORIGINAL> \
+-lavfi libvmaf="log_fmt=json:ms_ssim=1:ssim=1:psnr=1:log_path=/<LOG FILE PATH>.vmaf.json:model_path=<PATH TO VMAF MODEL>" -f null -
+
+
+

, where FFMPEG PATH is the path to modified FFmpeg, DISTORTED FILE is the encoded file, RESOLUTION is WidthxHeigth resolution of the original clip, ORIGINAL is the original clip, LOG FILE PATH is the path of log file and PATH TO VMAF MODEL is the path to an appropriate VMAF model, which typically is vmaf_4k_v0.6.1.pkl for 4K resolution or vmaf_float_v0.6.1.pkl for lower resolutions. See Models for relevant details. The above command line calculates PSNR, SSIM and VMAF, in json format.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/examples/ffmpeg/tutorials.html b/v1.0/examples/ffmpeg/tutorials.html new file mode 100644 index 00000000..f5705dcf --- /dev/null +++ b/v1.0/examples/ffmpeg/tutorials.html @@ -0,0 +1,558 @@ + + + + + + + + + + + + + + + FFmpeg Tutorials — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

FFmpeg Tutorials

+

This page provides tutorials on how to use FFmpeg with the AMD AMA Video SDK. The complete reference guide for the FFmpeg version included in the AMD AMA Video SDK can be found here.

+

The tutorials break down the commands, starting with simple decode, scale and encode pipelines. The tutorials end with different varieties of full transcode pipelines.

+ +
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+

+
+
+
+

Simple FFmpeg Examples

+

Some of the examples read or write RAW files from disk (encode-only or decode-only pipelines). There is a chance that due to the massive bandwidth required for operating on these RAW files, you will notice a drop in FPS; this is not due to the AMD AMA Video SDK but the disk speeds. We recommend reading/writing from /dev/shm which is a RAM disk.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Decode Only

+

This example accepts a clip that is already encoded in H.264, and will decode the file into a RAW format and save it to disk.

+

Command Line:

+
ffmpeg -y -hwaccel ama -c:v h264_ama -out_fmt nv12 -i <INPUT> \
+ -vf hwdownload,format=nv12 -f rawvideo /tmp/dec_out.nv12
+
+
+

Explanation of the flags:

+
    +
  • ffmpeg

    +
      +
    • The ffmpeg application, which is provided by AMD, and moved to the top of the PATH when you sourced the setup.sh script

    • +
    +
  • +
  • hwaccel ama

    +
      +
    • Instructs FFmpeg to use accelerated plugins provided by AMD AMA Video SDK

    • +
    +
  • +
  • -out_fmt nv12

    +
      +
    • Specifies nv12 output format for the decoded video. Note that this option has to be specified twice: 1) To convert from the internal buffer format to nv12 in the decoder and 2) To convert when transferring to the host.

    • +
    +
  • +
  • -f rawvideo

    +
      +
    • This signifies that the video is in a raw format, without container or other metadata/information about the clip

    • +
    +
  • +
  • -c:v h264_ama

    +
      +
    • Declares the decoder's codec for video (as opposed to, e.g., audio -c:a ac3) is the hardware-accelerated H.264 decoder

    • +
    +
  • +
  • -i <INPUT>

    +
      +
    • The input file to be transcoded

    • +
    +
  • +
  • -vf hwdownload

    +
      +
    • Internally, the decoder operates on AMD AMA Video SDK type buffers to improve performance. To convert back to a host-buffer, you must execute this filter.

    • +
    +
  • +
  • -y

    +
      +
    • Enable overwrite without prompting the user if they're sure

    • +
    +
  • +
  • /tmp/dec_out.yuv

    +
      +
    • The decoder will save the file to the path above

    • +
    +
  • +
+
+
+

Encode Only

+

This example accepts a RAW 1080p60 clip in YUV420 format. It will pass the clip to the encoder to produce an AV1 encoded MP4 output with a target bitrate of 5Mbps and saves it to disk. The command uses the default VQ setting. See FFmpeg Video Quality for details.

+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -b:v 5M -f mp4 -y sn1_av1.mp4
+
+
+

Explanation of the flags:

+
    +
  • -re

    +
      +
    • Flag to maintain the target frame rate

    • +
    +
  • +
  • -s 1920x1080

    +
      +
    • Since there is no container or metadata in a RAW clip, the user must define the input clip's resolution/size. This example states the input is 1080p

    • +
    +
  • +
  • -framerate 60

    +
      +
    • Again, without metadata, the encoder requires the framerate of the incoming stream

    • +
    +
  • +
  • -pix_fmt yuv420p

    +
      +
    • The color space of the encoder is by default yuv420p. this example is defining the input clip as being this same color space

    • +
    +
  • +
  • -f mp4

    +
      +
    • Sets the output video container to MP4

    • +
    +
  • +
  • -b:v 5M

    +
      +
    • The target bitrate of the encoded stream. 8M signifies a target bitrate of 8 Megabits per second. You can also use 8000K or 8000000.

    • +
    +
  • +
  • -c:v av1_ama

    +
      +
    • Declares the encoder's codec for video (as opposed to audio -c:a ...) is the hardware-accelerated AV1 encoder

    • +
    +
  • +
  • /tmp/enc_out.mp4

    +
      +
    • Save the output in the above path.

    • +
    +
  • +
+
+

Constant Rate Factor (CRF) Mode

+

The following examples demonstrate the usage of the -crf flag and impact of the -qp option on the quality of the encoded streams.

+
+
High Quality Encoding
+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -crf 1 -qp 0 -f mp4 sn1_crf_hq.mp4
+
+
+

Explanation of the flags:

+
    +
  • -crf 1

    +
      +
    • Enables the -crf mode

    • +
    +
  • +
  • -qp 0

    +
      +
    • Sets the encoded AV1 stream to highest CRF quality

    • +
    +
  • +
+
+
+
Low Quality Encoding
+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -crf 1 -qp 255 -f mp4 sn1_crf_lq.mp4
+
+
+

Explanation of the flags:

+
    +
  • -qp 255

    +
      +
    • Sets the encoded AV1 stream to lowest CRF quality

    • +
    +
  • +
+
+
+
+
+

Basic Transcode

+

This example takes an H.264 clip and transcodes it to HEVC at the bitrate of 8Mbps. The output is written into /tmp/h264_to_hevc.

+

Command Line:

+
ffmpeg -y -hwaccel ama -c:v h264_ama -i <INPUT> \
+ -c:v hevc_ama -b:v 8M  -f rawvideo  /tmp/h264_to_hevc.hevc
+
+
+
+
+

Decode Only Into Multiple-Resolution Outputs

+

This example decodes an existing H.264 file and then scales it into multiple resolutions as defined below. It will not re-encode them, but save the RAW outputs to disk under /tmp/_scale<resolution>.yuv

+

Command Line:

+
 ffmpeg -y -hwaccel ama \
+-c:v h264_ama  -out_fmt nv12 -i <INPUT>  \
+-filter_complex "scaler_ama=outputs=4:out_res=(1920x1080|full|nv12)(1280x720|full|nv12)(720x480|full|nv12)(360x240|full|nv12) [a][b][c][d]; [a]hwdownload,format=nv12[a1];[b]hwdownload,format=nv12[b1];[c]hwdownload,format=nv12[c1];[d]hwdownload,format=nv12[d1]" \
+-map '[a1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_1080p.yuv \
+-map '[b1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_720p.yuv  \
+-map '[c1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_480p.yuv \
+-map '[d1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_240p.yuv
+
+
+

Explanation of the flags:

+
    +
  • -filter_complex

    +
      +
    • The FFmpeg -filter_complex flag allows combining multiple filters together using a graph-like syntax. This example uses the scaler_ama to create 4 output resolutions from the input stream.

    • +
    • The scaler_ama filter configures the hardware-accelerated scaler to produce 4 output resolutions (1920x1080, 1280x720, 720x480, and 360x240). For each output, the width, height, frame rate and pixel format are defined as arguments to out_res option as in (WidthxHeight|Rate|Format). The 4 outputs are transfered to the host as a1, b1, c1 and d1 respectively.

    • +
    +
  • +
  • -map "[ID]"

    +
      +
    • Selects an output of the filter graph. The flags that follow apply to the selected stream.

    • +
    +
  • +
  • /tmp/scale_<resolution>.yuv

    +
      +
    • Save the output files to the paths listed

    • +
    +
  • +
+
+
+

Encode Only Into Multiple-Resolution Outputs

+

This example takes a raw 1080p60 YUV file, scales it down to different resolutions and frame rates, encodes each of the scaled streams to different formats and saves them to disk under /tmp/<encode format>_<resolution>p<frame rate>.mp4

+

Command Line:

+
ffmpeg -y -hwaccel ama -f rawvideo -pix_fmt yuv420p -s:v 1920x1080 -framerate 60 -i <INPUT> \
+-filter_complex "hwupload,scaler_ama=outputs=4:out_res=(1920x1080|full)(1280x720|half)(720x480|half)(360x240|half) [a][b][c][d]" \
+-map '[a]' -c:v hevc_ama -b:v 6M -f mp4 -y /tmp/hevc_1080p60.mp4 \
+-map '[b]' -c:v av1_ama  -b:v 2M -f mp4 -y /tmp/av1_720p30.mp4 \
+-map '[c]' -c:v h264_ama -b:v 1M -f mp4 -y /tmp/h264_480p30.mp4 \
+-map '[d]' -c:v av1_ama  -b:v 1M -f mp4 -y /tmp/av1_240p30.mp4
+
+
+

Explanation of the flags:

+
    +
  • -filter_complex "hwupload...

    +
      +
    • Specifies that video clip gets upload to the device.

    • +
    +
  • +
  • -filter_complex "...scaler_ama=outputs=4:out_res=...(1280x720|half)...

    +
      +
    • Declares scaler output of given resolution and rate. See scaler_ama for more details.

    • +
    +
  • +
  • -c:v [hevc_ama | av1_ama | h264_ama]

    +
      +
    • Declares various encode types HEVC, AV1 and H.264, respectively.

    • +
    +
  • +
  • /tmp/encode-format_resoultion.encode-format

    +
      +
    • Saves the output clips to the location listed

    • +
    +
  • +
+
+
+

Transcode with Multiple-Resolution Outputs

+

This example implements a complete transcoding pipeline on an 1080p60 H.264 input. It decodes the input stream, scales it to 4 different resolutions and encodes scaler's outputs into various formats and saves them to disk under /tmp/<encoder format>_<resolution>.mp4

+

Command Line:

+
ffmpeg -y -hwaccel ama \
+-c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=4:out_res=(1920x1080)(1280x720)(720x480)(360x240) [a][b][c][d]" \
+-map '[a]' -c:v hevc_ama -b:v 6M -f mp4 -y /tmp/hevc_1080p.mp4 \
+-map '[b]' -c:v av1_ama  -b:v 2M -f mp4 -y /tmp/av1_720p.mp4 \
+-map '[c]' -c:v h264_ama -b:v 1M -f mp4 -y /tmp/h264_480p.mp4 \
+-map '[d]' -c:v av1_ama  -b:v 1M -f mp4 -y /tmp/av1_240p.mp4
+
+
+
+
+

Transcode in ULL Mode

+

This example implements an ultra low latency transcode pipeline. For more details refer Tuning Transcode Latency.

+

Command Line:

+
ffmpeg  -hide_banner -loglevel error -y -hwaccel ama -low_latency 1 -c:v h264_ama -i <INPUT> \
+-c:v hevc_ama -b:v 10M -lookahead_depth 0 -f rawvideo /tmp/h264_to_hevc.hevc
+
+
+

Explanation of the flags:

+
    +
  • -low_latency 1

    +
      +
    • Enables low latency decoding mode.

    • +
    +
  • +
  • -lookahead_depth 0

    +
      +
    • LA size of 0 triggers ultra low latency encoding mode.

    • +
    +
  • +
+
+
+

Double Density Example with xrmd

+

This example demonstrates an example on how to achieve 4x4kp60 density on a single device

+

Command Line:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -i <4Kp6 H.264 file> \
+ -filter_complex "split=4[a][b][c][d]" \
+ -map "[a]" -c:v av1_ama -f rawvideo -y /tmp/out_3840x2160_0.av1 \
+ -map "[b]" -c:v hevc_ama -f rawvideo -y /tmp/out_3840x2160_0.hevc \
+ -map "[c]" -c:v av1_ama -f rawvideo -y /tmp/out_3840x2160_1.av1 \
+ -map "[d]" -c:v hevc_ama -f rawvideo -y /tmp/out_3840x2160_1.hevc
+
+
+

Explanation of the flags:

+
    +
  • -split

    +
      +
    • Splits input into several identical outputs.

    • +
    +
  • +
+
+
+

Double Density Example without xrmd

+

This example demonstrates how to achieve 4x4kp60 density on a single device, by explicitly allocating tasks on slices 0 and 1. Note in this example xrmd service has to be stopped.

+

Command Line:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -i <4Kp6 H.264 file> \
+ -filter_complex "split=4[a][b][c][d]" \
+ -map "[a]" -c:v av1_ama -slice 0 -f rawvideo -y /tmp/out_3840x2160_0.av1 \
+ -map "[b]" -c:v hevc_ama -slice 0 -f rawvideo -y /tmp/out_3840x2160_0.hevc \
+ -map "[c]" -c:v av1_ama -slice 1 -f rawvideo -y /tmp/out_3840x2160_1.av1 \
+ -map "[d]" -c:v hevc_ama -slice 1 -f rawvideo -y /tmp/out_3840x2160_1.hevc
+
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/examples/gstreamer/filters.html b/v1.0/examples/gstreamer/filters.html new file mode 100644 index 00000000..b26f5207 --- /dev/null +++ b/v1.0/examples/gstreamer/filters.html @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + GStreamer Examples using Software Filters — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Examples using Software Filters

+ +

The /opt/amd/ama/ma35/examples/gstreamer/ama_pipeline_scripts/filters/ folder contains different examples showing how to use GStreamer combining both AMD accelerated functions and software filters. In all these examples, an AMA compatible device, e.g., MA35D, is used to decode the input stream, the decoded frames are transfered back to the host using the ama_download filter, one of more software filters are applied to the decoded frames and the filtered frames are transfered back to the device using ama_upload for encoding. It should be noted that, when possible, zero-copy filters such as split and fps should be used, to minimize the traffic between the host CPU and target device.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Video Rotation

+
    +
  • Example script: 01_rotate_video.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and will send the rotated, encoded h.264 output to /tmp/xil_rotate_<N>.mp4.

+
+
+

Logo Overlay

+
    +
  • Example script: 02_logo_overlay.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and an image file ("logo"). It will scale the logo to 500x100, place it 16 pixels right and 16 pixels down from the top-left corner of the output video file, which will be an encoded h.264 output saved to /tmp/xil_logo_overlay.mp4.

+
+
+

Crop and Zoom

+
    +
  • Example script: 03_crop_zoom.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and will crop a 300x200 sized section of the original video. The section's top left corner begins at 20 pixels to the right, and 10 pixels down from the top-left corner of the original video. The output video is h.264 encoded and is saved to /tmp/xil_crop_zoom.mp4

+
+
+

Video Composition

+
    +
  • Example script: 04_multi_comp.sh

  • +
+

This example accepts 4x 8-bit, YUV420, pre-encoded h264 files of equal dimensions, and will create an output 2x2 composite video which will be an encoded h.264 output saved to /tmp/xil_multi_comp.mp4. The output resolution will be equal to the original input.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/examples/gstreamer/tutorials.html b/v1.0/examples/gstreamer/tutorials.html new file mode 100644 index 00000000..8279741a --- /dev/null +++ b/v1.0/examples/gstreamer/tutorials.html @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + GStreamer Introductory Tutorials — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Introductory Tutorials

+

This page provides tutorials on how to use GStreamer with the AMD AMA Video SDK. The complete reference guide for the GStreamer version included in the AMD AMA Video SDK can be found here.

+ +
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Simple GStreamer Examples

+

By default, all the example scripts use the filesink plug-in and write the output files into the /tmp directory.

+

Some of the examples read or write RAW files from disk (encode-only or decode-only pipelines). There is a chance that due to the massive bandwidth required for operating on these RAW files, you will notice a drop in FPS; this is not due to the AMD AMA Video SDK but the disk speeds. We recommend reading/writing from /dev/shm which is a RAM disk.

+

Most of the scripts allow to use the fakesink plug-in which only displays performance numbers and will not write outputs to disk. This is done by setting the “fakesink” argument to 1.

+

Each script contains error checks before passing arguments to GStreamer pipeline command to help users avoid giving incorrect arguments.

+

Most of the example scripts included in this directory take H.264 input streams. To use H.265 input streams, update the scripts to use the h265parse GStreamer plug-in instead of h264parse.

+

For brevity purposes, explanations of the GStreamer element properties are not repeated after they have been explained once. The detailed explanation of the each GStreamer pipeline element property can be obtained by using gst-inspect-1.0 <element name> (e.g. gst-inspect-1.0 ama_av1enc).

+
+

Decode only

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! parsebin ! h264parse ! ama_h264dec ! capsfilter 'caps=video/x-raw(memory:AMAMemory),format=NV12' !  ama_download ! filesink location=/tmp/h264.nv12
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • gst-launch-1.0

    +
      +
    • The GStreamer application, which is provided by AMD, and moved to the top of the PATH when you sourced the setup.sh script

    • +
    +
  • +
  • filesrc location

    +
      +
    • Location of the file h.264 to read

    • +
    +
  • +
  • parsebin

    +
      +
    • Unpacks the container to elementary stream

    • +
    +
  • +
  • h264parse

    +
      +
    • Parses H.264 streams

    • +
    +
  • +
  • ama_h264dec

    +
      +
    • GStreamer plug-in that provides functionality to decode H.264 encoded streams. This plug-in accepts input encoded stream in byte-stream/NALU format only and produces NV12 frames.

    • +
    +
  • +
  • capsfilter

    +
      +
    • Specifies the capabilities of the streams. Note that keyword capsfilter is optional.

    • +
    +
  • +
+
+
+

Encode only

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! rawvideoparse width=1920 height=1080 format=i420 framerate=60/1 ! ama_upload ! ama_h264enc ! h264parse ! filesink location=/tmp/out.h264
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • ama_h264enc

    +
      +
    • GStreamer plug-in that provides functionality to encode raw bit streams into AVC byte-stream.

    • +
    +
  • +
  • rawvideoparse

    +
      +
    • This element converts unformatted data streams into timestamped raw video frames, with specified resolution, frame rate and pixel format.

    • +
    +
  • +
  • ama_upload

    +
      +
    • This plugin transfer raw video file content from host to the device

    • +
    +
  • +
+
+
+

Transcode with Multiple-Resolution outputs

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! parsebin ! \
+h264parse ! ama_h264dec ! identity eos-after=1200 ! ama_scaler name=s \
+s.src_0 ! 'video/x-raw(memory:AMAMemory),width=1920,height=1080' ! ama_h265enc bitrate=6000000 ! queue ! filesink location=/tmp/hevc_1080p.hevc \
+s.src_1 ! 'video/x-raw(memory:AMAMemory),width=1280,height=720' ! ama_av1enc bitrate=2000000 ! queue ! filesink location=/tmp/av1_720p.av1 \
+s.src_2 ! 'video/x-raw(memory:AMAMemory),width=720,height=480' ! ama_h264enc bitrate=1000000 ! queue ! filesink location=/tmp/h264_480p.h264 \
+s.src_3 ! 'video/x-raw(memory:AMAMemory),width=360,height=240' ! ama_av1enc bitrate=1000000 ! queue ! filesink location=/tmp/av1_240p.av1
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • queue

    +
    +
      +
    • The queue will create a new thread on the source pad to decouple the processing on sink and source pad.

    • +
    +
    +
  • +
  • identity

    +
    +
      +
    • In this usage, forces the insertion of EOS after 1200 buffers.

    • +
    +
    +
  • +
+

For more comprehensive sets of examples refer to /opt/amd/ama/ma35/examples/gstreamer/ama_pipeline_scripts/tutorials folder.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/examples/gstreamer/xabrladder.html b/v1.0/examples/gstreamer/xabrladder.html new file mode 100644 index 00000000..956a6300 --- /dev/null +++ b/v1.0/examples/gstreamer/xabrladder.html @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + + GStreamer ABR Ladder Application — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer ABR Ladder Application

+ +
+

Introduction

+

The sample multi-scale program located at /opt/amd/ama/ma35/bin/gstreamer/ is a command line utility which implements the GStreamer video transcoding pipeline described in the diagram below. This application expects an input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams. The resolution of each output stream is configured using a JSON file (by default: /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder/abrladder.json). The output streams produced by this application are saved in the /tmp/ladder_outputs/ folder.

+

This application is installed through the amd-ama-gstreamer package. If this package is not present on your system, install it by following the steps described in the package feed page. The source code for this application is also available under, /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder.

+GStreamer pipeline of the ama_xabrladder application +
+

Note

+

This example supports input files of elementary stream NAL type or mp4 containers, with H.264/H.265 elementary stream in it. No other formats are supported

+
+
+
+

Host System Requirement

+
    +
  • AMD AMA Video SDK

  • +
  • amd-ama-gstreamer package

  • +
+
+
+

Usage

+

Below are the input parameters required to run the application.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Parameter

Short Form

Description

+
+--devidx
+
+ +
+
+-i
+
+ +
+
device index
+
Type: int
+
Range: 0 to 31
+
Default: NA
+
Option: Mandatory
+
+
+
+--json
+
+ +
+
+-j
+
+ +
+
JSON file used to describe the configuration of the ABR ladder
+
Type: string
+
Range: NA
+
Default: /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder
+
Option: Optional
+
+
+
+--codectype
+
+ +
+
+-c
+
+ +
+
Output codec type
+
Type: int
+
Range: 0 (H264), 1 (H265)
+
Default: NA
+
Option: Mandatory
+
+
+
+--file
+
+ +
+
+-f
+
+ +
+
Input file path name (mp4/elementary-stream)
+
Type: string
+
Range: NA
+
Default: NA
+
Option: Mandatory
+
+
+
+--forcekeyframe
+
+ +
+
+-k
+
+ +
+
Keyframe (IDR frame) insertion frequency in number of frames
+
Type: int
+
Range: NA
+
Default: 0
+
Option: Optional
+
+
+
+
+

Examples

+

Below are example commands for the ABR ladder use case. The output files are stored in /tmp/ladder_outputs/ folder. Ensure that enough space is available in this folder.

+
    +
  1. Running one ABR ladder on one device:

    +
    ama_xabrladder  --devidx 0 --codectype 0 --file <path to file>
    +
    +
    +
  2. +
+

The above command takes the input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams based on the codec type provided (0 for H.264 and 1 for H.265) with the following resolutions: 720p60, 720p30, 480p30, 360p30 and 160p30.

+
    +
  1. Running one ABR ladder on one device without lookahead:

    +
    ama_xabrladder  --devidx 0 --lookahead_enable 0 --codectype 0 --file <path to file>
    +
    +
    +
  2. +
+

The above command takes the input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams based on the codec type provided (0 for H.264 and 1 for H.265) with the following resolutions: 720p60, 720p30, 480p30, 360p30 and 160p30.

+
    +
  1. Running one ABR ladder on one device with lookahead enabled, and using the short-form options:

    +
    ama_xabrladder -i 0  -c 0 -f <path to file>
    +
    +
    +
  2. +
  3. Running two ABR ladders, mapping each ladder to a specific device using the devidx option:

    +
    ama_xabrladder --devidx 0  --codectype 1 --file <path to file>
    +ama_xabrladder --devidx 1  --codectype 1 --file <path to file>
    +
    +
    +
  4. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/examples/gstreamer/xcompositor.html b/v1.0/examples/gstreamer/xcompositor.html new file mode 100644 index 00000000..a9da46e1 --- /dev/null +++ b/v1.0/examples/gstreamer/xcompositor.html @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + GStreamer Compositor Application — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Compositor Application

+ +
+

Introduction

+

The sample compositor program located at /opt/amd/ama/ma35/bin/gstreamer/ is a command line utility which implements the GStreamer video transcoding pipeline described in the diagram below. This application expects four input video files 60(mp4 with H.264/H.265 or H.264/H.265 elementary stream). The resolution of each input cannot exceed 1080p. The application creates an output stream by first composing the four inputs in a 2x2 grid, then by adding an optional logo and lastly by inserting a time stamp.

+

This application is installed through the amd-ama-gstreamer package. If this package is not present on your system, install it by following the steps described in the package feed page. The source code for this application is also available under, /opt/amd/ama/ma35/examples/gstreamer/ama_xcompositor.

+GStreamer pipeline of the ama_xcompositor application +
+

+
+
+
+

Host System Requirement

+
    +
  • AMD AMA Video SDK

  • +
  • amd-ama-gstreamer package

  • +
+
+
+

Usage

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Parameter

Description

-f

+
mp4/elementary-stream file path. Resolutions up to 1080p are supported.
+
Type: string
+
Range: NA
+
Default: NA
+
Option: Mandatory
+
+

-l

+
png/jpg logo file path. No logo will be overlayed if this option is not specified.
+
Type: string
+
Range: NA
+
Default: Null
+
Option: Optional
+
+

-b

+
Max bitrate for encoder in Kbps
+
Type: int
+
Range: 0 to 4294967295
+
Default: 5000
+
Option: Optional
+
+

-i

+
device index
+
Type: int
+
Range: 0 to 31
+
Default: 0
+
Option: Optional
+
+

-h

+
Horizontal offset of overlay logo in fractions of video image width, from top-left corner of video image (in relative positioning)
+
Type: double
+
Range: 0 to 1
+
Default: 0.9
+
Option: Optional
+
+

-v

+
Vertical offset of overlay logo in fractions of video image height, from top-left corner of video image (in relative positioning)
+
Type: double
+
Range: 0 to 1
+
Default: 0
+
Option: Optional
+
+

-n

+
Number of input buffers
+
Type: integer
+
Range: 20 to 2147483647
+
Default: 2000
+
Option: Optional
+
+

-o

+
Output file name and path
+
Type: String
+
Range: NA
+
Default: ./result.mp4
+
Option: Optional
+
+
+
+
+

Examples

+
    +
  1. Composition along with logo on top right of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png
    +
    +
    +
  2. +
  3. Composition with logo on top left of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png -h 0 -v 0
    +
    +
    +
  4. +
  5. Composition with logo on center of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png -h 0.5 -v 0.5
    +
    +
    +
  6. +
  7. Composition without logo layer:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265
    +
    +
    +
  8. +
  9. Composition on device with index 2:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -i 2
    +
    +
    +
  10. +
  11. Composition on decoder soft kernel start index at 8:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265
    +
    +
    +
  12. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/examples/xma/xma_apps.html b/v1.0/examples/xma/xma_apps.html new file mode 100644 index 00000000..251e6724 --- /dev/null +++ b/v1.0/examples/xma/xma_apps.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + + + XMA Examples for the AMD AMA Video SDK — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

XMA Examples for the AMD AMA Video SDK

+ +

The examples in the /opt/amd/ama/ma35/bin folder illustrate how C-based applications can natively interact with AMD AMA Video SDK devices using the XMA (Xilinx Media Accelerator) APIs. Source codes for decoder, encoder, scaler and transcoder can be found under /opt/amd/ama/ma35/examples/xma directory.

+

Detailed documentation on the AMD AMA Video SDK plugin interface and the XMA APIs can be found in the C API Programming Guide section of the documentation.

+

Requirements

+
    +
  • The XMA applications has been built for and verified on a supported OS.

  • +
  • The XMA applications only work with elementary streams. Container formats such as mp4 are not supported.

  • +
+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

XMA Decoder App

+
+

Decoder Test Instructions

+

The XMA decoder application supports most of the decode options supported by FFmpeg. The XMA decoder application supports only elementary H.264, HEVC and AV1 encoded bitstreams.

+
+

Decoder Usage

+

Running the decoder app with the --help option will print the complete list of options:

+
ma35_decoder_app --help
+encoded file and utilizes hardware acceleration to get the decoded
+output.
+
+Usage:
+        ma35_decoder_app [options] -i <input-file> -c:v <codec-type>
+        [codec_options] -o <output-file>
+
+Arguments:
+        --help                     Print this message and exit
+        -log_level <value>         Specify the log level
+        -log_location <value>      Log location. 0 for none,
+                                   1 console (default), 2 syslog, 3 file
+        -log_file <file>           Name and path of the log file. Default
+                                   ma35_decoder_app.log
+        -d <device_id>             Specify a device on which to run.
+                                   Default: 0
+
+Input Arguments:
+
+        -stream_loop <loop-count>  Number of times to loop the input
+                                   file
+        -i <input-file>            Input file to be used
+
+Codec Arguments:
+
+        -c:v <codec>               Specify H264 or H265 decoding.
+                                   (h264_ama, hevc_ama)
+        -latency_logging           Enable latency logging
+        -frames <frame-count>      Number of frames to be processed.
+        -pix_fmt fmt               The output format (nv12, yuv420p,
+                                   yuv420p10le, xv15) Default: nv12 8 bit,
+                                   yuv420p10le 10 bit
+        -o <file>                  File to which output is written.
+
+
+
+
+

Sample Decoder Command

+

Decode an hevc encoded file into raw N12 format:

+
ma35_decoder_app -c:v hevc_ama -i <INPUT> -frames 100 -pix_fmt nv12 -o out1.nv12
+
+
+
+

+
+
+
+
+
+

XMA Encoder App

+
+

Encoder Test Instructions

+

The encoder XMA application supports most of the encoder options supported by FFmpeg. The XMA application supports variety of input pixel formats, see -out_fmt, and can output H.264/HEVC/AV1 encoded elementary stream formats.

+
+

Encoder Usage

+

Running the encoder app with the --help option will print the complete list of options:

+
ma35_encoder_app --help
+XMA Encoder App Usage:
+     ./ma35_encoder_app [input options] -i input-file -c:v <codec-option>  [encoder options] -o <output-file>
+
+Arguments:
+
+     --help                     Print this message and exit.
+     -log_level <value>         Log level settings, supported are 0 or
+                                emergency, 1 or alert, 2 or critical, 3
+                                or error, 4 or warning, 5 or notice, 6
+                                or info, 7 or debug.
+                                Default is 3/error
+     -log_location <value>      Log location settings, supported are 0 or
+                                none, 1 or console, 2 or syslog, 3
+                                or file.
+                                Default is 1/console
+     -log_file <log-file>       Name and path of log file
+                                Default is ma35_encoder_app.log
+     -d <device-id>             Specify a device on which the
+                                encoder to run.
+                                Default is /dev/ama_transcoder0
+     -frames <frame-count>      Number of frames to be processed.
+
+Input options:
+
+     -stream_loop <loop-count>  Number of times to loop the input
+                                YUV file.
+     -w <width>                 Width of YUV input.
+     -h <height>                Height of YUV input.
+     -pix_fmt <pixel-format>    Pixel format of the input file. It must be yuv420p,
+
+     -i <input-file>            Name and path of input YUV file
+
+Codec option:
+
+     -c:v <codec>               Encoder codec to be used. Supported
+                                are h264_ama, hevc_ama, av1_ama
+     -device_type               When encoding to AV1, this sets which
+                                AV1 encoder will be used. Supported
+                                values are 1(Xilinx), 2(Vendor
+                                supplied), or any
+
+Encoder params:
+
+     -b:v <bitrate>             Bitrate can be given in Kbps or Mbps
+                                or bits i.e., 5000000, 5000K, 5M.
+                                Default is 5Mbps
+     -fps <fps>                 Input frame rate. Default is 30.
+     -g <intraperiod>           Intra period. Default is 15.
+     -qp <qp>                   QP. Supported are -1 to 51,
+                                default is -1
+     -min_qp <qp>               Minimum QP. Supported are 0 to 51,
+                                default is 0.
+     -max_qp <qp>               Maximum QP. Supported values are 0
+                                to 51, default is 51.
+     -spatial_aq_gain <gain>    Spatial AQ gain. Supported values are
+                                0 to 100 or 255, default is 255.
+     -temporal_aq_gain <gain>   Temporal AQ gain. Supported values are
+                                0 to 100 or 255, default is 255.
+     -temporal_aq <0/1>         Temporal AQ. Enable/Disable,
+                                default is -1.
+     -spatial_aq <0/1>          Spatial AQ. Enable/Disable,
+                                default is -1.
+     -qp_mode <qp>              QP Mode. Supported values 0, 1 and 2
+                                default is 0.
+     -control_rate <rc_mode>    Rate Control. Supported values -1, 0, 1, 2 and 3
+                                default is -1.
+     -bf <frames>               Number of B frames. Supported are -1
+                                to 3, default is -1.
+     -force_idr <0/1            Supported values are 0 and 1
+     -profile <value>           Encoder profile.
+                For HEVC, supported are 100 or main, 101 or main10_intra,
+                                102 or main10 , 103 or main10_intra
+                                or still.
+                                Default is 0/automatic
+                                ENC_HEVC_MAIN - 100 or main
+                                ENC_HEVC_MAIN_INTRA - 101 or main_intr
+                                ENC_HEVC_MAIN_10 - 102 or main10
+                                ENC_HEVC_MAIN10_INTRA - 103 or main10_intra
+                For H264, supported are auto or -1, 0 or baseline,
+                                1 or main, 2 or high, 3 or high10
+                                4 or high10_intra, Default is auto or -1
+                                ENC_H264_BASELINE - 0 or baseline.
+                                ENC_H264_MAIN - 1 or main.
+                                ENC_H264_HIGH - 2 or high.
+                                ENC_H264_HIGH_10 - 3 or high10.
+                                ENC_H264_HIGH_10_INTRA - 4 or high10_intra
+     -level <value>             Encoder level.
+                                For HEVC, supported are 10, 11, 20,
+                                21, 30, 31, 40, 41, 50, 51.
+                                default is 10.
+                                For H264, supported are 10, 11, 12,
+                                13, 20, 21, 22, 30, 31, 32, 40, 41,
+                                42, 50, 51, 52.
+                                Default is 0/automatic.
+     -tier <value>              HEVC tier, supported are -1 or auto, 0 or main,
+                                1 or high.
+                                Default is -1/auto
+     -crf <value>               CRF supported values are 0 and 1 i.e. enable
+                                and disable
+     -tune_metrics <value>      Tunes MPSoC H.264/HEVC encoder's video
+                                quality for objective metrics, default 1.
+                                Supported value from 1 to 4
+     -lookahead_depth <value>   Lookahead depth. Supported are 0 to
+                                20, default is 0.
+     -latency_mode <value>      0 normal latency (default), 1 low
+                                latency, or 2 ultra low latency
+     -latency_logging           Enable latency logging
+     -expert_options            Expert options
+     -o <file>                  File to which output is written.
+
+
+
+
+

Sample Encoder Commands

+

H.265 encoding, ultra low latency (Consult the Tuning Latency of Transcode Pipeline section for more details):

+
ma35_encoder_app -w 1920 -h 1080 -pix_fmt yuv420p -i <INPUT> -c:v hevc_ama -b:v 5M -lookahead_depth 0 -g 30 -o out0.265
+
+
+
+

+
+
+
+
+
+

XMA Scaler App

+
+

Scaler Test Instructions

+

The scaler XMA application supports most of the scaler options supported by FFmpeg. The XMA application supports -out_fmt pixel formats.

+
+

Scaler Usage

+

Running the scaler app with the --help option will print the complete list of options:

+
ma35_scaler_app --help
+This program ingests an nv12, yuv420p, yuv420p10le, or xv15 input
+file and utilizes hardware acceleration to scale to various resolutions.
+
+Usage:
+        ma35_scaler_app [options] -w <input-width> -h <input-height> -i
+        <input-file> [scaler_options] -w <output-1-width> -h
+        <output-1-height> -o <output-1-file> -w ...
+
+Arguments:
+        --help                     Print this message and exit
+        -log <level>               Specify the log level
+        -log_location <value>      Log location. 0 for none,
+                                   1 console (default), 2 syslog, 3 file
+        -log_file <file>           Name and path of the log file. Default
+                                    ma35_scaler_app.log
+        -d <device-id>             Specify a device on which to run.
+                                   Default: 0
+
+Input Arguments:
+
+        -stream_loop <loop-count>  Number of times to loop the input
+                                   file
+        -w <width>                 Specify the input's width
+        -h <height>                Specify the input's height
+        -pix_fmt <pixel-format>    Pixel format of the input file (nv12,
+                                   xv15, yuv420p10le). Default : nv12.
+        -fps <frame-rate>          Frame rate. Used for scaler load
+                                   calculation.
+        -i <input-file>            Input file to be used
+
+Output Arguments:
+        -rate <half/full>          Set the rate to half. Half rate drops
+                                   frames to reduce resource usage.
+                                   Default: full.
+        -latency_logging           Enable latency logging
+        -w <width>                 Specify the output's width
+        -h <height>                Specify the output's height
+        -pix_fmt <pixel-format>    Pixel format of the output file (nv12,
+                                   xv15, yuv420p10le). Default: input fmt
+        -frames <frame-count>      Number of frames to be processed.
+        -o <file>                  File to which output is written.
+
+
+
+
+

Sample Scaler Command

+

Scale 1080p nv12 to 720p, 480p, 360p, and 240p nv12:

+
ma35_scaler_app -pix_fmt nv12 -w 1920 -h 1080 -i <INPUT> \
+-w 1280 -h 720  -pix_fmt nv12 -o out1.nv12 \
+-w 848  -h 480  -pix_fmt nv12 -o out2.nv12 \
+-w 640  -h 360  -pix_fmt nv12 -o out3.nv12 \
+-w 288  -h 160  -pix_fmt nv12 -o out4.nv12
+
+
+
+

+
+
+
+
+
+

XMA Transcoder App

+
+

Transcoder Test Instructions

+

The transcoder XMA application supports most of the options supported by ffmpeg. The XMA application supports only elementary H.264, HEVC and AV1 encoded stream input and outputs H.264/HEVC/AV1 encoded elementary stream.

+
+

Transcoder Usage

+

Running the transcoder app with the --help option will print the complete list of options:

+
 ma35_transcoder_app --help
+ XMA Transcoder App Usage:
+        ./program [generic options] -c:v <decoder codec> [decoder options]  -i input-file -scaler_ma -outputs [num] [Scaler options]  -c:v <encoder codec> [encoder options] -o <output-file>  -c:v <encoder codec> [encoder options] -o <output-file>  -c:v <encoder codec> [encoder options] -o <output-file>.....
+
+Arguments:
+
+        --help                     Print this message and exit.
+        -d <device-id>             Specify a device on which the
+                                   transcoder to run. Default: 0
+        -stream_loop <loop-count>  Number of times to loop the input file
+        -frames <frame-count>      Number of input frames to be processed
+
+Decoder options:
+
+        -c:v <codec>               Decoder codec to be used. Supported
+                                   are hevc_ama, h264_ama
+        -latency_logging <0/1>     Latency logging for decoder. Default
+                                   disabled
+        -push-model <0/1>          Decoder streaming model (pull or push). Default
+                                   is pull (can be faster than real-time)
+        -i <input-file>            Name and path of input H.264/HEVC file
+
+Scaler options:
+
+        -scaler_ma                 Name of the ABR scaler filter
+        -num-output <value>        Number of output files from scaler
+        -out_1_width <width>       Width of the scaler output channel 1
+        -out_1_height <height>     Height of the scaler output channel 1
+        -out_1_rate <full/half>    Full of Half rate for output channel 1
+        -out_2_width <width>       Width of the scaler output channel 2
+        -out_2_height <height>     Height of the scaler output channel 2
+        -out_2_rate <full/half>    Full of Half rate for output channel 2
+        -out_3_width <width>       Width of the scaler output channel 3
+        -out_3_height <height>     Height of the scaler output channel 3
+        -out_3_rate <full/half>    Full of Half rate for output channel 3
+        -out_4_width <width>       Width of the scaler output channel 4
+        -out_4_height <height>     Height of the scaler output channel 4
+        -out_4_rate <full/half>    Full of Half rate for output channel 4
+        -out_5_width <width>       Width of the scaler output channel 5
+        -out_5_height <height>     Height of the scaler output channel 5
+        -out_5_rate <full/half>    Full of Half rate for output channel 5
+        -out_6_width <width>       Width of the scaler output channel 6
+        -out_6_height <height>     Height of the scaler output channel 6
+        -out_6_rate <full/half>    Full of Half rate for output channel 6
+        -out_7_width <width>       Width of the scaler output channel 7
+        -out_7_height <height>     Height of the scaler output channel 7
+        -out_7_rate <full/half>    Full of Half rate for output channel 7
+        -out_8_width <width>       Width of the scaler output channel 8
+        -out_8_height <height>     Height of the scaler output channel 8
+        -out_8_rate <full/half>    Full of Half rate for output channel 8
+        -latency_logging <0/1>     Latency logging for scaler. Default
+                                   disabled
+Encoder options:
+
+        -c:v <codec>               Encoder codec to be used. Supported
+                                   are hevc_ama, h264_ama, and av1_ama
+        -device_type               When encoding to AV1, this sets which
+                                   AV1 encoder will be used. Supported
+                                   values are 1(Xilinx), 2(Vendor
+                                   supplied), or any
+        -b:v <bitrate>             Bitrate can be given in Kbps or Mbps
+                                   or bits i.e., 5000000, 5000K, 5M.
+                                   Default is 200kbps
+        -fps <fps>                 Input frame rate. Default is 30.
+        -g <intraperiod>           Intra period. Default is 12.
+        -max-bitrate <bitrate>     Maximum bit rate. Supported are -1 to
+                                   350000000, default is -1
+        -min_qp <qp>               Minimum QP. Supported are 0 to 51,
+                                   default is 0.
+        -max_qp <qp>               Maximum QP. Supported values are 0
+                                   to 51, default is 51.
+        -spatial_aq_gain <gain>    Spatial AQ gain. Supported values are
+                                   0 to 100 or 255, default is 255.
+        -temporal_aq_gain <gain>   Temporal AQ gain. Supported values are
+                                   0 to 100 or 255, default is 255.
+        -bf <frames>               Number of B frames. Supported are 0
+                                   to 7, default is 2.
+        -force_idr <0/1            Supported values are 0 and 1
+        -profile <value>           Encoder profile.
+                   For HEVC, supported are 100 or main, 101 or main10_intra,
+                                   102 or main10 , 103 or main10_intra
+                                   or still.
+                                   Default is 0/automatic
+                                   ENC_HEVC_MAIN - 100 or main
+                                   ENC_HEVC_MAIN_INTRA - 101 or main_intr
+                                   ENC_HEVC_MAIN_10 - 102 or main10
+                                   ENC_HEVC_MAIN10_INTRA - 103 or main10_intra             For H264, supported are auto or -1, 0 or baseline,
+                                   1 or main, 2 or high, 3 or high10
+                                   4 or high10_intra, Default is auto or -1
+                                   ENC_H264_BASELINE - 0 or baseline.
+                                   ENC_H264_MAIN - 1 or main.
+                                   ENC_H264_HIGH - 2 or high.
+                                   ENC_H264_HIGH_10 - 3 or high10.
+                                   ENC_H264_HIGH_10_INTRA - 4 or high10_intra   -level <value>             Encoder level.
+                                   For HEVC, supported are 10 to 52,
+                                   default is 50.
+                                   For H264, supported are 10 to 52,
+                                   default is 50.
+        -slices <value>            Number of slices per frame. Supported
+                                   are 1 to 68, default is 1.
+        -qp_mode <qp>              QP Mode. Supported values 0, 1 and 2
+                                   default is 0.
+        -control_rate <rc_mode>    Rate Control. Supported values -1 to 3
+                                   default is -1.
+        -aspect_ratio <value>      Aspect ratio. Supported values are 0
+                                   to 3, default is 0.
+        -lookahead_depth <value>   Lookahead depth. Supported are 0 to
+                                   20, default is 0.
+        -temporal_aq <0/1>         Temporal AQ. Enable/Disable,
+                                   default is -1.
+        -spatial_aq <0/1>          Spatial AQ. Enable/Disable,
+                                   default is -1.
+        -tune_metrics <value>      Tunes MPSoC H.264/HEVC encoder's video
+                                   quality for objective metrics, default 1.
+                                   Supported value from 1 to 4
+        -tier <value>              HEVC tier, supported are -1 or auto, 0 or main,
+                                   1 or high.
+                                   Default is -1/auto
+        -crf <value>               CRF supported values are 0 and 1 i.e. enable
+                                   and disable
+                                   Default is -1/auto
+        -latency_logging           Enable latency logging
+        -latency_mode <value>      0 normal latency (default), 1 low
+                                   latency, or 2 ultra low latency      -o <file>                  File to which output is written.
+
+
+
+
+

Sample Transcoder Commands

+

H.264 to AV1 Transcoder:

+
ma35_transcoder_app -streams 1 -frames 2000 -c:v h264_ama \
+-i <INPUT> \
+-c:v av1_ama -b:v 10M  -o h264_av1_transcode.av1
+
+
+

H.264 to H264 ABR Transcoder:

+
ma35_transcoder_app -streams 1 -c:v h264_ama \
+-i <INPUT> \
+-scaler_ma -num-output 4 \
+-out_1_width 1280 -out_1_height 720 -out_2_width 848 -out_2_height 480 \
+-out_3_width 640 -out_3_height 360 -out_4_width 288 -out_4_height 160 \
+-c:v h264_ama -b:v 4000K -o abr_ladder1.264 \
+-c:v h264_ama -b:v 3000K -o abr_ladder2.264 \
+-c:v h264_ama -b:v 2500K -o abr_ladder3.264 \
+-c:v h264_ama -b:v 1250K -o abr_ladder4.264
+
+
+

H.264 to AV1 ULL Transcode

+
ma35_transcoder_app -streams 1 -frames 2000 -c:v h264_ama \
+-i <INPUT>\
+-c:v av1_ama  -b:v 10M -lookahead_depth 0 -o h264_av1_transcode.av1
+
+
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/genindex.html b/v1.0/genindex.html new file mode 100644 index 00000000..6ce050cd --- /dev/null +++ b/v1.0/genindex.html @@ -0,0 +1,1164 @@ + + + + + + + + + + + + + + Index — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Index
  • +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ Symbols + | B + | C + | D + | E + | F + | G + | I + | L + | M + | P + | Q + | R + | S + | T + | X + +
+

Symbols

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + +
+ +

G

+ + +
+ +

I

+ + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

P

+ + +
+ +

Q

+ + + +
+ +

R

+ + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

X

+ + + +
+ + + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/v1.0/getting_started_on_prem.html b/v1.0/getting_started_on_prem.html new file mode 100644 index 00000000..202b54d9 --- /dev/null +++ b/v1.0/getting_started_on_prem.html @@ -0,0 +1,398 @@ + + + + + + + + + + + + + + + Getting Started with AMD AMA Video SDK Cards on Premises — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Getting Started with AMD AMA Video SDK Cards on Premises
  • +
  • +
  • +
+
+
+
+
+ +
+

Getting Started with AMD AMA Video SDK Cards on Premises

+ +
+

Chassis Setup

+
+

Note

+

Generic kernel 5.15 is required for successful operation of this SDK. See Linux VM Guest, Step 2, for details on how to install kernel 5.15 and other required packages.

+
+
    +
  1. BIOS setting:

    +
      +
    1. PCIe bifurcation must be enabled on each slot with a MA35 card.

    2. +
    3. Secure boot must be disabled.

    4. +
    5. Enable Above 4G Decoding.

    6. +
    7. Enable virtualization.

    8. +
    +
  2. +
  3. Enable IOMMU by updating /etc/default/grub file to include

    +
      +
    • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on iommu=pt", for AMD based systems

    • +
    • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on iommu=pt", for Intel based chassis

    • +
    +
  4. +
  5. Update Grub

    +
    sudo update-grub
    +
    +
    +
  6. +
  7. Allocate at least 4GB of huge pages, per device, plus an extra 96 huge pages, e.g., 2048+96=2144

    +
    sudo sh -c "echo 'vm.nr_hugepages=2144' >> /etc/sysctl.conf"
    +
    +
    +

    Note that if a chassis is being configured to host VMs, then the total number of huge pages, on the host, needs to be the sum of allocated RAM of all VM instances plus 96. As an example, on a bare-metal chassis, with a single card containing 2 devices, the required number of huge pages is 4096+96=4192. On the other hand, running 6 VMs, each with 12GB of RAM, requires 6*12GB/2MB+96=36960 huge pages. (See Virtualization for details.)

    +
  8. +
  9. Reboot

    +
    sudo reboot
    +
    +
    +
  10. +
  11. Verify settings

    +
    cat /proc/cmdline
    +BOOT_IMAGE=/vmlinuz-5.15.0-50-generic root=/dev/mapper/vg00-rootlv ro quiet splash amd_iommu=on iommu=pt
    +
    +
    +

    and

    +
    cat /proc/meminfo | grep -i huge
    +
    +
    +

    , should return:

    +
    HugePages_Total:    4096
    +HugePages_Free:     4096
    +HugePages_Rsvd:        0
    +Hugepagesize:       2048 kB
    +
    +
    +
  12. +
+
+
+

Check Cards

+

To establish whether deployed cards have proper firmware installed, proceed as follows:

+
    +
  1. List AMD AMA Video SDK PCIe devices

    +
    sudo lspci -vvvd 10ee:
    +
    +
    +

    If devices are not listed as Multimedia controller and/or Region 4 size is not 512MB, a flash update is required. Refer to Flash Firmware section, for instructions.

    +
  2. +
+
+
+

Install the AMD AMA Video SDK

+
    +
  • Ensure that you PPA feed is setup. See Package Feed Setup

  • +
  • Ubuntu

    +
    +
      +
    1. Install packages

      +
      sudo apt -y install dkms libhugetlbfs0 libboost-all-dev
      +dpkg --get-selections '*ma35*' | awk '{system("sudo apt -y purge " $1)}'
      +dpkg --get-selections 'amd-ama*' | awk '{system("sudo apt -y purge " $1)}'
      +sudo apt update
      +sudo apt install amd-ama-driver=1.0.0 amd-ama-core=1.0.0 amd-ama-xma=1.0.0 amd-ama-ffmpeg=1.0.0 amd-ama-gstreamer=1.0.0
      +sudo apt-mark hold amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer
      +
      +
      +
    2. +
    3. Verify packages

      +
      sudo dpkg -l amd-ama*
      +
      +
      +

      The expected output is:

      +
      Desired=Unknown/Install/Remove/Purge/Hold
      +| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
      +|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
      +||/ Name              Version      Architecture Description
      ++++-=================-============-============-=================================
      +ii  amd-ama-core      1.0.0        amd64        Supernova
      +ii  amd-ama-driver    1.0.0        amd64        Supernova
      +ii  amd-ama-ffmpeg    1.0.0        amd64        Supernova
      +ii  amd-ama-gstreamer 1.0.0        amd64        Supernova
      +ii  amd-ama-xma       1.0.0        amd64        Supernova
      +
      +
      +
    4. +
    5. Insert kernel module

      +
      sudo modprobe ama_transcoder
      +
      +
      +
    6. +
    +
    +
  • +
+
+
+

Installation Verification

+

After each reboot or SDK update execute the following command:

+
    +
  1. Confirm driver's successful installation by:

  2. +
+
+
cat /sys/class/misc/ama_transcoder0/version_information
+
+
+

It should return:

+
<<<Version Info>>>
+ZSP Version = 1.0.5
+SC Version = 9.7.10
+eSecure Version = 1.0.0
+PCIe FW Version = 2.1.0
+PCIe CTRL Patch Version = 1.0.3
+PCIe PHY Patch A Version = 1.0.0
+
+
+
+

If the observed version numbers are older than the above, flashing is required. Refer to Flash Firmware section, for instructions.

+
+
+

Flash Firmware

+

If flashing is required, due to older firmware versions, proceed as follows:

+
    +
  1. Flash the security patch firmware:

    +
    sudo /opt/amd/ama/ma35/bin/maflash program -d all  <patch firmware bin>
    +
    +
    +

    , where patch firmware bin is /opt/amd/ama/ma35/firmware/ma35d_security_patch.bin.

    +
  2. +
  3. Cold reboot:

    +
    sudo systemctl poweroff
    +
    +
    +

    , and power up.

    +
  4. +
  5. To flash all devices, in parallel, issue the following:

    +
    sudo /opt/amd/ama/ma35/bin/maflash program -d all -p <firmware bin>
    +
    +
    +

    , where firmware bin is /opt/amd/ama/ma35/firmware/ma35_firmware.bin.

    +

    Ignore warning messages that state:

    +
    ...
    +Warning: SC update is not supported from ASIC 1 (skipping)
    +...
    +
    +
    +
  6. +
  7. Cold reboot:

    +
    sudo systemctl poweroff
    +
    +
    +

    , and power up.

    +
  8. +
+

For more details on flashing, refer to Programing a Device.

+
+
+

Set Up the Runtime Environment

+
    +
  1. Run setup script

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  2. +
+

Note that this script requires Bash shell to run.

+
+
+

Run Your First Examples

+

See the tutorials and examples page to learn how to run jobs on your system.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/index.html b/v1.0/index.html new file mode 100644 index 00000000..368b1c3d --- /dev/null +++ b/v1.0/index.html @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA)
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA)

+

The AMD AMA Video SDK is a complete software stack allowing users to seamlessly leverage the hardware accelerated features of AMD video codec units and enable high-density real-time transcoding for live streaming video service providers, OEMs, and Content Delivery Network (CDNs), on compatible cards. Included in the AMD AMA Video SDK is a pre-compiled version of FFmpeg which integrates video transcoding plug-ins for AMD devices, enabling simple hardware acceleration of video decoding, scaling and encoding. The AMD AMA Video SDK also provides a C-based application programming interface (API) which facilitates the integration of AMD video codec units transcoding capabilities in proprietary frameworks.

+

Cards compatible with AMA SDK offer low power usage, high visual quality at high density. Specifically, MA35D video transcoding card, which is made of 2 Video Processing Units (VPU), is capable of transcoding to and from HEVC, AVC and AV1 formats, at an aggregate rate of up to two 4Kp60, for AVC and HEVC formats, and four 4Kp60 for AV1 format, per VPU.

+ +
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/managing_compute_resources.html b/v1.0/managing_compute_resources.html new file mode 100644 index 00000000..3bbf2a83 --- /dev/null +++ b/v1.0/managing_compute_resources.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + Managing Video Acceleration Compute Resources — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Managing Video Acceleration Compute Resources
  • +
  • +
  • +
+
+
+
+
+ +
+

Managing Video Acceleration Compute Resources

+ +
+

Introduction

+

The notion of compute units (CUs) and CU pool is central to resource management. A typical video transcode pipeline is made of multiple CUs such as decoder, scaler, lookahead, and encoder. These together form a CU pool. Based on the input resolution, framerate and type of transcode, the load of CUs within a CU pool varies. The number of required resources determines how many parallel jobs can run in real-time. CUs and CU pool are managed by the Xilinx® resource manager (XRM). XRM is a software layer responsible for managing the video hardware accelerators available in the host system. AMD AMA Video SDK compilable cards have a set processing capacity, e.g., an MA35 device is capable of an aggregate processing equivalent of 2 4kp60 H264/HEVC in parallel to 2 4kp60 AV1 streams. XRM allows for running and managing multiple heterogeneous job, in parallel, on all devices hosted in a chassis. It is noted that XRM strictly adheres to the total capacity of the hosted accelerators, i.e., it does not allow for over-subscription of resources.

+

The rest of this guide explains how to:

+
    +
  1. Assign jobs to specific devices using explicit device identifiers

  2. +
  3. Measure device load and determine where to run jobs using either manual or automated resource management techniques

  4. +
+
+
+

Assigning Jobs to Specific Devices

+

By default, a job is submitted to device 0 and slice handling/assignment by XRMD. When running multiple jobs in parallel, device 0 is bound to run out of resources rapidly and additional jobs will error out due to insufficient resources. By using explicit device identifiers, new jobs can be individually submitted to a specific device. This makes it easy and straightforward to leverage the entire video acceleration capacity of your system, based on the number of cards and devices.

+

The FFmpeg -hwaccel option can be used to specify the device on which a specific job should be run. This makes it possible to assign multiple jobs across all available devices in the host. +Determining on which device(s) to run a job can be done using either the manual or automated methods described in the following sections.

+
+

Examples using Explicit Device IDs

+

FFmpeg example of two different jobs run on two different devices

+

In this example, two different FFmpeg jobs are run in parallel. The -hwaccel option is used to submit each job to a different device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0  -c:v h264_ama -i INPUT1.h264 -f mp4 -c:v hevc_ama -y /dev/null &
+ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder1  -c:v h264_ama -i INPUT2.h264 -f mp4 -c:v hevc_ama -y /dev/null &
+
+
+
+

+
+
+
+
+

Manual Resource Management

+

The card management tools included in the AMD AMA Video SDK provide ways to query the status and utilization of the video accelerator devices. Using these tools the user can determine which resources are available and thereby determine on which device to submit a job (using explicit device identifies, as explained in the previous section).

+

Given that each device has a set compute capacity, the user is responsible for only submitting jobs which will not exceed the capacity of the specified device. If a job is submitted on a device where there are not enough compute unit resources available to support the job, the job will error out with a message about resource allocation failure.

+

The XRM and card management tools provide methods to estimate CU requirements and check current device load.

+
+

Checking System Load

+

Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

+
source /opt/amd/ama/ma35/scripts/setup.sh
+
+
+

Note that this command should be run only once per boot.

+

To check the current loading of all the devices in your system, use the following command:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

This will generate a report in JSON format containing the load information for all the compute unit (CU) resources. The report contains a section for each device in the system. The device sections contain sub-sections for each of the CUs (decoder, scaler, lookahead, encoder) in that device. For example, the load information for the encoder on device 0 may look as follows:

+
"device_0": {
+  ...
+  "cu_2": {
+       "cuId         ": "2",
+       "cuType       ": "IP Kernel",
+       "kernelName   ": "encoder",
+       "kernelAlias  ": "ENCODER_TYPE1_AMA",
+       "instanceName ": "encoder_1",
+       "cuName       ": "encoder:encoder_1",
+       "kernelPlugin ": "",
+       "maxCapacity  ": "497664000",
+       "numChanInuse ": "0",
+       "usedLoad     ": "0 of 1000000",
+       "reservedLoad ": "0 of 1000000",
+       "resrvUsedLoad": "0 of 1000000"
+   },
+
+
+

The usedLoad value indicates how much of that resource is currently being used. The value will range from 0 (nothing running) to 1000000 (fully loaded). The reservedLoad value indicates how much of that resource is being reserved using XRM. The resrvUsedLoad value indicates how much of the reserved load is actually being used.

+
+
+

Insufficient Resources

+

If there are not enough compute unit resources available on the device to support a FFmpeg job, the job will error out with a message about resource allocation failure:

+
Insufficient resources available for allocation
+
+
+

In this case, you can check the system load (as described in the section below) and look for a device with enough free resources, or wait until another job finishes and releases enough resources to run the desired job.

+
+
+

Job Resource Requirements

+

The load of a given job can be estimated by taking the resolution of the job as a percentage of the total capacity of a device. For instance, on an MA35D device, a 1080p60 stream will require 12.5% of the resources available on the device. Resource loads are reported with a precision of 1/1000000.

+
+

+
+
+
+
+

Automated Resource Management

+

The AMD AMA Video SDK provides a mechanism to automatically determine how many instances of various jobs can be submitted to the system and on which device(s) to dispatch each job instance. This mechanism relies on Job Descriptions files and a Job Slot Reservation tool which calculates the resources required for each job, determines on which device each job should be run and reserves the resources accordingly. Note that there is no requirement for job descriptions to be homogeneous.

+
+

Note

+

To observe the various job management log messages use tail -F /var/log/syslog command.

+
+
+

Video Transcode Job Descriptions

+

A video transcode Job Description File (JDF) provides information to the resource manager about what resources are needed to run a particular job. With this information, the resource manager can calculate the CU load for the specified job as well as the maximum possible number of jobs that can be run real-time in parallel.

+

A video transcode job description is specified through a JSON file and the key-value pairs specify the functions, formats, and resolutions needed.

+
+
function

Which HW resource to use (DECODER, SCALER, ENCODER)

+
+
format

Input/output format (H264, HEVC, AV1, yuv420p, yuv420p10le)

+
+
resolution

Input/output height, width, and frame-rate as a numerator / denominator fraction

+
+
type

Optional entry to select between Type 1 and Type 2 AV1 encoder. Valid values are 1 and 2, with default equal 1

+
+
load_factor

Optional entry that instructs XRM to allocate a multiple factor of required resources. The multiplication factor is either the default 1.0, i.e., no addition allocation or explicitly defined by this entry. A typical usage of this entry is in cases where there is a need for headroom, while allocating resources.

+
+
num_job_slots

Optional entry that explicitly specifies the number of resources or job slots for a particular job. The absence of this entry allows for a given job to reserve all available resources on a given device, instead of what is required to complete the job.

+
+
resources

All the resources listed in this section of the job description will be allocated on the same device. If the job requires a single device, this is the section in which resources should be specified.

+
+
+

Several examples of JSON job slot descriptions can be found in the /opt/amd/ama/ma35/scripts/describe_job folder once the AMD AMA Video SDK has been installed.

+

Below is the /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale example. This JSON example describes an ABR transcode job which uses a decoder, scaler, and encoder to generate 12 output renditions.

+
{
+    "request": {
+        "name": "t10_transcode_multiscale",
+        "request_id": 1,
+        "parameters": {
+            "name": "testjob",
+            "resources": 
+            [
+                {
+                    "function": "DECODER",
+                    "format":   "H264",
+                    "resolution": { "input": { "width": 3840, "height": 2160, "frame-rate": { "num":60, "den":1} } }
+                },
+                        {
+                    "function": "SCALER",
+                    "format":   "yuv420p",
+                    "resolution":{                                                                                 
+                        "input": { "width": 3840, "height": 2160, "frame-rate": { "num":60, "den":1} },
+                        "output":
+                        [        
+                            { "width": 1920, "height": 1080, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1600, "height": 900, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1440, "height": 900, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1360, "height": 768, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1280, "height": 720, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1024, "height": 768, "frame-rate": { "num":60, "den":1}},
+                            { "width": 960, "height": 540, "frame-rate": { "num":60, "den":1}},
+                            { "width": 848, "height": 480, "frame-rate": { "num":60, "den":1}},
+                            { "width": 640, "height": 360, "frame-rate": { "num":60, "den":1}},
+                            { "width": 540, "height": 480, "frame-rate": { "num":60, "den":1}},
+                            { "width": 352, "height": 288, "frame-rate": { "num":60, "den":1}},
+                            { "width": 288, "height": 160, "frame-rate": { "num":60, "den":1}}
+                        ]
+                    }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1920, "height": 1080, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1600, "height": 900, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1440, "height": 900, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1360, "height": 768, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1280, "height": 720, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1024, "height": 768, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 960, "height": 540, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 848, "height": 480, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 640, "height": 360, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 540, "height": 480, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 352, "height": 288, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 288, "height": 160, "frame-rate": { "num":60, "den":1} } } 
+                }
+            ]
+        }
+    }
+}
+
+
+

The next sections document the two different ways of using job descriptions to run multiple jobs across one or more devices:

+ +
+
+

The Job Slot Reservation Tool

+

The job slot reservation application, jobslot_reservation, takes as input multiple JSON job description files. Each JSON JDF provides information to the resource manager about what kind of transcode is intended to run on a card. With this information, the resource manager calculates the CU load for the specified job as well as the maximum possible number of jobs that can be run real-time in parallel.

+

Once the maximum possible number of jobs is known, CUs and job slots are reserved, and corresponding reservation IDs are stored in a bash file at /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh, where TIMESTAMP refers to Linux epoch timestamp and JDF is the name of JSON JDF, without its extension. A reservation ID is a unique identifier which is valid while the job slot reservation application is running. After sourcing the respective /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh files, the reservation IDs are then passed to individual FFmpeg processes via the XRM_RESERVE_ID environment variable. The FFmpeg processes then use this reservation ID to retrieve and use the corresponding CUs reserved by the job slot reservation tool.

+

The reserved resources are released by ending the job reservation process. Reserved slots can be reused after an FFmpeg job finishes, as long as the job reservation process is still running.

+

Optionally, jobslot_reservation can take --dry_run argument to check how many job slots are possible for a given job, without actual reservation. Additionally, this application is process-safe.

+

Ill-formed JSON Job Descriptions

+

If you run the jobslot_reservation tool with a syntactically incorrect JSON description, you will see the following messages:

+
decoder plugin function=0 fail to run the function
+scaler plugin function=0 fail to run the function
+encoder plugin function=0 fail to run the function
+
+
+

This indicates that the job description is ill-formed and needs to be corrected.

+
+

Example requiring a single device per job

+

This example uses the /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json file describing a 1080p ABR ladder running on a single device.

+
    +
  1. Setup the environment:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  2. +
  3. Run the job slot reservation application with the desired JSON job description. For example

    +
    JobDescriptionFile: /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json
    +Requested Loads:
    +scaler [0]: 523634
    +
    +decoder [0]: 250000
    +
    +...
    +
    +lookahead [0]: 6111
    +
    +encoder [0]: 5555
    +
    +lookahead [0]: 2777
    +
    +===============================================================
    +Total Job Slots possible : 2
    +Dry run: Disabled
    +
    +Job Type: /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json
    +Job Slots Alloted: 2
    +XRM_RESERVE_ID file - "/var/tmp/amd/xrm_jobReservation_79533431_t10_transcode_multiscale.sh"
    +================================================================
    +
    +---------------------------------------------------------------
    +
    +The Job-slot reservations are alive as long as this Application is alive!
    +(press Enter to close this app)
    +
    +---------------------------------------------------------------
    +
    +
    +
  4. +
+

The job slot reservation application creates a /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh with XRM_RESERVE_ID_{n} set to unique IDs generated by XRM (with n ranging from 1 to the number of possible job slots for the given job). Here is an example of this generated file:

+
export XRM_RESERVE_ID_0=1
+export XRM_RESERVE_ID_1=2
+
+
+
    +
  1. Launch individual FFmpeg processes in distinct shells after sourcing the /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh file and setting XRM_RESERVE_ID environment to a unique XRM_RESERVE_ID_{n}.

    +

    For job 1, within a new terminal:

    +
    source /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh
    +export XRM_RESERVE_ID=${XRM_RESERVE_ID_1}
    +ffmpeg -c:v h264_ama ...
    +
    +
    +

    For job 2, within a new terminal:

    +
    source /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh
    +export XRM_RESERVE_ID=${XRM_RESERVE_ID_2}
    +ffmpeg -c:v h264_ama ...
    +
    +
    +

    And so forth for the other jobs.

    +
  2. +
  3. Press Enter in the job reservation app terminal to release the resources after the jobs are complete.

  4. +
+
+
+
+

Automated Job Launching

+

The Job Slot Reservation tool automatically reserves job slots, but actual jobs still need to be manually launched using the generated reservations IDs. It is possible to create custom orchestration layers to automatically handle the reservation of job slots and the launching of jobs.

+

The AMD AMA Video SDK includes an example launcher application for FFmpeg. Source code for the FFmpeg Launcher example and the Job Slot Reservation tool are included in the Github repository of AMD AMA Video SDK and can be used as a starting point for developing custom orchestration layers.

+
+

The FFmpeg Launcher Example

+

The FFmpeg launcher, launcher, is an example application which automates the dispatching of FFmpeg jobs across multiple devices. It simplifies the process of manually setting up XRM reservation IDs and launching FFmpeg for many video streams. The FFmpeg launcher takes tuples of source, Transcode Job Description (TJD) files, where each line of source file is a full path to the location of an input file and TJD has the following format:

+
+
job_description = JDF_PATH

JDF_PATH value refers to the full path of a JDF

+
+
cmdline = FFMPEG_CMD

FFMPEG_CMD refers to a complete FFmpeg pipeline command, without input source file after -i.

+
+
+

As an example, the source1.txt and job1.txt tuple describes a decode pipeline running on device 0:

+

source1.txt:

+
/path/to/4kp60.h264
+
+
+

job1.txt:

+
job_description = /path/to/JDF file
+
+cmdline = ffmpeg -y -hwaccel ama -c:v h264_ama -out_fmt nv12 -i -filter_hw_device dev0 -filter_complex "hwdownload,format=nv12[out]" -map "out]" -vframes 300 -f rawvideo -pix_fmt nv12 /dev/null
+
+
+
+

Note

+

The FFmpeg launcher is only an example application. It is provided as an illustration of how an orchestration layer can use Job Descriptions, but it is not an official feature of the AMD AMA Video SDK.

+
+

The following steps show how to use the FFmpeg launcher for an arbitrary number of jobs, assuming all are within the total compute capacity of the accelerator cards.

+
    +
  1. Environment setup

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  2. +
  3. To run the FFmpeg launcher, use the following command:

    +
    launcher <(source, TJD)> {(source, TJD)}
    +
    +
    +

    Here is an example of the command:

    +
    launcher source1.txt job1.txt source2.txt job2.txt
    +
    +
    +
  4. +
+
+

+
+
+
+
+
+

XRM Reference Guide

+

The Xilinx® resource manager (XRM) is the software which manages the hardware accelerators available in the system. XRM includes the following components:

+
    +
  • xrmd: the XRM daemon, a background process supporting reservation, allocation, and release of hardware acceleration resources.

  • +
  • xrmadm the command line tool is used to interact with the XRM daemon (xrmd).

  • +
  • a C Application Programming Interface (API)

  • +
+
+

Command Line Interface

+

The XRM xrmadm command line tool is used to interact with the XRM daemon (xrmd). It provides the following capabilities and uses a JSON file as input for each action:

+
    +
  • Generate status reports for each device

  • +
  • Load and unload the hardware accelerators

  • +
  • Load and unload the software plugins

  • +
+

The XRM related files are installed under /opt/amd/ama/ma35/scripts/.

+
+

Setup

+

When sourced, the /opt/amd/ama/ma35/scripts/setup.sh script takes care of setting up the enviroment for the AMD AMA Video SDK, including its XRM components:

+
    +
  • The XRM daemon (xrmd) is started

  • +
  • The hardware accelerators (xclbin) and software plugins are loaded on the Xilinx devices

  • +
+
+
+

Generating Status Reports

+

xrmadm can generate reports with the status of each device in the system. This capability is particularly useful to check the loading of each hardware accelerator.

+

To generate a report for all the devices in the system:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

To generate a more detailed report for a single device, which is specified in the json file:

+
xrmadm /opt/amd/ama/ma35/scripts/list_onedevice_cmd.json
+
+
+

A sample JSON file for generating a report for device 0 is shown below:

+
{
+    "request": {
+        "name": "list",
+        "requestId": 1,
+        "device": 0
+    }
+}
+
+
+
+
+

Loading/Unloading Software Plugins

+

xrmadm can be used to load or unload the software plugins required to manage the compute resources. The software plugins perform resource management functions such as calculating CU load and CU max capacity. Once a plugin is loaded, it becomes usable by a host application through the XRM APIs. The XRM plugins need to be loaded before executing an application (such as FFmpeg/GStreamer) which relies on the plugins.

+

To load the plugins:

+
xrmadm /opt/amd/ama/ma35/scripts/load_xrm_plugins_cmd.json
+ {
+     "response": {
+         "name": "loadXrmPlugins",
+         "requestId": "1",
+         "status": "ok"
+     }
+ }
+
+
+

To unload the plugins:

+
xrmadm /opt/amd/ama/ma35/scripts/unload_xrm_plugins_cmd.json
+ {
+     "response": {
+         "name": "unloadXrmPlugins",
+         "requestId": "1",
+         "status": "ok"
+     }
+ }
+
+
+
+
+
+

C Application Programming Interface

+

XRM provides a C Application Programming Interface (API) to reserve, allocate and release CUs from within a custom application. For complete details about this programming interface, refer to the XRM API Reference Guide section of the documentation.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/migration.html b/v1.0/migration.html new file mode 100644 index 00000000..9f04f8aa --- /dev/null +++ b/v1.0/migration.html @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + Software Migration Considerations — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Software Migration Considerations
  • +
  • +
  • +
+
+
+
+
+ +
+

Software Migration Considerations

+ +

This section of documentation covers the notable API differences between the current release of SDK, 1.0, and previous versions.

+
+

API Changes from Alveo U30

+

This sub-section describes differences between U30 and MA35D

+
+
+

FFmpeg API Changes

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + +

Options General

MA35D

U30

-c:v:

+

Used for codec selection. Aside from naming convention changes, new AV1 codec and VP9 decoder are now available.

+

-c:v

-c:v

-filter_complex:

+

Used for frame filtering operation. Aside from naming convention changes, new 2D composition and ML operations are now available.

+

-filter_complex

-filter_complex

-hwaccel:

+

Used to select hardware accelerator engine. This option was previously referred to as xlnx_hwdev.

+

-hwaccel

-xlnx_hwdev

-vf:

+

Used to select the DMA transfer direction between host and accelerator.

+

-vf

xvbm_convert

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Encoder

Version 1.0

U30

-level:

+

Used to specify encoder's level. It now supports AV1's levels.

+

-level

-level

-profile:

+

Used to set encoder's profile. It now supports AV1's main.

+

-profile

-profile

-control_rate:

+

Used to set rate control mode. Options to this setting have changed.

+

-control_rate

-control-rate

-tune_metrics:

+

Used to tune VQ metrics. Options to this setting have changed.

+

-tune_metrics

-tune-metrics

-cores:

+

Used to explicitly specify the number of processing cores.

+

Deprecated

-cores

-periodicity-idr:

+

Used to determine IDR frame frequency.

+

Deprecated

-periodicity-idr

-force_key_frames:

+

Used to force IDR frame insertion, at specified frame numbers.

+

Deprecated

-force_key_frames

-disable-pipeline:

+

Used to enable/disable pipelining.

+

Deprecated

-disable-pipeline

-aspect-ratio:

+

Used to set video's aspect ratio.

+

Deprecated

-aspect-ratio

-expert-options:

+

Used to set encoder's expert option.

+

Deprecated

-expert-options

-avc-lowlat:

+

Used to enable/disable ULL for AVC.

+

Deprecated

-avc-lowlat

+ +++++ + + + + + + + + + + + + + + + + +

Options Decoder

Version 1.0

U30

-splitbuff_mode:

+

Used to configure decoder's buffer mode.

+

Deprecated

-splitbuff_mode

-entropy_buffers_count:

+

Used to set number of decoder's entropy buffers.

+

Deprecated

-entropy_buffers_count

+ +++++ + + + + + + + + + + + + + + + + + + + + +

Options Scaler

Version 1.0

U30

-out_{N}_width:

+

Used to configure width of an output rung.

+

Deprecated

-out_{N}_width

-out_{N}_height:

+

Used to configure height of an output rung.

+

Deprecated

-out_{N}_height

-out_{N}_rate:

+

Used to configure frame rate of an output rung.

+

Deprecated

-out_{N}_rate

+
+
+

Gstreamer API Changes

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Encoder

Version 1.0

U30

tune_metrics:

+

Used to tune VQ metrics. Options to this setting have changed.

+

tune-metrics

tune-metrics

ultra-low-latency:

+

Used to set ULL mode.

+

Set lookahead-depth to 0.

ultra-low-latency

target-bitrate:

+

Used to set target bit rate.

+

bitrate

target-bitrate

control_rate:

+

Used to set rate control mode. Options to this setting have changed.

+

rate-control

control-rate

dev-idx:

+

Used to specify the index of the device on which the encoder should be executed.

+

device

dev-idx

aspect-ratio:

+

Used to set video’s aspect ratio.

+

Deprecated

aspect-ratio

avc-lowlat:

+

Used to enable/disable ULL for AVC.

+

Deprecated

avc-lowlat

dependent-slice:

+

Used to specify slice dependency.

+

Deprecated

dependent-slice

enable-pipeline:

+

Used to enable/disable pipelining.

+

Deprecated

enable-pipeline

ip-delta:

+

Used to set IP delta.

+

Deprecated

ip-delta

loop-filter-beta-offset:

+

Used to set loop filter beta offset.

+

Deprecated

loop-filter-beta-offset

loop-filter-tc-offset:

+

Used to set loop filter tc offset..

+

Deprecated

loop-filter-tc-offset

slice-qp:

+

Used to set slice QP mode.

+

Deprecated

slice-qp

scaling-list:

+

Used to set lscaling list mode.

+

Deprecated

scaling-list

reservation-id:

+

Used to set resource pool reservation id.

+

Deprecated

reservation-id

rc-mode:

+

Used to enable custom rate control mode.

+

Deprecated

rc-mode

qp-mode:

+

Used to set QP control mode used by the encoder.

+

Deprecated

qp-mode

pb-delta:

+

Used to set PB delta.

+

Deprecated

pb-delta

periodicity-idr:

+

Used to set periodicity of IDR frames.

+

Deprecated

periodicity-idr

num-cores:

+

Used to set the number of encoder cores to be used for current stream.

+

Deprecated

num-cores

num-slices:

+

Used to set the number of slices produced for each frame.

+

Deprecated

num-slices

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Decoder

Version 1.0

U30

dev-idx:

+

Used to specify the index of the device on which the decoder should be executed.

+

device

dev-idx

avoid-dynamic-alloc:

+

Used to set a flag to avoid dynamic allocation of output buffers.

+

Deprecated

avoid-dynamic-alloc

avoid-output-copy:

+

Used to set a flag to avoid output frames copy.

+

Deprecated

avoid-output-copy

disable-hdr10-sei:

+

Used to configure whether to passthrough HDR10/10+ SEI messages or not.

+

Deprecated

disable-hdr10-sei

interpolate-timestamps:

+

Used to configure interpolation of output buffers PTS.

+

Deprecated

interpolate-timestamps

num-entropy-buf:

+

Used to specifie the number of decoder internal entropy buffers.

+

Deprecated

num-entropy-buf

reservation-id:

+

Used to set resource Pool Reservation id.

+

Deprecated

reservation-id

splitbuff-mode:

+

Used to configure decoder in split/unsplit input buffer mode.

+

Deprecated

splitbuff-mode

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Scaler

Version 1.0

U30

dev-idx:

+

Used to specify the index of the device on which the scaler should be executed.

+

device

dev-idx

avoid-output-copy:

+

Used to set a flag to avoid output frames copy on all source pads.

+

Deprecated

avoid-output-copy

coef-load-type:

+

Used to configure coefficients loading type for scaling.

+

Deprecated

coef-load-type

enable-pipeline:

+

Used to enable buffer pipelining to improve performance in non zero-copy use cases.

+

Deprecated

enable-pipeline

reservation-id:

+

Used to configure resource pool reservation id.

+

Deprecated

reservation-id

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/objects.inv b/v1.0/objects.inv new file mode 100644 index 00000000..c60c1bec Binary files /dev/null and b/v1.0/objects.inv differ diff --git a/v1.0/other_versions.html b/v1.0/other_versions.html new file mode 100644 index 00000000..f05f5690 --- /dev/null +++ b/v1.0/other_versions.html @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + <no title> — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • <no title>
  • +
  • +
  • +
+
+
+
+
+ +
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/package_feed.html b/v1.0/package_feed.html new file mode 100644 index 00000000..1e580d09 --- /dev/null +++ b/v1.0/package_feed.html @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + Distribution Package Feed — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Distribution Package Feed
  • +
  • +
  • +
+
+
+
+
+ +
+

Distribution Package Feed

+ +
+

Package Descriptions

+ ++++ + + + + + + + + + + + + + + + + + + + + + + +

Name

Description

amd-ama-core

This package includes all the core elements that are required for running applications.

amd-ama-driver

This package includes all kernel driver and firmware elements.

amd-ama-ffmpeg

This package includes all the relevant software for running hardware-accelerated FFmpeg pipelines.

amd-ama-gstreamer

This package includes all the relevant software for running hardware-accelerated Gstreamer pipelines.

amd-ama-xma

This package includes various XMA based application programs and development header files.

+
+
+

Configuring the Package Feed

+

Distribution based package feeds allow for convenient and robust methods to update and upgrade relevant packages of the AMD AMA Video SDK. In order to be able to install the AMD AMA Video SDK packages from the package feed, point your package management client to the remote AMD AMA Video SDK package repository according to the instructions described below.

+
+

Ubuntu

+
    +
  1. Add Xilinx key:

    +
    wget -qO - https://www.xilinx.com/support/download/2018-2-1/xilinx-master-signing-key.asc | sudo apt-key add -
    +
    +
    +
  2. +
  3. Add Xilinx PPA feed:

    +
    echo "deb [trusted=yes] https://packages.xilinx.com/artifactory/debian-packages $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/xilinx.list
    +
    +
    +
  4. +
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/release_notes.html b/v1.0/release_notes.html new file mode 100644 index 00000000..01e39443 --- /dev/null +++ b/v1.0/release_notes.html @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) Release Notes — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA) Release Notes
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA) Release Notes

+
+

Note

+

Version: 1.0

+
+ +
+

+
+
+

Overview

+

This section describes various requirements, limitations, known issues and their respective workarounds that are applicable to AMD AMA Video SDK.

+
+
+

Release Requirements

+
    +
  1. The following firmware versions are required:

    +
      +
    1. Satelite Control (SC): 9.7.10

    2. +
    3. ZSP: 1.0.5

    4. +
    +
  2. +
  3. This documentation is applicable to 1.0 release.

  4. +
+
+
+

Features in This Release

+
    +
  1. Support for video transcode using either our supplied FFmpeg (n5.1.2), Gstreamer (v1.22), or custom Xilinx Media Acceleration (XMA) applications.

  2. +
  3. Support for up to 4 x 4Kp60 8-bit or 10-bit video decode AV1, AVC or HEVC per device.

  4. +
  5. Support for up to 2 x 4Kp60 8-bit or 10-bit video transcode of AVC or HEVC per device.

  6. +
  7. Support for up to 4 x 4Kp60 8-bit or 10-bit video transcode of AV1 per device.

  8. +
  9. Support for integration with software-based video image filters using our hardware DMA support to/from device memory (FFmpeg or Gstreamer).

  10. +
  11. Optional use of our supplied resource management daemon (xrmd) for automated accelerator selection and load balancing.

  12. +
  13. Resource utilization reporting when using our supplied resource management daemon (xrmd).

  14. +
  15. Utility applications enabling collection of power, voltage, temperature and memory for each device as well as aggregate values for the MA35D accelerator card.

  16. +
  17. Support for virtualization using either Ubuntu 20.04 or 22.04 in KVM mode with a guest OS also running either Ubuntu 20.04 or 22.04.

  18. +
+
+
+

Supported Kernels and Distributions

+

This release of AMD AMA Video SDK supports Ubuntu 22.04 and 20.04, with generic kernel 5.15.0.

+
+
+

Known Limitations

+
    +
  1. Support for 2D graphics engine and ML engine not supported in kernel driver.

  2. +
  3. This software has been tested on Ubuntu 20.04 and Ubuntu 22.04 with generic kernel version 5.15.0.

  4. +
  5. PF and VF must support PCIe memory regions BAR0 of 8 MB, BAR2 of 64 MB and BAR4 of 512 MB sizes.

  6. +
  7. Host servers must enable Above 4G Decoding.

  8. +
  9. A device that has been assigned to a VM cannot share its resources with its host.

  10. +
  11. Only a single VF may be assigned to a VM.

  12. +
  13. PCI passthrough of a physical function to a VM is not supported in this release. Utilize the included support for virtual functions (VF) when configuring a VM to access a device.

  14. +
  15. For maximum server scalability, ensure that a single VF is assigned to a VM.

  16. +
  17. MA35D only supports progressive content, i.e., interlaced contents are not supported in either the decoder or encoder.

  18. +
  19. For encoding, only resolutions that are divisible by 4 are supported, i.e., both height and width.

  20. +
  21. For decoding, only resolutions that are divisible by 2 are supported, i.e., both height and width.

  22. +
  23. This version of the SDK does not support splitting a video acceleration use case across multiple MA35D devices.

  24. +
  25. With the current version of FFmpeg, n5.1.2, it is not recommended to transport AV1 over MPEG TS.

  26. +
  27. XMA sample applications are not meant to be run at maximum density.

  28. +
  29. Encode rates up to maximum of 400 Mbps are supported.

  30. +
  31. VBR and CVBR rate control modes are not supported under ULL.

  32. +
  33. AV1 decoder does not support 8k resolution in portrait mode.

  34. +
+
+
+

Known Issues

+
    +
  1. A secondary bus reset (SBR) will cause the server to hang. A cold boot of the server will restore function. After installation of our driver package, our setup.sh script should be run prior to utilizing any of the features of the SDK. The setup.sh will disable secondary bus reset.

  2. +
  3. AV1 decoding is not supported in the reference XMA transcoder application (ma35_transcoder_app).

  4. +
  5. AV1 decoding using the included ama_av1dec Gstreamer plugin requires the use of an IVF packaged AV1 raw video stream and a corresponding ivfparse plugin to be utilized to demux the AV1 video stream.

  6. +
  7. If the kernel driver is not loaded, tools such as mautil may crash when invoked.

  8. +
  9. mamgmt reset should not be issued, while devices are in use.

  10. +
  11. Rate control modes VBR and CVBR produce subpar VQ, with AV1 Type 1 encoders, on contents that include more than couple of seconds of high spatial and temporal complexities.

  12. +
+
+
+

Upgrading from Previous Versions

+
    +
  1. Remove any ma35 and amd-ama packages as per installation instructions.

  2. +
  3. Remove any manually created Boost library soft links that may have been created, previously.

  4. +
  5. Remove all entries from /etc/apt/sources.list.d/xilinx.list if this file exists.

  6. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/search.html b/v1.0/search.html new file mode 100644 index 00000000..6edb66b6 --- /dev/null +++ b/v1.0/search.html @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + Search — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Search
  • +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/v1.0/searchindex.js b/v1.0/searchindex.js new file mode 100644 index 00000000..bfbaeafb --- /dev/null +++ b/v1.0/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["c_apis", "card_management", "examples", "examples/amf/amf_encoder", "examples/ffmpeg/filters", "examples/ffmpeg/quality_analysis", "examples/ffmpeg/tutorials", "examples/gstreamer/filters", "examples/gstreamer/tutorials", "examples/gstreamer/xabrladder", "examples/gstreamer/xcompositor", "examples/xma/xma_apps", "getting_started_on_prem", "index", "managing_compute_resources", "migration", "other_versions", "package_feed", "release_notes", "specs_and_features", "troubleshooting", "tuning_pipeline_latency", "tuning_video_quality", "unified_logging", "using_ffmpeg", "using_gstreamer", "virtualization"], "filenames": ["c_apis.rst", "card_management.rst", "examples.rst", "examples/amf/amf_encoder.rst", "examples/ffmpeg/filters.rst", "examples/ffmpeg/quality_analysis.rst", "examples/ffmpeg/tutorials.rst", "examples/gstreamer/filters.rst", "examples/gstreamer/tutorials.rst", "examples/gstreamer/xabrladder.rst", "examples/gstreamer/xcompositor.rst", "examples/xma/xma_apps.rst", "getting_started_on_prem.rst", "index.rst", "managing_compute_resources.rst", "migration.rst", "other_versions.rst", "package_feed.rst", "release_notes.rst", "specs_and_features.rst", "troubleshooting.rst", "tuning_pipeline_latency.rst", "tuning_video_quality.rst", "unified_logging.rst", "using_ffmpeg.rst", "using_gstreamer.rst", "virtualization.rst"], "titles": ["C API Programming Guide", "Card Management", "Tutorials and Examples", "AMF Encoder Tutorial", "FFmpeg Examples using Software Filters", "Video Quality Examples", "FFmpeg Tutorials", "GStreamer Examples using Software Filters", "GStreamer Introductory Tutorials", "GStreamer ABR Ladder Application", "GStreamer Compositor Application", "XMA Examples for the AMD AMA Video SDK", "Getting Started with AMD AMA Video SDK Cards on Premises", "AMD Advanced Media Acceleration (AMA)", "Managing Video Acceleration Compute Resources", "Software Migration Considerations", "<no title>", "Distribution Package Feed", "AMD Advanced Media Acceleration (AMA) Release Notes", "Specs and Features of the AMD AMA Video SDK", "AMD Advanced Media Acceleration (AMA) Troubleshooting", "Tuning Latency", "Tuning Video Quality", "Unified Logging", "Using FFmpeg", "Using GStreamer", "Virtualization"], "terms": {"amazon": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "ec2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "vt2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "2022": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "2024": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "ma35": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "opt": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "The": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 20, 21, 22, 23, 24, 25, 26], "provid": [0, 1, 4, 5, 6, 8, 9, 13, 14, 19, 22, 23, 24, 25, 26], "base": [0, 2, 3, 9, 11, 12, 13, 14, 17, 18, 19, 24, 25], "which": [0, 1, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 19, 21, 22, 23, 24, 25, 26], "facilit": [0, 13, 19], "integr": [0, 13, 18, 19], "transcod": [0, 9, 10, 13, 18, 20, 21, 22, 24, 25], "capabl": [0, 8, 13, 14, 19, 22, 24], "proprietari": [0, 13, 19], "framework": [0, 3, 13, 19, 23, 25], "thi": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 19, 20, 21, 22, 24, 25, 26], "i": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 19, 20, 21, 22, 23, 24, 25, 26], "form": [0, 9, 14, 19, 22, 24], "leverag": [0, 13, 14, 19, 24, 25], "xilinx": [0, 1, 11, 14, 17, 18, 19, 26], "media": [0, 3, 5, 11, 19, 25], "acceler": [0, 1, 4, 6, 7, 11, 15, 17, 19, 23, 24, 25, 26], "librari": [0, 5, 18, 23, 24], "manag": [0, 17, 18, 19, 26], "libxma": 0, "meant": [0, 18, 26], "simplifi": [0, 14], "control": [0, 1, 11, 12, 15, 18, 19, 20, 22, 23, 24, 25, 26], "us": [0, 1, 3, 5, 6, 8, 9, 11, 15, 18, 19, 20, 21, 22, 26], "hardwar": [0, 1, 6, 11, 13, 14, 15, 17, 18, 19, 23, 24], "avail": [0, 1, 9, 10, 14, 15, 19, 24, 25, 26], "system": [0, 4, 5, 6, 7, 8, 11, 12, 19, 25, 26], "keep": 0, "track": [0, 5], "total": [0, 1, 12, 14], "capac": [0, 5, 14, 25], "each": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 18, 19, 22, 23, 24, 26], "comput": [0, 1, 19], "unit": [0, 1, 13, 14, 26], "make": [0, 14, 19, 24, 25, 26], "possibl": [0, 4, 5, 7, 14, 20], "perform": [0, 1, 3, 4, 5, 6, 7, 8, 11, 14, 15, 20, 21, 23, 24, 25], "action": [0, 1, 14, 19], "releas": [0, 1, 13, 14, 15, 22, 24], "calcul": [0, 5, 11, 14, 19], "load": [0, 1, 11, 15, 18, 26], "max": [0, 10, 11, 14, 22, 23, 25], "4": [0, 1, 4, 5, 6, 11, 12, 18, 19, 20, 21, 22, 24, 25, 26], "differ": [0, 5, 6, 7, 9, 14, 15, 19, 22, 23, 24, 25], "correspond": [0, 14, 18, 22], "specif": [0, 1, 9, 13, 19, 22, 23, 24, 25, 26], "featur": [0, 13, 14, 24, 26], "card": [0, 13, 14, 18, 20, 25, 26], "ani": [0, 11, 18, 19, 23, 24, 25], "combin": [0, 4, 5, 6, 7, 19], "can": [0, 1, 3, 4, 5, 6, 7, 8, 11, 14, 19, 20, 21, 22, 24, 25, 26], "when": [0, 4, 6, 7, 8, 11, 14, 18, 20, 22, 24, 25], "layer": [0, 10, 14, 23], "ar": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "organ": 0, "around": 0, "follow": [0, 1, 4, 5, 6, 7, 9, 10, 12, 14, 18, 19, 20, 21, 22, 23, 24, 25, 26], "step": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 20, 26], "must": [0, 6, 11, 12, 18, 22, 24, 25], "first": [0, 1, 10, 26], "creat": [0, 1, 6, 7, 8, 10, 14, 18, 20, 25, 26], "xrm_plugin_reserv": 0, "where": [0, 1, 4, 5, 12, 14, 19, 21, 22, 23, 24, 26], "one": [0, 1, 4, 7, 9, 14, 19, 22, 24, 26], "dec": [0, 23], "enc": [0, 1, 23], "scale": [0, 6, 7, 9, 11, 13, 15, 25], "done": [0, 4, 6, 7, 8, 14, 19, 20], "describ": [0, 1, 4, 6, 7, 9, 10, 14, 15, 17, 18, 20, 22, 23, 24, 25, 26], "detail": [0, 1, 4, 5, 6, 8, 11, 12, 14, 19, 20, 22, 24, 25], "below": [0, 1, 6, 9, 10, 14, 17, 19, 20, 21, 22, 24, 25], "onc": [0, 1, 8, 14], "have": [0, 5, 8, 12, 14, 15, 18, 19, 22, 24, 25, 26], "been": [0, 5, 8, 11, 14, 18, 19, 20, 26], "dedic": [0, 5], "need": [0, 12, 14, 19, 25, 26], "To": [0, 1, 6, 8, 12, 14, 19, 22, 26], "all": [0, 1, 4, 5, 6, 7, 8, 11, 12, 14, 15, 17, 18, 19, 22, 23, 24, 25, 26], "requir": [0, 4, 5, 6, 7, 8, 11, 12, 17, 19, 20, 21, 24, 26], "paramet": [0, 9, 10, 14, 21, 23, 24, 26], "particular": [0, 14], "It": [0, 1, 4, 5, 6, 7, 11, 12, 14, 15, 19, 21, 22, 24, 25], "call": [0, 19], "function": [0, 1, 4, 7, 8, 14, 18, 21, 22, 25, 26], "A": [0, 1, 12, 14, 18, 19, 24], "complet": [0, 1, 6, 8, 11, 13, 14, 19, 24, 25], "send": [0, 7, 23], "from": [0, 1, 5, 6, 7, 8, 10, 11, 12, 13, 14, 17, 19, 20, 22, 23, 24, 25, 26], "host": [0, 4, 6, 7, 8, 12, 14, 15, 18, 19, 20, 24, 25], "receiv": 0, "devic": [0, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 22, 24, 26], "xmafram": 0, "also": [0, 1, 6, 9, 10, 13, 18, 20, 21, 22, 24, 26], "do": [0, 20, 21, 22, 26], "zero": [0, 1, 4, 7, 15, 25], "copi": [0, 4, 7, 15, 24, 25], "oper": [0, 1, 4, 6, 8, 12, 15, 19, 20, 23, 24, 26], "pass": [0, 6, 8, 14, 19, 26], "next": [0, 14], "without": [0, 5, 9, 10, 14, 19, 24, 25, 26], "being": [0, 1, 6, 12, 14, 24], "back": [0, 4, 6, 7, 20, 24], "return": [0, 1, 12, 26], "code": [0, 5, 9, 10, 11, 14, 19, 24, 25], "should": [0, 1, 4, 5, 6, 7, 8, 11, 12, 14, 15, 18, 21, 22, 24], "determin": [0, 5, 14, 15, 21, 22, 23], "suitabl": 0, "finish": [0, 14], "destroi": [0, 1], "so": [0, 14, 19, 21, 24], "free": [0, 14], "other": [0, 5, 6, 9, 12, 14, 19, 20, 22, 24], "job": [0, 12, 24, 25], "ensur": [0, 1, 4, 5, 6, 7, 8, 9, 11, 12, 18, 20, 26], "everyth": 0, "clean": 0, "up": [0, 1, 10, 13, 14, 18, 19, 24], "properli": [0, 1, 20, 26], "xrm_plugin_releas": 0, "dynam": [0, 15, 24, 25], "packag": [0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 18, 25, 26], "build": [0, 1, 5, 24, 25, 26], "part": [0, 19, 26], "necessari": 0, "declar": [0, 6], "your": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 14, 17, 24, 25], "includ": [0, 1, 5, 6, 8, 12, 13, 14, 17, 18, 19, 23, 24, 25], "header": [0, 17, 26], "sourc": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 19, 20, 23, 24, 25], "h": [0, 6, 7, 8, 9, 10, 11, 19, 24], "add": [0, 4, 5, 17, 20, 21, 24, 26], "line": [0, 1, 4, 5, 6, 7, 8, 9, 10, 19, 22, 23, 24], "cmakelist": 0, "txt": [0, 14, 22, 23], "file": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 18, 19, 20, 22, 23, 24, 25, 26], "target_link_librari": 0, "project_nam": 0, "public": 0, "xrm_interfac": [0, 24, 25], "target_include_directori": 0, "project_source_dir": 0, "target_properti": 0, "interface_include_directori": 0, "struct": 0, "xmaparamet": 0, "type": [0, 1, 5, 6, 9, 10, 11, 14, 15, 18, 19, 21, 23, 24, 25, 26], "length": [0, 25], "valu": [0, 1, 11, 14, 18, 20, 22, 23, 24, 25], "custom": [0, 5, 14, 15, 18, 19], "argument": [0, 5, 6, 8, 11, 14, 20], "found": [0, 4, 5, 6, 7, 8, 11, 14, 21, 22, 24, 25], "xmaparam": 0, "xmaframeproperti": 0, "dimens": [0, 7], "xmabuff": 0, "raw": [0, 4, 5, 6, 8, 11, 18, 20, 22], "its": [0, 5, 14, 18, 19, 20, 22, 24, 26], "sent": 0, "thei": [0, 5, 6, 8, 22, 24], "input": [0, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 19, 20, 21, 24], "output": [0, 4, 5, 7, 9, 10, 11, 12, 14, 15, 19, 20, 21, 22, 23, 24], "look": [0, 1, 5, 14, 19, 22, 24], "ahead": [0, 19, 22], "support": [0, 1, 4, 9, 10, 11, 12, 14, 15, 17, 19, 20, 22, 25, 26], "3": [0, 1, 4, 11, 12, 19, 20, 21, 22, 24, 25], "xma_host_buffer_typ": 0, "upload": [0, 6, 25], "befor": [0, 5, 8, 14, 20, 25], "xma_device_only_buffer_typ": 0, "download": [0, 5, 17, 24, 25, 26], "no_buff": 0, "contain": [0, 1, 6, 7, 8, 9, 11, 12, 14, 20, 21, 22, 24, 25], "place": [0, 7], "holder": 0, "fill": 0, "onli": [0, 1, 5, 11, 14, 18, 19, 21, 22, 24, 25], "while": [0, 14, 18, 20, 22], "xma_device_buffer_typ": 0, "dummi": 0, "those": 0, "respect": [0, 1, 5, 6, 14, 18, 19, 24, 25], "xmadatabuff": 0, "sw_format": 0, "member": 0, "xmascalerproperti": 0, "xmaencoderproperti": 0, "xmafilterproperti": 0, "repres": 0, "pixel": [0, 6, 7, 8, 11, 24], "format": [0, 1, 4, 5, 6, 8, 9, 11, 13, 14, 19, 20, 22, 24, 25], "therefor": 0, "assign": [0, 18, 21, 24], "direct": [0, 15, 19, 24, 25], "flow": 0, "xma_nv12_fmt_typ": 0, "xma_p010le_fmt_typ": 0, "flag": [0, 5, 6, 15, 21], "xma_frame_property_flag_tile_4x4": 0, "intern": [0, 6, 15, 20], "xma_packed10_fmt_typ": 0, "an": [0, 1, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 23, 24, 25, 26], "xma_rgb24_fmt_typ": 0, "futur": [0, 25], "xma_yuv420p_fmt_typ": 0, "xma_yuv420p10le_fmt_typ": 0, "extern": [0, 19], "section": [0, 1, 4, 5, 6, 7, 11, 12, 14, 15, 18, 19, 20, 22, 23, 24, 25, 26], "commonli": [0, 5], "most": [0, 5, 8, 11, 19, 22], "consist": 0, "xma_log_init": 0, "xma_logmsg": 0, "xma_log_releas": 0, "xmalogg": 0, "int32_t": 0, "xmalogleveltyp": 0, "log_level": [0, 11, 23, 24], "xmalogtyp": 0, "log_typ": 0, "xmaloghandl": 0, "handl": [0, 14, 24], "prior": [0, 18], "see": [0, 1, 4, 5, 6, 7, 8, 11, 12, 14, 19, 20, 21, 22, 24], "variad": 0, "usag": [0, 1, 4, 6, 8, 13, 14, 22, 24, 25], "void": 0, "level": [0, 11, 15, 19, 23, 24], "const": 0, "char": 0, "name": [0, 1, 4, 8, 9, 10, 11, 12, 14, 15, 17, 23, 24, 25, 26], "msg": 0, "messag": [0, 11, 12, 14, 15, 20], "wa": [0, 15, 23], "previous": [0, 4, 6, 7, 15, 18], "xma_initi": 0, "xma_releas": 0, "xmainitparamet": 0, "init_param": 0, "xmahandl": 0, "xma_data_buffer_alloc": 0, "xma_data_from_buffer_clon": 0, "xma_data_buffer_fre": 0, "size_t": 0, "size": [0, 6, 7, 12, 18, 20, 22, 23, 24, 26], "bool": 0, "given": [0, 1, 4, 6, 11, 14, 21, 22], "uint8_t": 0, "xma_data_buffer_clone_free_callback_funct": 0, "free_callback": 0, "opaqu": 0, "point": [0, 1, 14, 17, 20], "longer": 0, "xma_frame_planes_get": 0, "xma_frame_get_plane_height": 0, "xma_frame_get_plane_strid": 0, "xma_frame_get_plane_s": 0, "xma_frame_alloc": 0, "xma_frame_from_buffers_clon": 0, "xma_frame_clon": 0, "xma_frame_inc_ref": 0, "xma_frame_dec_ref": 0, "xma_frame_fre": 0, "frame_prop": 0, "number": [0, 8, 9, 10, 11, 12, 14, 15, 20, 21, 22, 23, 24, 25], "plane": 0, "height": [0, 6, 8, 10, 11, 14, 15, 18, 22, 24, 25], "stride": 0, "width": [0, 1, 6, 8, 10, 11, 14, 15, 18, 22, 24, 25], "xmaframedata": 0, "frame_data": 0, "xma_frame_clone_free_callback_funct": 0, "xma_fram": 0, "same": [0, 5, 6, 14, 22, 25], "side": 0, "ad": [0, 1, 10, 24], "remov": [0, 12, 18, 26], "affect": 0, "origin": [0, 5, 7], "increas": [0, 19, 21, 22], "count": [0, 11], "decreas": [0, 19, 20, 22], "previou": [0, 14, 15], "xma_dec_session_cr": 0, "xma_dec_set_log": 0, "xma_dec_session_send_data": 0, "xma_dec_session_get_properti": 0, "xma_dec_session_recv_fram": 0, "xma_dec_session_destroi": 0, "xmadecod": 0, "xmadecodersess": 0, "xmadecoderproperti": 0, "dec_prop": 0, "run": [0, 1, 9, 11, 14, 17, 18, 19, 20, 24, 25, 26], "until": [0, 14, 19], "after": [0, 8, 12, 14, 18, 26], "allow": [0, 1, 6, 8, 13, 14, 17, 19, 21, 22, 24, 25, 26], "depend": [0, 15, 19, 20, 22], "sever": [0, 6, 14, 19], "factor": [0, 14, 22, 24, 25], "resolut": [0, 5, 7, 9, 10, 11, 14, 18, 19, 20, 24, 25], "rate": [0, 5, 8, 11, 13, 14, 15, 18, 19, 21, 22, 24, 25], "bit": [0, 4, 7, 8, 11, 15, 18, 21, 22, 25], "depth": [0, 11, 15, 19, 20, 22, 24, 25], "xma_dec_session_set_log": 0, "chang": [0, 4, 19, 22], "default": [0, 1, 5, 6, 8, 9, 10, 11, 12, 14, 20, 22, 23, 24, 25, 26], "set": [0, 6, 8, 11, 14, 15, 19, 20, 21, 22, 23, 24, 25, 26], "some": [0, 5, 6, 8, 20, 22], "data_us": 0, "wai": [0, 14, 19, 24], "pars": [0, 8], "stream": [0, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 18, 19, 20, 21, 22, 24, 25], "time": [0, 1, 4, 5, 6, 7, 8, 10, 11, 13, 14, 20, 21, 22], "indic": [0, 1, 14, 20, 26], "amount": [0, 22], "consum": 0, "If": [0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 18, 20, 21, 23, 24, 25, 26], "xma_success": 0, "abl": [0, 17, 26], "entireti": 0, "accordingli": [0, 14], "In": [0, 1, 4, 5, 6, 7, 8, 14, 17, 19, 21], "case": [0, 9, 14, 15, 18, 19, 20, 21, 22, 24], "proce": [0, 1, 12], "fetch": 0, "xma_try_again": 0, "did": 0, "report": [0, 1, 18, 19, 20, 21, 23], "0": [0, 1, 4, 5, 6, 8, 9, 10, 11, 12, 14, 15, 18, 19, 20, 21, 22, 23, 24, 25, 26], "again": [0, 6], "xma_send_more_data": 0, "more": [0, 1, 4, 6, 7, 8, 11, 12, 14, 18, 19, 20, 22, 24, 25], "ha": [0, 1, 5, 6, 11, 14, 18, 19, 20, 22, 24, 25], "notifi": 0, "null": [0, 5, 10, 14], "continu": [0, 1], "order": [0, 1, 5, 17, 21, 26], "flush": 0, "out": [0, 4, 8, 14, 20, 25], "yuv": [0, 6, 11], "dec_sess": 0, "fprop": 0, "tri": 0, "valid": [0, 1, 14, 19, 21, 22, 24, 25], "pointer": 0, "still": [0, 11, 14], "produc": [0, 6, 8, 9, 15, 18, 19, 25], "xma_eo": 0, "configur": [0, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 18, 19, 20, 22, 23, 24, 25, 26], "standard": [0, 5, 19, 24], "both": [0, 4, 7, 18, 19, 22, 24, 26], "specifi": [0, 1, 5, 6, 8, 10, 11, 14, 15, 22, 24, 25], "hwdecoder_typ": 0, "param": [0, 11, 22, 25], "arrai": 0, "list": [0, 1, 5, 6, 11, 12, 14, 15, 17, 18, 21, 22, 24], "param_cnt": 0, "incom": [0, 6, 22, 24], "even": [0, 19], "integ": [0, 10, 24, 25], "between": [0, 1, 4, 7, 14, 15, 19, 21, 24, 25, 26], "128": [0, 26], "3840": [0, 14], "portrait": [0, 18, 19], "2160": [0, 14], "bits_per_pixel": 0, "per": [0, 1, 6, 11, 12, 13, 18, 20, 22, 25, 26], "primari": [0, 1, 22], "8": [0, 6, 7, 10, 11, 18, 21, 25, 26], "10": [0, 1, 4, 7, 11, 12, 15, 18, 21, 24, 25], "xma_frame_property_flag_compress": 0, "addit": [0, 1, 5, 14, 22, 23, 25], "out_fmt": [0, 4, 6, 11, 14, 21, 24], "option": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 18, 21, 22, 25], "low_lat": [0, 6, 21, 24], "1": [0, 1, 4, 5, 6, 8, 9, 10, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "enabl": [0, 6, 9, 11, 12, 13, 15, 18, 19, 21, 23, 24, 25, 26], "e": [0, 1, 4, 6, 7, 8, 11, 12, 14, 18, 22, 24, 25, 26], "p": [0, 1, 6, 12, 25], "b": [0, 1, 4, 5, 6, 10, 11, 21, 22, 24, 25], "latency_log": [0, 11, 21, 24], "inform": [0, 1, 5, 6, 14, 24], "xma_scaler_session_cr": 0, "xma_scaler_set_log": 0, "xma_scaler_session_send_fram": 0, "xma_scaler_session_recv_frame_list": 0, "xma_scaler_session_destroi": 0, "xmascal": 0, "xmascalersess": 0, "prop": 0, "underli": [0, 22], "eventu": 0, "multipl": [0, 4, 14, 18, 19, 22, 24], "take": [0, 6, 8, 9, 14, 24, 25], "further": [0, 4, 5, 6, 7], "upon": [0, 20], "xma_flush_again": 0, "mean": [0, 1, 5, 22, 24], "frame_list": 0, "everi": [0, 1, 5, 21], "reach": [0, 19], "end": [0, 6, 14, 20, 21, 22], "xma_error": 0, "xmascalerinoutproperti": 0, "xmascalerfilterproperti": 0, "16": [0, 7, 19, 21, 24], "hwscaler_typ": 0, "xma_abr_scaler_typ": 0, "num_output": 0, "xma_vpe_fmt_typ": 0, "framer": [0, 5, 6, 8, 14, 22], "second": [0, 6, 18, 22, 25, 26], "mix_rat": 0, "mix": 0, "half": [0, 6, 11, 12, 24], "top": [0, 4, 6, 7, 8, 10, 25], "crop": [0, 25], "disabl": [0, 11, 12, 14, 15, 18, 23, 24, 25], "xma_enc_session_cr": 0, "xma_enc_session_set_log": 0, "xma_enc_session_send_fram": 0, "xma_enc_session_recv_data": 0, "xma_enc_session_destroi": 0, "xmaencod": 0, "xmaencodersess": 0, "enc_prop": 0, "about": [0, 1, 6, 14, 22], "func": 0, "data_s": 0, "respons": [0, 14], "xma_resend_and_recv": 0, "readi": 0, "untouch": 0, "either": [0, 5, 14, 18, 19], "reus": [0, 14], "hwencoder_typ": 0, "lookahead_depth": [0, 5, 6, 11, 20, 21, 22, 24], "lookahead": [0, 1, 9, 11, 14, 15, 20, 24, 25], "modul": [0, 12, 26], "give": [0, 5, 8], "start": [0, 1, 5, 6, 10, 13, 14, 20, 22, 26], "40": [0, 1, 11, 19, 25], "rc_mode": [0, 11], "constant": [0, 19, 21, 24, 25], "qp": [0, 6, 11, 15, 19, 22, 24, 25], "cbr": [0, 19, 21, 24, 25], "2": [0, 1, 4, 6, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 24, 25, 26], "vbr": [0, 18, 19, 24, 25], "cvbr": [0, 18, 19, 24, 25], "bitrat": [0, 6, 8, 10, 11, 15, 20, 21, 22, 24, 25], "kbp": [0, 10, 11], "fix": [0, 20, 21, 22, 25], "quantiz": [0, 19, 21, 22, 24, 25], "51": [0, 11, 22, 24, 25], "264": [0, 6, 7, 8, 9, 10, 11, 19, 24], "hevc": [0, 6, 8, 11, 13, 14, 18, 19, 21, 24, 25], "255": [0, 6, 11, 22, 24, 25], "av1": [0, 6, 8, 11, 13, 14, 15, 18, 19, 21, 24, 25], "gop_siz": 0, "maximum": [0, 11, 14, 18, 19, 22, 24, 25], "group": [0, 26], "pictur": 0, "temp_aq_gain": 0, "tempor": [0, 11, 18, 19, 22, 24, 25], "aq": [0, 11, 22, 24, 25], "gain": [0, 11, 22, 24, 25], "spat_aq_gain": 0, "spatial": [0, 11, 18, 19, 22, 24, 25], "minqp": [0, 22], "minimum": [0, 11, 24, 25], "maxqp": [0, 22], "profil": [0, 11, 15, 19, 24], "baselin": [0, 11, 19, 24], "main": [0, 11, 15, 17, 19, 24, 25], "high": [0, 11, 13, 18, 19, 20, 24, 25], "intra": [0, 11, 19, 24, 25], "100": [0, 1, 11, 20], "101": [0, 11], "102": [0, 11], "103": [0, 11], "200": 0, "auto": [0, 11, 24, 25], "codec": [0, 5, 6, 9, 11, 13, 15, 24], "slice": [0, 6, 11, 14, 15, 19, 24, 25], "spatial_aq": [0, 11, 24], "adapt": 0, "temporal_aq": [0, 11, 24], "qp_mode": [0, 11, 24], "rel": [0, 10, 25], "uniform": [0, 24, 25], "tune_metr": [0, 5, 11, 15, 22, 24], "tune": [0, 6, 11, 15, 19, 24, 25], "metric": [0, 5, 11, 15, 24, 25], "none": [0, 4, 11, 12, 26], "vq": [0, 5, 6, 15, 18, 19, 21, 24, 25], "psnr": [0, 22, 24, 25], "ssim": [0, 22, 24, 25], "vmaf": [0, 22, 24, 25], "forced_idr": [0, 24], "forc": [0, 8, 15, 23, 24, 25, 26], "insert": [0, 8, 9, 10, 12, 15, 21, 24, 26], "idr": [0, 9, 15, 19, 24, 25], "crf": [0, 11, 24, 25], "expert_opt": [0, 11], "": [0, 1, 4, 5, 6, 7, 8, 11, 12, 14, 15, 21, 24, 25, 26], "expert": [0, 11, 15], "device_typ": [0, 11], "For": [0, 1, 4, 5, 6, 8, 11, 12, 14, 18, 19, 21, 22, 24, 25, 26], "select": [0, 5, 6, 12, 14, 15, 18, 19, 21, 24], "xma_filter_session_cr": 0, "xma_filter_session_set_log": 0, "xma_filter_session_send_fram": 0, "xma_filter_session_recv_fram": 0, "xma_filter_session_destroi": 0, "xmafilt": 0, "xmafiltersess": 0, "reciev": 0, "re": [0, 6, 19, 22], "mai": [0, 1, 5, 14, 18, 19, 20, 21, 22, 24, 26], "current": [0, 1, 14, 15, 18, 22, 25], "yet": 0, "xmafilterportproperti": 0, "hwfilter_typ": 0, "entri": [0, 14, 18], "xma_upload_filter_typ": 0, "xma_download_filter_typ": 0, "port": 0, "xma_int32": 0, "note": [0, 1, 4, 5, 6, 7, 8, 12, 13, 14, 19, 21, 22, 24, 25, 26], "error": [0, 1, 6, 8, 11, 14, 20, 23, 24, 25], "occur": 0, "immedi": 0, "fpga": 0, "daemon": [0, 1, 14, 18, 26], "command": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12, 19, 22, 26], "tool": [0, 1, 18, 19, 22], "commun": [0, 19, 24, 25], "xrmadm": [0, 14], "xrmd": [0, 14, 18, 24], "document": [0, 5, 11, 14, 15, 18, 22, 24, 25], "defin": [0, 6, 14, 19, 22, 23, 24, 26], "xrm_dec_reserv": 0, "xrm_dec_releas": 0, "xrm_dec_interfac": 0, "int": [0, 9, 10, 22], "xrmdecodecontext": 0, "xrm_dec_ctx": 0, "dev_index": 0, "xrminterfaceproperti": 0, "xrm_prop": 0, "check": [0, 8, 26], "relev": [0, 5, 17, 21], "were": 0, "xrm_enc_reserv": 0, "xrm_enc_releas": 0, "xrm_enc_interfac": 0, "xrmencodecontext": 0, "xrm_enc_ctx": 0, "slice_id": 0, "is_xav1": 0, "is_ul": 0, "xrm_scale_reserv": 0, "xrm_scale_releas": 0, "xrm_scale_interfac": 0, "xrmscalecontext": 0, "scaler_xrm_ctx": 0, "input_prop": 0, "output_prop": 0, "amd": [1, 2, 3, 4, 6, 7, 8, 9, 10, 14, 15, 16, 17, 21, 22, 23, 25, 26], "ama": [1, 2, 3, 4, 6, 7, 8, 9, 10, 14, 15, 16, 17, 21, 22, 23, 25, 26], "video": [1, 2, 3, 6, 8, 9, 10, 13, 15, 16, 17, 18, 20, 21, 23, 25, 26], "sdk": [1, 2, 3, 4, 6, 7, 8, 9, 10, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 25, 26], "xrm": [1, 19, 20, 23, 24, 25], "interfac": [1, 11, 13, 19], "instal": [1, 4, 5, 6, 7, 8, 9, 10, 11, 14, 17, 18, 24, 25, 26], "upgrad": [1, 17], "board": 1, "flash": 1, "standalon": 1, "queri": [1, 14, 19], "administ": 1, "examin": 1, "reset": [1, 18, 19], "target": [1, 4, 6, 7, 15, 19, 20, 22, 23, 26], "pcie": [1, 12, 18, 19, 26], "domain": [1, 26], "notat": 1, "work": [1, 11], "pci": [1, 18, 19, 26], "often": 1, "pad": [1, 8, 15], "lead": 1, "four": [1, 10, 13], "digit": 1, "colon": 1, "hexadecim": 1, "two": [1, 9, 13, 14, 19, 22, 23, 25], "sometim": 1, "refer": [1, 6, 8, 12, 15, 18, 19, 23, 24, 25], "slot": [1, 12], "decim": 1, "softwar": [1, 2, 13, 17, 18, 19, 23], "background": [1, 14], "process": [1, 5, 8, 11, 13, 14, 15, 19, 21, 22, 23, 24, 25], "reserv": [1, 15], "alloc": [1, 6, 12, 14, 15, 19, 25, 26], "interact": [1, 11, 14, 21, 23, 26], "gener": [1, 4, 11, 12, 15, 18, 19, 23, 26], "guid": [1, 5, 6, 8, 11, 24, 25], "compat": [1, 4, 7, 13, 19, 21, 22, 25, 26], "obtain": [1, 5, 8, 21, 24, 25, 26], "exampl": [1, 3, 13, 19, 21, 22, 26], "detect": 1, "bdf": 1, "0000": [1, 20, 26], "01": [1, 21, 26], "00": [1, 4, 20, 21, 26], "02": [1, 26], "info": [1, 11, 12, 23, 26], "No": [1, 9, 10, 19], "taken": 1, "help": [1, 8, 11, 24, 26], "cmd": 1, "last": 1, "design": [1, 25, 26], "you": [1, 4, 5, 6, 7, 8, 11, 12, 14, 24, 25, 26], "through": [1, 4, 5, 9, 10, 14, 19, 22, 24, 26], "cat": [1, 12, 26], "sy": [1, 12, 26], "class": [1, 12], "misc": [1, 12], "ama_transcod": [1, 12, 26], "x": [1, 4, 8, 18, 22], "bus_id": 1, "minu": 1, "ama_transcoder0": [1, 4, 5, 11, 12, 14, 20, 21, 24], "verifi": [1, 11, 12], "version_inform": [1, 12], "zsp": [1, 12, 18], "5": [1, 9, 10, 11, 12, 14, 18, 19, 20, 21, 24, 26], "sc": [1, 12, 17, 18], "9": [1, 10, 12, 18, 21], "7": [1, 11, 12, 18, 24, 25], "esecur": [1, 12], "fw": [1, 12], "ctrl": [1, 12, 20], "patch": [1, 12, 24, 25], "phy": [1, 12], "environ": [1, 14], "d": [1, 6, 11, 12, 17, 18, 24, 25, 26], "chassi": [1, 14, 19], "basic": 1, "shell": [1, 12, 14], "sub": [1, 14, 15, 21], "pipelin": [1, 6, 8, 9, 10, 11, 14, 15, 17, 19, 21, 22, 24], "impact": [1, 6, 22, 24], "result": [1, 4, 5, 10, 19, 22], "non": [1, 15, 19], "determinist": 1, "behavior": [1, 19, 22], "applic": [1, 2, 3, 4, 5, 6, 7, 8, 11, 13, 17, 18, 19, 21, 22, 24, 26], "via": [1, 14, 26], "execut": [1, 4, 5, 6, 7, 8, 11, 12, 14, 15, 24, 25, 26], "vm": [1, 12, 18], "instanc": [1, 12, 14, 26], "root": [1, 12, 24, 26], "privileg": 1, "r": [1, 24, 26], "switch": 1, "view": 1, "interest": 1, "electr": 1, "power": [1, 12, 13, 18, 19], "sensor": 1, "present": [1, 4, 5, 6, 7, 8, 9, 10, 11], "hw": [1, 14], "cnt": 1, "counter": 1, "print": [1, 11, 21, 24], "memori": [1, 8, 18, 25, 26], "topologi": [1, 21], "thermal": 1, "known": [1, 5, 14, 20, 22, 25], "These": [1, 14, 19, 22, 24], "json": [1, 5, 9, 14], "o": [1, 10, 11, 18, 26], "filenam": 1, "temperatur": [1, 18], "ma35_temp_s2": 1, "85": 1, "c": [1, 2, 3, 4, 5, 6, 9, 11, 12, 13, 15, 19, 20, 21, 22, 24, 26], "board_temp": 1, "44": [1, 26], "aux": 1, "732": 1, "mv": 1, "ddr0": 1, "868": 1, "ml_engin": 1, "747": 1, "748": 1, "3v": 1, "pex": 1, "voltag": [1, 18], "3304": 1, "3320": 1, "12v": 1, "12040": 1, "293": 1, "ma": 1, "93": 1, "426": 1, "board_pow": 1, "6405": 1, "mw": 1, "administr": 1, "virtual": [1, 12, 18, 20], "vf": [1, 4, 5, 6, 15, 18, 22, 24, 26], "numvf": [1, 26], "Or": 1, "activ": [1, 24, 26], "linux": [1, 12, 14], "15": [1, 11, 12, 18, 22, 26], "60": [1, 5, 6, 8, 10, 14, 20, 22, 24, 26], "66": 1, "ubuntu": [1, 12, 18, 26], "smp": 1, "fri": 1, "jan": [1, 5], "20": [1, 7, 10, 11, 18, 22, 26], "14": 1, "29": 1, "49": [1, 21], "utc": 1, "2023": [1, 21, 26], "machin": [1, 24, 26], "x86_64": 1, "cpu": [1, 4, 5, 7, 26], "core": [1, 12, 15, 17, 19, 26], "24": [1, 21], "63450": 1, "mb": [1, 18, 24], "glibc": 1, "35": [1, 22], "04": [1, 18, 26], "03": [1, 26], "bandwidth": [1, 6, 8, 19], "tag": 1, "mbp": [1, 11, 18], "s2_dfi_w_mbp": 1, "s2_dfi_r_mbp": 1, "s2_axi_w_mbp": 1, "s2_axi_r_mbp": 1, "s1_dfi_w_mbp": 1, "s1_dfi_r_mbp": 1, "s1_axi_w_mbp": 1, "s1_axi_r_mbp": 1, "vendor": [1, 11, 26], "0x10ee": 1, "0x5070": 1, "16gt": 1, "temp": 1, "114": 1, "59": 1, "740": 1, "750": 1, "3296": 1, "12216": 1, "266": 1, "80": [1, 24], "1026": 1, "13676": 1, "uptim": 1, "sec": 1, "5620": 1, "pciephypatch": 1, "pciectlpatch": 1, "6": [1, 5, 11, 12, 20, 24], "threshold": 1, "shutdown_temp_c": 1, "110": 1, "max_operating_temp_c": 1, "105": 1, "threshold_temp_c": 1, "oem_id": 1, "0xe78": 1, "sku_numb": 1, "part_numb": 1, "05105": 1, "product_nam": 1, "alveo": 1, "ma35d": [1, 4, 7, 13, 14, 15, 18], "eng": 1, "product_revis": 1, "b01": 1, "product_sn": 1, "51051a32c24k": 1, "processor_typ": 1, "vpu": [1, 13, 19], "uncorrect": 1, "correct": [1, 14], "ths2_axi_sram": 1, "ths1_axi_sram": 1, "ddr_ch7": 1, "ddr_ch6": 1, "ddr_ch3": 1, "ddr_ch2": 1, "ddr_ch1": 1, "ddr_ch5": 1, "ddr_ch0": 1, "ddr_ch4": 1, "sure": [1, 6, 24], "wish": 1, "y": [1, 4, 5, 6, 12, 14, 21, 22, 24, 26], "n": [1, 7, 10, 14, 15, 24], "issu": [1, 12, 26], "sudo": [1, 12, 17, 20, 25, 26], "v": [1, 4, 5, 6, 10, 11, 14, 15, 21, 22, 24, 26], "imag": [1, 4, 7, 10, 18, 19, 26], "get": [1, 6, 11, 13, 23, 25, 26], "meta": 1, "data": [1, 8, 19, 20, 24], "binari": [1, 5, 24], "path_to_flash_imag": 1, "comma": 1, "separ": 1, "keyword": [1, 8], "parallel": [1, 12, 14, 19, 25], "simultan": [1, 19], "across": [1, 5, 14, 18, 19], "stop": [1, 6], "backup": 1, "region": [1, 12, 18], "appropri": [1, 5, 25], "proper": [1, 4, 5, 6, 7, 8, 11, 12], "zsp_firmware_packed_v104": 1, "bin": [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 26], "zsp_firmware_packed_": 1, "package_timestamp": 1, "08": 1, "29_21": 1, "52": [1, 11], "31": [1, 9, 10, 11], "keyset": 1, "md5sum": 1, "8bba16f5a321bc5710fea5106bb14f45": 1, "schema": 1, "eraseflash": 1, "18": 1, "27": [1, 21], "36": 1, "45": 1, "54": 1, "63": 1, "72": [1, 24], "81": [1, 24], "90": 1, "writeflash": 1, "pleas": 1, "wait": [1, 14], "flash_progress": 1, "30": [1, 11, 19, 21, 22], "50": [1, 11, 12, 21, 22, 24], "70": 1, "successfulli": 1, "mandatori": [1, 4, 5, 6, 7, 8, 9, 10, 11, 14], "script": [1, 4, 5, 6, 7, 8, 11, 12, 14, 18], "setup": [1, 18, 25, 26], "sh": [1, 4, 5, 6, 7, 8, 11, 12, 14, 18, 20, 24, 26], "boot": [1, 12, 14, 18], "list_cmd": [1, 14], "cu": [1, 14], "decod": [1, 4, 5, 7, 10, 12, 13, 14, 15, 18, 19, 23], "scaler": [1, 6, 14, 15], "encod": [1, 4, 5, 7, 10, 13, 14, 15, 18, 19, 23], "device_0": [1, 14], "cu_2": [1, 14], "cuid": [1, 14], "cutyp": [1, 14], "ip": [1, 14, 15, 26], "kernel": [1, 10, 12, 14, 17, 26], "kernelnam": [1, 14], "kernelalia": [1, 14], "encoder_type1_ama": [1, 14], "instancenam": [1, 14], "encoder_1": [1, 14], "cunam": [1, 14], "kernelplugin": [1, 14], "maxcapac": [1, 14], "497664000": [1, 14], "numchaninus": [1, 14], "usedload": [1, 14], "1000000": [1, 8, 14], "reservedload": [1, 14], "resrvusedload": [1, 14], "how": [1, 3, 4, 5, 6, 7, 8, 11, 12, 14, 19, 24, 25], "much": [1, 14], "rang": [1, 9, 10, 14, 19, 20, 21, 22, 24, 25], "noth": [1, 14], "fulli": [1, 14, 19], "actual": [1, 14, 19, 22], "ffmpeg": [2, 5, 7, 8, 11, 12, 13, 17, 18, 19, 20, 22, 23], "qualiti": [2, 11, 13, 20, 21, 24, 25], "filter": [2, 6, 11, 15, 18, 20, 23], "gstreamer": [2, 4, 5, 6, 11, 12, 14, 17, 18, 19, 22, 23], "compositor": 2, "abr": [2, 11, 14, 22, 23, 24], "ladder": [2, 14, 22, 23, 24], "xma": [2, 4, 5, 6, 7, 8, 12, 17, 18, 19, 23, 25], "under": [3, 5, 6, 9, 10, 11, 14, 18], "construct": [3, 24], "folder": [3, 4, 5, 6, 7, 8, 9, 11, 14, 24, 25], "illustr": [3, 5, 11, 14, 19, 22, 24, 25], "advanc": [3, 19], "api": [3, 11, 13, 14, 19], "shown": [4, 14], "g": [4, 6, 7, 8, 11, 12, 14, 22, 24, 25], "frame": [4, 5, 6, 7, 8, 9, 11, 14, 15, 21, 22, 24, 25], "transfer": [4, 6, 7, 8, 15, 19, 24, 25], "hwdownload": [4, 6, 14, 24], "appli": [4, 6, 7, 24, 25], "hwupload": [4, 5, 6, 22, 24], "split": [4, 6, 7, 15, 18, 19], "fp": [4, 6, 7, 8, 11, 19, 21, 24], "minim": [4, 7], "traffic": [4, 7], "descript": [4, 6, 7, 9, 10, 12, 23, 24, 25], "accumul": [4, 6, 7], "manner": [4, 6, 7], "explain": [4, 5, 6, 7, 8, 14], "version": [4, 5, 6, 7, 8, 11, 12, 13, 15, 19, 20, 24, 25, 26], "On": [4, 5, 6, 7, 8, 11, 12, 26], "premis": [4, 5, 6, 7, 8, 11, 13, 26], "export": [4, 5, 6, 7, 8, 11, 14, 23, 25], "import": [4, 5, 6, 7, 8, 11, 22], "variabl": [4, 5, 6, 7, 8, 11, 14, 23, 24, 25], "open": [4, 5, 6, 7, 8, 11, 24], "new": [4, 5, 6, 7, 8, 11, 14, 15], "termin": [4, 5, 6, 7, 8, 11, 14, 23], "correctli": [4, 5, 6, 7, 8, 11], "demonstr": [4, 5, 6], "flip": 4, "over": [4, 14, 18, 20], "hwaccel": [4, 5, 6, 14, 15, 19, 21, 22, 24], "hwaccel_devic": [4, 5, 14, 21, 24], "dev": [4, 5, 6, 8, 11, 12, 14, 15, 21, 24, 25, 26], "h264_ama": [4, 5, 6, 11, 14, 21, 24], "yuv420p": [4, 5, 6, 11, 14, 22, 24], "filter_complex": [4, 6, 14, 15, 21, 24], "transpos": 4, "dir": [4, 20], "passthrough": [4, 15, 18], "a1": [4, 6], "b1": [4, 6], "map": [4, 6, 9, 14, 24], "f": [4, 5, 6, 9, 10, 14, 21, 22, 24], "mp4": [4, 6, 7, 9, 10, 11, 14, 24], "90_flip": 4, "270_flip": 4, "path": [4, 5, 6, 8, 9, 10, 11, 14, 23, 24, 25, 26], "avc": [4, 8, 13, 15, 18, 19, 21, 22, 25], "clip": [4, 5, 6, 22], "directori": [4, 8, 11], "y4m": 4, "vid": 4, "l": [4, 10, 12, 24], "lai": 4, "offset": [4, 10, 15], "640": [4, 11, 14], "480": [4, 8, 11, 14], "in_w": 4, "800": 4, "in_h": 4, "out_h": 4, "compos": [4, 10], "tile": 4, "hide_bann": [4, 6], "input_1": 4, "input_2": 4, "input_3": 4, "input_4": 4, "scaler_ama": [4, 6, 21, 24], "out_r": [4, 6, 21, 24], "1920x1080": [4, 5, 6, 21, 22, 24], "11": [4, 11, 26], "22": [4, 11, 18], "33": 4, "hstack": 4, "bot": 4, "vstack": 4, "15m": 4, "vframe": [4, 14], "600": [4, 22], "replac": 4, "yuv420p10l": [4, 11, 14, 24], "graph": [4, 6, 24], "As": [4, 12, 14, 21, 26], "show": [4, 7, 14, 19, 24], "crop_10b": 4, "1m": [4, 6, 24], "442": 4, "page": [5, 6, 8, 9, 10, 12, 24, 26], "behind": 5, "measur": [5, 14, 22, 23], "maxim": 5, "topic": 5, "user": [5, 6, 8, 13, 14, 19, 23, 25, 26], "There": [5, 6, 8, 24], "longstand": 5, "goal": 5, "engin": [5, 15, 18, 22], "quantit": 5, "watch": 5, "inspect": [5, 8], "individu": [5, 14, 25], "led": 5, "evolut": 5, "algorithm": 5, "solut": [5, 19], "common": [5, 23], "peak": 5, "signal": 5, "nois": 5, "ratio": [5, 11, 15], "structur": 5, "similar": [5, 19], "index": [5, 9, 10, 15], "multimethod": 5, "assess": 5, "fusion": 5, "opinion": 5, "mo": 5, "human": 5, "visual": [5, 13, 21, 22, 25], "screen": 5, "feedback": 5, "mani": [5, 14, 19, 24, 25, 26], "peopl": 5, "argu": 5, "best": [5, 20, 21, 22, 24, 25], "although": 5, "consid": 5, "least": [5, 12, 26], "accur": 5, "ozer": 5, "center": [5, 10], "post": 5, "hi": 5, "experiment": 5, "correl": [5, 19], "abov": [5, 6, 9, 12, 18, 20, 21, 22, 24, 26], "review": 5, "find": [5, 24, 26], "here": [5, 6, 8, 14, 22], "furthermor": [5, 19, 21], "due": [5, 6, 8, 12, 14, 24, 25], "industri": [5, 24], "like": [5, 6, 24], "ones": [5, 19, 22], "taught": 5, "test": [5, 18, 19, 26], "higher": [5, 22], "wors": 5, "ey": 5, "x264": [5, 19], "x265": [5, 19], "object": [5, 11, 19, 21, 22, 24, 25], "discuss": 5, "subject": [5, 22], "appeal": 5, "what": [5, 14], "happen": [5, 22], "scene": [5, 22], "why": 5, "highli": [5, 19], "recommend": [5, 6, 8, 18, 19, 20, 21, 22], "undergon": 5, "transform": 5, "compress": [5, 21, 22, 24], "past": 5, "univers": 5, "state": [5, 6, 12, 19, 26], "fairli": 5, "compar": 5, "altern": [5, 19, 20], "remain": 5, "long": [5, 14], "pre": [5, 7, 13, 19], "tutori": [5, 12, 13, 19, 24, 26], "cover": [5, 15], "chapter": [5, 24], "variou": [5, 6, 11, 14, 17, 18, 20, 22, 24, 25], "effect": [5, 21, 22, 24, 25], "mode": [5, 11, 15, 18, 22, 23, 24, 25], "hevc_ama": [5, 6, 11, 14, 21, 22, 24], "av1_ama": [5, 6, 11, 24], "permut": 5, "adjust": [5, 22], "pix_fmt": [5, 6, 11, 14], "2000k": 5, "rawvideo": [5, 6, 14, 21, 22, 24], "real": [5, 11, 13, 14, 20], "guarante": 5, "howev": [5, 22], "better": [5, 22], "ull": [5, 11, 15, 18, 22, 24], "achiev": [5, 6, 21, 26], "licens": [5, 24], "reason": 5, "deliv": [5, 19], "doe": [5, 14, 18], "comprehens": [5, 8, 24], "plugin": [5, 6, 8, 11, 18, 19, 20, 23, 24], "easiest": 5, "static": [5, 19, 22], "john": 5, "van": 5, "sickl": 5, "among": [5, 21], "precompil": 5, "recompil": 5, "anoth": [5, 14], "repositori": [5, 14, 17, 26], "instruct": [5, 6, 12, 14, 17, 18, 24, 25], "rebuild": 5, "sampl": [5, 9, 10, 14, 18, 21, 22], "typic": [5, 14, 22], "distort": [5, 22], "lavfi": [5, 22], "libvmaf": 5, "log_fmt": 5, "ms_ssim": 5, "log_path": 5, "log": [5, 11, 14, 20, 24], "model_path": 5, "TO": 5, "model": [5, 11, 26], "modifi": [5, 22], "widthxheigth": 5, "vmaf_4k_v0": 5, "pkl": 5, "4k": 5, "vmaf_float_v0": 5, "lower": [5, 19, 20, 21, 24, 25], "break": 6, "down": [6, 7, 23], "varieti": [6, 11, 25], "full": [6, 11, 14, 20, 24, 25], "read": [6, 8], "write": [6, 8, 23], "disk": [6, 8, 26], "chanc": [6, 8], "massiv": [6, 8], "notic": [6, 8, 11, 21], "drop": [6, 8, 11], "speed": [6, 8, 19, 20, 21, 22], "we": [6, 8, 23], "shm": [6, 8, 24], "ram": [6, 8, 12, 19, 26], "accept": [6, 7, 8], "alreadi": 6, "save": [6, 7, 9], "nv12": [6, 8, 11, 14, 21, 24, 25], "tmp": [6, 7, 8, 9, 14, 21, 23, 24], "dec_out": 6, "explan": [6, 8], "move": [6, 8, 22], "twice": [6, 24], "convert": [6, 8, 24], "buffer": [6, 8, 10, 15, 20, 21, 22, 25], "signifi": 6, "metadata": 6, "oppos": 6, "audio": [6, 24], "ac3": 6, "improv": [6, 15, 19, 22, 24], "overwrit": 6, "prompt": 6, "1080p60": [6, 14, 19], "yuv420": [6, 7], "5mbp": [6, 11], "5m": [6, 11, 22], "sn1_av1": 6, "maintain": 6, "sinc": [6, 26], "1080p": [6, 10, 11, 14], "color": [6, 25], "space": [6, 9, 23, 25], "8m": 6, "megabit": 6, "8000k": 6, "8000000": 6, "enc_out": 6, "sn1_crf_hq": 6, "highest": 6, "sn1_crf_lq": 6, "lowest": 6, "8mbp": 6, "written": [6, 11, 19], "h264_to_hevc": 6, "exist": [6, 18, 26], "them": [6, 24], "_scale": 6, "1280x720": [6, 24], "720x480": [6, 24], "360x240": [6, 24], "c1": 6, "d1": 6, "scale_1080p": 6, "scale_720p": 6, "scale_480p": 6, "scale_240p": 6, "togeth": [6, 14, 25], "syntax": [6, 24], "widthxheight": [6, 24], "id": [6, 11, 15, 19, 23, 24, 25], "scale_": 6, "_": [6, 23], "6m": [6, 21, 24], "hevc_1080p60": 6, "2m": [6, 24], "av1_720p30": 6, "h264_480p30": 6, "av1_240p30": 6, "format_resoult": 6, "locat": [6, 8, 9, 10, 11, 14, 23, 24, 25, 26], "implement": [6, 9, 10, 24], "hevc_1080p": [6, 8, 24], "av1_720p": [6, 8, 24], "h264_480p": [6, 8, 24], "av1_240p": [6, 8, 24], "ultra": [6, 11, 15], "latenc": [6, 11, 15, 19, 24, 25], "loglevel": 6, "10m": [6, 11], "la": [6, 19], "trigger": 6, "4x4kp60": 6, "singl": [6, 12, 18, 19, 24, 26], "4kp6": 6, "out_3840x2160_0": 6, "out_3840x2160_1": 6, "ident": [6, 8, 23, 24], "explicitli": [6, 14, 15, 19, 20, 21], "task": 6, "servic": [6, 13, 19, 26], "ama_pipeline_script": [7, 8], "ama_download": [7, 8, 25], "ama_upload": [7, 8, 22, 25], "01_rotate_video": 7, "h264": [7, 8, 9, 10, 11, 14, 21, 24, 25], "xil_rotate_": 7, "02_logo_overlai": 7, "500x100": 7, "right": [7, 10], "left": [7, 10, 25], "corner": [7, 10], "xil_logo_overlai": 7, "03_crop_zoom": 7, "300x200": 7, "begin": 7, "xil_crop_zoom": 7, "04_multi_comp": 7, "4x": [7, 19], "equal": [7, 14, 23], "2x2": [7, 10], "xil_multi_comp": 7, "By": [8, 14, 25], "filesink": [8, 25], "plug": [8, 13, 19], "fakesink": [8, 22], "displai": [8, 19, 21], "avoid": [8, 15, 20], "incorrect": [8, 14], "265": [8, 9, 10, 11, 19], "updat": [8, 12, 17], "h265pars": 8, "instead": [8, 14, 22], "h264pars": 8, "breviti": 8, "purpos": 8, "element": [8, 17, 19, 20, 25], "properti": [8, 25], "repeat": [8, 26], "gst": [8, 22, 23], "ama_av1enc": [8, 25], "launch": [8, 22], "filesrc": 8, "parsebin": 8, "ama_h264dec": [8, 25], "capsfilt": [8, 22], "cap": [8, 20, 22, 24], "amamemori": 8, "unpack": [8, 12], "elementari": [8, 9, 10, 11], "byte": [8, 25], "nalu": 8, "rawvideopars": [8, 22], "1920": [8, 11, 14, 22], "1080": [8, 11, 14, 22], "i420": [8, 22, 25], "ama_h264enc": [8, 25], "unformat": 8, "timestamp": [8, 14, 15, 23], "eo": 8, "1200": [8, 22, 24], "ama_scal": [8, 25], "src_0": 8, "ama_h265enc": [8, 22, 25], "6000000": 8, "queue": 8, "src_1": 8, "1280": [8, 11, 14], "720": [8, 11, 14], "2000000": 8, "src_2": 8, "src_3": 8, "360": [8, 11, 14], "240": 8, "thread": [8, 19, 23], "decoupl": 8, "sink": 8, "multi": [9, 19, 21], "program": [9, 10, 11, 12, 13, 17, 19, 22], "util": [9, 10, 11, 14, 18, 19, 23, 24, 26], "diagram": [9, 10], "expect": [9, 10, 12, 19], "ama_xabrladd": 9, "abrladd": 9, "ladder_output": 9, "feed": [9, 10, 12], "nal": 9, "short": 9, "devidx": 9, "na": [9, 10], "j": [9, 24], "string": [9, 10, 24], "codectyp": 9, "h265": [9, 10, 11, 22, 25], "forcekeyfram": 9, "k": 9, "keyfram": 9, "frequenc": [9, 15], "store": [9, 14], "enough": [9, 14], "720p60": [9, 19], "720p30": [9, 19], "480p30": [9, 19], "360p30": [9, 19], "160p30": [9, 19], "lookahead_en": 9, "cannot": [10, 18, 20], "exce": [10, 14], "grid": 10, "logo": 10, "lastli": 10, "stamp": 10, "ama_xcompositor": 10, "png": 10, "jpg": 10, "overlai": 10, "4294967295": [10, 25], "5000": [10, 22], "horizont": [10, 19], "fraction": [10, 14], "posit": [10, 24, 25], "doubl": [10, 19], "vertic": [10, 19], "2147483647": [10, 25], "2000": [10, 11], "composit": [10, 15, 21, 24], "along": [10, 19], "video1": 10, "video2": 10, "video3": 10, "video4": 10, "soft": [10, 18], "nativ": 11, "built": [11, 24], "bitstream": 11, "ma35_decoder_app": 11, "codec_opt": 11, "exit": 11, "log_loc": 11, "consol": [11, 23, 26], "syslog": [11, 14, 23, 24], "log_fil": 11, "device_id": 11, "stream_loop": 11, "loop": [11, 15], "fmt": 11, "xv15": 11, "n12": 11, "out1": 11, "ma35_encoder_app": 11, "emerg": 11, "alert": 11, "critic": 11, "warn": [11, 12, 20, 23], "debug": [11, 23, 26], "w": [11, 20], "suppli": [11, 18], "5000000": [11, 25], "5000k": 11, "intraperiod": 11, "period": [11, 15, 21, 25], "min_qp": [11, 24], "max_qp": [11, 24], "spatial_aq_gain": [11, 24], "temporal_aq_gain": [11, 24], "control_r": [11, 15, 21, 24], "bf": [11, 24], "force_idr": 11, "main10_intra": 11, "main10": [11, 19], "automat": [11, 14, 19], "enc_hevc_main": 11, "enc_hevc_main_intra": 11, "main_intr": 11, "enc_hevc_main_10": 11, "enc_hevc_main10_intra": 11, "high10": 11, "high10_intra": 11, "enc_h264_baselin": 11, "enc_h264_main": 11, "enc_h264_high": 11, "enc_h264_high_10": 11, "enc_h264_high_10_intra": 11, "21": [11, 21], "41": 11, "12": [11, 14, 19, 21], "13": 11, "32": [11, 19], "42": 11, "tier": [11, 24, 25], "mpsoc": 11, "latency_mod": 11, "normal": [11, 19], "low": [11, 13, 15, 19, 20, 25], "consult": [11, 24, 25], "out0": 11, "ma35_scaler_app": 11, "ingest": 11, "scaler_opt": 11, "reduc": [11, 19, 20, 21, 22, 24], "resourc": [11, 15, 18, 19, 24, 25], "720p": 11, "480p": 11, "360p": 11, "240p": 11, "848": [11, 14], "out2": 11, "out3": 11, "288": [11, 14], "160": [11, 14], "out4": 11, "ma35_transcoder_app": [11, 18], "scaler_ma": 11, "num": [11, 14, 15, 22], "push": 11, "pull": 11, "faster": [11, 19], "than": [11, 12, 18, 19, 20], "out_1_width": 11, "channel": [11, 19, 20, 21, 22], "out_1_height": 11, "out_1_rat": 11, "out_2_width": 11, "out_2_height": 11, "out_2_rat": 11, "out_3_width": 11, "out_3_height": 11, "out_3_rat": 11, "out_4_width": 11, "out_4_height": 11, "out_4_rat": 11, "out_5_width": 11, "out_5_height": 11, "out_5_rat": 11, "out_6_width": 11, "out_6_height": 11, "out_6_rat": 11, "out_7_width": 11, "out_7_height": 11, "out_7_rat": 11, "out_8_width": 11, "out_8_height": 11, "out_8_rat": 11, "200kbp": 11, "350000000": 11, "68": [11, 19], "aspect_ratio": 11, "aspect": [11, 15], "h264_av1_transcod": 11, "4000k": 11, "abr_ladder1": 11, "3000k": 11, "abr_ladder2": 11, "2500k": 11, "abr_ladder3": 11, "1250k": 11, "abr_ladder4": 11, "success": 12, "guest": [12, 18], "bio": 12, "bifurc": 12, "secur": 12, "4g": [12, 18], "iommu": [12, 26], "etc": [12, 17, 18, 20, 21, 26], "grub": 12, "grub_cmdline_linux_default": 12, "quiet": 12, "splash": 12, "amd_iommu": 12, "pt": [12, 15], "intel_iommu": 12, "intel": [12, 26], "4gb": 12, "huge": [12, 26], "plu": [12, 26], "extra": [12, 24, 26], "96": [12, 26], "2048": [12, 26], "2144": 12, "echo": [12, 17, 26], "nr_hugepag": [12, 26], "sysctl": [12, 26], "conf": [12, 26], "sum": 12, "bare": 12, "metal": 12, "4096": 12, "4192": 12, "hand": 12, "12gb": [12, 19, 26], "2mb": 12, "36960": 12, "reboot": [12, 26], "proc": 12, "cmdline": [12, 14], "boot_imag": 12, "vmlinuz": [12, 26], "mapper": 12, "vg00": 12, "rootlv": 12, "ro": 12, "meminfo": 12, "grep": [12, 26], "hugepages_tot": 12, "hugepages_fre": 12, "hugepages_rsvd": 12, "hugepages": 12, "kb": [12, 24], "establish": 12, "whether": [12, 15, 22, 25], "deploi": [12, 22], "lspci": [12, 26], "vvvd": 12, "10ee": [12, 26], "multimedia": [12, 25, 26], "512mb": 12, "ppa": [12, 17, 26], "apt": [12, 17, 18, 25, 26], "dkm": [12, 26], "libhugetlbfs0": 12, "libboost": 12, "dpkg": 12, "awk": 12, "purg": 12, "driver": [12, 17, 18, 19, 26], "mark": 12, "hold": 12, "desir": [12, 14, 20, 22, 24], "unknown": 12, "statu": [12, 19, 20, 26], "Not": 12, "inst": 12, "trig": 12, "await": 12, "pend": 12, "err": 12, "reinst": 12, "uppercas": 12, "bad": 12, "architectur": 12, "ii": [12, 24], "amd64": 12, "supernova": 12, "modprob": [12, 26], "confirm": [12, 26], "observ": [12, 14, 20, 22], "older": 12, "maflash": 12, "ma35d_security_patch": 12, "cold": [12, 18], "systemctl": [12, 26], "poweroff": 12, "ma35_firmwar": 12, "ignor": [12, 24, 26], "asic": 12, "skip": 12, "bash": [12, 14], "learn": 12, "stack": [13, 19], "seamlessli": [13, 19], "densiti": [13, 18, 19, 22, 24, 25], "live": [13, 19], "oem": [13, 19], "content": 13, "deliveri": [13, 19], "network": [13, 19, 26], "cdn": [13, 19], "compil": [13, 14, 19, 24], "ins": [13, 19], "simpl": [13, 19, 24], "offer": [13, 22], "made": [13, 14, 19], "aggreg": [13, 14, 18, 19], "4kp60": [13, 14, 18, 19], "notion": 14, "pool": [14, 15], "central": 14, "within": [14, 22, 24, 25], "vari": [14, 19], "equival": 14, "heterogen": 14, "strictli": 14, "adher": 14, "subscript": [14, 20], "rest": 14, "identifi": [14, 25], "techniqu": 14, "submit": [14, 25], "bound": [14, 25], "rapidli": [14, 25], "easi": [14, 25], "straightforward": [14, 25], "entir": [14, 24, 25], "method": [14, 17, 20], "input1": 14, "ama_transcoder1": 14, "input2": 14, "therebi": 14, "failur": 14, "estim": 14, "percentag": 14, "precis": 14, "mechan": 14, "dispatch": 14, "reli": [14, 26], "homogen": 14, "tail": 14, "var": 14, "jdf": 14, "With": [14, 18, 24], "well": [14, 18], "kei": [14, 17, 19, 22, 23], "pair": [14, 22], "numer": [14, 24, 25], "denomin": 14, "load_factor": 14, "headroom": 14, "num_job_slot": 14, "absenc": 14, "describe_job": 14, "t10_transcode_multiscal": 14, "rendit": [14, 19], "request": 14, "request_id": 14, "testjob": 14, "den": 14, "1600": 14, "900": 14, "1440": 14, "1360": 14, "768": 14, "1024": 14, "960": 14, "540": 14, "352": 14, "jobslot_reserv": 14, "kind": 14, "intend": 14, "xrm_jobreservation_timestamp_jdf": 14, "epoch": 14, "extens": 14, "uniqu": 14, "xrm_reserve_id": 14, "retriev": 14, "dry_run": 14, "addition": [14, 23, 24], "safe": 14, "ill": [14, 22], "syntact": 14, "fail": [14, 20], "jobdescriptionfil": 14, "523634": 14, "250000": 14, "6111": 14, "5555": 14, "2777": 14, "dry": 14, "allot": 14, "xrm_jobreservation_79533431_t10_transcode_multiscal": 14, "aliv": 14, "press": 14, "enter": 14, "close": [14, 19], "app": 14, "xrm_reserve_id_": 14, "xrm_reserve_id_0": 14, "xrm_reserve_id_1": 14, "distinct": [14, 26], "xrm_reserve_id_2": 14, "And": 14, "forth": 14, "orchestr": 14, "github": [14, 24, 25], "develop": [14, 17], "tupl": [14, 24], "tjd": 14, "job_descript": 14, "jdf_path": 14, "ffmpeg_cmd": 14, "source1": 14, "job1": 14, "filter_hw_devic": 14, "dev0": 14, "300": [14, 22], "offici": 14, "arbitrari": 14, "assum": [14, 19, 23, 26], "source2": 14, "job2": 14, "compon": [14, 21], "relat": 14, "care": [14, 25], "enviro": 14, "xclbin": 14, "particularli": 14, "list_onedevice_cmd": 14, "requestid": 14, "becom": 14, "usabl": 14, "load_xrm_plugins_cmd": 14, "loadxrmplugin": 14, "ok": [14, 26], "unload_xrm_plugins_cmd": 14, "unloadxrmplugin": 14, "notabl": 15, "asid": [15, 19], "convent": [15, 24], "vp9": 15, "now": 15, "2d": [15, 18], "ml": [15, 18, 19, 24], "xlnx_hwdev": 15, "dma": [15, 18, 24], "xvbm_convert": 15, "deprec": 15, "force_key_fram": 15, "lowlat": 15, "splitbuff_mod": 15, "entropy_buffers_count": 15, "entropi": 15, "out_": 15, "_width": 15, "rung": [15, 24], "_height": 15, "_rate": 15, "idx": 15, "delta": 15, "beta": 15, "tc": 15, "lscale": 15, "rc": 15, "pb": 15, "hdr10": [15, 19], "sei": [15, 19], "interpol": 15, "buf": 15, "splitbuff": 15, "unsplit": 15, "coef": 15, "coeffici": 15, "firmwar": [17, 18], "conveni": 17, "robust": 17, "client": [17, 26], "remot": 17, "accord": [17, 19], "wget": 17, "qo": 17, "http": [17, 24, 25], "www": [17, 24], "com": [17, 25], "2018": 17, "master": [17, 19], "sign": 17, "asc": 17, "deb": 17, "trust": 17, "ye": 17, "artifactori": 17, "debian": 17, "lsb_releas": 17, "tee": [17, 26], "workaround": [18, 20], "satelit": 18, "our": 18, "n5": [18, 20], "v1": 18, "autom": 18, "balanc": 18, "collect": 18, "kvm": 18, "graphic": [18, 26], "pf": [18, 20, 26], "bar0": 18, "bar2": 18, "64": [18, 19, 24], "bar4": 18, "512": 18, "server": [18, 26], "share": [18, 24], "physic": [18, 26], "access": [18, 19, 25], "scalabl": 18, "progress": [18, 19], "interlac": 18, "divis": 18, "transport": [18, 24], "mpeg": [18, 19], "t": [18, 26], "400": 18, "8k": 18, "secondari": 18, "bu": [18, 26], "sbr": 18, "caus": 18, "hang": [18, 20], "restor": 18, "ama_av1dec": [18, 25], "ivf": [18, 20], "ivfpars": 18, "demux": 18, "mautil": 18, "crash": 18, "invok": 18, "mamgmt": [18, 26], "subpar": 18, "coupl": 18, "complex": [18, 24, 25], "manual": [18, 26], "boost": 18, "link": [18, 19, 25], "offload": 19, "intens": 19, "workload": 19, "popular": 19, "experi": 19, "suit": 19, "fed": 19, "turn": [19, 20, 22], "special": [19, 21], "gpu": 19, "vcu": 19, "ycbcr": 19, "iso": [19, 26], "itu": 19, "constrain": [19, 20, 25], "effici": [19, 25, 26], "aom": 19, "aomedia": 19, "128x128": 19, "3840x2160": [19, 24], "landscap": 19, "8x": 19, "driven": 19, "flexibl": 19, "hdr": 19, "popul": 19, "volum": 19, "light": 19, "charaterist": 19, "st2094_10": 19, "dolbyvis": 19, "st2094_40": 19, "samsung": 19, "mdcv": 19, "cll": 19, "atc": 19, "sequenc": 19, "persist": 19, "constraint": [19, 21, 24], "ts_103572v010101p": 19, "pdf": 19, "whenev": 19, "a341s34": 19, "582r4": 19, "a341": 19, "amend": 19, "2094": 19, "distribut": 19, "condit": [19, 20], "downscal": 19, "smaller": 19, "pyramid": 19, "tap": 19, "stage": 19, "polyphas": 19, "phase": 19, "luma": 19, "chroma": 19, "nomin": 19, "medium": [19, 22, 24, 25], "slow": [19, 22, 24, 25], "preset": [19, 24, 25, 26], "match": 19, "wherea": 19, "har": 19, "few": 19, "definit": 19, "linearli": 19, "throughput": [19, 22], "hyper": 19, "meet": [19, 24], "increment": 19, "met": 19, "impli": [19, 24], "explicit": [19, 24], "4kp30": 19, "1080p30": 19, "136": 19, "1440p60": 19, "1440p30": 19, "540p60": 19, "540p30": 19, "2160p60": 19, "240p30": 19, "144p30": 19, "2160p30": 19, "xxxxx": 20, "devicealloc": 20, "pressur": 20, "obviou": 20, "resolv": 20, "decrement": 20, "hl": 20, "slower": 20, "ffplai": 20, "mux": 20, "plai": 20, "recent": 20, "later": [20, 24], "player": [20, 25], "vlc": 20, "v3": 20, "17": 20, "permit": 20, "off": [20, 21, 24, 25, 26], "videor": 20, "encount": [20, 24], "bitdepth": 20, "30fp": 20, "26": 20, "60fp": 20, "46": [20, 21], "greater": 20, "dmesg": 20, "323": 20, "436842": 20, "05": [20, 21], "hdma": 20, "hdma_link_rc2ep_xf": 20, "0x1": 20, "440802": 20, "rc2ep": 20, "element_cnt": 20, "link_table_pa": 20, "0x160000": 20, "443387": 20, "ctl": 20, "0x01": 20, "0x4": 20, "0x2": 20, "sl": 20, "0x97e00000": 20, "dh": 20, "0x0": 20, "dl": 20, "0x20831000": 20, "445538": 20, "0x06": 20, "rsv": 20, "llp_h": 20, "llp_l": 20, "447257": 20, "0x500": 20, "io_page_fault": 20, "mi": 20, "trade": 21, "delai": [21, 22], "gop": [21, 24, 25], "understood": [21, 22], "come": [21, 22], "cost": 21, "optim": [21, 22, 24, 25], "compromis": 21, "let": 21, "unaccept": 21, "summat": 21, "linear": 21, "7xframe": 21, "4xframe": 21, "av1p30": 21, "ipbbb": 21, "28": 21, "except": 21, "53": 21, "alwai": 21, "cqp": [21, 25], "hevc_to_scale_to_h264": 21, "25": [21, 22], "028958": 21, "m": [21, 26], "152": 21, "79": 21, "157": 21, "194255": 21, "151": 21, "165": 21, "q": 21, "12m": 21, "lsize": 21, "189kb": 21, "83": 21, "1858": 21, "8kbit": 21, "27x": 21, "th": 21, "primarili": 22, "major": 22, "pertain": 22, "concept": 22, "signific": 22, "analysi": 22, "score": 22, "necessarili": 22, "abil": 22, "limit": [22, 24, 25], "spent": 22, "dure": [22, 24, 26], "motion": 22, "vector": 22, "search": 22, "rdoq": 22, "enhanc": [22, 24, 25], "expens": 22, "term": 22, "bd": 22, "flavor": 22, "stai": 22, "stat": 22, "emploi": 22, "independ": 22, "concern": 22, "runtim": 22, "segment": 22, "int_max": 22, "min": [22, 25], "consider": 22, "game": 22, "fast": 22, "camera": 22, "pan": 22, "rotat": 22, "talk": 22, "head": 22, "conferenc": 22, "exact": 22, "config": [22, 25], "initil": 22, "compli": 22, "unexpect": 22, "dynamic_params_fil": [22, 24], "own": [22, 26], "associ": [22, 26], "framenumbern1": 22, "key1": 22, "value1": 22, "framenumbern2": 22, "key2": 22, "value2": 22, "key3": 22, "value3": 22, "numb": 22, "brkbp": 22, "taq": 22, "taqgain": 22, "saq": 22, "saqgain": 22, "testsrc": 22, "durat": [22, 24], "6000": 22, "1800": 22, "2400": 22, "10000": 22, "fakesrc": 22, "sizetyp": 22, "sizemax": 22, "4147200": 22, "4000": 22, "param1": 22, "ul": 23, "aim": 23, "environment": 23, "global": [23, 24], "destin": 23, "narrow": 23, "release_preset": 23, "debug_preset": 23, "async": 23, "max_siz": 23, "10mb": 23, "log_ama_": 23, "pid": 23, "localhost": 23, "facil": 23, "local0": 23, "shortcut": 23, "perf_log": 23, "debug_file_nam": 23, "debug_thread": 23, "debug_pid": 23, "debug_time_stamp": 23, "1gb": 23, "asynchron": 23, "fatal": 23, "trace": 23, "debug_file_lin": 23, "inclus": 23, "accel": 23, "vpi": 23, "gen": 23, "log_ama": 23, "100mb": 23, "want": [23, 24], "wide": [24, 25], "encapsul": 24, "extract": 24, "n4": 24, "scope": [24, 25], "exhaust": [24, 25], "onlin": [24, 25], "org": [24, 25], "html": 24, "howto": 24, "infil": 24, "1000k": 24, "uri": 24, "hz": 24, "transact": [24, 25], "extend": 24, "convers": [24, 25], "roman": 24, "p010le": 24, "packed10": 24, "rgbp": 24, "max_bitr": 24, "5e": 24, "unspecifi": 24, "uint32_max": 24, "restrict": 24, "impos": 24, "control_mod": 24, "treat": 24, "relative_load": 24, "const_qp": 24, "vsync": 24, "prevent": 24, "dynamic_gop": 24, "empti": [24, 25, 26], "wxh": 24, "176x144": 24, "session": 24, "block": 24, "descriptor": 24, "verbos": 24, "perf": 24, "enable_pipelin": 24, "worth": 24, "av": 24, "introductori": 24, "zip": [24, 25], "ma35d_sdk_v1": [24, 25], "0_ffmpeg": 24, "unzip": [24, 25], "ma35_ffmpeg": 24, "fork": 24, "wiki": 24, "libhugetlbf": 24, "nasm": 24, "yasm": 24, "navig": 24, "alsa": 24, "libxcb": 24, "xfix": 24, "shape": 24, "xlib": 24, "libmfx": 24, "vaapi": 24, "vulkan": 24, "prefix": 24, "pwd": 24, "strip": 24, "vpe": 24, "libxrm": 24, "lib": [24, 25, 26], "lvpi": 24, "lcommon": 24, "lg2dec": 24, "lh2enc": 24, "lcach": 24, "lgal": 24, "lvsc": 24, "larchmodelsw": 24, "lnnarchperf": 24, "lxav1sdk": 24, "llog_ama": 24, "lxrm_interfac": 24, "lroi_scal": 24, "lhugetlbf": 24, "lpthread": 24, "lstdc": 24, "lm": 24, "ldl": 24, "lrt": 24, "cflag": 24, "usr": 24, "ldflag": 24, "wl": 24, "rpath": 24, "libavutil": 24, "libavfilt": 24, "libavcodec": 24, "libavformat": 24, "libavdevic": 24, "libswscal": 24, "libswresampl": 24, "permiss": 24, "chmod": 24, "755": 24, "exec": 24, "libx264": 24, "gnu": 24, "workflow": 25, "serv": 25, "editor": 25, "broadcast": 25, "freedesktop": 25, "ama_h265dec": 25, "ama_hevcdec": 25, "obu": 25, "One": 25, "nv12_4l4": 25, "nv12_10le_4l4": 25, "i420_10l": 25, "i420_10b": 25, "argb": 25, "abgr": 25, "rgba": 25, "bgra": 25, "rgb": 25, "bgr": 25, "boolean": 25, "fals": 25, "nv12_10le32": 25, "consecut": 25, "enum": 25, "true": 25, "distanc": 25, "interv": 25, "analyz": 25, "account": 25, "35000000000": 25, "temporal": 25, "vma": 25, "resiz": 25, "area": 25, "downstream": 25, "unnecessari": 25, "upstream": 25, "larg": 25, "insuffici": 25, "regardless": 25, "0_gstreamer": 25, "ma35_gstream": 25, "prerequisit": 25, "ninja": 25, "flex": 25, "bison": 25, "python3": 25, "pip": 25, "pkg": 25, "libjansson": 25, "uuid": 25, "snap": 25, "cmake": 25, "classic": 25, "pip3": 25, "meson": 25, "git": 25, "clone": 25, "cd": 25, "checkout": 25, "f6e672f27fcac06af58d7ac995551893d36944c": 25, "cp": 25, "ama_gstream": 25, "ln": 25, "subproject": 25, "c_include_path": 25, "library_path": 25, "isol": 26, "sr": 26, "iov": 26, "technologi": 26, "checker": 26, "qemu": 26, "libvirt": 26, "bridg": 26, "virt": 26, "lscpu": 26, "doesn": 26, "sbin": 26, "dbdf": 26, "corpor": 26, "5070": 26, "lsmod": 26, "831488": 26, "otherwis": 26, "sriov_numvf": 26, "5071": 26, "creation": 26, "snippet": 26, "libvirtd": 26, "systemd": 26, "wed": 26, "06": 26, "07": 26, "09": 26, "19": 26, "pdt": 26, "7h": 26, "ago": 26, "focal": 26, "fossa": 26, "instanti": 26, "12288": 26, "vcpu": 26, "q35": 26, "qcow2": 26, "variant": 26, "ubuntu20": 26, "pty": 26, "target_typ": 26, "serial": 26, "arg": 26, "ttys0": 26, "casper": 26, "initrd": 26, "apic": 26, "ioapic": 26, "intremap": 26, "eim": 26, "caching_mod": 26, "memoryback": 26, "hugepag": 26, "nosharepag": 26, "lock": 26, "hostdev": 26, "xx": 26, "vfio": 26, "storag": 26, "virsh": 26, "edit": 26, "kib": 26, "acpi": 26, "vmport": 26, "rng": 26, "ssh": 26, "connect": 26, "openssh": 26, "address": 26, "net": 26, "dhcp": 26, "leas": 26, "attach": 26, "6gb": 26, "3072": 26, "3168": 26, "gcc": 26, "toolchain": 26, "essenti": 26}, "objects": {"": [[0, 0, 1, "c.XmaDataBuffer", "XmaDataBuffer"], [0, 0, 1, "c.XmaDecoderProperties", "XmaDecoderProperties"], [0, 0, 1, "c.XmaEncoderProperties", "XmaEncoderProperties"], [0, 0, 1, "c.XmaFilterPortProperties", "XmaFilterPortProperties"], [0, 0, 1, "c.XmaFilterProperties", "XmaFilterProperties"], [0, 0, 1, "c.XmaFrame", "XmaFrame"], [0, 0, 1, "c.XmaFrameProperties", "XmaFrameProperties"], [0, 0, 1, "c.XmaParameter", "XmaParameter"], [0, 0, 1, "c.XmaScalerInOutProperties", "XmaScalerInOutProperties"], [0, 0, 1, "c.XmaScalerProperties", "XmaScalerProperties"], [0, 1, 1, "c.xma_data_buffer_alloc", "xma_data_buffer_alloc"], [0, 1, 1, "c.xma_data_buffer_free", "xma_data_buffer_free"], [0, 1, 1, "c.xma_data_from_buffer_clone", "xma_data_from_buffer_clone"], [0, 1, 1, "c.xma_dec_session_create", "xma_dec_session_create"], [0, 1, 1, "c.xma_dec_session_destroy", "xma_dec_session_destroy"], [0, 1, 1, "c.xma_dec_session_get_properties", "xma_dec_session_get_properties"], [0, 1, 1, "c.xma_dec_session_recv_frame", "xma_dec_session_recv_frame"], [0, 1, 1, "c.xma_dec_session_send_data", "xma_dec_session_send_data"], [0, 1, 1, "c.xma_dec_session_set_log", "xma_dec_session_set_log"], [0, 1, 1, "c.xma_enc_session_create", "xma_enc_session_create"], [0, 1, 1, "c.xma_enc_session_destroy", "xma_enc_session_destroy"], [0, 1, 1, "c.xma_enc_session_recv_data", "xma_enc_session_recv_data"], [0, 1, 1, "c.xma_enc_session_send_frame", "xma_enc_session_send_frame"], [0, 1, 1, "c.xma_enc_session_set_log", "xma_enc_session_set_log"], [0, 1, 1, "c.xma_filter_session_create", "xma_filter_session_create"], [0, 1, 1, "c.xma_filter_session_destroy", "xma_filter_session_destroy"], [0, 1, 1, "c.xma_filter_session_recv_frame", "xma_filter_session_recv_frame"], [0, 1, 1, "c.xma_filter_session_send_frame", "xma_filter_session_send_frame"], [0, 1, 1, "c.xma_filter_session_set_log", "xma_filter_session_set_log"], [0, 1, 1, "c.xma_frame_alloc", "xma_frame_alloc"], [0, 1, 1, "c.xma_frame_clone", "xma_frame_clone"], [0, 1, 1, "c.xma_frame_dec_ref", "xma_frame_dec_ref"], [0, 1, 1, "c.xma_frame_free", "xma_frame_free"], [0, 1, 1, "c.xma_frame_from_buffers_clone", "xma_frame_from_buffers_clone"], [0, 1, 1, "c.xma_frame_get_plane_height", "xma_frame_get_plane_height"], [0, 1, 1, "c.xma_frame_get_plane_size", "xma_frame_get_plane_size"], [0, 1, 1, "c.xma_frame_get_plane_stride", "xma_frame_get_plane_stride"], [0, 1, 1, "c.xma_frame_inc_ref", "xma_frame_inc_ref"], [0, 1, 1, "c.xma_frame_planes_get", "xma_frame_planes_get"], [0, 1, 1, "c.xma_initialize", "xma_initialize"], [0, 1, 1, "c.xma_log_init", "xma_log_init"], [0, 1, 1, "c.xma_log_release", "xma_log_release"], [0, 1, 1, "c.xma_logmsg", "xma_logmsg"], [0, 1, 1, "c.xma_release", "xma_release"], [0, 1, 1, "c.xma_scaler_session_create", "xma_scaler_session_create"], [0, 1, 1, "c.xma_scaler_session_destroy", "xma_scaler_session_destroy"], [0, 1, 1, "c.xma_scaler_session_recv_frame_list", "xma_scaler_session_recv_frame_list"], [0, 1, 1, "c.xma_scaler_session_send_frame", "xma_scaler_session_send_frame"], [0, 1, 1, "c.xrm_dec_release", "xrm_dec_release"], [0, 1, 1, "c.xrm_dec_reserve", "xrm_dec_reserve"], [0, 1, 1, "c.xrm_enc_release", "xrm_enc_release"], [0, 1, 1, "c.xrm_enc_reserve", "xrm_enc_reserve"], [0, 1, 1, "c.xrm_scale_release", "xrm_scale_release"], [0, 1, 1, "c.xrm_scale_reserve", "xrm_scale_reserve"], [9, 3, 1, "cmdoption-codectype", "--codectype"], [9, 3, 1, "cmdoption-devidx", "--devidx"], [9, 3, 1, "cmdoption-file", "--file"], [9, 3, 1, "cmdoption-forcekeyframe", "--forcekeyframe"], [9, 3, 1, "cmdoption-json", "--json"], [24, 3, 1, "cmdoption-b-v", "-b:v"], [24, 3, 1, "cmdoption-bf", "-bf"], [9, 3, 1, "cmdoption-c", "-c"], [24, 3, 1, "cmdoption-c-v", "-c:v"], [24, 3, 1, "cmdoption-control_rate", "-control_rate"], [24, 3, 1, "cmdoption-crf", "-crf"], [24, 3, 1, "cmdoption-dynamic_gop", "-dynamic_gop"], [24, 3, 1, "cmdoption-dynamic_params_file", "-dynamic_params_file"], [24, 3, 1, "cmdoption-enable_pipeline", "-enable_pipeline"], [9, 3, 1, "cmdoption-f", "-f"], [24, 3, 1, "cmdoption-filter_complex", "-filter_complex"], [24, 3, 1, "cmdoption-forced_idr", "-forced_idr"], [24, 3, 1, "cmdoption-g", "-g"], [24, 3, 1, "cmdoption-hwaccel", "-hwaccel"], [9, 3, 1, "cmdoption-i", "-i"], [9, 3, 1, "cmdoption-j", "-j"], [9, 3, 1, "cmdoption-k", "-k"], [24, 3, 1, "cmdoption-latency_logging", "-latency_logging"], [24, 3, 1, "cmdoption-level", "-level"], [24, 3, 1, "cmdoption-log_level", "-log_level"], [24, 3, 1, "cmdoption-lookahead_depth", "-lookahead_depth"], [24, 3, 1, "cmdoption-low_latency", "-low_latency"], [24, 3, 1, "cmdoption-max_bitrate", "-max_bitrate"], [24, 3, 1, "cmdoption-max_qp", "-max_qp"], [24, 3, 1, "cmdoption-min_qp", "-min_qp"], [24, 3, 1, "cmdoption-out_fmt", "-out_fmt"], [24, 3, 1, "cmdoption-out_res", "-out_res"], [24, 3, 1, "cmdoption-outputs", "-outputs"], [24, 3, 1, "cmdoption-perf", "-perf"], [24, 3, 1, "cmdoption-preset", "-preset"], [24, 3, 1, "cmdoption-profile", "-profile"], [24, 3, 1, "cmdoption-qp", "-qp"], [24, 3, 1, "cmdoption-qp_mode", "-qp_mode"], [24, 3, 1, "cmdoption-r", "-r"], [24, 3, 1, "cmdoption-s", "-s"], [24, 3, 1, "cmdoption-slice", "-slice"], [24, 3, 1, "cmdoption-spatial_aq", "-spatial_aq"], [24, 3, 1, "cmdoption-spatial_aq_gain", "-spatial_aq_gain"], [24, 3, 1, "cmdoption-temporal_aq", "-temporal_aq"], [24, 3, 1, "cmdoption-temporal_aq_gain", "-temporal_aq_gain"], [24, 3, 1, "cmdoption-tier", "-tier"], [24, 3, 1, "cmdoption-tune_metrics", "-tune_metrics"], [24, 3, 1, "cmdoption-type", "-type"], [24, 3, 1, "cmdoption-vf", "-vf"], [24, 3, 1, "cmdoption-vsync", "-vsync"], [25, 3, 1, "cmdoption-arg-b-frames", "b-frames"], [25, 3, 1, "cmdoption-arg-bitrate", "bitrate"], [25, 3, 1, "cmdoption-arg-crf", "crf"], [25, 3, 1, "cmdoption-arg-crop", "crop"], [25, 3, 1, "cmdoption-arg-crop-height", "crop-height"], [25, 3, 1, "cmdoption-arg-crop-left", "crop-left"], [25, 3, 1, "cmdoption-arg-crop-top", "crop-top"], [25, 3, 1, "cmdoption-arg-crop-width", "crop-width"], [25, 3, 1, "cmdoption-arg-device", "device"], [25, 3, 1, "cmdoption-arg-device-type", "device-type"], [25, 3, 1, "cmdoption-arg-encoding-params-file", "encoding-params-file"], [25, 3, 1, "cmdoption-arg-forced-idr", "forced-idr"], [25, 3, 1, "cmdoption-arg-gop-length", "gop-length"], [25, 3, 1, "cmdoption-arg-idr-interval", "idr-interval"], [25, 3, 1, "cmdoption-arg-lookahead-depth", "lookahead-depth"], [25, 3, 1, "cmdoption-arg-low-latency", "low-latency"], [25, 3, 1, "cmdoption-arg-max-bitrate", "max-bitrate"], [25, 3, 1, "cmdoption-arg-max-qp", "max-qp"], [25, 3, 1, "cmdoption-arg-min-qp", "min-qp"], [25, 3, 1, "cmdoption-arg-preset", "preset"], [25, 3, 1, "cmdoption-arg-qp", "qp"], [25, 3, 1, "cmdoption-arg-qp-mode", "qp-mode"], [25, 3, 1, "cmdoption-arg-rate-control", "rate-control"], [24, 3, 1, "cmdoption-arg-scaler_ama", "scaler_ama"], [25, 3, 1, "cmdoption-arg-slice", "slice"], [25, 3, 1, "cmdoption-arg-spatial-aq", "spatial-aq"], [25, 3, 1, "cmdoption-arg-spatial-aq-gain", "spatial-aq-gain"], [25, 3, 1, "cmdoption-arg-temporal-aq-gain", "temporal-aq-gain"], [25, 3, 1, "cmdoption-arg-temporall-aq", "temporall-aq"], [25, 3, 1, "cmdoption-arg-tier", "tier"], [25, 3, 1, "cmdoption-arg-tune-metrics", "tune-metrics"]], "xma_data_buffer_alloc": [[0, 2, 1, "c.xma_data_buffer_alloc", "dummy"], [0, 2, 1, "c.xma_data_buffer_alloc", "handle"], [0, 2, 1, "c.xma_data_buffer_alloc", "size"]], "xma_data_buffer_free": [[0, 2, 1, "c.xma_data_buffer_free", "data"]], "xma_data_from_buffer_clone": [[0, 2, 1, "c.xma_data_from_buffer_clone", "data"], [0, 2, 1, "c.xma_data_from_buffer_clone", "free_callback"], [0, 2, 1, "c.xma_data_from_buffer_clone", "handle"], [0, 2, 1, "c.xma_data_from_buffer_clone", "opaque"], [0, 2, 1, "c.xma_data_from_buffer_clone", "size"]], "xma_dec_session_create": [[0, 2, 1, "c.xma_dec_session_create", "dec_props"]], "xma_dec_session_destroy": [[0, 2, 1, "c.xma_dec_session_destroy", "session"]], "xma_dec_session_get_properties": [[0, 2, 1, "c.xma_dec_session_get_properties", "dec_session"], [0, 2, 1, "c.xma_dec_session_get_properties", "fprops"]], "xma_dec_session_recv_frame": [[0, 2, 1, "c.xma_dec_session_recv_frame", "frame"], [0, 2, 1, "c.xma_dec_session_recv_frame", "session"]], "xma_dec_session_send_data": [[0, 2, 1, "c.xma_dec_session_send_data", "data"], [0, 2, 1, "c.xma_dec_session_send_data", "data_used"], [0, 2, 1, "c.xma_dec_session_send_data", "session"]], "xma_dec_session_set_log": [[0, 2, 1, "c.xma_dec_session_set_log", "handle"], [0, 2, 1, "c.xma_dec_session_set_log", "session"]], "xma_enc_session_create": [[0, 2, 1, "c.xma_enc_session_create", "enc_props"]], "xma_enc_session_destroy": [[0, 2, 1, "c.xma_enc_session_destroy", "session"]], "xma_enc_session_recv_data": [[0, 2, 1, "c.xma_enc_session_recv_data", "data"], [0, 2, 1, "c.xma_enc_session_recv_data", "data_size"], [0, 2, 1, "c.xma_enc_session_recv_data", "session"]], "xma_enc_session_send_frame": [[0, 2, 1, "c.xma_enc_session_send_frame", "frame"], [0, 2, 1, "c.xma_enc_session_send_frame", "session"]], "xma_enc_session_set_log": [[0, 2, 1, "c.xma_enc_session_set_log", "handle"], [0, 2, 1, "c.xma_enc_session_set_log", "session"]], "xma_filter_session_create": [[0, 2, 1, "c.xma_filter_session_create", "props"]], "xma_filter_session_destroy": [[0, 2, 1, "c.xma_filter_session_destroy", "session"]], "xma_filter_session_recv_frame": [[0, 2, 1, "c.xma_filter_session_recv_frame", "frame"], [0, 2, 1, "c.xma_filter_session_recv_frame", "session"]], "xma_filter_session_send_frame": [[0, 2, 1, "c.xma_filter_session_send_frame", "frame"], [0, 2, 1, "c.xma_filter_session_send_frame", "session"]], "xma_filter_session_set_log": [[0, 2, 1, "c.xma_filter_session_set_log", "handle"], [0, 2, 1, "c.xma_filter_session_set_log", "session"]], "xma_frame_alloc": [[0, 2, 1, "c.xma_frame_alloc", "dummy"], [0, 2, 1, "c.xma_frame_alloc", "frame_props"], [0, 2, 1, "c.xma_frame_alloc", "handle"]], "xma_frame_clone": [[0, 2, 1, "c.xma_frame_clone", "handle"], [0, 2, 1, "c.xma_frame_clone", "xma_frame"]], "xma_frame_dec_ref": [[0, 2, 1, "c.xma_frame_dec_ref", "frame"]], "xma_frame_free": [[0, 2, 1, "c.xma_frame_free", "frame"]], "xma_frame_from_buffers_clone": [[0, 2, 1, "c.xma_frame_from_buffers_clone", "frame_data"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "frame_props"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "free_callback"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "handle"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "opaque"]], "xma_frame_get_plane_height": [[0, 2, 1, "c.xma_frame_get_plane_height", "frame_props"], [0, 2, 1, "c.xma_frame_get_plane_height", "handle"], [0, 2, 1, "c.xma_frame_get_plane_height", "plane"]], "xma_frame_get_plane_size": [[0, 2, 1, "c.xma_frame_get_plane_size", "frame_props"], [0, 2, 1, "c.xma_frame_get_plane_size", "handle"], [0, 2, 1, "c.xma_frame_get_plane_size", "plane"]], "xma_frame_get_plane_stride": [[0, 2, 1, "c.xma_frame_get_plane_stride", "frame_props"], [0, 2, 1, "c.xma_frame_get_plane_stride", "handle"], [0, 2, 1, "c.xma_frame_get_plane_stride", "plane"]], "xma_frame_inc_ref": [[0, 2, 1, "c.xma_frame_inc_ref", "frame"]], "xma_frame_planes_get": [[0, 2, 1, "c.xma_frame_planes_get", "frame_props"], [0, 2, 1, "c.xma_frame_planes_get", "handle"]], "xma_initialize": [[0, 2, 1, "c.xma_initialize", "handle"], [0, 2, 1, "c.xma_initialize", "init_params"], [0, 2, 1, "c.xma_initialize", "log"]], "xma_log_init": [[0, 2, 1, "c.xma_log_init", "handle"], [0, 2, 1, "c.xma_log_init", "log_level"], [0, 2, 1, "c.xma_log_init", "log_type"]], "xma_log_release": [[0, 2, 1, "c.xma_log_release", "handle"]], "xma_logmsg": [[0, 2, 1, "c.xma_logmsg", "handle"], [0, 2, 1, "c.xma_logmsg", "level"], [0, 2, 1, "c.xma_logmsg", "msg"], [0, 2, 1, "c.xma_logmsg", "name"]], "xma_release": [[0, 2, 1, "c.xma_release", "handle"]], "xma_scaler_session_create": [[0, 2, 1, "c.xma_scaler_session_create", "props"]], "xma_scaler_session_destroy": [[0, 2, 1, "c.xma_scaler_session_destroy", "session"]], "xma_scaler_session_recv_frame_list": [[0, 2, 1, "c.xma_scaler_session_recv_frame_list", "frame_list"], [0, 2, 1, "c.xma_scaler_session_recv_frame_list", "session"]], "xma_scaler_session_send_frame": [[0, 2, 1, "c.xma_scaler_session_send_frame", "frame"], [0, 2, 1, "c.xma_scaler_session_send_frame", "session"]], "xrm_dec_release": [[0, 2, 1, "c.xrm_dec_release", "xrm_dec_ctx"]], "xrm_dec_reserve": [[0, 2, 1, "c.xrm_dec_reserve", "dev_index"], [0, 2, 1, "c.xrm_dec_reserve", "xrm_dec_ctx"], [0, 2, 1, "c.xrm_dec_reserve", "xrm_props"]], "xrm_enc_release": [[0, 2, 1, "c.xrm_enc_release", "xrm_enc_ctx"]], "xrm_enc_reserve": [[0, 2, 1, "c.xrm_enc_reserve", "dev_index"], [0, 2, 1, "c.xrm_enc_reserve", "is_ull"], [0, 2, 1, "c.xrm_enc_reserve", "is_xav1"], [0, 2, 1, "c.xrm_enc_reserve", "slice_id"], [0, 2, 1, "c.xrm_enc_reserve", "xrm_enc_ctx"], [0, 2, 1, "c.xrm_enc_reserve", "xrm_props"]], "xrm_scale_release": [[0, 2, 1, "c.xrm_scale_release", "scaler_xrm_ctx"]], "xrm_scale_reserve": [[0, 2, 1, "c.xrm_scale_reserve", "dev_index"], [0, 2, 1, "c.xrm_scale_reserve", "input_props"], [0, 2, 1, "c.xrm_scale_reserve", "num_outputs"], [0, 2, 1, "c.xrm_scale_reserve", "output_props"], [0, 2, 1, "c.xrm_scale_reserve", "scaler_xrm_ctx"]]}, "objtypes": {"0": "c:struct", "1": "c:function", "2": "c:functionParam", "3": "std:cmdoption"}, "objnames": {"0": ["c", "struct", "C struct"], "1": ["c", "function", "C function"], "2": ["c", "functionParam", "C function parameter"], "3": ["std", "cmdoption", "program option"]}, "titleterms": {"c": [0, 14], "api": [0, 15], "program": [0, 1, 14], "guid": [0, 14], "tabl": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "content": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], "overview": [0, 1, 18, 20, 25, 26], "gener": [0, 14, 24], "applic": [0, 9, 10, 14, 25], "develop": 0, "resourc": [0, 1, 14], "initi": 0, "alloc": 0, "session": 0, "creation": 0, "runtim": [0, 12], "process": 0, "cleanup": 0, "compil": 0, "link": [0, 13], "amd": [0, 5, 11, 12, 13, 18, 19, 20, 24], "ama": [0, 5, 11, 12, 13, 18, 19, 20, 24], "video": [0, 4, 5, 7, 11, 12, 14, 19, 22, 24], "sdk": [0, 5, 11, 12, 19, 24], "plugin": [0, 14, 25], "common": 0, "xma": [0, 11], "data": [0, 25], "structur": 0, "refer": [0, 14], "log": [0, 23], "interfac": [0, 14], "buffer": 0, "frame": [0, 20], "decod": [0, 6, 8, 11, 21, 24, 25], "properti": 0, "scaler": [0, 11, 19, 24, 25], "encod": [0, 3, 6, 8, 11, 20, 21, 22, 24, 25], "filter": [0, 4, 7, 24], "ultra": [0, 5, 21], "low": [0, 5, 6, 21], "latenc": [0, 5, 21, 22], "consider": [0, 15], "mode": [0, 6, 21], "xrm": [0, 14], "reserv": [0, 14], "card": [1, 12, 19], "manag": [1, 14], "mautil": 1, "maflash": 1, "mamgmt": 1, "xrmadm": 1, "xrmd": [1, 6], "devic": [1, 14, 25], "identifi": 1, "dbdf": 1, "bu": 1, "id": [1, 14], "firmwar": [1, 12], "version": [1, 18], "number": [1, 19], "check": [1, 12, 14], "system": [1, 9, 10, 14], "statu": [1, 14], "configur": [1, 17, 21], "util": 1, "tutori": [2, 3, 6, 8], "exampl": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 23, 24, 25], "amf": 3, "ffmpeg": [4, 6, 14, 15, 21, 24], "us": [4, 7, 14, 24, 25], "softwar": [4, 7, 14, 15], "environ": [4, 5, 6, 7, 8, 11, 12], "setup": [4, 5, 6, 7, 8, 11, 12, 14], "rotat": [4, 7], "logo": [4, 7], "overlai": [4, 7], "crop": [4, 7], "shift": 4, "composit": [4, 7], "chroma": 4, "subsampl": 4, "qualiti": [5, 6, 19, 22], "introduct": [5, 9, 10, 14, 24, 25], "optim": 5, "set": [5, 12], "tune": [5, 21, 22], "paramet": [5, 22, 25], "av1": [5, 20, 22], "vmaf": 5, "normal": 5, "medium": 5, "preset": [5, 22], "avc": 5, "slow": [5, 20], "run": [5, 12], "psnr": 5, "ssim": 5, "score": 5, "simpl": [6, 8], "onli": [6, 8], "constant": 6, "rate": [6, 20], "factor": 6, "crf": 6, "high": 6, "basic": 6, "transcod": [6, 8, 11, 14, 19], "Into": 6, "multipl": [6, 8, 25], "resolut": [6, 8], "output": [6, 8, 25], "ull": [6, 21], "doubl": 6, "densiti": [6, 20], "without": 6, "gstreamer": [7, 8, 9, 10, 15, 20, 25], "zoom": 7, "introductori": 8, "abr": [9, 19], "ladder": [9, 19], "host": [9, 10, 26], "requir": [9, 10, 14, 18], "usag": [9, 10, 11, 20], "compositor": 10, "app": 11, "test": 11, "instruct": 11, "sampl": 11, "command": [11, 14, 24], "get": 12, "start": 12, "premis": 12, "chassi": 12, "instal": 12, "verif": 12, "flash": 12, "up": [12, 25], "your": 12, "first": 12, "advanc": [13, 18, 20], "media": [13, 18, 20], "acceler": [13, 14, 18, 20], "quick": 13, "comput": 14, "assign": 14, "job": [14, 19], "specif": 14, "explicit": 14, "manual": 14, "load": [14, 25], "insuffici": 14, "autom": 14, "descript": [14, 17], "The": [14, 19], "slot": 14, "tool": 14, "singl": 14, "per": [14, 19], "launch": 14, "launcher": 14, "line": 14, "report": 14, "unload": 14, "migrat": 15, "chang": 15, "from": [15, 18], "alveo": 15, "u30": 15, "distribut": [17, 18], "packag": 17, "feed": 17, "ubuntu": 17, "releas": 18, "note": 18, "featur": [18, 19], "thi": 18, "support": 18, "kernel": 18, "known": 18, "limit": 18, "issu": [18, 20], "upgrad": 18, "previou": 18, "spec": 19, "ma35d": 19, "codec": [19, 20], "unit": 19, "adapt": 19, "bitrat": 19, "perform": 19, "8": 19, "bit": [19, 20], "color": 19, "real": 19, "time": 19, "scale": [19, 24], "10": 19, "troubleshoot": 20, "memori": 20, "playback": 20, "mp4": 20, "30": 20, "fp": 20, "variabl": 20, "400": 20, "mbp": 20, "max": 20, "mani": 20, "parallel": 20, "hdr": 20, "spatialaqgain": 20, "vm": [20, 26], "guidelin": 21, "automat": 21, "look": 21, "ahead": 21, "depth": 21, "calcul": 21, "measur": 21, "metric": 22, "type": 22, "select": 22, "dynam": 22, "unifi": 23, "log_ama_config": 23, "log_ama_filt": 23, "option": 24, "multiscal": 24, "rebuild": [24, 25], "input": 25, "pipelin": 25, "hardwar": 25, "down": 25, "dma": 25, "move": 25, "through": 25, "work": 25, "virtual": 26, "linux": 26, "kvm": 26, "guest": 26}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"C API Programming Guide": [[0, "c-api-programming-guide"]], "Table of Contents": [[0, "table-of-contents"], [1, "table-of-contents"], [4, "table-of-contents"], [5, "table-of-contents"], [6, "table-of-contents"], [7, "table-of-contents"], [8, "table-of-contents"], [9, "table-of-contents"], [10, "table-of-contents"], [11, "table-of-contents"], [12, "table-of-contents"], [14, "table-of-contents"], [15, "table-of-contents"], [17, "table-of-contents"], [18, "table-of-contents"], [19, "table-of-contents"], [20, "table-of-contents"], [21, "table-of-contents"], [22, "table-of-contents"], [23, "table-of-contents"], [24, "table-of-contents"], [25, "table-of-contents"], [26, "table-of-contents"]], "Overview": [[0, "overview"], [1, "overview"], [18, "overview"], [20, "overview"], [26, "overview"]], "General Application Development Guide": [[0, "general-application-development-guide"]], "Resource Initialization and Allocation": [[0, "resource-initialization-and-allocation"]], "Session Creation": [[0, "session-creation"]], "Runtime Processing": [[0, "runtime-processing"]], "Cleanup": [[0, "cleanup"]], "Compiling and Linking with the AMD AMA Video SDK Plugins": [[0, "compiling-and-linking-with-the-sdk-plugins"]], "Common XMA Data Structures": [[0, "common-xma-data-structures"]], "Common XMA Data Reference": [[0, "common-xma-data-reference"]], "XMA Log Interface": [[0, "xma-log-interface"]], "XMA Session Interface": [[0, "xma-session-interface"]], "XMA Data Buffer Interface": [[0, "xma-data-buffer-interface"]], "XMA Frame Interface": [[0, "xma-frame-interface"]], "Decoder Plugin Reference": [[0, "decoder-plugin-reference"]], "Decoder Interface": [[0, "decoder-interface"]], "Decoder Properties": [[0, "decoder-properties"]], "Scaler Plugin Reference": [[0, "scaler-plugin-reference"]], "Scaler Interface": [[0, "scaler-interface"]], "Scaler Properties": [[0, "scaler-properties"]], "Encoder Plugin Reference": [[0, "encoder-plugin-reference"]], "Encoder Interface": [[0, "encoder-interface"]], "Encoder Properties": [[0, "encoder-properties"]], "Filter Plugin Reference": [[0, "filter-plugin-reference"]], "Filter Interface": [[0, "filter-interface"]], "Filter Properties": [[0, "filter-properties"]], "Ultra Low Latency Considerations": [[0, "ultra-low-latency-considerations"]], "Decoder Low Latency Mode": [[0, "decoder-low-latency-mode"]], "Encoder Ultra Low Latency Mode": [[0, "encoder-ultra-low-latency-mode"]], "XRM API Reference": [[0, "xrm-api-reference"]], "Decoder Resource Reservation with XRM": [[0, "decoder-resource-reservation-with-xrm"]], "Encoder Resource Reservation with XRM": [[0, "encoder-resource-reservation-with-xrm"]], "Scaler Resource Reservation with XRM": [[0, "scaler-resource-reservation-with-xrm"]], "Card Management": [[1, "card-management"]], "mautil, maflash and mamgmt": [[1, "mautil-maflash-and-mamgmt"]], "xrmadm and xrmd": [[1, "xrmadm-and-xrmd"]], "Card and Device Identifiers": [[1, "card-and-device-identifiers"]], "Device DBDF (mautil)": [[1, "device-dbdf-mautil"]], "Device DBDF (mamgmt)": [[1, "device-dbdf-mamgmt"]], "Bus ID": [[1, "bus-id"]], "Firmware Version Number": [[1, "firmware-version-number"]], "Checking System Status - mautil": [[1, "checking-system-status-mautil"]], "Checking Device Status": [[1, "checking-device-status"]], "Checking Device Configuration - mamgmt": [[1, "checking-device-configuration-mamgmt"]], "Programming a Device - maflash": [[1, "programming-a-device-maflash"]], "Checking Resource Utilization": [[1, "checking-resource-utilization"]], "Tutorials and Examples": [[2, "tutorials-and-examples"]], "AMF Encoder Tutorial": [[3, "amf-encoder-tutorial"]], "FFmpeg Examples using Software Filters": [[4, "ffmpeg-examples-using-software-filters"]], "Environment Setup": [[4, "environment-setup"], [5, "environment-setup"], [6, "environment-setup"], [7, "environment-setup"], [8, "environment-setup"], [11, "environment-setup"]], "Video Rotation": [[4, "video-rotation"], [7, "video-rotation"]], "Logo Overlay": [[4, "logo-overlay"], [7, "logo-overlay"]], "Crop and Shift": [[4, "crop-and-shift"]], "Video Composition": [[4, "video-composition"], [7, "video-composition"]], "Chroma Subsampling": [[4, "chroma-subsampling"]], "Video Quality Examples": [[5, "video-quality-examples"]], "Introduction to Video Quality": [[5, "introduction-to-video-quality"]], "Optimized Settings for the AMD AMA Video SDK": [[5, "optimized-settings-for-the-sdk"]], "Video Tuning Parameters": [[5, "id1"]], "AV1 VMAF - Normal Latency - Medium Preset": [[5, "av1-vmaf-normal-latency-medium-preset"]], "AVC VMAF - Normal Latency - Slow Preset": [[5, "avc-vmaf-normal-latency-slow-preset"]], "AV1 VMAF - Ultra Low Latency - Medium Preset": [[5, "av1-vmaf-ultra-low-latency-medium-preset"]], "AVC VMAF - Ultra Low Latency - Slow Preset": [[5, "avc-vmaf-ultra-low-latency-slow-preset"]], "Running PSNR/SSIM/VMAF Scores": [[5, "running-psnr-ssim-vmaf-scores"]], "FFmpeg Tutorials": [[6, "ffmpeg-tutorials"]], "Simple FFmpeg Examples": [[6, "simple-ffmpeg-examples"]], "Decode Only": [[6, "decode-only"]], "Encode Only": [[6, "encode-only"]], "Constant Rate Factor (CRF) Mode": [[6, "constant-rate-factor-crf-mode"]], "High Quality Encoding": [[6, "high-quality-encoding"]], "Low Quality Encoding": [[6, "low-quality-encoding"]], "Basic Transcode": [[6, "basic-transcode"]], "Decode Only Into Multiple-Resolution Outputs": [[6, "decode-only-into-multiple-resolution-outputs"]], "Encode Only Into Multiple-Resolution Outputs": [[6, "encode-only-into-multiple-resolution-outputs"]], "Transcode with Multiple-Resolution Outputs": [[6, "transcode-with-multiple-resolution-outputs"]], "Transcode in ULL Mode": [[6, "transcode-in-ull-mode"]], "Double Density Example with xrmd": [[6, "double-density-example-with-xrmd"]], "Double Density Example without xrmd": [[6, "double-density-example-without-xrmd"]], "GStreamer Examples using Software Filters": [[7, "gstreamer-examples-using-software-filters"]], "Crop and Zoom": [[7, "crop-and-zoom"]], "GStreamer Introductory Tutorials": [[8, "gstreamer-introductory-tutorials"]], "Simple GStreamer Examples": [[8, "simple-gstreamer-examples"]], "Decode only": [[8, "decode-only"]], "Encode only": [[8, "encode-only"]], "Transcode with Multiple-Resolution outputs": [[8, "transcode-with-multiple-resolution-outputs"]], "GStreamer ABR Ladder Application": [[9, "gstreamer-abr-ladder-application"]], "Introduction": [[9, "introduction"], [10, "introduction"], [14, "introduction"], [24, "introduction"], [25, "introduction"]], "Host System Requirement": [[9, "host-system-requirement"], [10, "host-system-requirement"]], "Usage": [[9, "usage"], [10, "usage"]], "Examples": [[9, "examples"], [10, "examples"], [23, "examples"]], "GStreamer Compositor Application": [[10, "gstreamer-compositor-application"]], "XMA Examples for the AMD AMA Video SDK": [[11, "xma-examples-for-the-sdk"]], "XMA Decoder App": [[11, "xma-decoder-app"]], "Decoder Test Instructions": [[11, "decoder-test-instructions"]], "Decoder Usage": [[11, "decoder-usage"]], "Sample Decoder Command": [[11, "sample-decoder-command"]], "XMA Encoder App": [[11, "xma-encoder-app"]], "Encoder Test Instructions": [[11, "encoder-test-instructions"]], "Encoder Usage": [[11, "encoder-usage"]], "Sample Encoder Commands": [[11, "sample-encoder-commands"]], "XMA Scaler App": [[11, "xma-scaler-app"]], "Scaler Test Instructions": [[11, "scaler-test-instructions"]], "Scaler Usage": [[11, "scaler-usage"]], "Sample Scaler Command": [[11, "sample-scaler-command"]], "XMA Transcoder App": [[11, "xma-transcoder-app"]], "Transcoder Test Instructions": [[11, "transcoder-test-instructions"]], "Transcoder Usage": [[11, "transcoder-usage"]], "Sample Transcoder Commands": [[11, "sample-transcoder-commands"]], "Getting Started with AMD AMA Video SDK Cards on Premises": [[12, "getting-started-with-sdk-cards-on-premises"]], "Chassis Setup": [[12, "chassis-setup"]], "Check Cards": [[12, "check-cards"]], "Install the AMD AMA Video SDK": [[12, "install-the-sdk"]], "Installation Verification": [[12, "installation-verification"]], "Flash Firmware": [[12, "flash-firmware"]], "Set Up the Runtime Environment": [[12, "set-up-the-runtime-environment"]], "Run Your First Examples": [[12, "run-your-first-examples"]], "AMD Advanced Media Acceleration (AMA)": [[13, "amd-advanced-media-acceleration-ama"]], "Quick Links": [[13, "quick-links"]], "Managing Video Acceleration Compute Resources": [[14, "managing-video-acceleration-compute-resources"]], "Assigning Jobs to Specific Devices": [[14, "assigning-jobs-to-specific-devices"]], "Examples using Explicit Device IDs": [[14, "examples-using-explicit-device-ids"]], "Manual Resource Management": [[14, "manual-resource-management"]], "Checking System Load": [[14, "checking-system-load"]], "Insufficient Resources": [[14, "insufficient-resources"]], "Job Resource Requirements": [[14, "job-resource-requirements"]], "Automated Resource Management": [[14, "automated-resource-management"]], "Video Transcode Job Descriptions": [[14, "video-transcode-job-descriptions"]], "The Job Slot Reservation Tool": [[14, "the-job-slot-reservation-tool"]], "Example requiring a single device per job": [[14, "example-requiring-a-single-device-per-job"]], "Automated Job Launching": [[14, "automated-job-launching"]], "The FFmpeg Launcher Example": [[14, "the-ffmpeg-launcher-example"]], "XRM Reference Guide": [[14, "xrm-reference-guide"]], "Command Line Interface": [[14, "command-line-interface"]], "Setup": [[14, "setup"]], "Generating Status Reports": [[14, "generating-status-reports"]], "Loading/Unloading Software Plugins": [[14, "loading-unloading-software-plugins"]], "C Application Programming Interface": [[14, "c-application-programming-interface"]], "Software Migration Considerations": [[15, "software-migration-considerations"]], "API Changes from Alveo U30": [[15, "api-changes-from-alveo-u30"]], "FFmpeg API Changes": [[15, "ffmpeg-api-changes"]], "Gstreamer API Changes": [[15, "gstreamer-api-changes"]], "Distribution Package Feed": [[17, "distribution-package-feed"]], "Package Descriptions": [[17, "package-descriptions"]], "Configuring the Package Feed": [[17, "configuring-the-package-feed"]], "Ubuntu": [[17, "ubuntu"]], "AMD Advanced Media Acceleration (AMA) Release Notes": [[18, "amd-advanced-media-acceleration-ama-release-notes"]], "Release Requirements": [[18, "release-requirements"]], "Features in This Release": [[18, "features-in-this-release"]], "Supported Kernels and Distributions": [[18, "supported-kernels-and-distributions"]], "Known Limitations": [[18, "known-limitations"]], "Known Issues": [[18, "known-issues"]], "Upgrading from Previous Versions": [[18, "upgrading-from-previous-versions"]], "Specs and Features of the AMD AMA Video SDK": [[19, "specs-and-features-of-the-sdk"]], "The AMD AMA Video SDK": [[19, "the-sdk"]], "The AMD MA35D Card": [[19, "the-amd-ma35d-card"]], "Video Codec Unit": [[19, "video-codec-unit"]], "Adaptive Bitrate Scaler": [[19, "adaptive-bitrate-scaler"]], "Video Quality": [[19, "video-quality"]], "Performance Tables": [[19, "performance-tables"]], "Performance Tables for 8-bit Color": [[19, "performance-tables-for-8-bit-color"]], "Number of Real-Time Transcode Jobs per Card (8-bit)": [[19, "id3"]], "Number of Real-Time Transcode with Scale Jobs per Card (8-bit)": [[19, "id4"]], "Number of Real-Time ABR Ladders (8-bit)": [[19, "id5"]], "Performance Tables for 10-bit Color": [[19, "performance-tables-for-10-bit-color"]], "Number of Real-Time Transcode Jobs per Card (10-bit)": [[19, "id6"]], "Number of Real-Time Transcode with Scale Jobs per Card (10-bit)": [[19, "id7"]], "Number of Real-Time ABR Ladders (10-bit)": [[19, "id8"]], "AMD Advanced Media Acceleration (AMA) Troubleshooting": [[20, "amd-advanced-media-acceleration-ama-troubleshooting"]], "Memory Usage": [[20, "memory-usage"]], "AV1 Slow Playback": [[20, "av1-slow-playback"]], "AV1 MP4 Playback": [[20, "av1-mp4-playback"]], "30 FPS Density": [[20, "fps-density"]], "Gstreamer Variable Frame Rate": [[20, "gstreamer-variable-frame-rate"]], "400 Mbps Max Bit Rate": [[20, "mbps-max-bit-rate"]], "Many Parallel Encodes": [[20, "many-parallel-encodes"]], "HDR & spatialAqGain": [[20, "hdr-spatialaqgain"]], "Codec Issues in VM": [[20, "codec-issues-in-vm"]], "Tuning Latency": [[21, "tuning-latency"]], "Decoder Latency": [[21, "decoder-latency"]], "Encoder Latency": [[21, "encoder-latency"]], "Guidelines on Encoder Latency Configuration": [[21, "guidelines-on-encoder-latency-configuration"]], "Automatic Look Ahead Depth Calculation": [[21, "automatic-look-ahead-depth-calculation"]], "Ultra Low Latency (ULL) Mode": [[21, "ultra-low-latency-ull-mode"]], "FFmpeg Latency Measurements": [[21, "ffmpeg-latency-measurements"]], "Tuning Video Quality": [[22, "tuning-video-quality"]], "Metrics": [[22, "metrics"]], "Latency": [[22, "latency"]], "Preset": [[22, "preset"]], "AV1 Type Selection": [[22, "av1-type-selection"]], "Dynamic Encoder Parameters": [[22, "dynamic-encoder-parameters"]], "Unified Logging": [[23, "unified-logging"]], "LOG_AMA_CONFIG": [[23, "log-ama-config"]], "LOG_AMA_FILTER": [[23, "log-ama-filter"]], "Using FFmpeg": [[24, "using-ffmpeg"]], "Example Commands": [[24, "example-commands"]], "General FFmpeg Options": [[24, "general-ffmpeg-options"]], "Video Decoding": [[24, "video-decoding"]], "Video Encoding": [[24, "video-encoding"]], "Video Scaling": [[24, "video-scaling"]], "Multiscale Filter Options": [[24, "id1"]], "Using the AMD AMA Video SDK Scaler Filter": [[24, "using-the-sdk-scaler-filter"]], "Rebuilding FFmpeg": [[24, "rebuilding-ffmpeg"]], "Using GStreamer": [[25, "using-gstreamer"]], "Overview of the GStreamer Plugins": [[25, "overview-of-the-gstreamer-plugins"]], "Decoder Plugin": [[25, "decoder-plugin"]], "Decoder Inputs and Outputs": [[25, "decoder-inputs-and-outputs"]], "Decoder Parameters": [[25, "decoder-parameters"]], "Decoder Example Pipelines": [[25, "decoder-example-pipelines"]], "Encoder Plugin": [[25, "encoder-plugin"]], "Encoder Inputs and Outputs": [[25, "encoder-inputs-and-outputs"]], "Encoder Parameters": [[25, "encoder-parameters"]], "Encoder Example Pipelines": [[25, "encoder-example-pipelines"]], "Scaler Plugin": [[25, "scaler-plugin"]], "Scaler Inputs and Outputs": [[25, "scaler-inputs-and-outputs"]], "Scaler Parameters": [[25, "scaler-parameters"]], "Scaler Example Pipelines": [[25, "scaler-example-pipelines"]], "Hardware Down and Up Loads": [[25, "hardware-down-and-up-loads"]], "Inputs and Outputs": [[25, "inputs-and-outputs"]], "DMA Parameters": [[25, "dma-parameters"]], "Moving Data through the Pipeline": [[25, "moving-data-through-the-pipeline"]], "Working with Multiple Devices": [[25, "working-with-multiple-devices"]], "Rebuilding GStreamer and Application Examples": [[25, "rebuilding-gstreamer-and-application-examples"]], "Virtualization": [[26, "virtualization"]], "Linux KVM": [[26, "linux-kvm"]], "Linux Host": [[26, "linux-host"]], "Linux VM Guest": [[26, "linux-vm-guest"]]}, "indexentries": {"xmadatabuffer (c struct)": [[0, "c.XmaDataBuffer"]], "xmadecoderproperties (c struct)": [[0, "c.XmaDecoderProperties"]], "xmaencoderproperties (c struct)": [[0, "c.XmaEncoderProperties"]], "xmafilterportproperties (c struct)": [[0, "c.XmaFilterPortProperties"]], "xmafilterproperties (c struct)": [[0, "c.XmaFilterProperties"]], "xmaframe (c struct)": [[0, "c.XmaFrame"]], "xmaframeproperties (c struct)": [[0, "c.XmaFrameProperties"]], "xmaparameter (c struct)": [[0, "c.XmaParameter"]], "xmascalerinoutproperties (c struct)": [[0, "c.XmaScalerInOutProperties"]], "xmascalerproperties (c struct)": [[0, "c.XmaScalerProperties"]], "xma_data_buffer_alloc (c function)": [[0, "c.xma_data_buffer_alloc"]], "xma_data_buffer_free (c function)": [[0, "c.xma_data_buffer_free"]], "xma_data_from_buffer_clone (c function)": [[0, "c.xma_data_from_buffer_clone"]], "xma_dec_session_create (c function)": [[0, "c.xma_dec_session_create"]], "xma_dec_session_destroy (c function)": [[0, "c.xma_dec_session_destroy"]], "xma_dec_session_get_properties (c function)": [[0, "c.xma_dec_session_get_properties"]], "xma_dec_session_recv_frame (c function)": [[0, "c.xma_dec_session_recv_frame"]], "xma_dec_session_send_data (c function)": [[0, "c.xma_dec_session_send_data"]], "xma_dec_session_set_log (c function)": [[0, "c.xma_dec_session_set_log"]], "xma_enc_session_create (c function)": [[0, "c.xma_enc_session_create"]], "xma_enc_session_destroy (c function)": [[0, "c.xma_enc_session_destroy"]], "xma_enc_session_recv_data (c function)": [[0, "c.xma_enc_session_recv_data"]], "xma_enc_session_send_frame (c function)": [[0, "c.xma_enc_session_send_frame"]], "xma_enc_session_set_log (c function)": [[0, "c.xma_enc_session_set_log"]], "xma_filter_session_create (c function)": [[0, "c.xma_filter_session_create"]], "xma_filter_session_destroy (c function)": [[0, "c.xma_filter_session_destroy"]], "xma_filter_session_recv_frame (c function)": [[0, "c.xma_filter_session_recv_frame"]], "xma_filter_session_send_frame (c function)": [[0, "c.xma_filter_session_send_frame"]], "xma_filter_session_set_log (c function)": [[0, "c.xma_filter_session_set_log"]], "xma_frame_alloc (c function)": [[0, "c.xma_frame_alloc"]], "xma_frame_clone (c function)": [[0, "c.xma_frame_clone"]], "xma_frame_dec_ref (c function)": [[0, "c.xma_frame_dec_ref"]], "xma_frame_free (c function)": [[0, "c.xma_frame_free"]], "xma_frame_from_buffers_clone (c function)": [[0, "c.xma_frame_from_buffers_clone"]], "xma_frame_get_plane_height (c function)": [[0, "c.xma_frame_get_plane_height"]], "xma_frame_get_plane_size (c function)": [[0, "c.xma_frame_get_plane_size"]], "xma_frame_get_plane_stride (c function)": [[0, "c.xma_frame_get_plane_stride"]], "xma_frame_inc_ref (c function)": [[0, "c.xma_frame_inc_ref"]], "xma_frame_planes_get (c function)": [[0, "c.xma_frame_planes_get"]], "xma_initialize (c function)": [[0, "c.xma_initialize"]], "xma_log_init (c function)": [[0, "c.xma_log_init"]], "xma_log_release (c function)": [[0, "c.xma_log_release"]], "xma_logmsg (c function)": [[0, "c.xma_logmsg"]], "xma_release (c function)": [[0, "c.xma_release"]], "xma_scaler_session_create (c function)": [[0, "c.xma_scaler_session_create"]], "xma_scaler_session_destroy (c function)": [[0, "c.xma_scaler_session_destroy"]], "xma_scaler_session_recv_frame_list (c function)": [[0, "c.xma_scaler_session_recv_frame_list"]], "xma_scaler_session_send_frame (c function)": [[0, "c.xma_scaler_session_send_frame"]], "xrm_dec_release (c function)": [[0, "c.xrm_dec_release"]], "xrm_dec_reserve (c function)": [[0, "c.xrm_dec_reserve"]], "xrm_enc_release (c function)": [[0, "c.xrm_enc_release"]], "xrm_enc_reserve (c function)": [[0, "c.xrm_enc_reserve"]], "xrm_scale_release (c function)": [[0, "c.xrm_scale_release"]], "xrm_scale_reserve (c function)": [[0, "c.xrm_scale_reserve"]], "--codectype": [[9, "cmdoption-codectype"]], "--devidx": [[9, "cmdoption-devidx"]], "--file": [[9, "cmdoption-file"]], "--forcekeyframe": [[9, "cmdoption-forcekeyframe"]], "--json": [[9, "cmdoption-json"]], "-c": [[9, "cmdoption-c"]], "-f": [[9, "cmdoption-f"], [24, "cmdoption-f"]], "-i": [[9, "cmdoption-i"], [24, "cmdoption-i"]], "-j": [[9, "cmdoption-j"]], "-k": [[9, "cmdoption-k"]], "command line option": [[9, "cmdoption-c"], [9, "cmdoption-codectype"], [9, "cmdoption-devidx"], [9, "cmdoption-f"], [9, "cmdoption-file"], [9, "cmdoption-forcekeyframe"], [9, "cmdoption-i"], [9, "cmdoption-j"], [9, "cmdoption-json"], [9, "cmdoption-k"], [24, "cmdoption-arg-scaler_ama"], [24, "cmdoption-b-v"], [24, "cmdoption-bf"], [24, "cmdoption-c-v"], [24, "cmdoption-control_rate"], [24, "cmdoption-crf"], [24, "cmdoption-dynamic_gop"], [24, "cmdoption-dynamic_params_file"], [24, "cmdoption-enable_pipeline"], [24, "cmdoption-f"], [24, "cmdoption-filter_complex"], [24, "cmdoption-forced_idr"], [24, "cmdoption-g"], [24, "cmdoption-hwaccel"], [24, "cmdoption-i"], [24, "cmdoption-latency_logging"], [24, "cmdoption-level"], [24, "cmdoption-log_level"], [24, "cmdoption-lookahead_depth"], [24, "cmdoption-low_latency"], [24, "cmdoption-max_bitrate"], [24, "cmdoption-max_qp"], [24, "cmdoption-min_qp"], [24, "cmdoption-out_fmt"], [24, "cmdoption-out_res"], [24, "cmdoption-outputs"], [24, "cmdoption-perf"], [24, "cmdoption-preset"], [24, "cmdoption-profile"], [24, "cmdoption-qp"], [24, "cmdoption-qp_mode"], [24, "cmdoption-r"], [24, "cmdoption-s"], [24, "cmdoption-slice"], [24, "cmdoption-spatial_aq"], [24, "cmdoption-spatial_aq_gain"], [24, "cmdoption-temporal_aq"], [24, "cmdoption-temporal_aq_gain"], [24, "cmdoption-tier"], [24, "cmdoption-tune_metrics"], [24, "cmdoption-type"], [24, "cmdoption-vf"], [24, "cmdoption-vsync"], [25, "cmdoption-arg-0"], [25, "cmdoption-arg-1"], [25, "cmdoption-arg-2"], [25, "cmdoption-arg-b-frames"], [25, "cmdoption-arg-bitrate"], [25, "cmdoption-arg-crf"], [25, "cmdoption-arg-crop"], [25, "cmdoption-arg-crop-height"], [25, "cmdoption-arg-crop-left"], [25, "cmdoption-arg-crop-top"], [25, "cmdoption-arg-crop-width"], [25, "cmdoption-arg-device"], [25, "cmdoption-arg-device-type"], [25, "cmdoption-arg-encoding-params-file"], [25, "cmdoption-arg-forced-idr"], [25, "cmdoption-arg-gop-length"], [25, "cmdoption-arg-idr-interval"], [25, "cmdoption-arg-lookahead-depth"], [25, "cmdoption-arg-low-latency"], [25, "cmdoption-arg-max-bitrate"], [25, "cmdoption-arg-max-qp"], [25, "cmdoption-arg-min-qp"], [25, "cmdoption-arg-preset"], [25, "cmdoption-arg-qp"], [25, "cmdoption-arg-qp-mode"], [25, "cmdoption-arg-rate-control"], [25, "cmdoption-arg-slice"], [25, "cmdoption-arg-spatial-aq"], [25, "cmdoption-arg-spatial-aq-gain"], [25, "cmdoption-arg-temporal-aq-gain"], [25, "cmdoption-arg-temporall-aq"], [25, "cmdoption-arg-tier"], [25, "cmdoption-arg-tune-metrics"]], "xrm_reserve_id": [[14, "index-0"], [14, "index-2"]], "xrm_reserve_id_{n}": [[14, "index-1"], [14, "index-3"]], "environment variable": [[14, "index-0"], [14, "index-1"], [14, "index-2"], [14, "index-3"]], "-b:v": [[24, "cmdoption-b-v"]], "-bf": [[24, "cmdoption-bf"]], "-c:v": [[24, "cmdoption-c-v"]], "-control_rate": [[24, "cmdoption-control_rate"]], "-crf": [[24, "cmdoption-crf"]], "-dynamic_gop": [[24, "cmdoption-dynamic_gop"]], "-dynamic_params_file": [[24, "cmdoption-dynamic_params_file"]], "-enable_pipeline": [[24, "cmdoption-enable_pipeline"]], "-filter_complex": [[24, "cmdoption-filter_complex"]], "-forced_idr": [[24, "cmdoption-forced_idr"]], "-g": [[24, "cmdoption-g"]], "-hwaccel": [[24, "cmdoption-hwaccel"]], "-latency_logging": [[24, "cmdoption-latency_logging"]], "-level": [[24, "cmdoption-level"]], "-log_level": [[24, "cmdoption-log_level"]], "-lookahead_depth": [[24, "cmdoption-lookahead_depth"]], "-low_latency": [[24, "cmdoption-low_latency"]], "-max_bitrate": [[24, "cmdoption-max_bitrate"]], "-max_qp": [[24, "cmdoption-max_qp"]], "-min_qp": [[24, "cmdoption-min_qp"]], "-out_fmt": [[24, "cmdoption-out_fmt"]], "-out_res": [[24, "cmdoption-out_res"]], "-outputs": [[24, "cmdoption-outputs"]], "-perf": [[24, "cmdoption-perf"]], "-preset": [[24, "cmdoption-preset"]], "-profile": [[24, "cmdoption-profile"]], "-qp": [[24, "cmdoption-qp"]], "-qp_mode": [[24, "cmdoption-qp_mode"]], "-r": [[24, "cmdoption-r"]], "-s": [[24, "cmdoption-s"]], "-slice": [[24, "cmdoption-slice"]], "-spatial_aq": [[24, "cmdoption-spatial_aq"]], "-spatial_aq_gain": [[24, "cmdoption-spatial_aq_gain"]], "-temporal_aq": [[24, "cmdoption-temporal_aq"]], "-temporal_aq_gain": [[24, "cmdoption-temporal_aq_gain"]], "-tier": [[24, "cmdoption-tier"]], "-tune_metrics": [[24, "cmdoption-tune_metrics"]], "-type": [[24, "cmdoption-type"]], "-vf": [[24, "cmdoption-vf"]], "-vsync": [[24, "cmdoption-vsync"]], "scaler_ama": [[24, "cmdoption-arg-scaler_ama"]], "b-frames": [[25, "cmdoption-arg-b-frames"]], "bitrate": [[25, "cmdoption-arg-bitrate"]], "crf": [[25, "cmdoption-arg-crf"]], "crop": [[25, "cmdoption-arg-crop"]], "crop-height": [[25, "cmdoption-arg-crop-height"]], "crop-left": [[25, "cmdoption-arg-crop-left"]], "crop-top": [[25, "cmdoption-arg-crop-top"]], "crop-width": [[25, "cmdoption-arg-crop-width"]], "device": [[25, "cmdoption-arg-0"], [25, "cmdoption-arg-1"], [25, "cmdoption-arg-2"], [25, "cmdoption-arg-device"]], "device-type": [[25, "cmdoption-arg-device-type"]], "encoding-params-file": [[25, "cmdoption-arg-encoding-params-file"]], "forced-idr": [[25, "cmdoption-arg-forced-idr"]], "gop-length": [[25, "cmdoption-arg-gop-length"]], "idr-interval": [[25, "cmdoption-arg-idr-interval"]], "lookahead-depth": [[25, "cmdoption-arg-lookahead-depth"]], "low-latency": [[25, "cmdoption-arg-low-latency"]], "max-bitrate": [[25, "cmdoption-arg-max-bitrate"]], "max-qp": [[25, "cmdoption-arg-max-qp"]], "min-qp": [[25, "cmdoption-arg-min-qp"]], "preset": [[25, "cmdoption-arg-preset"]], "qp": [[25, "cmdoption-arg-qp"]], "qp-mode": [[25, "cmdoption-arg-qp-mode"]], "rate-control": [[25, "cmdoption-arg-rate-control"]], "slice": [[25, "cmdoption-arg-slice"]], "spatial-aq": [[25, "cmdoption-arg-spatial-aq"]], "spatial-aq-gain": [[25, "cmdoption-arg-spatial-aq-gain"]], "temporal-aq-gain": [[25, "cmdoption-arg-temporal-aq-gain"]], "temporall-aq": [[25, "cmdoption-arg-temporall-aq"]], "tier": [[25, "cmdoption-arg-tier"]], "tune-metrics": [[25, "cmdoption-arg-tune-metrics"]]}}) \ No newline at end of file diff --git a/v1.0/specs_and_features.html b/v1.0/specs_and_features.html new file mode 100644 index 00000000..0b903736 --- /dev/null +++ b/v1.0/specs_and_features.html @@ -0,0 +1,546 @@ + + + + + + + + + + + + + + + Specs and Features of the AMD AMA Video SDK — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Specs and Features of the AMD AMA Video SDK
  • +
  • +
  • +
+
+
+
+
+ +
+

Specs and Features of the AMD AMA Video SDK

+ +
+

The AMD AMA Video SDK

+

The AMD AMA Video SDK is a complete software stack allowing users to seamlessly leverage the features of AMD video acceleration units such as MA35D. It includes the following elements:

+
    +
  • Pre-compiled versions of FFmpeg and GStreamer which integrate key video transcoding plug-ins, enabling simple hardware offloading of compute-intensive workloads using these two popular frameworks. These custom versions of FFmpeg and GStreamer link to a host driver which communicates with the hardware on the PCIe card. No hardware experience is required to run FFmpeg or GStreamer commands with the AMD AMA Video SDK.

  • +
  • The Xilinx Resource Manager (XRM) which is the software used to manage and allocate all the hardware-accelerated features available in the system. XRM allows running multiple video processing jobs across multiple devices and multiple AMD video acceleration cards.

  • +
  • A C-based application programming interface (API) which facilitates the integration of AMD video transcoding capabilities in proprietary frameworks. This API is provided in the form plugins which can be called from external application using the Xilinx Media Accelerator (XMA) interface.

  • +
  • A suite of card management tools used to perform actions such as programming, resetting, or querying the status of AMD video acceleration cards.

  • +
  • Many examples and tutorials illustrating how to use and make the most of the AMD AMA Video SDK.

  • +
+MA35D Pipeline +
+
+

The AMD MA35D Card

+

The MA35D, which is compatible with AMD AMA Video SDK, is a low-profile, PCI™-based media accelerator card that delivers a high-density real-time transcoding solution for live streaming video service providers, OEMs, and Content Delivery Network (CDNs).

+

The MA35D card is targeted for both real-time and faster than real-time video workloads. It is expected that one or more sources of video input, either from files or from live video streams, are fed into the transcode pipeline. The encoder encodes one or more output streams from each scaled rendition of the input.

+
+

Video Codec Unit

+

The MA35D accelerator card has 2 VPUs, where each VPU is made of 2 video processing slices. These slices in turn are made of specialized decode, scale, GPU, ML, look ahead, and encode units.

+MA35D VPU +

Video Codec Unit (VCU) cores are capable of:

+
    +
  • Video format: YCbCr 4:2:0, 8 or 10-bit per color channel

  • +
  • Multi-standard encoding/decoding support, including:

    +
      +
    • ISO MPEG-4 Part 10: Advanced Video Coding (AVC)/ITU H.264 - Baseline, Constrained Baseline, High, High-10, High-10-Intra up to Level 5.2

    • +
    • ISO MPEG-H Part 2: High Efficiency Video Coding (HEVC)/ITU H.265 - Main, Main-Intra, Main10, Main-10-Intra, up to Level 5.2

    • +
    • AOM AV1: AOMedia Video 1 - Main, High up to Level 5.3

    • +
    +
  • +
  • Supports resolutions from 128x128 to 3840x2160 portrait and landscape

  • +
  • Simultaneous transcoding with a maximum aggregated bandwidth of 4x 4Kp60 per card for AVC or HEVC and 8x 4Kp60 for AV1

  • +
  • Look-ahead driven video quality improvements through temporal adaptive and spatial adaptive quantization

  • +
  • Low latency rate control

  • +
  • Flexible rate control: CBR, VBR, CVBR, and Constant QP

  • +
  • Progressive support for H.264, H.265 and AV1

  • +
  • HDR10/10+: HDR data is automatically populated by the decoder and passed to other accelerators in the transcode pipeline.

    +
      +
    • The following HDR10 SEI are supported:

      +
        +
      • Mastering Display Color Volume (SEI ITU)

      • +
      • Content Light Level (SEI ITU)

      • +
      • Alternative Transfer Charateristics (SEI ITU)

      • +
      +
    • +
    • The following HDR10+ SEI are supported:

      +
        +
      • ST2094_10 (DolbyVision, User defined SEI)

      • +
      • ST2094_40 (Samsung, User defined SEI)

      • +
      +
    • +
    • Behavior for HDR10/10+ SEI is as follows:

      +
        +
      • Static HDR SEI (MDCV, CLL & ATC) will not change in-between IDRs (and even in the video sequence according the HDR standards).

      • +
      • MDCV, CLL & ATC will be written only on IDRs, according to the persistency of MDCV, CLL & ATC SEIs.

      • +
      • ST2094_10 will be written on each access unit as per constraint of section A.2.1 ts_103572v010101p.pdf.

      • +
      • ST2094_40 will be written on IDRs, and whenever the user changes its content, according to the persistency specification in A341S34-1-582r4-A341-Amendment-2094-40.pdf

      • +
      +
    • +
    +
  • +
+
+
+

Adaptive Bitrate Scaler

+

For streaming applications, video is distributed in different resolutions and bit rates to adapt to varying network bandwidth conditions. All adaptive bitrate (ABR) transcoding systems require an ABR scaler that downscales an input video stream to several different smaller resolutions that are then re-encoded. These smaller resolutions are referred to as an image pyramid or an ABR ladder.

+

The MA35D ABR scaler is an accelerator capable of generating up to 16 lower resolution output images from a single input image. The ABR scaler supports the following features:

+
    +
  • Supports up to 12 taps in both horizontal and vertical direction per stage

  • +
  • High quality polyphase scaling with 64 phases and up to 12 taps in both horizontal and vertical direction per stage

  • +
  • Supports 8 and 10-bit 4:2:0

  • +
  • Luma and Chroma processed in parallel

  • +
  • Supports resolutions from 128x128 to 3840x2160, in multiples of 4

  • +
  • The scaler is tuned for downscaling and expects non-increasing resolutions in an ABR ladder. Increasing resolutions between outputs is supported but will reduce video quality.

  • +
+
+
+

Video Quality

+

The MA35D card nominally produces video quality (VQ) that is closely correlated to x264 medium, x265 medium and x265 slow presets, with respect to its accelerated AVC, HEVC and AV1 encoders. Furthermore, in case of AV1 encoders, -type-1 AV1 matches a similar VQ as x265 slow; whereas, -type-2 that of x265 medium. This video quality is highly dependent on video content so actual results may vary.

+
+
+

Performance Tables

+

The video processing power of the MA35D cards can be harnessed in many different ways, from running a few high-definition jobs to running many low-resolution ones, with or without scaling. The tables below show how many jobs can be run at real-time speed based on the use case and the number of cards available. All these configurations have been tested and validated by AMD and assume normal operating ranges.

+
+

Note

+
    +
  1. In the following tables, density numbers linearly scale to up to 16 devices.

  2. +
  3. It is assumed that per aggregate throughput of 4Kp60, host chassis has set aside 8 hyper-threaded cores with 12GB of RAM.

  4. +
+
+
+

Note

+

To meet the following density numbers for 30 FPS pipelines, it is recommended to decrease LA depth incrementally, until target density objectives are met. Refer to Automatic Look Ahead Depth Calculation for valid range of LA depth.

+
+

In the following tables Single Density refers to any combination of AVC, HEVC or AV1 Type-2 encoders, whereas, Double Density refers to any combination of AVC, HEVC or AV1 Type-2 encoders along with AV1 Type-1 encoder.

+

It is noted that with respect to Transcode with Scale Jobs Tables, below, the output of a decoder can be split and encoded with any combination of AMA encoders. This in turn implies that the expected density numbers can vary from reported Single Density to Double Density, depending on encoder selection, for each output of the scaler.

+

To fully utilize all devices on a card and reach the stated densities, device selection needs to be explicitly done in a command line. See -hwaccel and Using Explicit Device IDs for more details.

+
+

Performance Tables for 8-bit Color

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode Jobs per Card (8-bit)

Transcode Use Case

Single Density

Double Density

4kp60

4

8

4kp30

8

16

1080p60

16

32

1080p30

32

64

720p60

32

64

720p30

68

136

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode with Scale Jobs per Card (8-bit)

Transcode with Scale Use Case

Single Density

Double Density

4kp60 to 1440p60

4

8

4kp30 to 1440p30

8

16

1080p60 to 720p60

16

32

1080p30 to 720p30

32

64

720p60 to 540p60

32

64

720p30 to 540p30

68

136

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time ABR Ladders (8-bit)

ABR Ladders Use Case

1 Card

2160p60 to 1440p60, 1080p60, 720p30, 480p30, 360p30, 240p30, 144p30

4

2160p30 to 2160p30, 1440p30, 1080p30, 720p30, 480p30, 360p30, 240p30, 144p30

4

1080p60 to 1080p60, 720p60, 720p30, 480p30, 360p30, 160p30

8

1080p60 to 720p60, 720p30, 480p30, 360p30, 160p30

16

1080p30 to 1080p30, 720p30, 480p30, 240p30

16

720p30 to 720p30, 480p30, 240p30

40

+
+
+

Performance Tables for 10-bit Color

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode Jobs per Card (10-bit)

Transcode Use Case

Single Density

Double Density

4kp60

4

8

4kp30

8

16

1080p60

16

32

1080p30

32

64

720p60

32

64

720p30

68

136

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode with Scale Jobs per Card (10-bit)

Transcode with Scale Use Case

Single Density

Double Density

4kp60 to 1440p60

4

8

4kp30 to 1440p30

8

16

1080p60 to 720p60

16

32

1080p30 to 720p30

32

64

720p60 to 540p60

32

64

720p30 to 540p30

68

136

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time ABR Ladders (10-bit)

ABR Ladders Use Case

1 Card

2160p60 to 1440p60, 1080p60, 720p30, 480p30, 360p30, 240p30, 144p30

4

2160p30 to 2160p30, 1440p30, 1080p30, 720p30, 480p30, 360p30, 240p30, 144p30

4

1080p60 to 1080p60, 720p60, 720p30, 480p30, 360p30, 160p30

8

1080p60 to 720p60, 720p30, 480p30, 360p30, 160p30

16

1080p30 to 1080p30, 720p30, 480p30, 240p30

16

720p30 to 720p30, 480p30, 240p30

40

+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/troubleshooting.html b/v1.0/troubleshooting.html new file mode 100644 index 00000000..1b603e15 --- /dev/null +++ b/v1.0/troubleshooting.html @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) Troubleshooting — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA) Troubleshooting
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA) Troubleshooting

+ +
+

Overview

+

This section describes various troubleshooting methods and workarounds for some known issues such as out of memory errors, low frame-rate, etc.

+
+

Memory Usage

+

Messages such as:

+
    +
  • ERROR: from element xxxxx: Internal data stream error.

  • +
  • ERROR [Channel] Cannot create channel: DeviceAllocate failed

  • +
+

...

+

, indicate memory pressure on the accelerator card.

+

Workaround: Other than the obvious over-subscription use-cases, these issues can be resolved by decrementing the lookahead buffer size.

+
+
+

AV1 Slow Playback

+

An AV1 HLS stream may playback at slower than real time speeds.

+

Workaround: Recommend explicitly setting of FPS playback frame rate when using ffplay or use ffplay from FFmpeg 5.1.2 or 6.0.

+
+
+

AV1 MP4 Playback

+

AV1 muxed into an MP4 container may not play back properly.

+

Workaround: Recommend playback of raw video using more recent versions of ffplay (n5.1.2 or later) or more recent versions of media players such as VLC v3.0.17.4. Alternatively, muxing the raw video into an IVF container format is also permitted.

+
+
+

30 FPS Density

+

30 FPS transcodes and below can not run at full density with default lookahead depth.

+

Workaround: Decrease lookahead depth or density. Required decrease is dependent upon resolution/frame rate. See Performance Tables Section for details.

+
+
+

Gstreamer Variable Frame Rate

+

Variable frame rate files are not supported by the Gstreamer AMA plugins.

+

Workaround: Turn XRM off and add a videorate filter and caps filter before the encoder to set a fixed frame rate.

+
+
+

400 Mbps Max Bit Rate

+

Encoders do not support a target or max bitrate above 400 Mbps.

+

Workaround: This issue can be avoided by constraining the bitrate values below to 400 Mbps.

+
+
+

Many Parallel Encodes

+

Encountering Cannot create channel: DeviceAllocate failed error, when running high number of encoding operations in parallel.

+

Workaround: Reduce the memory requirements by lowering the lookahead depth of the encoding operation. This can be controlled with the -lookahead_depth argument. Default values depend on the FPS and bitdepth of the input source. The following are some starting points:

+
+

30fps: -lookahead_depth 26 (reduce by steps of 2)

+

60fps: -lookahead_depth 46 (reduce by steps of 4)

+
+
+
+

HDR & spatialAqGain

+

Encoding HDR content with a spatialAqGain of 1 or 2 is not supported.

+

Workaround: Using the default values of spatialAqGain is recommended for best video quality when possible. If it is desirable to reduce the spatialAqGain from the recommended range of 60 - 100, using a value of 3 or greater will avoid this issue.

+
+
+

Codec Issues in VM

+

If codec operations are hanging in a VM, while the following sudo dmesg -w output log is observed:

+
...
+[  323.436842] ama_transcoder0 0000:05:00.0 hdma: warning:hdma_link_rc2ep_xfer status is done, c:2,status=0x1,condition=0
+[  323.440802] ama_transcoder0 0000:05:00.0 hdma: dir:rc2ep element_cnt=1 channel:2 link_table_pa:0x160000
+[  323.443387] ama_transcoder0 0000:05:00.0 hdma: ctl:0x01 size:0x4 sh:0x2 sl:0x97e00000 dh:0x0 dl:0x20831000
+[  323.445538] ama_transcoder0 0000:05:00.0 hdma: end ctrl:0x06 rsv:0x0 llp_h:0x0 llp_l:0x160000
+[  323.447257] ama_transcoder0 0000:05:00.0 hdma: rc2ep PF c=2 0x500 = 0x1
+...
+
+
+

, with host reporting IO_PAGE_FAULT in its dmesg logs, then this is an indication of a mis-configured VM.

+

Workaround: Ensure that VM has been properly created as per Virtualization.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/tuning_pipeline_latency.html b/v1.0/tuning_pipeline_latency.html new file mode 100644 index 00000000..932980c5 --- /dev/null +++ b/v1.0/tuning_pipeline_latency.html @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + Tuning Latency — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tuning Latency
  • +
  • +
  • +
+
+
+
+
+ +
+

Tuning Latency

+ +

Latency tuning allows for trade off among end to end delay, video bit rate, GOP composition, etc. Interactive applications that require low latency, can do so by setting relevant parameters in the video pipeline. It is understood that lowering the latency comes at the cost of increased bit rate, for a given visual quality.

+
+

Decoder Latency

+

Decoding latency can be reduced by enabling the -low_latency decoder option in FFmpeg. The low latency decoding mode is not compatible with B frames. If the input streams contains B-frames, the -low_latency option should not be used.

+
+
+

Encoder Latency

+

AMD AMA Video SDK encoder performs multi-objective optimization with set constraints on bit rate, GOP topology, visual quality measures, etc. As such, it may be tuned to achieve a compromise between latency and quality or be specialized to ultra low latency.

+
+

Guidelines on Encoder Latency Configuration

+

Encoding latency can also be reduced by trading off compression rate or visual quality. The following table lists the encoder options which can used to reduce to that effect.

+ ++++ + + + + + + + + + + + + + +

Encode Options

Notes

Look Ahead Depth

+
For best visual quality, it is recommend to let the buffer depth be determined automatically. If it is found that the selected depth adds unacceptable delay, then this option can be set explicitly.
+
+

Number of B frames

+
It is understood that for every inserted B frame there will be a frame period delay.
+
+
+
+
+

Automatic Look Ahead Depth Calculation

+

The VQ optimized look ahead buffer depth is the summation of the following 3 components:

+
    +
  1. The fixed 4 frames depth

  2. +
  3. The number of selected B frames

  4. +
  5. Linear function of frame rate:

    +
      +
    1. 8 bit: 0.7xframe rate

    2. +
    3. 10 bit: 0.4xframe rate

    4. +
    +
  6. +
+

As an example, the assigned depth of an 8-bit, AV1p30, with IPBBB sub gop, stream is 4+3+21=28 frames.

+

The valid range of look ahead buffer depth is between 9+Number of B frames and 46+Number of B frames, except for AV1 Type-1, where:

+
+
    +
  1. For FPS below 30, the range is between 12+Number of B frames and 49+Number of B frames.

  2. +
  3. For FPS above 30, the range is between 16+Number of B frames and 53+Number of B frames.

  4. +
+
+
+
+

Ultra Low Latency (ULL) Mode

+

Ultra Low Latency (ULL) encoding is enabled by setting -lookahead_depth flag to 0.

+

Notes

+
    +
  • In ULL encoding mode, frames are always processed in display order. As such, this mode is not compatible with B frames. Furthermore, only Constant Quantization Parameter (CQP) and Constant Bit Rate (CBR) options are allowed. See -control_rate.

  • +
+
+
+
+

FFmpeg Latency Measurements

+

Latency measurements can be obtained by enabling -latency_logging. The following is a sample transcode, HEVC to AVC, pipeline:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v hevc_ama -out_fmt nv12 -i <INPUT> -filter_complex "scaler_ama=outputs=1:out_res=(1920x1080)" -c:v h264_ama -frames 50 -lookahead_depth 0 -latency_logging enable -f rawvideo -b:v 6M /tmp/hevc_to_scale_to_h264.h264
+
+...
+2023-05-25 12:27:01.028958 NOTICE [Channel] Latency @ output frame  24:  0 frames, 4.5 ms; 152.79 fps = (24-0)/(157.1 ms)
+2023-05-25 12:27:01.194255 NOTICE [Channel] Latency @ output frame  49:  0 frames, 4.5 ms; 151.24 fps = (49-24)/(165.3 ms)
+frame=   50 fps=0.0 q=-0.0 latency= 12ms Lsize=     189kB time=00:00:00.83 bitrate=1858.8kbits/s speed=2.27x
+...
+
+
+

Note that latency reports are printed every 25th frame. In the case noted above, the end to end latency is 12 [ms].

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/tuning_video_quality.html b/v1.0/tuning_video_quality.html new file mode 100644 index 00000000..59a82013 --- /dev/null +++ b/v1.0/tuning_video_quality.html @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + Tuning Video Quality — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tuning Video Quality
  • +
  • +
  • +
+
+
+
+
+ +
+

Tuning Video Quality

+ +

The quality of encoded video depends on various factors. It is primarily a function of the target bit rate and the type of video content. However, there are some encoder parameters which can be used to adjust the video quality. This document describes the major parameters impacting video quality, as they specifically pertain to AMA SDK compatible devices. These parameters and the underlying concepts are applicable whether using FFmpeg or the C example programs.

+

Currently, there are 3 significant parameters that effect the visual quality of the video:

+
    +
  1. Metric, which is specified by -tune_metrics

  2. +
  3. Latency, which is specified by -lookahead_depth

  4. +
  5. Preset, which is specified by -preset

  6. +
+

Sections below will describe each of these parameters in detail.

+

Various examples illustrating the effect of these settings can be found here:

+ +
+

Metrics

+

This parameters defines means of scoring the observed video quality, for both subjective and objective measures. To control this parameter, set -tune_metrics to its desired target value. It is important to note that the encode engine has specific optimizations per mode, e.g., while setting the -tune_metrics parameter to 1, will optimize the visual quality, it may not necessarily provide the best PSNR, SSIM or VMAF scores.

+
+
+

Latency

+

Through this parameter one has the ability to control the end to end delay, within a transcode pipeline. See Tuning Latency of Transcode Pipeline for more details. It is understood that typically allowing for more delay in a pipeline, results in a better visual quality, e.g., increasing the depth of the look ahead buffer, results in a higher score, for a given bit rate. This parameter is controlled -lookahead_depth. See FFmpeg Video Quality for example usage. Note that look ahead depth can be reduced to 15 frames with (limited) impact to video quality.

+
+
+

Preset

+

Speed preset determines the amount of time that is spent in encoding the incoming bit stream. This time in turn is determined by the number of encode optimization tools deployed, during the encoding process. Specifically, for this release, motion vector search range, Rate-Distortion Optimized Quantization (RDOQ) and other such tools are used to enhance the visual quality, at the expense of processing time. For example, -preset slow provides about 2% improvement, in terms of BD Rate, for AVC encoding, while decreasing the throughput by 20%. It should be noted that slow preset also increases the ULL mode latency, by 25%. See FFmpeg quality analysis examples for example usage. Note that the specific values noted in these example are the only ones that are recommended for usage.

+
+
+

AV1 Type Selection

+

AMD AMA Video SDK offers 2 flavors of AV1 encoding: the default type 1 and type 2. For most use-cases, it is recommended to stay with the default value, as it not only provides better visual quality, but also provides per frame objective stats. However, given that these 2 encoders employ 2 independent pipelines if the primary concern is to increase the number of encoded streams, then addition of type 2 AV1 will increase the channel density.

+
+
+

Dynamic Encoder Parameters

+

Dynamic parameters are parameters which can be changed during runtime. This is useful to optimize video quality and compression rate for different segments of the video. This capability is supported for FFmpeg and GStreamer.

+

The following encoder parameters can be dynamically modified:

+
    +
  • Number of B frames (0 to 4)

  • +
  • Bitrate (0 to INT_MAX)

  • +
  • Temporal AQ mode (0 to 1)

  • +
  • Temporal AQ gain (0 to 255)

  • +
  • Spatial AQ mode (0 to 1)

  • +
  • Spatial AQ gain (0 to 255)

  • +
  • Min/Max QP (0-51)

  • +
+

When using FFmpeg or GStreamer, the encoder parameters which should be changed are specified in a configuration file as key-value pairs. This means that these key-value pairs must be known ahead of time.

+

Dynamic Parameters Considerations

+
    +
  • Recommended settings for dynamic B frames are:

    +
      +
    • 0 for gaming clips with fast motion, camera pan/rotation scenes

    • +
    • 2 for static or slow moving scenes, talking heads, or video conferencing type of content

    • +
    • 1 for all medium motion and all other content

    • +
    +
  • +
  • B frames changes do not happen at the exact frame number specified. Instead, the change comes into effect one or two frames from the actual frame number specified in the config file.

  • +
  • The maximum value for the number of B frames is the value configured at initilization

  • +
  • The configuration files for dynamic parameters must comply with the format specified above. Ill-formed files may result in unexpected behavior.

  • +
+

FFmpeg

+

Encoder parameters which should be changed dynamically are specified as key-value pairs in a configuration file. This configuration file is provided to FFmpeg using the -dynamic_params_file encoder option.

+

The -dynamic_params_file option is specific to an encoded output. For use cases with multiple encoded outputs (such as ABR ladders), each output can have its own -dynamic_params_file option and associated configuration file.

+

The configuration file should contain one line for each frame where one or more parameters are changed. Each line should start with the frame number followed by a list of key-value pairs for all the modified parameters:

+
<frameNumberN1>:<key1>=<value1>
+<frameNumberN2>:<key2>=<value2>,<key3>=<value3>
+
+
+

Below is a table listing the parameters which can be changed at runtime, the corresponding key and valid values.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Dynamic Parameter

Key

Valid Values

Number of B frames

NumB=<int>

0 to 4

Bitrate (in bits per second)

BRkbps=<int>

0 to INT_MAX

Temporal AQ mode

tAQ=<int>

0 to 1

Temporal AQ gain

tAQGain=<int>

0 to 255

Spatial AQ mode

sAQ=<int>

0 to 1

Spatial AQ gain

sAQGain=<int>

0 to 255

Min/Max QP

MinQP=<int>,MaxQP=<int>

0 to 51

+

Sample FFmpeg encode command:

+
ffmpeg -hwaccel ama -re -f lavfi -i testsrc=duration=60:size=1920x1080:rate=60,format=yuv420p -f rawvideo  -vf "hwupload" -c:v hevc_ama -b:v 5M  -dynamic_params_file ./param.txt -y -f rawvideo  output.h265
+
+
+

Sample configuration file for dynamic parameters:

+
300:NumB=1
+600:BRkbps=6000
+1200:sAQ=1,sAQGain=50
+1800:tAQ=1,tAQGain=50
+2400:NumB=0,BRkbps=10000,sAQ=0,sAQGain=50,tAQ=0
+5000:MinQP=30,MaxQP=35
+
+
+

GStreamer

+

Gstreamer uses the same formated configuration file as FFmpeg:

+
gst-launch-1.0 fakesrc sizetype=fixed sizemax=4147200 num-buffers=4000 ! capsfilter caps='video/x-raw' ! rawvideoparse width=1920 height=1080 format=i420 framerate=60/1 ! ama_upload ! ama_h265enc encoding-params-file=./param1.txt ! fakesink
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/unified_logging.html b/v1.0/unified_logging.html new file mode 100644 index 00000000..17af4117 --- /dev/null +++ b/v1.0/unified_logging.html @@ -0,0 +1,392 @@ + + + + + + + + + + + + + + + Unified Logging — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Unified Logging
  • +
  • +
  • +
+
+
+
+
+ +
+

Unified Logging

+ +

Unified Logging (UL) utility is aimed at providing an identical logging output, configuration and interaction for different video frameworks provided by AMD AMA Video SDK. Two environmental variables LOG_AMA_CONFIG and LOG_AMA_FILTER control interactions with UL. LOG_AMA_CONFIG variable controls the global setting of logging, which includes log destination, max size, log source info, and log levels. LOG_AMA_FILTER variable filters the global configuration and narrows down the logging output to specific software layer, accelerator type or level. The following sections describe the configuration parameters of each variable.

+
+

LOG_AMA_CONFIG

+

LOG_AMA_CONFIG is utilized as follows:

+
export LOG_AMA_CONFIG="[key=value | ...]"
+
+
+

, where key and value are defined as:

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key

value

Description

destination

console, file, syslog, release_preset or debug_preset

Determines the target destination of output logs.

+

console: Terminal output

+

file: Defaults to "async=1, max_size=10MB, location=log_ama_<pid>_<timestamp>.txt"

+

syslog: Defaults to "async=1, location=localhost, facility=LOCAL0"

+

release_preset: Shortcut for "destination=syslog, async=1 | log_level = WARN| perf_log=0 | debug_file_name=0 | debug_thread = 0 | debug_pid=0 | debug_time_stamp=0"

+

debug_preset: Shortcut for "destination=file, max_size=1GB | log_level = DEBUG | async=1 | perf_log=1 | debug_file_name=1 | debug_thread = 1 | debug_pid=1 | debug_time_stamp=1"

+

async refers to asynchronous mode of write operation

+

location refers to output path of logs

+

log_level

FATAL, ERROR, WARN, INFO, DEBUG, TRACE or ALL

Determines the log level.

+

Defaults to WARN

+

perf_log

0 or 1

Enables or disables performance measurements.

+

Defaults to 0

+

debug_file_name

0 or 1

Enables or disables addition of log file names.

+

Defaults to 0

+

debug_file_line

0 or 1

Enables or disables inclusion of log line numbers.

+

Defaults to 0

+

debug_time_stamp

0 or 1

Enables or disables addition of timestamps.

+

Defaults to 0

+

debug_pid

0 or 1

Enables or disables reporting of process id.

+

Defaults to 0

+

debug_thread

0 or 1

Enables or disables reporting of thread id.

+

Defaults to 0

+
+
+
+

LOG_AMA_FILTER

+

LOG_AMA_FILTER is utilized as follows:

+
export LOG_AMA_FILTER="[LAYER.ACCEL=log_level | ...]"
+
+
+

, where LAYER and ACCEL are defined as:

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LAYER

Description

SDK

Any user space library

VPI

Video processing plugins

XMA

XMA library

FFMPEG

FFmpeg plugins

GST

Gstreamer plugins

GEN

General and common layers

XRM

XRM library

+ ++++ + + + + + + + + + + + + + + + + + + + +

ACCEL

Description

ABR

ABR ladder

DEC

Decoder

ENC

Encoder

GEN

General hardware logs

+
+
+

Examples

+
    +
  1. Send output to log_ama_<pid>_<timestamp>.txt file, and set log_level to warning:

    +
    export LOG_AMA_CONFIG="destination=file | log_level=WARN | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  2. +
  3. Send output to /tmp/log_ama.txt file, and set log_level to info:

    +
    export LOG_AMA_CONFIG="destination=file, location=/tmp/log_ama.txt | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  4. +
  5. Send output to /tmp/log_ama.txt file, and set log_level to info, with max log file size equal to 100MB:

    +
    export LOG_AMA_CONFIG="destination=file, max_size=100MB, location=/tmp/log_ama.txt | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  6. +
  7. Get output on console, with log_level set to info:

    +
    export LOG_AMA_CONFIG="destination=console | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  8. +
  9. Assume log_level was WARN in LOG_AMA_CONFIG, the following filter will additionally enable TRACE log level of VPI layer for ABR plugins:

    +
    export LOG_AMA_FILTER=" VPI.ABR=TRACE"
    +
    +
    +
  10. +
  11. If we want all layers logs for ABR:

    +
    export LOG_AMA_FILTER=" *.ABR=TRACE"
    +
    +
    +
  12. +
  13. If we want all layers logs for ABR & ENC:

    +
    export LOG_AMA_FILTER=" *.ABR=TRACE | *.ENC=TRACE"
    +
    +
    +
  14. +
  15. Force all logs to ERROR, and generate debug logs from SDK for ABR type:

    +
    export LOG_AMA_FILTER=" *.*=ERROR | *.ABR=DEBUG"
    +
    +
    +
  16. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/using_ffmpeg.html b/v1.0/using_ffmpeg.html new file mode 100644 index 00000000..1bb092fd --- /dev/null +++ b/v1.0/using_ffmpeg.html @@ -0,0 +1,1036 @@ + + + + + + + + + + + + + + + Using FFmpeg — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Using FFmpeg
  • +
  • +
  • +
+
+
+
+
+ +
+

Using FFmpeg

+

This page documents how to use FFmpeg with the AMD AMA Video SDK.

+ +
+

+
+
+

Introduction

+

FFmpeg is an industry standard, open source, widely used utility for handling video. FFmpeg has many capabilities, including encoding and decoding of all video compression formats, encoding and decoding of audio, encapsulating, and extracting audio, and video from transport streams, and many more. The AMD AMA Video SDK includes an enhanced version of FFmpeg, version n4.4, which communicates with the hardware accelerated transcode pipeline.

+

It is not within the scope of this document to provide an exhaustive guide on the usage of FFmpeg. Various resources can be found online, for example:

+ +

The following sections describe the options used with FFmpeg to configure the various hardware accelerators available on an MA35 device.

+
+

+
+
+

Example Commands

+

A simple FFmpeg command for accelerated transcoding with the AMD AMA Video SDK will look like this one:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i infile.mp4 -c:v hevc_ama -b:v 1000K -r 60 -f mp4 -y transcoded.mp4
+
+
+

There are many other ways in which FFmpeg can be used to leverage the video transcoding features of an MA35 device. Examples illustrating how to run FFmpeg for encoding, decoding, and transcoding with or without ABR scaling, video composition and ML are included in FFmpeg tutorials.

+
+

+
+
+
+

General FFmpeg Options

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options

Descriptions

+
+-i
+
+ +
+
Input video URI.
+
+
+
+-c:v
+
+ +
+
Specify the video codec
+
This option must be set for any video stream processed on an MA35 device.
+
Valid decode values are h264_ama, hevc_ama, and av1_ama for H.264, HEVC, and AV1, respectively.
+
Valid encode values are h264_ama, hevc_ama, and av1_ama for H.264, HEVC, and AV1, respectively.
+
+
+
+-s
+
+ +
+
The frame size (WidthxHeight). For example 1920x1080 or 3840x2160.
+
+
+
+-f
+
+ +
+
The container format.
+
+
+
+-r
+
+ +
+
The frame rate in fps (Hz).
+
+
+
+-filter_complex
+
+ +
+
Used for frame filtering operation.
+
Valid value is scaler_ama, for ABR scaler.
+
Consult MA35 Filters for more details on how to use this option.
+
+
+
+-hwaccel
+
+ +
+
Global option used to specify on which MA35 device the FFmpeg job should run. Consult Using Explicit Device IDs for more details on how to use this option. Valid values are positive integers in [0..N-1] range. Default is device 0.
+
+
+
+-vf
+
+ +
+
Specify DMA direction. Valid options are hwdownload and hwupload, for DMA transfer of data to and from the host, respectively. Note that transaction directions are with respect to the host.
+
+
+
+

Note

+

Detailed help for encoder, decoder and scaler is obtained through FFmpeg extended help, e.g. ffmpeg -h encoder=h264_ama, ffmpeg -h decoder=hevc_ama or ffmpeg -h filter=scaler_ama.

+
+

The following conventions are used in the following tables:

+
    +
  1. When parameters can be specified as both numerical and string values, they are noted as:

    +
    (<number>) <string>
    +
    +
    +

    Conversely, when this is not the case, options are noted with Roman numerals as:

    +
    <Roman numeral>) <option>
    +
    +
    +
  2. +
  3. auto or -1 note that values are selected by the SDK to optimally meet the specified constraints.

  4. +
+
+

+
+
+
+
+

Video Decoding

+

For the complete list of features and capabilities of the AMD AMA Video SDK decoder, refer to Release Notes chapter of the documentation.

+

The table below describes all the options for the AMD AMA Video SDK decoder.

+ ++++ + + + + + + + + + + + + + +

Options

Descriptions

+
+-out_fmt
+
+ +
+
Decoder output pixel format
+
Valid global values for pixel format: nv12, p010le, packed10, rgbp, yuv420p, and yuv420p10le.
+
Note that an identical pixel format must be specified as value to format option, within -vf. See Decode Only for an example.
+
+
+
+-low_latency
+
+ +
+
Enable/Disable single frame level decode
+
When enabled, the decoding latency of streams not containing any B frames is reduced. This option has no impact on streams that include B frames.
+
Valid values: 0 or 1. (default is 0)
+
+
(0) disable - default
+
(1) enable
+
+
+
+
+

+
+
+
+

Video Encoding

+

For the complete list of features and capabilities of the AMD AMA Video SDK encoder, refer to Release Notes chapter of the documentation.

+

The table below describes all the options for the AMD AMA Video SDK encoder.

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options

Descriptions

+
+-b:v
+
+ +
+
Specify the video bitrate
+
You can specify this in Mb or Kb. For example -b:v 1M or -b:v 1000K.
+
+
+
+-max_bitrate
+
+ +
+
Maximum bitrate
+
Valid values: 0 to 3.5e+10
+
You may want to use this to limit encoding bitrate if you have not specified a -b:v bitrate
+
Default value -1 implies unspecified.
+
+
+
+-g
+
+ +
+
GOP size
+
Valid values: 0 to UINT32_MAX
+
Default value is -1, implying 2[s] gop duration, i.e., twice the frame rate
+
+
+
+-level
+
+ +
+
Encoding level restriction
+
Valid values for H.264: 1, 1.1, 1.2, 1.3, 2, 2.1, 2.2, 3, 3.1, 3.2, 4, 4.1, 4.2, 5, 5.1, 5.2
+
Valid values for HEVC: 1, 2, 2.1, 3, 3.1, 4, 4.1, 5, 5.1
+
Valid values for AV1: 2, 2.1, 3, 4, 4.1, 5, 5.1, 5.2, 5.3
+
Default value is auto.
+
+
+
+-profile
+
+ +
+
Set the encoding profile
+
Valid values for H.264: baseline, main, high
+
Valid values for HEVC: main, main-intra, main-10 and main-10-intra
+
Valid values for AV1: main
+
Default value is auto.
+
+
+
+-tier
+
+ +
+
Set the encoding tier (AV1 and HEVC only)
+
Valid values: -1, 0, 1
+
+
(-1) auto
+
(0) main
+
(1) high
+
+
Default value is auto.
+
+
+
+-crf
+
+ +
+
Constant Rate Factor
+
Valid values: 0, 1 (default is 0)
+
+
(0) disable - default
+
(1) enable
+
+
This option uses -qp for its quality assignment.
+
Note that this option ignores all other options that may impose restrictions on qp values. These include -min_qp, -max_qp, -b:v and -control_mode.
+
+
+
+-qp
+
+ +
+
Quantization Parameter
+
Valid values for H.264 and HEVC 0-51
+
Valid values for AV1 0-255
+
Default value -1 implies not used.
+
+
+
+-bf
+
+ +
+
Number of B frames
+
Valid values for H.264, HEVC and type-2 AV1: 0-3
+
Valid values for type-1 AV1: 0-7
+
Default auto selection value is -1.
+
+
+
+-lookahead_depth
+
+ +
+
Number of frames to lookahead for qp maps
+
Valid values: -1 to 50
+
Lookahead depth of 0 implies ULL mode
+
Default auto selection value, based on frame rate, is -1.
+
+
+
+-spatial_aq
+
+ +
+
Enable spatial AQ
+
Valid values: auto, disable or enable
+
+
(-1) auto
+
(0) disable
+
(1) enable
+
+
Default value is auto.
+
When qp_mode is uniform, this parameter is ignored and treated as disable.
+
+
+
+-spatial_aq_gain
+
+ +
+
Scale for spatial AQ gain
+
Valid values: 0 to 255
+
+
(255) For auto selection
+
+
Default value for H264, HEVC and AV1 is 64
+
Default value for type-1 AV1 is 72
+
+
+
+-temporal_aq
+
+ +
+
Enable temporal AQ
+
Valid values: auto, disable or enable
+
+
(-1) auto
+
(0) disable
+
(1) enable
+
+
Default value is auto.
+
+
When qp_mode is uniform, this parameter is ignored and treated as disable.
+
+
+
+
+-temporal_aq_gain
+
+ +
+
Scale for temporal AQ gain
+
Valid values: 0 to 255
+
+
(255) For auto selection
+
+
Default value for H264, HEVC and AV1 is 80
+
Default value for type-1 AV1 is 0
+
+
+
+-qp_mode
+
+ +
+
QP control mode
+
Valid values: auto, relative_load and uniform.
+
+
(0) auto for best VQ
+
(1) relative_load implying both spatial and temporal AQ
+
(2) uniform meaning no AQ
+
+
Default value is auto.
+
+
+
+-control_rate
+
+ +
+
Set the Rate Control mode
+
Valid values: -1 to 3
+
+
(-1) auto
+
(0) const_qp for Constant QP
+
(1) cbr for Constant Bitrate
+
(2) vbr for Variable Bitrate
+
(3) cvbr for Capped Variable Bitrate
+
+
Default value is auto.
+
+
+
+-min_qp
+
+ +
+
Minimum QP value allowed for rate control
+
Valid values for H264 and HEVC: 0 to 51
+
Valid values for AV1: 0 to 255
+
Default auto selection value is -1.
+
This option has no effect when -control_rate is set to Constant QP (0).
+
+
+
+-max_qp
+
+ +
+
Maximum QP value allowed for rate control
+
Valid values for H264 and HEVC: 0 to 51
+
Valid values for AV1: 0 to 255
+
Default auto selection value is -1.
+
This option has no effect when -control_rate is set to Constant QP (0).
+
+
+
+-forced_idr
+
+ +
+
Force insertion of IDR frames
+
Valid values: 0, 1 (default is 1)
+
+
(0) disable
+
(1) enable - default
+
+
Encodes all the intra frames as IDR
+
+
+
+-slice
+
+ +
+
Select a slice to run an encode job
+
Valid values if xrmd is not used are: 0, 1 (default is 0). If xrmd is active and this option is not set, xrmd will make the slice selection.
+
+
+
+-tune_metrics
+
+ +
+
Enable tuning video quality for the best objective metrics
+
This option optimizes the encoder for the selected tuning metric. See Tuning Video Quality for details.
+
Valid values: 1 to 4 (default is 1)
+
+
(1) vq - default
+
(2) psnr
+
(3) ssim
+
(4) vmaf
+
+
+
+
+-vsync
+
+ +
+
Add a vsync frame
+
Valid values: 0, 1 (default is 0)
+
Set this to 0 to prevent extra frames being added.
+
+
+
+-latency_logging
+
+ +
+
Log latency information to syslog
+
Valid values: enable and disable.
+
Default value is disable.
+
+
+
+-type
+
+ +
+
Applicable to AV1 encoders only
+
Valid values: 1 or 2.
+
+
i) 1 - default
+
ii) 2
+
+
Default value is 1.
+
Consult the AV1 Selection section for more details on how to use this option.
+
+
+
+-preset
+
+ +
+
Encoder VQ-Density preset
+
Valid values: medium or slow. (default is medium)
+
+
(medium) Full density with medium VQ - default
+
(slow) High VQ at lower density
+
+
Consult the Tuning Video Quality section for more details on how to use this option.
+
Note that this option has no effects on AV1 -type 1 encoding.
+
+
+
+-dynamic_gop
+
+ +
+
Enable Dynamic GOP
+
Valid values: -1, 0 or 1.
+
+
(-1) auto
+
(0) disabled
+
(1) enable
+
+
Default value is auto.
+
+
+
+-dynamic_params_file
+
+ +
+
Dynamic Configuration File
+
Path to dynamic file location (default is empty)
+
Consult the Dynamic Encoder Parameters section for more details on how to use this option.
+
+
+
+

+
+
+
+

Video Scaling

+

The AMD AMA Video SDK hardware scaler is leveraged in FFmpeg by using the scaler_ama complex filter and the FFmpeg filter graph syntax. This section describes the options of the scaler_ama complex filter.

+
+
+scaler_ama
+

Filter implementing the AMD AMA Video SDK ABR multiscaler. Takes one input and up to 16 output streams. The complete list of options is described below.

+
+ + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
Multiscale Filter Options

Options

Description

+
+-outputs
+
+ +
+
Specify the number of scaler outputs
+
Valid values are integers between 1 and desired number of outputs.
+
+
+
+-out_res
+
+ +
+
Specify ABR ladder rungs <1>*<16>(WxH | [Format] | [Rate])
+
List of up to 16 tuples of form (Resolution | Pixel Format | Frame Rate)
+
Valid values for resolution: 176x144 to 3840x2160 - default 1920x1080
+
Valid global values for pixel format: nv12, p010le, packed10, rgbp, yuv420p, and yuv420p10le
+
Valid values for frame rate: half and full - default full, where full refers to the incoming frame rate and half to the half of the incoming frame rate.
+
+
+
+-log_level
+
+ +
+
Specify log level
+
Valid values: 0 to 3 (default 0)
+
+
(0) off - default
+
(1) session detail
+
(2) command block descriptor
+
(3) verbose
+
+
+
+
+-perf
+
+ +
+
Extract performance data
+
Valid values: 0 and 1 (default 0)
+
+
(0) disable - default
+
(1) enable
+
+
+
+
+-enable_pipeline
+
+ +
+
Enable pipelining to improve performance
+
Valid values: 0 and 1 (default 1)
+
+
(0) disable
+
(1) enable - default
+
+
Note that enabling this option adds 2 frames worth of latency to the pipeline.
+
+
+
+

+
+
+

Using the AMD AMA Video SDK Scaler Filter

+

The filter graph specification for the scaler_ama filter should be constructed in the following way:

+
    +
  • Add the scaler_ama filter to the graph

  • +
  • Set the number of scaler outputs

  • +
  • Set the width, height, pixel format and rate settings for each scaler output

  • +
  • Define the name each scaler output

  • +
  • If the outputs are not to encoded on the device, add -vf filters to the filter graph to copy the frames back to the host and convert them to AV frames.

  • +
+

The following example shows a complete command to decode, scale and encode to 4 different resolutions and 3 different encode formats, where the input is an H.264 file:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=4:out_res=(1920x1080)(1280x720)(720x480)(360x240) [a][b][c][d]" \
+-map '[a]' -c:v hevc_ama -b:v 6M -frames 1200 -f rawvideo -y /tmp/hevc_1080p.hevc \
+-map '[b]' -c:v av1_ama  -b:v 2M -frames 1200 -f rawvideo -y /tmp/av1_720p.av1 \
+-map '[c]' -c:v h264_ama -b:v 1M -frames 1200 -f rawvideo -y /tmp/h264_480p.h264 \
+-map '[d]' -c:v av1_ama  -b:v 1M -frames 1200 -f rawvideo -y /tmp/av1_240p.av1
+
+
+

This example can also be found in the FFmpeg introductory tutorials: Transcode With Multiple-Resolution Outputs.

+
+

+
+
+
+
+

Rebuilding FFmpeg

+

Obtain the zipped version of SDK's FFmpeg source code, from ma35d_sdk_v1.0_ffmpeg.zip. Unzip this file into ma35_ffmpeg folder. This folder contains the entire source code for the FFmpeg executable, which is a fork of the main FFmpeg GitHub (release 5.1.2) with AMD plugins patches applied. Due to licensing restrictions, the FFmpeg executable included in the Video SDK is enabled with the AMD AMA Video SDK plugins only.

+

You can rebuild the FFmpeg executable with optional plugins by following the instructions below. Additionally, comprehensive instructions for compiling FFmpeg can be found on the FFmpeg wiki page.

+
    +
  1. Make sure libhugetlbfs-dev, nasm and yasm are installed on your machine.

  2. +
  3. Unzip the downloaded zip file:

    +
    unzip ma35d_sdk_v1.0_ffmpeg.zip
    +
    +
    +
  4. +
+
+

and navigate to root folder of the unzipped file.

+
+
    +
  1. Execute the following:

    +
    ./configure --disable-alsa --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --disable-libxcb-shape --disable-xlib --disable-libmfx --disable-vaapi --disable-vulkan --prefix=$PWD --disable-stripping --enable-shared --enable-vpe --enable-libxrm --extra-libs="-L/opt/amd/ama/ma35/lib -lvpi -lcommon -lg2dec -lh2enc -lcache -lGAL -lVSC -lArchModelSw  -lNNArchPerf -lxav1sdk -llog_ama /opt/amd/ama/ma35/lib/libxrm.so.1.6.0 -lxrm_interface -lroi_scale -lhugetlbfs -lpthread -lstdc++ -lm -ldl -lrt" --extra-cflags="-I/usr/include -I$PWD -I/opt/amd/ama/ma35/include/xrm_interface/ -I/opt/amd/ama/ma35/include/xrm/" --extra-ldflags="-Wl,-rpath=$PWD/libavutil:$PWD/libavfilter:$PWD/libavcodec:$PWD/libavformat:$PWD/libavdevice:$PWD/libswscale:$PWD/libswresample:$PWD:/opt/amd/ama/ma35/lib/"
    +
    +
    +
  2. +
+
+

If during this operation permission errors are encountered, then execute the following:

+
chmod 755 configure; find . -name "*.sh" -exec chmod 755 {} \;
+
+
+
+
    +
  1. Add any other plugins such as libx264 to the above configure line. (See FFmpeg Compilation Guide for details.) A list of configure options is printed by running configure --help.

  2. +
  3. Type make -j to build FFmpeg. GNU Make 3.81 or later is required.

  4. +
  5. Type make install to install all binaries and libraries you built.

  6. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/using_gstreamer.html b/v1.0/using_gstreamer.html new file mode 100644 index 00000000..e6a30796 --- /dev/null +++ b/v1.0/using_gstreamer.html @@ -0,0 +1,928 @@ + + + + + + + + + + + + + + + Using GStreamer — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Using GStreamer
  • +
  • +
  • +
+
+
+
+
+ +
+

Using GStreamer

+ +
+

Introduction

+

GStreamer is a pipeline-based multimedia framework that links together a wide variety of media processing systems to complete complex workflows. The pipeline design serves as a base to create many types of multimedia applications such as video editors, transcoders, streaming media broadcasters and media players. The AMD AMA Video SDK includes an enhanced version of GStreamer which can communicate with the hardware accelerated transcode pipeline in AMD devices.

+

It is not within the scope of this document to provide an exhaustive guide on the usage of GStreamer. Various resources can be found online, for example:

+ +
+

Overview of the GStreamer Plugins

+

The AMD AMA Video SDK provides the following GStreamer plugins for building hardware-accelerated video pipelines using AMA compatible devices:

+
    +
  • ama_av1dec for av1 decoding

  • +
  • ama_av1enc for av1 encoding

  • +
  • ama_h264dec for h264 decoding

  • +
  • ama_h264enc for h264 encoding

  • +
  • ama_h265dec for h264 decoding

  • +
  • ama_h264enc for h265 encoding

  • +
  • ama_scaler for hardware accelerated scaling and color conversion

  • +
  • ama_download data download from device to host

  • +
  • ama_upload data upload from host to device

  • +
+

The following sections describe the options used with GStreamer to configure and use the various hardware accelerators available on AMA compatible devices.

+
+

+
+
+
+
+

Decoder Plugin

+

The ama_av1dec, ama_h264dec and ama_hevcdec plugins provide support for hardware-accelerated decoding using AMA compatible devices, for AV1, AVC and HEVC.

+
+

Decoder Inputs and Outputs

+
    +
  • Input: 8 or 10 bits AV1, AVC or HEVC encoded stream, in OBU format for AV1 or byte-stream format for AVC or HEVC

  • +
  • Output: One of NV12_4L4, NV12_10LE_4L4, I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB or BGR formats

  • +
+
+
+

Decoder Parameters

+ ++++ + + + + + + + + + + + + + +

Property Name

Description

+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Default Value: -1 (auto)
+
Range -1 to 2147483647
+
+
+
+low-latency
+
+ +
+
Whether to enable low latency decoding
+
Type: Boolean
+
Default Value: false
+
+
+
+
+

Decoder Example Pipelines

+

Refer to the Decoder Pipeline example for an illustration of how to use this plugin.

+
+
+
+

Encoder Plugin

+

The ama_av1enc, ama_h264enc and ama_h265enc plugins provide support for hardware-accelerated encoding using AMA compatible devices, for AV1, AVC and HEVC.

+
+

Encoder Inputs and Outputs

+
    +
  • Input: NV12_4L4, NV12_10LE_4L4, I420, I420_10LE, I420_10BE, NV12 or NV12_10LE32

  • +
  • Output: One of AV1, AVC or HEVC 8-bit/10-bit encoded stream, in OBU format for AV1 and byte-stream for AVC and HEVC

  • +
+
+
+

Encoder Parameters

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Property Name

Description

+
+b-frames
+
+ +
+
Number of B-frames between two consecutive P-frames
+
Type: Integer
+
Range: -1 - 7, for AV1
+
Range: -1 - 3, for AVC and HEVC
+
Default: -1 (auto)
+
+
+
+bitrate
+
+ +
+
Fixed output bitrate in bits per second
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 5000000
+
+
+
+crf
+
+ +
+
If specified, enable CRF mode
+
Type: Boolean
+
Default: False
+
+
+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+device-type
+
+ +
+
AV1 device type to use
+
Type: Enum
+
+
(0): any
+
(1): Type 1
+
(2): Type 2
+
+
Default: 1
+
+
+
+forced-idr
+
+ +
+
Encode all intra frames as IDR
+
Type: Boolean
+
Default: True
+
+
+
+gop-length
+
+ +
+
Maximum distance between two consecutive I frames
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+idr-interval
+
+ +
+
The periodicity of IDR frames
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 4294967295
+
+
+
+lookahead-depth
+
+ +
+
Number of frames in the future of the currently encoded frame that the encoder will analyze and take into account
+
Type: Integer
+
Range: 0 - 40
+
Default: -1 (auto)
+
+
+
+max-bitrate
+
+ +
+
Use to limit encoding bitrate if you have not specified bitrate parameter
+
Type: Integer
+
Range: 0 - 35000000000
+
Default: -1 (auto)
+
+
+
+max-qp
+
+ +
+
Maximum QP value allowed for the rate control
+
Type: Integer
+
Range: 0 - 51, for AVC and HEVC
+
Range: 0 - 255, for AV1
+
Default: 51, for AVC and HEVC
+
Default: 255, for AV1
+
+
+
+min-qp
+
+ +
+
Minimum QP value allowed for the rate control
+
Type: Integer
+
Range: 0 - 51, for AVC and HEVC
+
Range: 0 - 255, for AV1
+
Default: 0
+
+
+
+qp
+
+ +
+
Fixed quantization value. When constant quality is enabled, bitrate must be set to 0
+
Type: Integer
+
Range: -1 - 255
+
Default: -1 (disable)
+
+
+
+qp-mode
+
+ +
+
QP control mode.
+
Type: Enum
+
+
(0): auto - Auto
+
(1): relative-load - Relative load (spatial AQ + temporal AQ)
+
(2): uniform - Uniform (AQ off)
+
+
+
+
+rate-control
+
+ +
+
Rate control mode to use for encoding
+
Type: Enum
+
+
(-1): auto - Auto
+
(0): cqp - Constant QP
+
(1): cbr - Constant bitrate
+
(2): vbr - Variable bitrate
+
(3): cvbr - Constrained variable bitrate
+
+
+
+
+slice
+
+ +
+
Which slice of the XMA device to use
+
Type: Integer
+
Range: -1 - 1
+
Default: -1
+
+
+
+spatial-aq
+
+ +
+
Enable spatial AQ
+
Type: Boolean
+
Default: True
+
+
+
+spatial-aq-gain
+
+ +
+
Spatial AQ gain scale factor
+
Type: Integer
+
Range: 0 -255
+
Default: 255
+
+
+
+temporall-aq
+
+ +
+
Enable temporal AQ
+
Type: Boolean
+
Default: True
+
+
+
+temporal-aq-gain
+
+ +
+
Temporal AQ gain scale factor
+
Type: Integer
+
Range: 0 -255
+
Default: 255
+
Default: 1
+
+
+
+tier
+
+ +
+
Tier
+
Type: Boolean
+
+
(-1): auto - Auto
+
(0): main - Main
+
(1): high - High
+
+
+
+
+preset
+
+ +
+
Encoder VQ-Density preset
+
Valid values: medium or slow. (default is medium)
+
+
(medium) Full density with medium VQ - default
+
(slow) High VQ at lower density
+
+
Consult the Tuning Video Quality section for more details on how to use this option.
+
Note that this option has no effects on AV1 device-type 1 encoding.
+
+
+
+tune-metrics
+
+ +
+
Tune VQ for objective metrics
+
Type: Enum
+
+
(1): vq - Best visual quality
+
(2): psnr - Best PSNR
+
(3): ssim - Best SSIM
+
(4): vmaf - Best VMA
+
+
+
+
+encoding-params-file
+
+ +
+
Dynamic Configuration File
+
Path to dynamic file location (default is empty)
+
Consult the Dynamic Encoder Parameters section for more details on how to use this option.
+
+
+
+
+

Encoder Example Pipelines

+

Refer to the Encoder Pipeline example for an illustration of how to use this plugin.

+
+

+
+
+
+
+

Scaler Plugin

+

The ama_scaler plugin provides support for hardware-accelerated resizing and cropping.

+
+

Scaler Inputs and Outputs

+
    +
  • Input: NV12_4L4, NV12_10LE_4L4, I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, and BGR

  • +
  • Output: NV12_4L4, NV12_10LE_4L4, I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, and BGR

  • +
+
+
+

Scaler Parameters

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +

Property Name

Description

+
+crop
+
+ +
+
Crop the input frame before scaling.
+
Type: Boolean
+
Default Value: false
+
+
+
+crop-height
+
+ +
+
Height of crop area. Must be < input height - crop-top and a multiple of 2
+
Type: Integer
+
Range: 0 - 2147483647
+
Default: 0
+
+
+
+crop-left
+
+ +
+
Left position of crop area. Must be < input width and a multiple of 2
+
Type: Integer
+
Range: 0 - 2147483647
+
Default: 0
+
+
+
+crop-top
+
+ +
+
Top position of crop area. Must be < input height and a multiple of 2
+
Type: Integer
+
Range: 0 - 2147483647
+
Default: 0
+
+
+
+crop-width
+
+ +
+
** Width of crop area. Must be < input width - crop-left and a multiple of 2**
+
Type: Integer
+
Range: 0 - 2147483647
+
Default: 0
+
+
+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+
+

Scaler Example Pipelines

+

Refer to the Transcode with Multiple-Resolution Outputs example for an illustration of how to use this plugin.

+
+
+
+

Hardware Down and Up Loads

+

The ama_download and ama_upload plugins provide support for DMA transfer of data to and from the host, respectively. Note that transaction directions are with respect to the host.

+
+

Inputs and Outputs

+
    +
  • Input: I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, BGR

  • +
  • Output: I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, BGR

  • +
+
+
+

DMA Parameters

+ ++++ + + + + + + + + + + +

Property Name

Description

+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+
+
+

Moving Data through the Pipeline

+

The GStreamer plugins included in the AMD AMA Video SDK take care of efficiently moving data through the video processing pipeline. For optimal performance, video buffers will be moved between the host and the appropriate device only if needed by plugins in the pipeline. This is known as "zero-copy".

+
    +
  • The decoder plugin will only copy the output buffer from the device to the host if a downstream element (e.g. filesink) running on the host needs to access the decoded frame. This allows downstream hardware-accelerated plugins (e.g. scaler, encoder) running on the same AMD device to process the decoded frames without unnecessary data transfers.

  • +
  • The encoder plugin will only copy the input buffer from host to the device if it is allocated in user-space memory on the host or in a different device. This allows the encoder to process frames produced by upstream hardware-accelerated plugins (e.g. decoder, scaler) running on the same AMD device without unnecessary data transfers.

  • +
+
+
+

Working with Multiple Devices

+

By default (if no device identifier is specified) a job is submitted to device 0. When running large jobs or multiple jobs in parallel, device 0 is bound to run out of resources rapidly and additional jobs will error out due to insufficient resources.

+

By using the device option of the GStreamer plugins included in the AMD AMA Video SDK, the different functions (decoder, scaler, encoder) of a pipeline can be individually submitted to a specific device. This makes it easy and straightforward to leverage the entire video acceleration capacity of your system, regardless of the number of cards and devices.

+
+
+

Rebuilding GStreamer and Application Examples

+

Obtain the zipped version of SDK's Gstreamer code from ma35d_sdk_v1.0_gstreamer.zip. Unzip this file into ma35_gstreamer folder. This folder will contain the source code for AMA SDK plugins and a patch for Gstreamer.

+

You can rebuild the Gstreamer executable with optional plugins by following the instructions below.

+
    +
  1. Install the prerequisite packages:

    +
    sudo apt install ninja-build flex bison python3-pip unzip pkg-config libjansson-dev uuid-dev
    +sudo snap install cmake --classic
    +sudo pip3 install meson ninja
    +
    +
    +
  2. +
  3. Unzip the downloaded zip file:

    +
    unzip ma35d_sdk_v1.0_gstreamer.zip -d ma35_gstreamer
    +
    +
    +
  4. +
  5. Get Gstreamer:

    +
    git clone https://github.com/GStreamer/gstreamer.git
    +cd gstreamer
    +git checkout f6e672f27fcac06af58d7ac995551893d36944ce
    +
    +
    +
  6. +
  7. Apply the patch to Gstreamer:

    +
    cp ../ma35_gstreamer/ama_gstreamer.patch .
    +git apply ama_gstreamer.patch
    +
    +
    +
  8. +
  9. Build Gstreamer and AMA SDK plugins:

    +
    cd ../ma35_gstreamer
    +ln -s ../gstreamer/subprojects ./
    +export C_INCLUDE_PATH=/opt/amd/ama/ma35/include/xma/:/opt/amd/ama/ma35/include/xrm/:/opt/amd/ama/ma35/include/xrm_interface/:$C_INCLUDE_PATH
    +export LIBRARY_PATH=/opt/amd/ama/ma35/lib/:$LIBRARY_PATH
    +meson setup build
    +cd build
    +ninja
    +
    +
    +
  10. +
  11. Install Gstreamer and plugins:

    +
    ninja install
    +
    +
    +
  12. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.0/virtualization.html b/v1.0/virtualization.html new file mode 100644 index 00000000..9f3d9677 --- /dev/null +++ b/v1.0/virtualization.html @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + Virtualization — AMD AMA 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Virtualization
  • +
  • +
  • +
+
+
+
+
+ +
+

Virtualization

+ +
+

Overview

+

AMA virtualization support allows for isolated interaction of clients' operating systems with AMA compatible cards, in Linux. Specifically, isolation is achieved by relying on I/O Memory Management Unit (IOMMU) and Single Root I/O virtualization (SR-IOV) technologies. As such, AMA virtualization support provides an efficient interaction path between client applications and AMA compatible cards. This section describes Linux virtualization setup.

+
+
+

Linux KVM

+

The following 2 sections, Linux Host and Linux VM Guest, describe both the host and VM guest required configurations.

+
+

Linux Host

+
    +
  1. Ensure that host system is setup as per On Premises.

  2. +
  3. Install CPU checker and KVM packages on the host. For an Ubuntu host, do the following:

    +
    sudo apt install -y cpu-checker qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
    +
    +
    +
  4. +
  5. Ensure that virtualization is enabled on the host:

    +
    $ lscpu | grep Virtualization
    +Virtualization:                  AMD-V
    +$ kvm-ok
    +INFO: /dev/kvm exists
    +KVM acceleration can be used
    +
    +
    +
  6. +
  7. If /etc/modules-load.d/ama_transcoder.conf doesn't exists, execute the following:

    +
    $ echo ama_transcoder | sudo tee /etc/modules-load.d/ama_transcoder.conf
    +
    +
    +
  8. +
  9. If /etc/modprobe.d/ama_transcoder.conf doesn't exists, execute the following:

  10. +
+
+
$ echo 'install ama_transcoder /sbin/modprobe --ignore-install ama_transcoder && /opt/amd/ama/ma35/bin/mamgmt --force -d <DBDF> numvfs -v 1 && <REPEAT>' | sudo tee /etc/modprobe.d/ama_transcoder.conf
+$ echo 'remove ama_transcoder /sbin/modprobe -r --ignore-install ama_transcoder; /opt/amd/ama/ma35/bin/mamgmt --force -d <DBDF> numvfs -v 0; <REPEAT>' | sudo tee -a /etc/modprobe.d/ama_transcoder.conf
+
+
+

, where DBDF is PCIe Domain:Bus:Device.Function designation of the device(s) and REPEAT indicates that the /opt/amd/ama/ma35/bin/mamgmt commands are to be repeated for all devices that are meant to be passed to a VM.

+
+

As an example, in a system with 2 cards:

+
lspci -d 10ee:
+01:00.0 Multimedia controller: Xilinx Corporation Device 5070
+02:00.0 Multimedia controller: Xilinx Corporation Device 5070
+03:00.0 Multimedia controller: Xilinx Corporation Device 5070
+04:00.0 Multimedia controller: Xilinx Corporation Device 5070
+
+
+

, in order to make one device, of each card, available to 2 distinct VMs, /etc/modprobe.d/ama_transcoder.conf will have the following content:

+
+
install ama_transcoder /sbin/modprobe --ignore-install ama_transcoder && /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:02:00.0 numvfs -v 1 && /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:04:00.0 numvfs -v 1
+remove  ama_transcoder /sbin/modprobe --ignore-install ama_transcoder;   /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:02:00.0 numvfs -v 0;   /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:04:00.0 numvfs -v 0
+
+
+
+
    +
  1. Reboot the host. After reboot execute and confirm the following:

    +
    $ lsmod | grep ama_transcoder
    +  ama_transcoder        831488  0
    +
    +
    +

    If the above returns empty, then insert the module manually, by sudo modprobe ama_transcoder. Otherwise, confirm that driver is properly configured:

    +
    $ cat /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
    +1
    +
    +$ lspci -d 10ee:
    +01:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +01:00.1 Multimedia controller: Xilinx Corporation Device 5071
    +...
    +
    +
    +

    The first command confirms that VM guest's Virtual Function (VF) that is associated with host's Physical Function (PF) is enabled and the second one confirms its creation. Note that this snippet assumes target device is 01.00.0.

    +
  2. +
  3. Setup KVM on the host and confirm that it is running:

    +
    $ sudo systemctl enable libvirtd
    +$ sudo systemctl start libvirtd
    +$ systemctl status libvirtd
    +libvirtd.service - Virtualization daemon
    +   Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
    +   Active: active (running) since Wed 2023-06-07 09:19:44 PDT; 7h ago
    +   ...
    +
    +
    +
  4. +
  5. Obtain Ubuntu 20.04 server image, from Ubuntu Focal Fossa.

  6. +
  7. Instantiate the VM guest, by allocating it at least 8 CPU cores and 12GB of RAM.

    +

    Check virt-install version:

    +
    virt-install --version
    +
    +
    +

    If it is 4.0.0 or above, execute the following:

    +
    sudo virt-install --name <VM name> \
    +--ram 12288 --vcpu 8 --virt-type kvm --machine q35 \
    +--disk path=<Path to qcow2 disk file>,size=128 \
    +--os-type linux --os-variant ubuntu20.04 --network network:default --graphics none --console pty,target_type=serial --extra-args "console=ttyS0" \
    +--location <Path to Ubuntu 20.04 ISO file>,kernel=casper/vmlinuz,initrd=casper/initrd \
    +--force --debug --features  apic=on,ioapic.driver=qemu --iommu model=intel,driver.intremap=on,driver.eim=on,driver.caching_mode=on --memorybacking hugepages.page.size=2,hugepages.page.unit=M,nosharepages=1,locked=1 \
    +--hostdev 0<xx>:00.1,driver.name=vfio
    +
    +
    +

    , where VM name is the name of the VM image and Path to qcow2 disk file is the path to VM's disk storage, which will be created. Note that this file will be owned by libvirt-qemu user and kvm group. Also, Path to Ubuntu 20.04 ISO file is the path to the downloaded ISO image and xx is part of DBDF designation as described above. Repeat this step for as many VMs that have been defined in /etc/modprobe.d/ama_transcoder.conf.

    +

    Otherwise, first create the VM without ioapic.driver and --iommu parameters:

    +
    sudo virt-install --name <VM name> \
    +--ram 12288 --vcpu 8 --virt-type kvm --machine q35 \
    +--disk path=<Path to qcow2 disk file>,size=128 \
    +--os-type linux --os-variant ubuntu20.04 --network network:default --graphics none --console pty,target_type=serial --extra-args "console=ttyS0" \
    +--location <Path to Ubuntu 20.04 ISO file>,kernel=casper/vmlinuz,initrd=casper/initrd \
    +--force --debug --hostdev 0<xx>:00.1,driver.name=vfio
    +
    +
    +

    and after VM creation add ioapic.driver and --iommu parameters, via virsh edit:

    +
      virsh edit <VM name>
    +  ...
    +  <memoryBacking>
    +   <hugepages>
    +     <page size='2048' unit='KiB'/>
    +   </hugepages>
    +   <nosharepages/>
    +   <locked/>
    + </memoryBacking>
    +  ...
    +  <features>
    +    <acpi/>
    +    <apic/>
    +    <vmport state='off'/>
    +    <ioapic driver='qemu'/>
    +  </features>
    +...
    +  </rng>
    +  <iommu model='intel'>
    +    <driver intremap='on' caching_mode='on'/>
    +  </iommu>
    +</devices>
    +...
    +
    +
    +

    During or after creation of a VM, it is helpful to install ssh server on the guest VM, in order to be able to connect to the instance:

    +
    sudo apt-get install openssh-server
    +
    +
    +

    (To find the IP address of the running VM, run sudo virsh net-dhcp-leases default or attach to the instance virsh --connect qemu:///system console <VM name> and issue the ip a command)

    +
  8. +
+
+
+

Linux VM Guest

+

On the running VM instance execute the following:

+
+
    +
  1. Set the huge table pages to 6GB, plus an extra 96 pages, i.e. 3072+96:

    +
    sudo sh -c "echo 'vm.nr_hugepages=3168' >> /etc/sysctl.conf"
    +
    +
    +
  2. +
  3. Note that if you are running 20.04 Server edition, you may need to install generic kernel 5.15, dkms and gcc-11:

  4. +
+
+
+
+
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
+sudo apt install -y gcc-11 linux-image-5.15.0-60-generic dkms build-essential linux-headers-5.15.0-60-generic
+
+
+
+
    +
  1. Reboot the VM

  2. +
  3. Install the AMD AMA Video SDK and run through Tutorials and Examples

  4. +
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/.buildinfo b/v1.1.1/.buildinfo new file mode 100644 index 00000000..14d32319 --- /dev/null +++ b/v1.1.1/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 7d3dca0c364b98ff1f81b5bab97dfb82 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/v1.1.1/.nojekyll b/v1.1.1/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/v1.1.1/_images/MA35D_VPU.png b/v1.1.1/_images/MA35D_VPU.png new file mode 100644 index 00000000..d55cabf6 Binary files /dev/null and b/v1.1.1/_images/MA35D_VPU.png differ diff --git a/v1.1.1/_images/MA35D_pipeline.png b/v1.1.1/_images/MA35D_pipeline.png new file mode 100644 index 00000000..fc17564b Binary files /dev/null and b/v1.1.1/_images/MA35D_pipeline.png differ diff --git a/v1.1.1/_images/gst_xabrladder.png b/v1.1.1/_images/gst_xabrladder.png new file mode 100644 index 00000000..75d9d2ba Binary files /dev/null and b/v1.1.1/_images/gst_xabrladder.png differ diff --git a/v1.1.1/_images/gst_xcompositor.png b/v1.1.1/_images/gst_xcompositor.png new file mode 100644 index 00000000..1848b6b3 Binary files /dev/null and b/v1.1.1/_images/gst_xcompositor.png differ diff --git a/v1.1.1/_static/_sphinx_javascript_frameworks_compat.js b/v1.1.1/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/v1.1.1/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/v1.1.1/_static/basic.css b/v1.1.1/_static/basic.css new file mode 100644 index 00000000..30fee9d0 --- /dev/null +++ b/v1.1.1/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/v1.1.1/_static/css/badge_only.css b/v1.1.1/_static/css/badge_only.css new file mode 100644 index 00000000..e380325b --- /dev/null +++ b/v1.1.1/_static/css/badge_only.css @@ -0,0 +1 @@ +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/v1.1.1/_static/css/fonts/Roboto-Slab-Bold.woff b/v1.1.1/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/v1.1.1/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/v1.1.1/_static/css/fonts/Roboto-Slab-Bold.woff2 b/v1.1.1/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/v1.1.1/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/v1.1.1/_static/css/fonts/Roboto-Slab-Regular.woff b/v1.1.1/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/v1.1.1/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/v1.1.1/_static/css/fonts/Roboto-Slab-Regular.woff2 b/v1.1.1/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/v1.1.1/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/v1.1.1/_static/css/fonts/fontawesome-webfont.eot b/v1.1.1/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/v1.1.1/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/v1.1.1/_static/css/fonts/fontawesome-webfont.svg b/v1.1.1/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/v1.1.1/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v1.1.1/_static/css/fonts/fontawesome-webfont.ttf b/v1.1.1/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/v1.1.1/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/v1.1.1/_static/css/fonts/fontawesome-webfont.woff b/v1.1.1/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/v1.1.1/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/v1.1.1/_static/css/fonts/fontawesome-webfont.woff2 b/v1.1.1/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/v1.1.1/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/v1.1.1/_static/css/fonts/lato-bold-italic.woff b/v1.1.1/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/v1.1.1/_static/css/fonts/lato-bold-italic.woff differ diff --git a/v1.1.1/_static/css/fonts/lato-bold-italic.woff2 b/v1.1.1/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/v1.1.1/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/v1.1.1/_static/css/fonts/lato-bold.woff b/v1.1.1/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/v1.1.1/_static/css/fonts/lato-bold.woff differ diff --git a/v1.1.1/_static/css/fonts/lato-bold.woff2 b/v1.1.1/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/v1.1.1/_static/css/fonts/lato-bold.woff2 differ diff --git a/v1.1.1/_static/css/fonts/lato-normal-italic.woff b/v1.1.1/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/v1.1.1/_static/css/fonts/lato-normal-italic.woff differ diff --git a/v1.1.1/_static/css/fonts/lato-normal-italic.woff2 b/v1.1.1/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/v1.1.1/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/v1.1.1/_static/css/fonts/lato-normal.woff b/v1.1.1/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/v1.1.1/_static/css/fonts/lato-normal.woff differ diff --git a/v1.1.1/_static/css/fonts/lato-normal.woff2 b/v1.1.1/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/v1.1.1/_static/css/fonts/lato-normal.woff2 differ diff --git a/v1.1.1/_static/css/theme.css b/v1.1.1/_static/css/theme.css new file mode 100644 index 00000000..2814741e --- /dev/null +++ b/v1.1.1/_static/css/theme.css @@ -0,0 +1,4771 @@ +html{ + box-sizing:border-box +} +*,:after,:before{ + box-sizing:inherit +} +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{ + display:block +} +audio,canvas,video{ + display:inline-block; + *display:inline; + *zoom:1 +} +[hidden],audio:not([controls]){ + display:none +} +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box +} +html{ + font-size:100%; + -webkit-text-size-adjust:100%; + -ms-text-size-adjust:100% +} +body{ + margin:0 +} +a:active,a:hover{ + outline:0 +} +abbr[title]{ + border-bottom:1px dotted +} +b,strong{ + font-weight:700 +} +blockquote{ + margin:0 +} +dfn{ + font-style:italic +} +ins{ + background:#ff9; + text-decoration:none +} +ins,mark{ + color:#000 +} +mark{ + background:#ff0; + font-style:italic; + font-weight:700 +} +.rst-content code,.rst-content tt,code,kbd,pre,samp{ + font-family:monospace,serif; + _font-family:courier new,monospace; + font-size:1em +} +pre{ + white-space:pre +} +q{ + quotes:none +} +q:after,q:before{ + content:""; + content:none +} +small{ + font-size:85% +} +sub,sup{ + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline +} +sup{ + top:-.5em +} +sub{ + bottom:-.25em +} +dl,ol,ul{ + margin:0; + padding:0; + list-style:none; + list-style-image:none +} +li{ + list-style:none +} +dd{ + margin:0 +} +img{ + border:0; + -ms-interpolation-mode:bicubic; + vertical-align:middle; + max-width:100% +} +svg:not(:root){ + overflow:hidden +} +figure,form{ + margin:0 +} +label{ + cursor:pointer +} +button,input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle +} +button,input{ + line-height:normal +} +button,input[type=button],input[type=reset],input[type=submit]{ + cursor:pointer; + -webkit-appearance:button; + *overflow:visible +} +button[disabled],input[disabled]{ + cursor:default +} +input[type=search]{ + -webkit-appearance:textfield; + -moz-box-sizing:content-box; + -webkit-box-sizing:content-box; + box-sizing:content-box +} +textarea{ + resize:vertical +} +table{ + border-collapse:collapse; + border-spacing:0 +} +td{ + vertical-align:top +} +.chromeframe{ + margin:.2em 0; + background:#ccc; + color:#000; + padding:.2em 0 +} +.ir{ + display:block; + border:0; + text-indent:-999em; + overflow:hidden; + background-color:transparent; + background-repeat:no-repeat; + text-align:left; + direction:ltr; + *line-height:0 +} +.ir br{ + display:none +} +.hidden{ + display:none!important; + visibility:hidden +} +.visuallyhidden{ + border:0; + clip:rect(0 0 0 0); + height:1px; + margin:-1px; + overflow:hidden; + padding:0; + position:absolute; + width:1px +} +.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{ + clip:auto; + height:auto; + margin:0; + overflow:visible; + position:static; + width:auto +} +.invisible{ + visibility:hidden +} +.relative{ + position:relative +} +big,small{ + font-size:100% +} +@media print{ + body,html,section{ + background:none!important + } + *{ + box-shadow:none!important; + text-shadow:none!important; + filter:none!important; + -ms-filter:none!important + } + a,a:visited{ + text-decoration:underline + } + .ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{ + content:"" + } + blockquote,pre{ + page-break-inside:avoid + } + thead{ + display:table-header-group + } + img,tr{ + page-break-inside:avoid + } + img{ + max-width:100%!important + } + @page{ + margin:.5cm + } + .rst-content .toctree-wrapper>p.caption,h2,h3,p{ + orphans:3; + widows:3 + } + .rst-content .toctree-wrapper>p.caption,h2,h3{ + page-break-after:avoid + } +} +.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{ + -webkit-font-smoothing:antialiased +} +/*! * Custome CSS styles for Xilinx GitHub Tutorials */ + p .footerinfo { + font-size:small; +} + footer .sphinxfooter{ + z-index:0; + background:#ffffff; +} + .sphinxhide { + display:none; +} + a:visited { + color: #9b59b6; +} + a:link { + color: blue; +} + .wy-nav-side a:hover { + color: white; +} + .headerlink { + padding-top: 60px; + margin-top: -50px; +} +/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ +@font-face{ + font-family:FontAwesome; + src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713); + src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg"); + font-weight:400; + font-style:normal +} +.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{ + display:inline-block; + font:normal normal normal 14px/1 FontAwesome; + font-size:inherit; + text-rendering:auto; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale +} +.fa-lg{ + font-size:1.33333em; + line-height:.75em; + vertical-align:-15% +} +.fa-2x{ + font-size:2em +} +.fa-3x{ + font-size:3em +} +.fa-4x{ + font-size:4em +} +.fa-5x{ + font-size:5em +} +.fa-fw{ + width:1.28571em; + text-align:center +} +.fa-ul{ + padding-left:0; + margin-left:2.14286em; + list-style-type:none +} +.fa-ul>li{ + position:relative +} +.fa-li{ + position:absolute; + left:-2.14286em; + width:2.14286em; + top:.14286em; + text-align:center +} +.fa-li.fa-lg{ + left:-1.85714em +} +.fa-border{ + padding:.2em .25em .15em; + border:.08em solid #eee; + border-radius:.1em +} +.fa-pull-left{ + float:left +} +.fa-pull-right{ + float:right +} +.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{ + margin-right:.3em +} +.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{ + margin-left:.3em +} +.pull-right{ + float:right +} +.pull-left{ + float:left +} +.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{ + margin-right:.3em +} +.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{ + margin-left:.3em +} +.fa-spin{ + -webkit-animation:fa-spin 2s linear infinite; + animation:fa-spin 2s linear infinite +} +.fa-pulse{ + -webkit-animation:fa-spin 1s steps(8) infinite; + animation:fa-spin 1s steps(8) infinite +} +@-webkit-keyframes fa-spin{ + 0%{ + -webkit-transform:rotate(0deg); + transform:rotate(0deg) + } + to{ + -webkit-transform:rotate(359deg); + transform:rotate(359deg) + } +} +@keyframes fa-spin{ + 0%{ + -webkit-transform:rotate(0deg); + transform:rotate(0deg) + } + to{ + -webkit-transform:rotate(359deg); + transform:rotate(359deg) + } +} +.fa-rotate-90{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform:rotate(90deg); + -ms-transform:rotate(90deg); + transform:rotate(90deg) +} +.fa-rotate-180{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform:rotate(180deg); + -ms-transform:rotate(180deg); + transform:rotate(180deg) +} +.fa-rotate-270{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform:rotate(270deg); + -ms-transform:rotate(270deg); + transform:rotate(270deg) +} +.fa-flip-horizontal{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform:scaleX(-1); + -ms-transform:scaleX(-1); + transform:scaleX(-1) +} +.fa-flip-vertical{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform:scaleY(-1); + -ms-transform:scaleY(-1); + transform:scaleY(-1) +} +:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{ + filter:none +} +.fa-stack{ + position:relative; + display:inline-block; + width:2em; + height:2em; + line-height:2em; + vertical-align:middle +} +.fa-stack-1x,.fa-stack-2x{ + position:absolute; + left:0; + width:100%; + text-align:center +} +.fa-stack-1x{ + line-height:inherit +} +.fa-stack-2x{ + font-size:2em +} +.fa-inverse{ + color:#fff +} +.fa-glass:before{ + content:"" +} +.fa-music:before{ + content:"" +} +.fa-search:before,.icon-search:before{ + content:"" +} +.fa-envelope-o:before{ + content:"" +} +.fa-heart:before{ + content:"" +} +.fa-star:before{ + content:"" +} +.fa-star-o:before{ + content:"" +} +.fa-user:before{ + content:"" +} +.fa-film:before{ + content:"" +} +.fa-th-large:before{ + content:"" +} +.fa-th:before{ + content:"" +} +.fa-th-list:before{ + content:"" +} +.fa-check:before{ + content:"" +} +.fa-close:before,.fa-remove:before,.fa-times:before{ + content:"" +} +.fa-search-plus:before{ + content:"" +} +.fa-search-minus:before{ + content:"" +} +.fa-power-off:before{ + content:"" +} +.fa-signal:before{ + content:"" +} +.fa-cog:before,.fa-gear:before{ + content:"" +} +.fa-trash-o:before{ + content:"" +} +.fa-home:before,.icon-home:before{ + content:"" +} +.fa-file-o:before{ + content:"" +} +.fa-clock-o:before{ + content:"" +} +.fa-road:before{ + content:"" +} +.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{ + content:"" +} +.fa-arrow-circle-o-down:before{ + content:"" +} +.fa-arrow-circle-o-up:before{ + content:"" +} +.fa-inbox:before{ + content:"" +} +.fa-play-circle-o:before{ + content:"" +} +.fa-repeat:before,.fa-rotate-right:before{ + content:"" +} +.fa-refresh:before{ + content:"" +} +.fa-list-alt:before{ + content:"" +} +.fa-lock:before{ + content:"" +} +.fa-flag:before{ + content:"" +} +.fa-headphones:before{ + content:"" +} +.fa-volume-off:before{ + content:"" +} +.fa-volume-down:before{ + content:"" +} +.fa-volume-up:before{ + content:"" +} +.fa-qrcode:before{ + content:"" +} +.fa-barcode:before{ + content:"" +} +.fa-tag:before{ + content:"" +} +.fa-tags:before{ + content:"" +} +.fa-book:before,.icon-book:before{ + content:"" +} +.fa-bookmark:before{ + content:"" +} +.fa-print:before{ + content:"" +} +.fa-camera:before{ + content:"" +} +.fa-font:before{ + content:"" +} +.fa-bold:before{ + content:"" +} +.fa-italic:before{ + content:"" +} +.fa-text-height:before{ + content:"" +} +.fa-text-width:before{ + content:"" +} +.fa-align-left:before{ + content:"" +} +.fa-align-center:before{ + content:"" +} +.fa-align-right:before{ + content:"" +} +.fa-align-justify:before{ + content:"" +} +.fa-list:before{ + content:"" +} +.fa-dedent:before,.fa-outdent:before{ + content:"" +} +.fa-indent:before{ + content:"" +} +.fa-video-camera:before{ + content:"" +} +.fa-image:before,.fa-photo:before,.fa-picture-o:before{ + content:"" +} +.fa-pencil:before{ + content:"" +} +.fa-map-marker:before{ + content:"" +} +.fa-adjust:before{ + content:"" +} +.fa-tint:before{ + content:"" +} +.fa-edit:before,.fa-pencil-square-o:before{ + content:"" +} +.fa-share-square-o:before{ + content:"" +} +.fa-check-square-o:before{ + content:"" +} +.fa-arrows:before{ + content:"" +} +.fa-step-backward:before{ + content:"" +} +.fa-fast-backward:before{ + content:"" +} +.fa-backward:before{ + content:"" +} +.fa-play:before{ + content:"" +} +.fa-pause:before{ + content:"" +} +.fa-stop:before{ + content:"" +} +.fa-forward:before{ + content:"" +} +.fa-fast-forward:before{ + content:"" +} +.fa-step-forward:before{ + content:"" +} +.fa-eject:before{ + content:"" +} +.fa-chevron-left:before{ + content:"" +} +.fa-chevron-right:before{ + content:"" +} +.fa-plus-circle:before{ + content:"" +} +.fa-minus-circle:before{ + content:"" +} +.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{ + content:"" +} +.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{ + content:"" +} +.fa-question-circle:before{ + content:"" +} +.fa-info-circle:before{ + content:"" +} +.fa-crosshairs:before{ + content:"" +} +.fa-times-circle-o:before{ + content:"" +} +.fa-check-circle-o:before{ + content:"" +} +.fa-ban:before{ + content:"" +} +.fa-arrow-left:before{ + content:"" +} +.fa-arrow-right:before{ + content:"" +} +.fa-arrow-up:before{ + content:"" +} +.fa-arrow-down:before{ + content:"" +} +.fa-mail-forward:before,.fa-share:before{ + content:"" +} +.fa-expand:before{ + content:"" +} +.fa-compress:before{ + content:"" +} +.fa-plus:before{ + content:"" +} +.fa-minus:before{ + content:"" +} +.fa-asterisk:before{ + content:"" +} +.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{ + content:"" +} +.fa-gift:before{ + content:"" +} +.fa-leaf:before{ + content:"" +} +.fa-fire:before,.icon-fire:before{ + content:"" +} +.fa-eye:before{ + content:"" +} +.fa-eye-slash:before{ + content:"" +} +.fa-exclamation-triangle:before,.fa-warning:before{ + content:"" +} +.fa-plane:before{ + content:"" +} +.fa-calendar:before{ + content:"" +} +.fa-random:before{ + content:"" +} +.fa-comment:before{ + content:"" +} +.fa-magnet:before{ + content:"" +} +.fa-chevron-up:before{ + content:"" +} +.fa-chevron-down:before{ + content:"" +} +.fa-retweet:before{ + content:"" +} +.fa-shopping-cart:before{ + content:"" +} +.fa-folder:before{ + content:"" +} +.fa-folder-open:before{ + content:"" +} +.fa-arrows-v:before{ + content:"" +} +.fa-arrows-h:before{ + content:"" +} +.fa-bar-chart-o:before,.fa-bar-chart:before{ + content:"" +} +.fa-twitter-square:before{ + content:"" +} +.fa-facebook-square:before{ + content:"" +} +.fa-camera-retro:before{ + content:"" +} +.fa-key:before{ + content:"" +} +.fa-cogs:before,.fa-gears:before{ + content:"" +} +.fa-comments:before{ + content:"" +} +.fa-thumbs-o-up:before{ + content:"" +} +.fa-thumbs-o-down:before{ + content:"" +} +.fa-star-half:before{ + content:"" +} +.fa-heart-o:before{ + content:"" +} +.fa-sign-out:before{ + content:"" +} +.fa-linkedin-square:before{ + content:"" +} +.fa-thumb-tack:before{ + content:"" +} +.fa-external-link:before{ + content:"" +} +.fa-sign-in:before{ + content:"" +} +.fa-trophy:before{ + content:"" +} +.fa-github-square:before{ + content:"" +} +.fa-upload:before{ + content:"" +} +.fa-lemon-o:before{ + content:"" +} +.fa-phone:before{ + content:"" +} +.fa-square-o:before{ + content:"" +} +.fa-bookmark-o:before{ + content:"" +} +.fa-phone-square:before{ + content:"" +} +.fa-twitter:before{ + content:"" +} +.fa-facebook-f:before,.fa-facebook:before{ + content:"" +} +.fa-github:before,.icon-github:before{ + content:"" +} +.fa-unlock:before{ + content:"" +} +.fa-credit-card:before{ + content:"" +} +.fa-feed:before,.fa-rss:before{ + content:"" +} +.fa-hdd-o:before{ + content:"" +} +.fa-bullhorn:before{ + content:"" +} +.fa-bell:before{ + content:"" +} +.fa-certificate:before{ + content:"" +} +.fa-hand-o-right:before{ + content:"" +} +.fa-hand-o-left:before{ + content:"" +} +.fa-hand-o-up:before{ + content:"" +} +.fa-hand-o-down:before{ + content:"" +} +.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{ + content:"" +} +.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{ + content:"" +} +.fa-arrow-circle-up:before{ + content:"" +} +.fa-arrow-circle-down:before{ + content:"" +} +.fa-globe:before{ + content:"" +} +.fa-wrench:before{ + content:"" +} +.fa-tasks:before{ + content:"" +} +.fa-filter:before{ + content:"" +} +.fa-briefcase:before{ + content:"" +} +.fa-arrows-alt:before{ + content:"" +} +.fa-group:before,.fa-users:before{ + content:"" +} +.fa-chain:before,.fa-link:before,.icon-link:before{ + content:"" +} +.fa-cloud:before{ + content:"" +} +.fa-flask:before{ + content:"" +} +.fa-cut:before,.fa-scissors:before{ + content:"" +} +.fa-copy:before,.fa-files-o:before{ + content:"" +} +.fa-paperclip:before{ + content:"" +} +.fa-floppy-o:before,.fa-save:before{ + content:"" +} +.fa-square:before{ + content:"" +} +.fa-bars:before,.fa-navicon:before,.fa-reorder:before{ + content:"" +} +.fa-list-ul:before{ + content:"" +} +.fa-list-ol:before{ + content:"" +} +.fa-strikethrough:before{ + content:"" +} +.fa-underline:before{ + content:"" +} +.fa-table:before{ + content:"" +} +.fa-magic:before{ + content:"" +} +.fa-truck:before{ + content:"" +} +.fa-pinterest:before{ + content:"" +} +.fa-pinterest-square:before{ + content:"" +} +.fa-google-plus-square:before{ + content:"" +} +.fa-google-plus:before{ + content:"" +} +.fa-money:before{ + content:"" +} +.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{ + content:"" +} +.fa-caret-up:before{ + content:"" +} +.fa-caret-left:before{ + content:"" +} +.fa-caret-right:before{ + content:"" +} +.fa-columns:before{ + content:"" +} +.fa-sort:before,.fa-unsorted:before{ + content:"" +} +.fa-sort-desc:before,.fa-sort-down:before{ + content:"" +} +.fa-sort-asc:before,.fa-sort-up:before{ + content:"" +} +.fa-envelope:before{ + content:"" +} +.fa-linkedin:before{ + content:"" +} +.fa-rotate-left:before,.fa-undo:before{ + content:"" +} +.fa-gavel:before,.fa-legal:before{ + content:"" +} +.fa-dashboard:before,.fa-tachometer:before{ + content:"" +} +.fa-comment-o:before{ + content:"" +} +.fa-comments-o:before{ + content:"" +} +.fa-bolt:before,.fa-flash:before{ + content:"" +} +.fa-sitemap:before{ + content:"" +} +.fa-umbrella:before{ + content:"" +} +.fa-clipboard:before,.fa-paste:before{ + content:"" +} +.fa-lightbulb-o:before{ + content:"" +} +.fa-exchange:before{ + content:"" +} +.fa-cloud-download:before{ + content:"" +} +.fa-cloud-upload:before{ + content:"" +} +.fa-user-md:before{ + content:"" +} +.fa-stethoscope:before{ + content:"" +} +.fa-suitcase:before{ + content:"" +} +.fa-bell-o:before{ + content:"" +} +.fa-coffee:before{ + content:"" +} +.fa-cutlery:before{ + content:"" +} +.fa-file-text-o:before{ + content:"" +} +.fa-building-o:before{ + content:"" +} +.fa-hospital-o:before{ + content:"" +} +.fa-ambulance:before{ + content:"" +} +.fa-medkit:before{ + content:"" +} +.fa-fighter-jet:before{ + content:"" +} +.fa-beer:before{ + content:"" +} +.fa-h-square:before{ + content:"" +} +.fa-plus-square:before{ + content:"" +} +.fa-angle-double-left:before{ + content:"" +} +.fa-angle-double-right:before{ + content:"" +} +.fa-angle-double-up:before{ + content:"" +} +.fa-angle-double-down:before{ + content:"" +} +.fa-angle-left:before{ + content:"" +} +.fa-angle-right:before{ + content:"" +} +.fa-angle-up:before{ + content:"" +} +.fa-angle-down:before{ + content:"" +} +.fa-desktop:before{ + content:"" +} +.fa-laptop:before{ + content:"" +} +.fa-tablet:before{ + content:"" +} +.fa-mobile-phone:before,.fa-mobile:before{ + content:"" +} +.fa-circle-o:before{ + content:"" +} +.fa-quote-left:before{ + content:"" +} +.fa-quote-right:before{ + content:"" +} +.fa-spinner:before{ + content:"" +} +.fa-circle:before{ + content:"" +} +.fa-mail-reply:before,.fa-reply:before{ + content:"" +} +.fa-github-alt:before{ + content:"" +} +.fa-folder-o:before{ + content:"" +} +.fa-folder-open-o:before{ + content:"" +} +.fa-smile-o:before{ + content:"" +} +.fa-frown-o:before{ + content:"" +} +.fa-meh-o:before{ + content:"" +} +.fa-gamepad:before{ + content:"" +} +.fa-keyboard-o:before{ + content:"" +} +.fa-flag-o:before{ + content:"" +} +.fa-flag-checkered:before{ + content:"" +} +.fa-terminal:before{ + content:"" +} +.fa-code:before{ + content:"" +} +.fa-mail-reply-all:before,.fa-reply-all:before{ + content:"" +} +.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{ + content:"" +} +.fa-location-arrow:before{ + content:"" +} +.fa-crop:before{ + content:"" +} +.fa-code-fork:before{ + content:"" +} +.fa-chain-broken:before,.fa-unlink:before{ + content:"" +} +.fa-question:before{ + content:"" +} +.fa-info:before{ + content:"" +} +.fa-exclamation:before{ + content:"" +} +.fa-superscript:before{ + content:"" +} +.fa-subscript:before{ + content:"" +} +.fa-eraser:before{ + content:"" +} +.fa-puzzle-piece:before{ + content:"" +} +.fa-microphone:before{ + content:"" +} +.fa-microphone-slash:before{ + content:"" +} +.fa-shield:before{ + content:"" +} +.fa-calendar-o:before{ + content:"" +} +.fa-fire-extinguisher:before{ + content:"" +} +.fa-rocket:before{ + content:"" +} +.fa-maxcdn:before{ + content:"" +} +.fa-chevron-circle-left:before{ + content:"" +} +.fa-chevron-circle-right:before{ + content:"" +} +.fa-chevron-circle-up:before{ + content:"" +} +.fa-chevron-circle-down:before{ + content:"" +} +.fa-html5:before{ + content:"" +} +.fa-css3:before{ + content:"" +} +.fa-anchor:before{ + content:"" +} +.fa-unlock-alt:before{ + content:"" +} +.fa-bullseye:before{ + content:"" +} +.fa-ellipsis-h:before{ + content:"" +} +.fa-ellipsis-v:before{ + content:"" +} +.fa-rss-square:before{ + content:"" +} +.fa-play-circle:before{ + content:"" +} +.fa-ticket:before{ + content:"" +} +.fa-minus-square:before{ + content:"" +} +.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{ + content:"" +} +.fa-level-up:before{ + content:"" +} +.fa-level-down:before{ + content:"" +} +.fa-check-square:before{ + content:"" +} +.fa-pencil-square:before{ + content:"" +} +.fa-external-link-square:before{ + content:"" +} +.fa-share-square:before{ + content:"" +} +.fa-compass:before{ + content:"" +} +.fa-caret-square-o-down:before,.fa-toggle-down:before{ + content:"" +} +.fa-caret-square-o-up:before,.fa-toggle-up:before{ + content:"" +} +.fa-caret-square-o-right:before,.fa-toggle-right:before{ + content:"" +} +.fa-eur:before,.fa-euro:before{ + content:"" +} +.fa-gbp:before{ + content:"" +} +.fa-dollar:before,.fa-usd:before{ + content:"" +} +.fa-inr:before,.fa-rupee:before{ + content:"" +} +.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{ + content:"" +} +.fa-rouble:before,.fa-rub:before,.fa-ruble:before{ + content:"" +} +.fa-krw:before,.fa-won:before{ + content:"" +} +.fa-bitcoin:before,.fa-btc:before{ + content:"" +} +.fa-file:before{ + content:"" +} +.fa-file-text:before{ + content:"" +} +.fa-sort-alpha-asc:before{ + content:"" +} +.fa-sort-alpha-desc:before{ + content:"" +} +.fa-sort-amount-asc:before{ + content:"" +} +.fa-sort-amount-desc:before{ + content:"" +} +.fa-sort-numeric-asc:before{ + content:"" +} +.fa-sort-numeric-desc:before{ + content:"" +} +.fa-thumbs-up:before{ + content:"" +} +.fa-thumbs-down:before{ + content:"" +} +.fa-youtube-square:before{ + content:"" +} +.fa-youtube:before{ + content:"" +} +.fa-xing:before{ + content:"" +} +.fa-xing-square:before{ + content:"" +} +.fa-youtube-play:before{ + content:"" +} +.fa-dropbox:before{ + content:"" +} +.fa-stack-overflow:before{ + content:"" +} +.fa-instagram:before{ + content:"" +} +.fa-flickr:before{ + content:"" +} +.fa-adn:before{ + content:"" +} +.fa-bitbucket:before,.icon-bitbucket:before{ + content:"" +} +.fa-bitbucket-square:before{ + content:"" +} +.fa-tumblr:before{ + content:"" +} +.fa-tumblr-square:before{ + content:"" +} +.fa-long-arrow-down:before{ + content:"" +} +.fa-long-arrow-up:before{ + content:"" +} +.fa-long-arrow-left:before{ + content:"" +} +.fa-long-arrow-right:before{ + content:"" +} +.fa-apple:before{ + content:"" +} +.fa-windows:before{ + content:"" +} +.fa-android:before{ + content:"" +} +.fa-linux:before{ + content:"" +} +.fa-dribbble:before{ + content:"" +} +.fa-skype:before{ + content:"" +} +.fa-foursquare:before{ + content:"" +} +.fa-trello:before{ + content:"" +} +.fa-female:before{ + content:"" +} +.fa-male:before{ + content:"" +} +.fa-gittip:before,.fa-gratipay:before{ + content:"" +} +.fa-sun-o:before{ + content:"" +} +.fa-moon-o:before{ + content:"" +} +.fa-archive:before{ + content:"" +} +.fa-bug:before{ + content:"" +} +.fa-vk:before{ + content:"" +} +.fa-weibo:before{ + content:"" +} +.fa-renren:before{ + content:"" +} +.fa-pagelines:before{ + content:"" +} +.fa-stack-exchange:before{ + content:"" +} +.fa-arrow-circle-o-right:before{ + content:"" +} +.fa-arrow-circle-o-left:before{ + content:"" +} +.fa-caret-square-o-left:before,.fa-toggle-left:before{ + content:"" +} +.fa-dot-circle-o:before{ + content:"" +} +.fa-wheelchair:before{ + content:"" +} +.fa-vimeo-square:before{ + content:"" +} +.fa-try:before,.fa-turkish-lira:before{ + content:"" +} +.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{ + content:"" +} +.fa-space-shuttle:before{ + content:"" +} +.fa-slack:before{ + content:"" +} +.fa-envelope-square:before{ + content:"" +} +.fa-wordpress:before{ + content:"" +} +.fa-openid:before{ + content:"" +} +.fa-bank:before,.fa-institution:before,.fa-university:before{ + content:"" +} +.fa-graduation-cap:before,.fa-mortar-board:before{ + content:"" +} +.fa-yahoo:before{ + content:"" +} +.fa-google:before{ + content:"" +} +.fa-reddit:before{ + content:"" +} +.fa-reddit-square:before{ + content:"" +} +.fa-stumbleupon-circle:before{ + content:"" +} +.fa-stumbleupon:before{ + content:"" +} +.fa-delicious:before{ + content:"" +} +.fa-digg:before{ + content:"" +} +.fa-pied-piper-pp:before{ + content:"" +} +.fa-pied-piper-alt:before{ + content:"" +} +.fa-drupal:before{ + content:"" +} +.fa-joomla:before{ + content:"" +} +.fa-language:before{ + content:"" +} +.fa-fax:before{ + content:"" +} +.fa-building:before{ + content:"" +} +.fa-child:before{ + content:"" +} +.fa-paw:before{ + content:"" +} +.fa-spoon:before{ + content:"" +} +.fa-cube:before{ + content:"" +} +.fa-cubes:before{ + content:"" +} +.fa-behance:before{ + content:"" +} +.fa-behance-square:before{ + content:"" +} +.fa-steam:before{ + content:"" +} +.fa-steam-square:before{ + content:"" +} +.fa-recycle:before{ + content:"" +} +.fa-automobile:before,.fa-car:before{ + content:"" +} +.fa-cab:before,.fa-taxi:before{ + content:"" +} +.fa-tree:before{ + content:"" +} +.fa-spotify:before{ + content:"" +} +.fa-deviantart:before{ + content:"" +} +.fa-soundcloud:before{ + content:"" +} +.fa-database:before{ + content:"" +} +.fa-file-pdf-o:before{ + content:"" +} +.fa-file-word-o:before{ + content:"" +} +.fa-file-excel-o:before{ + content:"" +} +.fa-file-powerpoint-o:before{ + content:"" +} +.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{ + content:"" +} +.fa-file-archive-o:before,.fa-file-zip-o:before{ + content:"" +} +.fa-file-audio-o:before,.fa-file-sound-o:before{ + content:"" +} +.fa-file-movie-o:before,.fa-file-video-o:before{ + content:"" +} +.fa-file-code-o:before{ + content:"" +} +.fa-vine:before{ + content:"" +} +.fa-codepen:before{ + content:"" +} +.fa-jsfiddle:before{ + content:"" +} +.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{ + content:"" +} +.fa-circle-o-notch:before{ + content:"" +} +.fa-ra:before,.fa-rebel:before,.fa-resistance:before{ + content:"" +} +.fa-empire:before,.fa-ge:before{ + content:"" +} +.fa-git-square:before{ + content:"" +} +.fa-git:before{ + content:"" +} +.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{ + content:"" +} +.fa-tencent-weibo:before{ + content:"" +} +.fa-qq:before{ + content:"" +} +.fa-wechat:before,.fa-weixin:before{ + content:"" +} +.fa-paper-plane:before,.fa-send:before{ + content:"" +} +.fa-paper-plane-o:before,.fa-send-o:before{ + content:"" +} +.fa-history:before{ + content:"" +} +.fa-circle-thin:before{ + content:"" +} +.fa-header:before{ + content:"" +} +.fa-paragraph:before{ + content:"" +} +.fa-sliders:before{ + content:"" +} +.fa-share-alt:before{ + content:"" +} +.fa-share-alt-square:before{ + content:"" +} +.fa-bomb:before{ + content:"" +} +.fa-futbol-o:before,.fa-soccer-ball-o:before{ + content:"" +} +.fa-tty:before{ + content:"" +} +.fa-binoculars:before{ + content:"" +} +.fa-plug:before{ + content:"" +} +.fa-slideshare:before{ + content:"" +} +.fa-twitch:before{ + content:"" +} +.fa-yelp:before{ + content:"" +} +.fa-newspaper-o:before{ + content:"" +} +.fa-wifi:before{ + content:"" +} +.fa-calculator:before{ + content:"" +} +.fa-paypal:before{ + content:"" +} +.fa-google-wallet:before{ + content:"" +} +.fa-cc-visa:before{ + content:"" +} +.fa-cc-mastercard:before{ + content:"" +} +.fa-cc-discover:before{ + content:"" +} +.fa-cc-amex:before{ + content:"" +} +.fa-cc-paypal:before{ + content:"" +} +.fa-cc-stripe:before{ + content:"" +} +.fa-bell-slash:before{ + content:"" +} +.fa-bell-slash-o:before{ + content:"" +} +.fa-trash:before{ + content:"" +} +.fa-copyright:before{ + content:"" +} +.fa-at:before{ + content:"" +} +.fa-eyedropper:before{ + content:"" +} +.fa-paint-brush:before{ + content:"" +} +.fa-birthday-cake:before{ + content:"" +} +.fa-area-chart:before{ + content:"" +} +.fa-pie-chart:before{ + content:"" +} +.fa-line-chart:before{ + content:"" +} +.fa-lastfm:before{ + content:"" +} +.fa-lastfm-square:before{ + content:"" +} +.fa-toggle-off:before{ + content:"" +} +.fa-toggle-on:before{ + content:"" +} +.fa-bicycle:before{ + content:"" +} +.fa-bus:before{ + content:"" +} +.fa-ioxhost:before{ + content:"" +} +.fa-angellist:before{ + content:"" +} +.fa-cc:before{ + content:"" +} +.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{ + content:"" +} +.fa-meanpath:before{ + content:"" +} +.fa-buysellads:before{ + content:"" +} +.fa-connectdevelop:before{ + content:"" +} +.fa-dashcube:before{ + content:"" +} +.fa-forumbee:before{ + content:"" +} +.fa-leanpub:before{ + content:"" +} +.fa-sellsy:before{ + content:"" +} +.fa-shirtsinbulk:before{ + content:"" +} +.fa-simplybuilt:before{ + content:"" +} +.fa-skyatlas:before{ + content:"" +} +.fa-cart-plus:before{ + content:"" +} +.fa-cart-arrow-down:before{ + content:"" +} +.fa-diamond:before{ + content:"" +} +.fa-ship:before{ + content:"" +} +.fa-user-secret:before{ + content:"" +} +.fa-motorcycle:before{ + content:"" +} +.fa-street-view:before{ + content:"" +} +.fa-heartbeat:before{ + content:"" +} +.fa-venus:before{ + content:"" +} +.fa-mars:before{ + content:"" +} +.fa-mercury:before{ + content:"" +} +.fa-intersex:before,.fa-transgender:before{ + content:"" +} +.fa-transgender-alt:before{ + content:"" +} +.fa-venus-double:before{ + content:"" +} +.fa-mars-double:before{ + content:"" +} +.fa-venus-mars:before{ + content:"" +} +.fa-mars-stroke:before{ + content:"" +} +.fa-mars-stroke-v:before{ + content:"" +} +.fa-mars-stroke-h:before{ + content:"" +} +.fa-neuter:before{ + content:"" +} +.fa-genderless:before{ + content:"" +} +.fa-facebook-official:before{ + content:"" +} +.fa-pinterest-p:before{ + content:"" +} +.fa-whatsapp:before{ + content:"" +} +.fa-server:before{ + content:"" +} +.fa-user-plus:before{ + content:"" +} +.fa-user-times:before{ + content:"" +} +.fa-bed:before,.fa-hotel:before{ + content:"" +} +.fa-viacoin:before{ + content:"" +} +.fa-train:before{ + content:"" +} +.fa-subway:before{ + content:"" +} +.fa-medium:before{ + content:"" +} +.fa-y-combinator:before,.fa-yc:before{ + content:"" +} +.fa-optin-monster:before{ + content:"" +} +.fa-opencart:before{ + content:"" +} +.fa-expeditedssl:before{ + content:"" +} +.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{ + content:"" +} +.fa-battery-3:before,.fa-battery-three-quarters:before{ + content:"" +} +.fa-battery-2:before,.fa-battery-half:before{ + content:"" +} +.fa-battery-1:before,.fa-battery-quarter:before{ + content:"" +} +.fa-battery-0:before,.fa-battery-empty:before{ + content:"" +} +.fa-mouse-pointer:before{ + content:"" +} +.fa-i-cursor:before{ + content:"" +} +.fa-object-group:before{ + content:"" +} +.fa-object-ungroup:before{ + content:"" +} +.fa-sticky-note:before{ + content:"" +} +.fa-sticky-note-o:before{ + content:"" +} +.fa-cc-jcb:before{ + content:"" +} +.fa-cc-diners-club:before{ + content:"" +} +.fa-clone:before{ + content:"" +} +.fa-balance-scale:before{ + content:"" +} +.fa-hourglass-o:before{ + content:"" +} +.fa-hourglass-1:before,.fa-hourglass-start:before{ + content:"" +} +.fa-hourglass-2:before,.fa-hourglass-half:before{ + content:"" +} +.fa-hourglass-3:before,.fa-hourglass-end:before{ + content:"" +} +.fa-hourglass:before{ + content:"" +} +.fa-hand-grab-o:before,.fa-hand-rock-o:before{ + content:"" +} +.fa-hand-paper-o:before,.fa-hand-stop-o:before{ + content:"" +} +.fa-hand-scissors-o:before{ + content:"" +} +.fa-hand-lizard-o:before{ + content:"" +} +.fa-hand-spock-o:before{ + content:"" +} +.fa-hand-pointer-o:before{ + content:"" +} +.fa-hand-peace-o:before{ + content:"" +} +.fa-trademark:before{ + content:"" +} +.fa-registered:before{ + content:"" +} +.fa-creative-commons:before{ + content:"" +} +.fa-gg:before{ + content:"" +} +.fa-gg-circle:before{ + content:"" +} +.fa-tripadvisor:before{ + content:"" +} +.fa-odnoklassniki:before{ + content:"" +} +.fa-odnoklassniki-square:before{ + content:"" +} +.fa-get-pocket:before{ + content:"" +} +.fa-wikipedia-w:before{ + content:"" +} +.fa-safari:before{ + content:"" +} +.fa-chrome:before{ + content:"" +} +.fa-firefox:before{ + content:"" +} +.fa-opera:before{ + content:"" +} +.fa-internet-explorer:before{ + content:"" +} +.fa-television:before,.fa-tv:before{ + content:"" +} +.fa-contao:before{ + content:"" +} +.fa-500px:before{ + content:"" +} +.fa-amazon:before{ + content:"" +} +.fa-calendar-plus-o:before{ + content:"" +} +.fa-calendar-minus-o:before{ + content:"" +} +.fa-calendar-times-o:before{ + content:"" +} +.fa-calendar-check-o:before{ + content:"" +} +.fa-industry:before{ + content:"" +} +.fa-map-pin:before{ + content:"" +} +.fa-map-signs:before{ + content:"" +} +.fa-map-o:before{ + content:"" +} +.fa-map:before{ + content:"" +} +.fa-commenting:before{ + content:"" +} +.fa-commenting-o:before{ + content:"" +} +.fa-houzz:before{ + content:"" +} +.fa-vimeo:before{ + content:"" +} +.fa-black-tie:before{ + content:"" +} +.fa-fonticons:before{ + content:"" +} +.fa-reddit-alien:before{ + content:"" +} +.fa-edge:before{ + content:"" +} +.fa-credit-card-alt:before{ + content:"" +} +.fa-codiepie:before{ + content:"" +} +.fa-modx:before{ + content:"" +} +.fa-fort-awesome:before{ + content:"" +} +.fa-usb:before{ + content:"" +} +.fa-product-hunt:before{ + content:"" +} +.fa-mixcloud:before{ + content:"" +} +.fa-scribd:before{ + content:"" +} +.fa-pause-circle:before{ + content:"" +} +.fa-pause-circle-o:before{ + content:"" +} +.fa-stop-circle:before{ + content:"" +} +.fa-stop-circle-o:before{ + content:"" +} +.fa-shopping-bag:before{ + content:"" +} +.fa-shopping-basket:before{ + content:"" +} +.fa-hashtag:before{ + content:"" +} +.fa-bluetooth:before{ + content:"" +} +.fa-bluetooth-b:before{ + content:"" +} +.fa-percent:before{ + content:"" +} +.fa-gitlab:before,.icon-gitlab:before{ + content:"" +} +.fa-wpbeginner:before{ + content:"" +} +.fa-wpforms:before{ + content:"" +} +.fa-envira:before{ + content:"" +} +.fa-universal-access:before{ + content:"" +} +.fa-wheelchair-alt:before{ + content:"" +} +.fa-question-circle-o:before{ + content:"" +} +.fa-blind:before{ + content:"" +} +.fa-audio-description:before{ + content:"" +} +.fa-volume-control-phone:before{ + content:"" +} +.fa-braille:before{ + content:"" +} +.fa-assistive-listening-systems:before{ + content:"" +} +.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{ + content:"" +} +.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{ + content:"" +} +.fa-glide:before{ + content:"" +} +.fa-glide-g:before{ + content:"" +} +.fa-sign-language:before,.fa-signing:before{ + content:"" +} +.fa-low-vision:before{ + content:"" +} +.fa-viadeo:before{ + content:"" +} +.fa-viadeo-square:before{ + content:"" +} +.fa-snapchat:before{ + content:"" +} +.fa-snapchat-ghost:before{ + content:"" +} +.fa-snapchat-square:before{ + content:"" +} +.fa-pied-piper:before{ + content:"" +} +.fa-first-order:before{ + content:"" +} +.fa-yoast:before{ + content:"" +} +.fa-themeisle:before{ + content:"" +} +.fa-google-plus-circle:before,.fa-google-plus-official:before{ + content:"" +} +.fa-fa:before,.fa-font-awesome:before{ + content:"" +} +.fa-handshake-o:before{ + content:"" +} +.fa-envelope-open:before{ + content:"" +} +.fa-envelope-open-o:before{ + content:"" +} +.fa-linode:before{ + content:"" +} +.fa-address-book:before{ + content:"" +} +.fa-address-book-o:before{ + content:"" +} +.fa-address-card:before,.fa-vcard:before{ + content:"" +} +.fa-address-card-o:before,.fa-vcard-o:before{ + content:"" +} +.fa-user-circle:before{ + content:"" +} +.fa-user-circle-o:before{ + content:"" +} +.fa-user-o:before{ + content:"" +} +.fa-id-badge:before{ + content:"" +} +.fa-drivers-license:before,.fa-id-card:before{ + content:"" +} +.fa-drivers-license-o:before,.fa-id-card-o:before{ + content:"" +} +.fa-quora:before{ + content:"" +} +.fa-free-code-camp:before{ + content:"" +} +.fa-telegram:before{ + content:"" +} +.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{ + content:"" +} +.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{ + content:"" +} +.fa-thermometer-2:before,.fa-thermometer-half:before{ + content:"" +} +.fa-thermometer-1:before,.fa-thermometer-quarter:before{ + content:"" +} +.fa-thermometer-0:before,.fa-thermometer-empty:before{ + content:"" +} +.fa-shower:before{ + content:"" +} +.fa-bath:before,.fa-bathtub:before,.fa-s15:before{ + content:"" +} +.fa-podcast:before{ + content:"" +} +.fa-window-maximize:before{ + content:"" +} +.fa-window-minimize:before{ + content:"" +} +.fa-window-restore:before{ + content:"" +} +.fa-times-rectangle:before,.fa-window-close:before{ + content:"" +} +.fa-times-rectangle-o:before,.fa-window-close-o:before{ + content:"" +} +.fa-bandcamp:before{ + content:"" +} +.fa-grav:before{ + content:"" +} +.fa-etsy:before{ + content:"" +} +.fa-imdb:before{ + content:"" +} +.fa-ravelry:before{ + content:"" +} +.fa-eercast:before{ + content:"" +} +.fa-microchip:before{ + content:"" +} +.fa-snowflake-o:before{ + content:"" +} +.fa-superpowers:before{ + content:"" +} +.fa-wpexplorer:before{ + content:"" +} +.fa-meetup:before{ + content:"" +} +.sr-only{ + position:absolute; + width:1px; + height:1px; + padding:0; + margin:-1px; + overflow:hidden; + clip:rect(0,0,0,0); + border:0 +} +.sr-only-focusable:active,.sr-only-focusable:focus{ + position:static; + width:auto; + height:auto; + margin:0; + overflow:visible; + clip:auto +} +.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{ + font-family:inherit +} +.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{ + font-family:FontAwesome; + display:inline-block; + font-style:normal; + font-weight:400; + line-height:1; + text-decoration:inherit +} +.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{ + display:inline-block; + text-decoration:inherit +} +.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{ + display:inline +} +.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{ + line-height:.9em +} +.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{ + display:inline-block +} +.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{ + opacity:.5; + -webkit-transition:opacity .05s ease-in; + -moz-transition:opacity .05s ease-in; + transition:opacity .05s ease-in +} +.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{ + opacity:1 +} +.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{ + font-size:14px; + vertical-align:-15% +} +.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{ + padding:12px; + line-height:24px; + margin-bottom:24px; + background:#e7f2fa +} +.rst-content .admonition-title,.wy-alert-title{ + font-weight:700; + display:block; + color:#fff; + background:#6ab0de; + padding:6px 12px; + margin:-12px -12px 12px +} +.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{ + background:#fdf3f2 +} +.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{ + background:#f29f97 +} +.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{ + background:#ffedcc +} +.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{ + background:#f0b37e +} +.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{ + background:#e7f2fa +} +.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{ + background:#6ab0de +} +.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{ + background:#dbfaf4 +} +.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{ + background:#1abc9c +} +.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{ + background:#f3f6f6 +} +.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{ + color:#404040; + background:#e1e4e5 +} +.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{ + color:#2980b9 +} +.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{ + margin-bottom:0 +} +.wy-tray-container{ + position:fixed; + bottom:0; + left:0; + z-index:600 +} +.wy-tray-container li{ + display:block; + width:300px; + background:transparent; + color:#fff; + text-align:center; + box-shadow:0 5px 5px 0 rgba(0,0,0,.1); + padding:0 24px; + min-width:20%; + opacity:0; + height:0; + line-height:56px; + overflow:hidden; + -webkit-transition:all .3s ease-in; + -moz-transition:all .3s ease-in; + transition:all .3s ease-in +} +.wy-tray-container li.wy-tray-item-success{ + background:#27ae60 +} +.wy-tray-container li.wy-tray-item-info{ + background:#2980b9 +} +.wy-tray-container li.wy-tray-item-warning{ + background:#e67e22 +} +.wy-tray-container li.wy-tray-item-danger{ + background:#e74c3c +} +.wy-tray-container li.on{ + opacity:1; + height:56px +} +@media screen and (max-width:768px){ + .wy-tray-container{ + bottom:auto; + top:0; + width:100% + } + .wy-tray-container li{ + width:100% + } +} +button{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle; + cursor:pointer; + line-height:normal; + -webkit-appearance:button; + *overflow:visible +} +button::-moz-focus-inner,input::-moz-focus-inner{ + border:0; + padding:0 +} +button[disabled]{ + cursor:default +} +.btn{ + display:inline-block; + border-radius:2px; + line-height:normal; + white-space:nowrap; + text-align:center; + cursor:pointer; + font-size:100%; + padding:6px 12px 8px; + color:#fff; + border:1px solid rgba(0,0,0,.1); + background-color:#27ae60; + text-decoration:none; + font-weight:400; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1); + outline-none:false; + vertical-align:middle; + *display:inline; + zoom:1; + -webkit-user-drag:none; + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; + -webkit-transition:all .1s linear; + -moz-transition:all .1s linear; + transition:all .1s linear +} +.btn-hover{ + background:#2e8ece; + color:#fff +} +.btn:hover{ + background:#2cc36b; + color:#fff +} +.btn:focus{ + background:#2cc36b; + outline:0 +} +.btn:active{ + box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1); + padding:8px 12px 6px +} +.btn:visited{ + color:#fff +} +.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:.4; + cursor:not-allowed; + box-shadow:none +} +.btn::-moz-focus-inner{ + padding:0; + border:0 +} +.btn-small{ + font-size:80% +} +.btn-info{ + background-color:#2980b9!important +} +.btn-info:hover{ + background-color:#2e8ece!important +} +.btn-neutral{ + background-color:#f3f6f6!important; + color:#404040!important +} +.btn-neutral:hover{ + background-color:#e5ebeb!important; + color:#404040 +} +.btn-neutral:visited{ + color:#404040!important +} +.btn-success{ + background-color:#27ae60!important +} +.btn-success:hover{ + background-color:#295!important +} +.btn-danger{ + background-color:#e74c3c!important +} +.btn-danger:hover{ + background-color:#ea6153!important +} +.btn-warning{ + background-color:#e67e22!important +} +.btn-warning:hover{ + background-color:#e98b39!important +} +.btn-invert{ + background-color:#222 +} +.btn-invert:hover{ + background-color:#2f2f2f!important +} +.btn-link{ + background-color:transparent!important; + color:#2980b9; + box-shadow:none; + border-color:transparent!important +} +.btn-link:active,.btn-link:hover{ + background-color:transparent!important; + color:#409ad5!important; + box-shadow:none +} +.btn-link:visited{ + color:#9b59b6 +} +.wy-btn-group .btn,.wy-control .btn{ + vertical-align:middle +} +.wy-btn-group{ + margin-bottom:24px; + *zoom:1 +} +.wy-btn-group:after,.wy-btn-group:before{ + display:table; + content:"" +} +.wy-btn-group:after{ + clear:both +} +.wy-dropdown{ + position:relative; + display:inline-block +} +.wy-dropdown-active .wy-dropdown-menu{ + display:block +} +.wy-dropdown-menu{ + position:absolute; + left:0; + display:none; + float:left; + top:100%; + min-width:100%; + background:#fcfcfc; + z-index:100; + border:1px solid #cfd7dd; + box-shadow:0 2px 2px 0 rgba(0,0,0,.1); + padding:12px +} +.wy-dropdown-menu>dd>a{ + display:block; + clear:both; + color:#404040; + white-space:nowrap; + font-size:90%; + padding:0 12px; + cursor:pointer +} +.wy-dropdown-menu>dd>a:hover{ + background:#2980b9; + color:#fff +} +.wy-dropdown-menu>dd.divider{ + border-top:1px solid #cfd7dd; + margin:6px 0 +} +.wy-dropdown-menu>dd.search{ + padding-bottom:12px +} +.wy-dropdown-menu>dd.search input[type=search]{ + width:100% +} +.wy-dropdown-menu>dd.call-to-action{ + background:#e3e3e3; + text-transform:uppercase; + font-weight:500; + font-size:80% +} +.wy-dropdown-menu>dd.call-to-action:hover{ + background:#e3e3e3 +} +.wy-dropdown-menu>dd.call-to-action .btn{ + color:#fff +} +.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{ + bottom:100%; + top:auto; + left:auto; + right:0 +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{ + background:#fcfcfc; + margin-top:2px +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{ + padding:6px 12px +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{ + background:#2980b9; + color:#fff +} +.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{ + right:0; + left:auto; + text-align:right +} +.wy-dropdown-arrow:before{ + content:" "; + border-bottom:5px solid #f5f5f5; + border-left:5px solid transparent; + border-right:5px solid transparent; + position:absolute; + display:block; + top:-4px; + left:50%; + margin-left:-3px +} +.wy-dropdown-arrow.wy-dropdown-arrow-left:before{ + left:11px +} +.wy-form-stacked select{ + display:block +} +.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle +} +.wy-form-aligned .wy-control-group>label{ + display:inline-block; + vertical-align:middle; + width:10em; + margin:6px 12px 0 0; + float:left +} +.wy-form-aligned .wy-control{ + float:left +} +.wy-form-aligned .wy-control label{ + display:block +} +.wy-form-aligned .wy-control select{ + margin-top:6px +} +fieldset{ + margin:0 +} +fieldset,legend{ + border:0; + padding:0 +} +legend{ + width:100%; + white-space:normal; + margin-bottom:24px; + font-size:150%; + *margin-left:-7px +} +label,legend{ + display:block +} +label{ + margin:0 0 .3125em; + color:#333; + font-size:90% +} +input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle +} +.wy-control-group{ + margin-bottom:24px; + max-width:1200px; + margin-left:auto; + margin-right:auto; + *zoom:1 +} +.wy-control-group:after,.wy-control-group:before{ + display:table; + content:"" +} +.wy-control-group:after{ + clear:both +} +.wy-control-group.wy-control-group-required>label:after{ + content:" *"; + color:#e74c3c +} +.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{ + padding-bottom:12px +} +.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{ + width:100% +} +.wy-control-group .wy-form-full{ + float:left; + display:block; + width:100%; + margin-right:0 +} +.wy-control-group .wy-form-full:last-child{ + margin-right:0 +} +.wy-control-group .wy-form-halves{ + float:left; + display:block; + margin-right:2.35765%; + width:48.82117% +} +.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){ + margin-right:0 +} +.wy-control-group .wy-form-halves:nth-of-type(odd){ + clear:left +} +.wy-control-group .wy-form-thirds{ + float:left; + display:block; + margin-right:2.35765%; + width:31.76157% +} +.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){ + margin-right:0 +} +.wy-control-group .wy-form-thirds:nth-of-type(3n+1){ + clear:left +} +.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{ + margin:6px 0 0; + font-size:90% +} +.wy-control-no-input{ + display:inline-block +} +.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{ + width:100% +} +.wy-form-message-inline{ + padding-left:.3em; + color:#666; + font-size:90% +} +.wy-form-message{ + display:block; + color:#999; + font-size:70%; + margin-top:.3125em; + font-style:italic +} +.wy-form-message p{ + font-size:inherit; + font-style:italic; + margin-bottom:6px +} +.wy-form-message p:last-child{ + margin-bottom:0 +} +input{ + line-height:normal +} +input[type=button],input[type=reset],input[type=submit]{ + -webkit-appearance:button; + cursor:pointer; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + *overflow:visible +} +input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{ + -webkit-appearance:none; + padding:6px; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + box-shadow:inset 0 1px 3px #ddd; + border-radius:0; + -webkit-transition:border .3s linear; + -moz-transition:border .3s linear; + transition:border .3s linear +} +input[type=datetime-local]{ + padding:.34375em .625em +} +input[disabled]{ + cursor:default +} +input[type=checkbox],input[type=radio]{ + padding:0; + margin-right:.3125em; + *height:13px; + *width:13px +} +input[type=checkbox],input[type=radio],input[type=search]{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box +} +input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{ + -webkit-appearance:none +} +input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{ + outline:0; + outline:thin dotted\9; + border-color:#333 +} +input.no-focus:focus{ + border-color:#ccc!important +} +input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{ + outline:thin dotted #333; + outline:1px auto #129fea +} +input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{ + cursor:not-allowed; + background-color:#fafafa +} +input:focus:invalid,select:focus:invalid,textarea:focus:invalid{ + color:#e74c3c; + border:1px solid #e74c3c +} +input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{ + border-color:#e74c3c +} +input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{ + outline-color:#e74c3c +} +input.wy-input-large{ + padding:12px; + font-size:100% +} +textarea{ + overflow:auto; + vertical-align:top; + width:100%; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif +} +select,textarea{ + padding:.5em .625em; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + box-shadow:inset 0 1px 3px #ddd; + -webkit-transition:border .3s linear; + -moz-transition:border .3s linear; + transition:border .3s linear +} +select{ + border:1px solid #ccc; + background-color:#fff +} +select[multiple]{ + height:auto +} +select:focus,textarea:focus{ + outline:0 +} +input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{ + cursor:not-allowed; + background-color:#fafafa +} +input[type=checkbox][disabled],input[type=radio][disabled]{ + cursor:not-allowed +} +.wy-checkbox,.wy-radio{ + margin:6px 0; + color:#404040; + display:block +} +.wy-checkbox input,.wy-radio input{ + vertical-align:baseline +} +.wy-form-message-inline{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle +} +.wy-input-prefix,.wy-input-suffix{ + white-space:nowrap; + padding:6px +} +.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{ + line-height:27px; + padding:0 8px; + display:inline-block; + font-size:80%; + background-color:#f3f6f6; + border:1px solid #ccc; + color:#999 +} +.wy-input-suffix .wy-input-context{ + border-left:0 +} +.wy-input-prefix .wy-input-context{ + border-right:0 +} +.wy-switch{ + position:relative; + display:block; + height:24px; + margin-top:12px; + cursor:pointer +} +.wy-switch:before{ + left:0; + top:0; + width:36px; + height:12px; + background:#ccc +} +.wy-switch:after,.wy-switch:before{ + position:absolute; + content:""; + display:block; + border-radius:4px; + -webkit-transition:all .2s ease-in-out; + -moz-transition:all .2s ease-in-out; + transition:all .2s ease-in-out +} +.wy-switch:after{ + width:18px; + height:18px; + background:#999; + left:-3px; + top:-3px +} +.wy-switch span{ + position:absolute; + left:48px; + display:block; + font-size:12px; + color:#ccc; + line-height:1 +} +.wy-switch.active:before{ + background:#1e8449 +} +.wy-switch.active:after{ + left:24px; + background:#27ae60 +} +.wy-switch.disabled{ + cursor:not-allowed; + opacity:.8 +} +.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{ + color:#e74c3c +} +.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{ + border:1px solid #e74c3c +} +.wy-inline-validate{ + white-space:nowrap +} +.wy-inline-validate .wy-input-context{ + padding:.5em .625em; + display:inline-block; + font-size:80% +} +.wy-inline-validate.wy-inline-validate-success .wy-input-context{ + color:#27ae60 +} +.wy-inline-validate.wy-inline-validate-danger .wy-input-context{ + color:#e74c3c +} +.wy-inline-validate.wy-inline-validate-warning .wy-input-context{ + color:#e67e22 +} +.wy-inline-validate.wy-inline-validate-info .wy-input-context{ + color:#2980b9 +} +.rotate-90{ + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -ms-transform:rotate(90deg); + -o-transform:rotate(90deg); + transform:rotate(90deg) +} +.rotate-180{ + -webkit-transform:rotate(180deg); + -moz-transform:rotate(180deg); + -ms-transform:rotate(180deg); + -o-transform:rotate(180deg); + transform:rotate(180deg) +} +.rotate-270{ + -webkit-transform:rotate(270deg); + -moz-transform:rotate(270deg); + -ms-transform:rotate(270deg); + -o-transform:rotate(270deg); + transform:rotate(270deg) +} +.mirror{ + -webkit-transform:scaleX(-1); + -moz-transform:scaleX(-1); + -ms-transform:scaleX(-1); + -o-transform:scaleX(-1); + transform:scaleX(-1) +} +.mirror.rotate-90{ + -webkit-transform:scaleX(-1) rotate(90deg); + -moz-transform:scaleX(-1) rotate(90deg); + -ms-transform:scaleX(-1) rotate(90deg); + -o-transform:scaleX(-1) rotate(90deg); + transform:scaleX(-1) rotate(90deg) +} +.mirror.rotate-180{ + -webkit-transform:scaleX(-1) rotate(180deg); + -moz-transform:scaleX(-1) rotate(180deg); + -ms-transform:scaleX(-1) rotate(180deg); + -o-transform:scaleX(-1) rotate(180deg); + transform:scaleX(-1) rotate(180deg) +} +.mirror.rotate-270{ + -webkit-transform:scaleX(-1) rotate(270deg); + -moz-transform:scaleX(-1) rotate(270deg); + -ms-transform:scaleX(-1) rotate(270deg); + -o-transform:scaleX(-1) rotate(270deg); + transform:scaleX(-1) rotate(270deg) +} +@media only screen and (max-width:480px){ + .wy-form button[type=submit]{ + margin:.7em 0 0 + } + .wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{ + margin-bottom:.3em; + display:block + } + .wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{ + margin-bottom:0 + } + .wy-form-aligned .wy-control-group label{ + margin-bottom:.3em; + text-align:left; + display:block; + width:100% + } + .wy-form-aligned .wy-control{ + margin:1.5em 0 0 + } + .wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{ + display:block; + font-size:80%; + padding:6px 0 + } +} +@media screen and (max-width:768px){ + .tablet-hide{ + display:none + } +} +@media screen and (max-width:480px){ + .mobile-hide{ + display:none + } +} +.float-left{ + float:left +} +.float-right{ + float:right +} +.full-width{ + width:100% +} +.rst-content table.docutils,.rst-content table.field-list,.wy-table{ + border-collapse:collapse; + border-spacing:0; + empty-cells:show; + margin-bottom:24px +} +.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; + text-align:center +} +.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{ + font-size:90%; + margin:0; + overflow:visible; + padding:8px 16px +} +.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{ + border-left-width:0 +} +.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{ + color:#000; + text-align:left; + vertical-align:bottom; + white-space:nowrap +} +.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{ + font-weight:700; + border-bottom:2px solid #e1e4e5 +} +.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{ + background-color:transparent; + vertical-align:middle +} +.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{ + line-height:18px +} +.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{ + margin-bottom:0 +} +.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{ + width:1%; + padding-right:0 +} +.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{ + margin:0 +} +.wy-table-secondary{ + color:grey; + font-size:90% +} +.wy-table-tertiary{ + color:grey; + font-size:80% +} +.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{ + background-color:#f3f6f6 +} +.rst-content table.docutils,.wy-table-bordered-all{ + border:1px solid #e1e4e5 +} +.rst-content table.docutils td,.wy-table-bordered-all td{ + border-bottom:1px solid #e1e4e5; + border-left:1px solid #e1e4e5 +} +.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-bordered{ + border:1px solid #e1e4e5 +} +.wy-table-bordered-rows td{ + border-bottom:1px solid #e1e4e5 +} +.wy-table-bordered-rows tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-horizontal td,.wy-table-horizontal th{ + border-width:0 0 1px; + border-bottom:1px solid #e1e4e5 +} +.wy-table-horizontal tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-responsive{ + margin-bottom:24px; + max-width:100%; + overflow:auto +} +.wy-table-responsive table{ + margin-bottom:0!important +} +.wy-table-responsive table td,.wy-table-responsive table th{ + white-space:auto +} +a{ + color:#2980b9; + text-decoration:none; + cursor:pointer +} +a:hover{ + color:#3091d1 +} +a:visited{ + color:#9b59b6 +} +html{ + height:100% +} +body,html{ + overflow-x:hidden +} +body{ + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + font-weight:400; + color:#404040; + min-height:100%; + background:#edf0f2 +} +.wy-text-left{ + text-align:left +} +.wy-text-center{ + text-align:center +} +.wy-text-right{ + text-align:right +} +.wy-text-large{ + font-size:120% +} +.wy-text-normal{ + font-size:100% +} +.wy-text-small,small{ + font-size:80% +} +.wy-text-strike{ + text-decoration:line-through +} +.wy-text-warning{ + color:#e67e22!important +} +a.wy-text-warning:hover{ + color:#eb9950!important +} +.wy-text-info{ + color:#2980b9!important +} +a.wy-text-info:hover{ + color:#409ad5!important +} +.wy-text-success{ + color:#27ae60!important +} +a.wy-text-success:hover{ + color:#36d278!important +} +.wy-text-danger{ + color:#e74c3c!important +} +a.wy-text-danger:hover{ + color:#ed7669!important +} +.wy-text-neutral{ + color:#404040!important +} +a.wy-text-neutral:hover{ + color:#595959!important +} +.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{ + margin-top:0; + font-weight:700; + font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif +} +p{ + line-height:24px; + font-size:16px; + margin:0 0 24px; +} +h1{ + font-size:175% +} +.rst-content .toctree-wrapper>p.caption,h2{ + font-size:150% +} +h3{ + font-size:125% +} +h4{ + font-size:115% +} +h5{ + font-size:110% +} +h6{ + font-size:100% +} +hr{ + display:block; + height:1px; + border:0; + border-top:1px solid #e1e4e5; + margin:24px 0; + padding:0 +} +.rst-content code,.rst-content tt,code{ + white-space:nowrap; + max-width:100%; + background:#fff; + border:1px solid #e1e4e5; + font-size:75%; + padding:0 5px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + color:#e74c3c; + overflow-x:auto +} +.rst-content tt.code-large,code.code-large{ + font-size:90% +} +.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{ + list-style:disc; + line-height:24px; + margin-bottom:24px +} +.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{ + list-style:disc; + margin-left:24px +} +.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{ + margin-bottom:0 +} +.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{ + list-style:circle +} +.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{ + list-style:square +} +.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{ + list-style:decimal +} +.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{ + list-style:decimal; + line-height:24px; + margin-bottom:24px +} +.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{ + list-style:decimal; + margin-left:24px +} +.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{ + margin-bottom:0 +} +.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{ + list-style:disc +} +.wy-breadcrumbs{ + *zoom:1 +} +.wy-breadcrumbs:after,.wy-breadcrumbs:before{ + display:table; + content:"" +} +.wy-breadcrumbs:after{ + clear:both +} +.wy-breadcrumbs li{ + display:inline-block +} +.wy-breadcrumbs li.wy-breadcrumbs-aside{ + float:right +} +.wy-breadcrumbs li a{ + display:inline-block; + padding:5px +} +.wy-breadcrumbs li a:first-child{ + padding-left:0 +} +.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{ + padding:5px; + border:none; + background:none +} +.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{ + color:#404040 +} +.wy-breadcrumbs-extra{ + margin-bottom:0; + color:#b3b3b3; + font-size:80%; + display:inline-block +} +@media screen and (max-width:480px){ + .wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none + } +} +@media print{ + .wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none + } +} +html{ + font-size:16px +} +.wy-affix{ + position:fixed; + top:1.618em +} +.wy-menu a:hover{ + text-decoration:none +} +.wy-menu-horiz{ + *zoom:1 +} +.wy-menu-horiz:after,.wy-menu-horiz:before{ + display:table; + content:"" +} +.wy-menu-horiz:after{ + clear:both +} +.wy-menu-horiz li,.wy-menu-horiz ul{ + display:inline-block +} +.wy-menu-horiz li:hover{ + background:hsla(0,0%,100%,.1) +} +.wy-menu-horiz li.divide-left{ + border-left:1px solid #404040 +} +.wy-menu-horiz li.divide-right{ + border-right:1px solid #404040 +} +.wy-menu-horiz a{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 16px +} +.wy-menu-vertical{ + width:300px + margin-bottom: 20px; +} +.wy-menu-vertical header,.wy-menu-vertical p.caption{ + color:#007C97; + height:32px; + line-height:32px; + padding:0 1.618em; + margin:12px 0 0; + display:block; + font-weight:700; + text-transform:uppercase; + font-size:100%; + white-space:nowrap; +} +.wy-menu-vertical ul{ + margin-bottom:0 +} +.wy-menu-vertical li.divide-top{ + border-top:1px solid #404040 +} +.wy-menu-vertical li.divide-bottom{ + border-bottom:1px solid #404040 +} +.wy-menu-vertical li.current{ + background:#e3e3e3 +} +.wy-menu-vertical li.current a{ + color:grey; + border-right:1px solid #c9c9c9; + padding:.4045em 2.427em +} +.wy-menu-vertical li.current a:hover{ + background:#d6d6d6 +} +.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{ + border:none; + background:inherit; + color:inherit; + padding-left:0; + padding-right:0 +} +.wy-menu-vertical li button.toctree-expand{ + display:block; + float:left; + margin-left:-1.2em; + line-height:18px; + color:#4d4d4d; + border:none; + background:none; + padding:0 +} +.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{ + color:#404040; + font-weight:700; + position:relative; + background:#fcfcfc; + border:none; + padding:.4045em 1.618em +} +.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{ + background:#fcfcfc +} +.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{ + color:grey +} +.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{ + display:block; + line-height:18px; + color:#333 +} +.wy-menu-vertical li.toctree-l1.current>a{ + border-bottom:1px solid #c9c9c9; + border-top:1px solid #c9c9c9 +} +.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{ + display:none +} +.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{ + display:block +} +.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{ + font-size:.9em +} +.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{ + color:#404040 +} +.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{ + color:grey +} +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{ + display:block +} +.wy-menu-vertical li.toctree-l2.current>a{ + padding:.4045em 2.427em +} +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{ + padding:.4045em 1.618em .4045em 4.045em +} +.wy-menu-vertical li.toctree-l3.current>a{ + padding:.4045em 4.045em +} +.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{ + padding:.4045em 1.618em .4045em 5.663em +} +.wy-menu-vertical li.toctree-l4.current>a{ + padding:.4045em 5.663em +} +.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{ + padding:.4045em 1.618em .4045em 7.281em +} +.wy-menu-vertical li.toctree-l5.current>a{ + padding:.4045em 7.281em +} +.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{ + padding:.4045em 1.618em .4045em 8.899em +} +.wy-menu-vertical li.toctree-l6.current>a{ + padding:.4045em 8.899em +} +.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{ + padding:.4045em 1.618em .4045em 10.517em +} +.wy-menu-vertical li.toctree-l7.current>a{ + padding:.4045em 10.517em +} +.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{ + padding:.4045em 1.618em .4045em 12.135em +} +.wy-menu-vertical li.toctree-l8.current>a{ + padding:.4045em 12.135em +} +.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{ + padding:.4045em 1.618em .4045em 13.753em +} +.wy-menu-vertical li.toctree-l9.current>a{ + padding:.4045em 13.753em +} +.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{ + padding:.4045em 1.618em .4045em 15.371em +} +.wy-menu-vertical li.toctree-l10.current>a{ + padding:.4045em 15.371em +} +.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{ + padding:.4045em 1.618em .4045em 16.989em +} +.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{ + background:#c9c9c9 +} +.wy-menu-vertical li.toctree-l2 button.toctree-expand{ + color:#a3a3a3 +} +.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{ + background:#bdbdbd +} +.wy-menu-vertical li.toctree-l3 button.toctree-expand{ + color:#969696 +} +.wy-menu-vertical li.current ul{ + display:block +} +.wy-menu-vertical li ul{ + margin-bottom:0; + display:none +} +.wy-menu-vertical li ul li a{ + margin-bottom:0; + color:#d9d9d9; + font-weight:400 +} +.wy-menu-vertical a{ + line-height:18px; + padding:.4045em 1.618em; + display:block; + position:relative; + font-size:90%; + color:#d9d9d9 +} +.wy-menu-vertical a:hover{ + background-color:#4e4a4a; + cursor:pointer +} +.wy-menu-vertical a:hover button.toctree-expand{ + color:#d9d9d9 +} +.wy-menu-vertical a:active{ + background-color:#2980b9; + cursor:pointer; + color:#fff +} +.wy-menu-vertical a:active button.toctree-expand{ + color:#fff +} +.wy-side-nav-search{ + display:block; + width:300px; + padding:.809em; + margin-bottom:.809em; + z-index:200; + background-color:#171c2d; + text-align:center; + color:#fcfcfc +} +.wy-side-nav-search input[type=text]{ + width:100%; + border-radius:50px; + padding:6px 12px; + border-color:#2472a4 +} +.wy-side-nav-search img{ + display:block; + margin:auto auto .809em; + height:45px; + width:45px; + background-color:#171c2d; + padding:5px; + border-radius:100% +} +.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{ + color:#fcfcfc; + font-size:100%; + font-weight:700; + display:inline-block; + padding:4px 6px; + margin-bottom:.809em; + max-width:100% +} +.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{ + background:hsla(0,0%,100%,.1) +} +.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{ + display:block; + margin:0 auto; + height:auto; + width:auto; + border-radius:0; + max-width:100%; + background:transparent +} +.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{ + margin-top:.85em +} +.wy-side-nav-search>div.version{ + margin-top:-.4045em; + margin-bottom:.809em; + font-weight:400; + color:hsla(0,0%,100%,.3) +} +.wy-nav .wy-menu-vertical header{ + color:#2980b9 +} +.wy-nav .wy-menu-vertical a{ + color:#b3b3b3 +} +.wy-nav .wy-menu-vertical a:hover{ + background-color:#2980b9; + color:#fff +} +[data-menu-wrap]{ + -webkit-transition:all .2s ease-in; + -moz-transition:all .2s ease-in; + transition:all .2s ease-in; + position:absolute; + opacity:1; + width:100%; + opacity:0 +} +[data-menu-wrap].move-center{ + left:0; + right:auto; + opacity:1 +} +[data-menu-wrap].move-left{ + right:auto; + left:-100%; + opacity:0 +} +[data-menu-wrap].move-right{ + right:-100%; + left:auto; + opacity:0 +} +.wy-body-for-nav{ + background:#fcfcfc +} +.wy-grid-for-nav{ + position:absolute; + width:100%; + height:100% +} +.wy-nav-side{ + position:fixed; + top:0; + bottom:0; + left:0; + padding-bottom:2em; + width:300px; + overflow-x:hidden; + overflow-y:hidden; + min-height:100%; + color:#9b9b9b; + background:#171c2d; + z-index:200 +} +.wy-side-scroll{ + width:320px; + position:relative; + overflow-x:hidden; + overflow-y:scroll; + height:100%; +} +.wy-nav-top{ + display:none; + background:#E9102B; + color:#fff; + padding:.4045em .809em; + position:relative; + line-height:50px; + text-align:center; + font-size:100%; + *zoom:1 +} +.wy-nav-top:after,.wy-nav-top:before{ + display:table; + content:"" +} +.wy-nav-top:after{ + clear:both +} +.wy-nav-top a{ + color:#fff; + font-weight:700 +} +.wy-nav-top img{ + margin-right:12px; + height:45px; + width:45px; + background-color:#2980b9; + padding:5px; + border-radius:100% +} +.wy-nav-top i{ + font-size:30px; + float:left; + cursor:pointer; + padding-top:inherit +} +.wy-nav-content-wrap{ + margin-left:300px; + background:#fcfcfc; + min-height:100% +} +.wy-nav-content{ + padding:1.618em 3.236em; + height:100%; + margin:auto +} +.wy-body-mask{ + position:fixed; + width:100%; + height:100%; + background:rgba(0,0,0,.2); + display:none; + z-index:499 +} +.wy-body-mask.on{ + display:block +} +footer{ + color:grey +} +footer p{ + margin-bottom:12px +} +.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{ + padding:0; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + font-size:1em; + background:none; + border:none; + color:grey +} +.rst-footer-buttons{ + *zoom:1 +} +.rst-footer-buttons:after,.rst-footer-buttons:before{ + width:100%; + display:table; + content:"" +} +.rst-footer-buttons:after{ + clear:both +} +.rst-breadcrumbs-buttons{ + margin-top:12px; + *zoom:1 +} +.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{ + display:table; + content:"" +} +.rst-breadcrumbs-buttons:after{ + clear:both +} +#search-results .search li{ + margin-bottom:24px; + border-bottom:1px solid #e1e4e5; + padding-bottom:24px +} +#search-results .search li:first-child{ + border-top:1px solid #e1e4e5; + padding-top:24px +} +#search-results .search li a{ + font-size:120%; + margin-bottom:12px; + display:inline-block +} +#search-results .context{ + color:grey; + font-size:90% +} +.genindextable li>ul{ + margin-left:24px +} +@media screen and (max-width:768px){ + .wy-body-for-nav{ + background:#fcfcfc + } + .wy-nav-top{ + display:block + } + .wy-nav-side{ + left:-300px + } + .wy-nav-side.shift{ + width:85%; + left:0 + } + .wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{ + width:auto + } + .wy-nav-content-wrap{ + margin-left:0 + } + .wy-nav-content-wrap .wy-nav-content{ + padding:1.618em + } + .wy-nav-content-wrap.shift{ + position:fixed; + min-width:100%; + left:85%; + top:0; + height:100%; + overflow:hidden + } +} +@media screen and (min-width:1100px){ + .wy-nav-content-wrap{ + /* background:rgba(0,0,0,.05) */ + } + .wy-nav-content{ + margin:0; + background:#fcfcfc + } +} +@media print{ + .rst-versions,.wy-nav-side,footer{ + display:none + } + .wy-nav-content-wrap{ + margin-left:0 + } +} +.rst-versions{ + position:fixed; + bottom:0; + left:0; + width:300px; + color:#fcfcfc; + background:#1f1d1d; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + z-index:400 +} +.rst-versions a{ + color:#2980b9; + text-decoration:none +} +.rst-versions .rst-badge-small{ + display:none +} +.rst-versions .rst-current-version{ + padding:12px; + background-color:#272525; + display:block; + text-align:right; + font-size:90%; + cursor:pointer; + color:#27ae60; + *zoom:1 +} +.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{ + display:table; + content:"" +} +.rst-versions .rst-current-version:after{ + clear:both +} +.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{ + color:#fcfcfc +} +.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{ + float:left +} +.rst-versions .rst-current-version.rst-out-of-date{ + background-color:#e74c3c; + color:#fff +} +.rst-versions .rst-current-version.rst-active-old-version{ + background-color:#f1c40f; + color:#000 +} +.rst-versions.shift-up{ + height:auto; + max-height:100%; + overflow-y:scroll +} +.rst-versions.shift-up .rst-other-versions{ + display:block +} +.rst-versions .rst-other-versions{ + font-size:90%; + padding:12px; + color:grey; + display:none +} +.rst-versions .rst-other-versions hr{ + display:block; + height:1px; + border:0; + margin:20px 0; + padding:0; + border-top:1px solid #413d3d +} +.rst-versions .rst-other-versions dd{ + display:inline-block; + margin:0 +} +.rst-versions .rst-other-versions dd a{ + display:inline-block; + padding:6px; + color:#fcfcfc +} +.rst-versions.rst-badge{ + width:auto; + bottom:20px; + right:20px; + left:auto; + border:none; + max-width:300px; + max-height:90% +} +.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{ + float:none; + line-height:30px +} +.rst-versions.rst-badge.shift-up .rst-current-version{ + text-align:right +} +.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{ + float:left +} +.rst-versions.rst-badge>.rst-current-version{ + width:auto; + height:30px; + line-height:30px; + padding:0 6px; + display:block; + text-align:center +} +@media screen and (max-width:768px){ + .rst-versions{ + width:85%; + display:none + } + .rst-versions.shift{ + display:block + } +} +.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{ + margin-bottom:24px +} +.rst-content img{ + max-width:100%; + height:auto +} +.rst-content div.figure,.rst-content figure{ + margin-bottom:24px +} +.rst-content div.figure .caption-text,.rst-content figure .caption-text{ + font-style:italic +} +.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{ + margin-bottom:0 +} +.rst-content div.figure.align-center,.rst-content figure.align-center{ + text-align:center +} +.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{ + margin-bottom:24px +} +.rst-content abbr[title]{ + text-decoration:none +} +.rst-content.style-external-links a.reference.external:after{ + font-family:FontAwesome; + content:"\f08e"; + color:#b3b3b3; + vertical-align:super; + font-size:60%; + margin:0 .2em +} +.rst-content blockquote{ + margin-left:24px; + line-height:24px; + margin-bottom:24px +} +.rst-content pre.literal-block{ + white-space:pre; + margin:0; + padding:12px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + display:block; + overflow:auto +} +.rst-content div[class^=highlight],.rst-content pre.literal-block{ + border:1px solid #e1e4e5; + overflow-x:auto; + margin:1px 0 24px +} +.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{ + padding:0; + border:none; + margin:0 +} +.rst-content div[class^=highlight] td.code{ + width:100% +} +.rst-content .linenodiv pre{ + border-right:1px solid #e6e9ea; + margin:0; + padding:12px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + user-select:none; + pointer-events:none +} +.rst-content div[class^=highlight] pre{ + white-space:pre; + margin:0; + padding:12px; + display:block; + overflow:auto +} +.rst-content div[class^=highlight] pre .hll{ + display:block; + margin:0 -12px; + padding:0 12px +} +.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + font-size:12px; + line-height:1.4 +} +.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{ + user-select:none; + pointer-events:none +} +.rst-content div.highlight span.linenos{ + display:inline-block; + padding-left:0; + padding-right:12px; + margin-right:12px; + border-right:1px solid #e6e9ea +} +.rst-content .code-block-caption{ + font-style:italic; + font-size:85%; + line-height:1; + padding:1em 0; + text-align:center +} +@media print{ + .rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{ + white-space:pre-wrap + } +} +.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{ + clear:both +} +.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{ + margin-bottom:0 +} +.rst-content .admonition-title:before{ + margin-right:4px +} +.rst-content .admonition table{ + border-color:rgba(0,0,0,.1) +} +.rst-content .admonition table td,.rst-content .admonition table th{ + background:transparent!important; + border-color:rgba(0,0,0,.1)!important +} +.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{ + list-style:lower-alpha +} +.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{ + list-style:upper-alpha +} +.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{ + margin-top:12px; + margin-bottom:12px +} +.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{ + margin-top:0 +} +.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{ + margin-bottom:12px +} +.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{ + margin-bottom:0 +} +.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{ + margin-bottom:12px +} +.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{ + margin-top:0; + margin-bottom:0 +} +.rst-content .line-block{ + margin-left:0; + margin-bottom:24px; + line-height:24px +} +.rst-content .line-block .line-block{ + margin-left:24px; + margin-bottom:0 +} +.rst-content .topic-title{ + font-weight:700; + margin-bottom:12px +} +.rst-content .toc-backref{ + color:#404040 +} +.rst-content .align-right{ + float:right; + margin:0 0 24px 24px +} +.rst-content .align-left{ + float:left; + margin:0 24px 24px 0 +} +.rst-content .align-center{ + margin:auto +} +.rst-content .align-center:not(table){ + display:block +} +.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{ + opacity:0; + font-size:14px; + font-family:FontAwesome; + margin-left:.5em +} +.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{ + opacity:1 +} +.rst-content .btn:focus{ + outline:2px solid +} +.rst-content table>caption .headerlink:after{ + font-size:12px +} +.rst-content .centered{ + text-align:center +} +.rst-content .sidebar{ + float:right; + width:40%; + display:block; + margin:0 0 24px 24px; + padding:24px; + background:#f3f6f6; + border:1px solid #e1e4e5 +} +.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{ + font-size:90% +} +.rst-content .sidebar .last,.rst-content .sidebar>:last-child{ + margin-bottom:0 +} +.rst-content .sidebar .sidebar-title{ + display:block; + font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif; + font-weight:700; + background:#e1e4e5; + padding:6px 12px; + margin:-24px -24px 24px; + font-size:100% +} +.rst-content .highlighted{ + background:#f1c40f; + box-shadow:0 0 0 2px #f1c40f; + display:inline; + font-weight:700 +} +.rst-content .citation-reference,.rst-content .footnote-reference{ + vertical-align:baseline; + position:relative; + top:-.4em; + line-height:0; + font-size:90% +} +.rst-content .hlist{ + width:100% +} +.rst-content dl dt span.classifier:before{ + content:" : " +} +.rst-content dl dt span.classifier-delimiter{ + display:none!important +} +html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{ + background:none; + border:none +} +html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{ + border:none; + background-color:transparent!important; + white-space:normal +} +html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{ + padding-left:0; + padding-right:0; + vertical-align:top +} +html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{ + display:grid; + grid-template-columns:max-content auto +} +html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{ + padding-left:1rem +} +html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{ + content:":" +} +html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{ + margin-bottom:0 +} +html.writer-html5 .rst-content dl.footnote{ + font-size:.9rem +} +html.writer-html5 .rst-content dl.footnote>dt{ + margin:0 .5rem .5rem 0; + line-height:1.2rem; + word-break:break-all; + font-weight:400 +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets{ + margin-right:.5rem +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{ + content:"[" +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{ + content:"]" +} +html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{ + font-style:italic +} +html.writer-html5 .rst-content dl.footnote>dd{ + margin:0 0 .5rem; + line-height:1.2rem +} +html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{ + font-size:.9rem +} +.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{ + color:grey +} +.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{ + color:#555 +} +.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{ + margin-bottom:0 +} +.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){ + margin-top:24px +} +.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{ + margin-bottom:24px +} +.rst-content table.docutils th{ + border-color:#e1e4e5 +} +html.writer-html5 .rst-content table.docutils th{ + border:1px solid #e1e4e5 +} +html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{ + line-height:1rem; + margin-bottom:0; + font-size:.9rem +} +.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{ + margin-bottom:0 +} +.rst-content table.field-list,.rst-content table.field-list td{ + border:none +} +.rst-content table.field-list td p{ + font-size:inherit; + line-height:inherit +} +.rst-content table.field-list td>strong{ + display:inline-block +} +.rst-content table.field-list .field-name{ + padding-right:10px; + text-align:left; + white-space:nowrap +} +.rst-content table.field-list .field-body{ + text-align:left +} +.rst-content code,.rst-content tt{ + color:#000; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + padding:2px 5px +} +.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{ + font-size:100%!important; + line-height:normal +} +.rst-content code.literal,.rst-content tt.literal{ + color:#e74c3c; + white-space:normal +} +.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{ + font-weight:700; + color:#404040 +} +.rst-content kbd,.rst-content pre,.rst-content samp{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace +} +.rst-content a code,.rst-content a tt{ + color:#2980b9 +} +.rst-content dl{ + margin-bottom:24px +} +.rst-content dl dt{ + font-weight:700; + margin-bottom:12px +} +.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{ + margin-bottom:12px +} +.rst-content dl dd{ + margin:0 0 12px 24px; + line-height:24px +} +html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){ + margin-bottom:24px +} +html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{ + display:table; + margin:6px 0; + font-size:90%; + line-height:normal; + background:#e7f2fa; + color:#2980b9; + border-top:3px solid #6ab0de; + padding:6px; + position:relative +} +html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{ + color:#6ab0de +} +html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{ + color:#404040; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{ + margin-bottom:6px; + border:none; + border-left:3px solid #ccc; + background:#f0f0f0; + color:#555 +} +html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{ + color:#404040; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{ + margin-top:0 +} +html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{ + background-color:transparent; + border:none; + padding:0; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{ + font-weight:700 +} +html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{ + display:inline-block; + padding:0 4px; + color:#000; + font-weight:700 +} +html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{ + display:inline-block; + padding-right:8px; + max-width:100% +} +html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{ + font-style:italic +} +html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + color:#000 +} +.rst-content .viewcode-back,.rst-content .viewcode-link{ + display:inline-block; + color:#27ae60; + font-size:80%; + padding-left:24px +} +.rst-content .viewcode-back{ + display:block; + float:right +} +.rst-content p.rubric{ + margin-bottom:12px; + font-weight:700 +} +.rst-content code.download,.rst-content tt.download{ + background:inherit; + padding:inherit; + font-weight:400; + font-family:inherit; + font-size:inherit; + color:inherit; + border:inherit; + white-space:inherit +} +.rst-content code.download span:first-child,.rst-content tt.download span:first-child{ + -webkit-font-smoothing:subpixel-antialiased +} +.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{ + margin-right:4px +} +.rst-content .guilabel{ + border:1px solid #7fbbe3; + background:#e7f2fa; + font-size:80%; + font-weight:700; + border-radius:4px; + padding:2.4px 6px; + margin:auto 2px +} +.rst-content .versionmodified{ + font-style:italic +} +@media screen and (max-width:480px){ + .rst-content .sidebar{ + width:100% + } +} +span[id*=MathJax-Span]{ + color:#404040 +} +.math{ + text-align:center +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff"); + font-weight:400; + font-style:normal; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff"); + font-weight:700; + font-style:normal; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff"); + font-weight:700; + font-style:italic; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff"); + font-weight:400; + font-style:italic; + font-display:block +} +@font-face{ + font-family:Roboto Slab; + font-style:normal; + font-weight:400; + src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff"); + font-display:block +} +@font-face{ + font-family:Roboto Slab; + font-style:normal; + font-weight:700; + src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff"); + font-display:block +} diff --git a/v1.1.1/_static/custom.css b/v1.1.1/_static/custom.css new file mode 100644 index 00000000..1cadbe76 --- /dev/null +++ b/v1.1.1/_static/custom.css @@ -0,0 +1,24 @@ +/* + * custom.css + * ~~~~~~~~~ + * + * Custom stylesheet. + * + * :copyright: Copyright 2022 by Xilinx, Inc. + * + */ + +/* -- main layout ----------------------------------------------------------- */ +@media screen and (max-width: 950px){ + .wy-body-for-nav{background:#000000} + .wy-nav-top{display:block} + .wy-nav-side{left:300px} + .wy-nav-side.shift{width:85%;left:0} + .wy-side-scroll{width:auto} + .wy-side-nav-search{width:auto} + .wy-menu.wy-menu-vertical{width:auto} + .wy-nav-content-wrap{margin-left:0} + .wy-nav-content-wrap + .wy-nav-content{padding:1.618em} + .wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden} +} \ No newline at end of file diff --git a/v1.1.1/_static/doctools.js b/v1.1.1/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/v1.1.1/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/v1.1.1/_static/documentation_options.js b/v1.1.1/_static/documentation_options.js new file mode 100644 index 00000000..a858b440 --- /dev/null +++ b/v1.1.1/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.1.1', + LANGUAGE: 'English', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/v1.1.1/_static/file.png b/v1.1.1/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/v1.1.1/_static/file.png differ diff --git a/v1.1.1/_static/jquery.js b/v1.1.1/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/v1.1.1/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v1.1.1/_static/js/html5shiv.min.js b/v1.1.1/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/v1.1.1/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v1.1.1/_static/js/theme.js b/v1.1.1/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/v1.1.1/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/v1.1.1/_static/layout.html b/v1.1.1/_static/layout.html new file mode 100644 index 00000000..81ae0134 --- /dev/null +++ b/v1.1.1/_static/layout.html @@ -0,0 +1,14 @@ +{% extends "!layout.html" %} + {% block footer %} {{ super() }} + + +{% endblock %} \ No newline at end of file diff --git a/v1.1.1/_static/minus.png b/v1.1.1/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/v1.1.1/_static/minus.png differ diff --git a/v1.1.1/_static/plus.png b/v1.1.1/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/v1.1.1/_static/plus.png differ diff --git a/v1.1.1/_static/pygments.css b/v1.1.1/_static/pygments.css new file mode 100644 index 00000000..84ab3030 --- /dev/null +++ b/v1.1.1/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/v1.1.1/_static/searchtools.js b/v1.1.1/_static/searchtools.js new file mode 100644 index 00000000..7918c3fa --- /dev/null +++ b/v1.1.1/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/v1.1.1/_static/sphinx_highlight.js b/v1.1.1/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/v1.1.1/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/v1.1.1/_static/xilinx-header-logo.png b/v1.1.1/_static/xilinx-header-logo.png new file mode 100644 index 00000000..00372830 Binary files /dev/null and b/v1.1.1/_static/xilinx-header-logo.png differ diff --git a/v1.1.1/_static/xilinx-header-logo.svg b/v1.1.1/_static/xilinx-header-logo.svg new file mode 100644 index 00000000..6b15297d --- /dev/null +++ b/v1.1.1/_static/xilinx-header-logo.svg @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + Page-1 + + + Sheet.1 + + + + + + diff --git a/v1.1.1/c_apis.html b/v1.1.1/c_apis.html new file mode 100644 index 00000000..28fc9bac --- /dev/null +++ b/v1.1.1/c_apis.html @@ -0,0 +1,1283 @@ + + + + + + + + + + + + + + + C API Programming Guide — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • C API Programming Guide
  • +
  • +
  • +
+
+
+
+
+ +
+

C API Programming Guide

+ +
+

Overview

+

The AMD AMA Video SDK provides a C-based application programming interface (API) which facilitates the integration of AMD transcoding capabilities in proprietary frameworks. This API is provided in the form of plugins leveraging the Xilinx Media Accelerator (XMA) library and the Xilinx Resource Manager (XRM) library.

+

The XMA Library

+

The XMA library (libxma) is meant to simplify the development of applications managing and controlling video accelerators such as decoders, scalers, filters, and encoders.

+

The XRM Library

+

The XRM library is used to manage the hardware accelerators available in the system. XRM keeps track of total system capacity for each of the compute units such as the decoder, scaler, and encoder. The XRM library makes it possible to perform actions such as reserving, allocating and releasing resources; calculating resource load and max capacity.

+

The AMD AMA Video SDK Plugins

+

The AMD AMA Video SDK provides 4 different plugins, each corresponding to a specific hardware accelerated feature of the card:

+
    +
  • The decoder plugin

  • +
  • The encoder plugin

  • +
  • The filter plugin

  • +
  • The scaler plugin

  • +
+

Any combination of plugins can be used when integrating with a proprietary framework.

+
+

+
+
+
+

General Application Development Guide

+

Integration layers for applications using the AMD AMA Video SDK are organized around the following steps:

+
    +
  1. Initialization

  2. +
  3. Resource Reservation

  4. +
  5. Session Creation

  6. +
  7. Runtime Processing

  8. +
  9. Cleanup

  10. +
+
+

Resource Initialization and Allocation

+

Applications using the plugins must first create a XRM plugin using the xrm_PLUGIN_reserve(), where PLUGIN is one of dec, enc, or scale. This is done using the XRM APIs, as described in detail in the XRM API Reference Guide below.

+
+
+

Session Creation

+

Once the resources have been allocated, the application must create dedicated plugin sessions for each of the hardware accelerators that need to be used (decoder, scaler, encoder, filter).

+

To create a session, the application must first initialize all the required properties and parameters of the particular plugin. It must then call the corresponding session creation function. A complete reference for all the plugins is provided below.

+
+
+

Runtime Processing

+

The plugins provide functions to send data from the host and receive data from the device. The data is in the form of video frames (XmaFrame). It is also possible to do zero-copy operations where frames are passed from one hardware accelerator to the next without being copied back to the host. The send and receive functions are specific to each plugin and the return code should be used to determine the next suitable action. A complete reference for all the plugins is provided below.

+
+
+

Cleanup

+

When the application finishes, it should destroy each plugin session using the corresponding destroy function. Doing so will free the resources on the AMD devices for other jobs and ensure that everything is released and cleaned-up properly.

+

The application should also use the xrm_PLUGIN_release(), where PLUGIN is one of dec, enc, or scale to release allocated resources. This is done using the XRM APIs, as described in detail in the XRM API Reference Guide below.

+
+

+
+
+
+
+

Compiling and Linking with the AMD AMA Video SDK Plugins

+

The plugins can be dynamically linked to the application. The required package to build applications is XRM. This package is provided as part of the AMD AMA Video SDK.

+

To provide the necessary declarations in your application, include the following header in your source code:

+
#include <xrm.h>
+
+
+

To compile and link your application with the plugins, add the following lines to your CMakeList.txt file:

+
target_link_libraries (${PROJECT_NAME} PUBLIC xma PUBLIC xrm_interface)
+target_include_directories (${PROJECT_NAME}
+  PUBLIC "${PROJECT_SOURCE_DIR}/include"
+  PUBLIC "$<TARGET_PROPERTY:xrm,INTERFACE_INCLUDE_DIRECTORIES>")
+
+
+
+

+
+
+
+

Common XMA Data Structures

+
+
+struct XmaParameter
+
+ +

Type-Length-Value data structure used for passing custom arguments to a plugin. The declaration of XmaParameter can be found in the /opt/amd/ama/ma35/include/xma/xmaparam.h file.

+
+
+struct XmaFrameProperties
+
+ +

Data structure describing the frame dimensions for XmaFrame. The declaration of XmaFrameProperties can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+struct XmaFrame
+
+ +

Data structure describing a raw video frame and its buffers. XmaFrame structures can be received from the decoder or sent to the encoder. They are also used as input and outputs for the scaler and the look-ahead. The declaration of XmaFrame can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+

The AMD AMA Video SDK plugins supports 3 types of frames:

+
    +
  • XMA_HOST_BUFFER_TYPE frames must be copied to the device using the upload filter before they can be used by the device..

  • +
  • XMA_DEVICE_ONLY_BUFFER_TYPE frames must be copied to the host using the download filter before they can be used by the host application.

  • +
  • NO_BUFFER frames do not contain buffer data and are used as place holders to be filled in by XMA plugins..

  • +
+

The upload filter plugin send function only supports XMA_HOST_BUFFER_TYPE frames, while all other send frame functions only support XMA_DEVICE_BUFFER_TYPE frames. All frames used in receive functions must contain "dummy" data. All parameters in those frames will be filled in by the respective receive functions. All frames must be allocated using the provided XMA functions.

+
+
+struct XmaDataBuffer
+
+ +

Data structure describing a buffer containing encoded video data. XmaDataBuffer structures can be sent to the decoder or received from the encoder. The declaration of XmaDataBuffer can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+

All XmaDataBuffer structures must be allocated using one of the provided functions. XmaDataBuffer structures used in the encoder receive function must be allocated with "dummy" data and will be filled in by the encoder.

+
+

Note

+

Xma[Scaler|Encoder|Filter]Properties.sw_format

+
+

sw_format, which is a member of XmaScalerProperties, XmaEncoderProperties, and XmaFilterProperties structures, represents the pixel format of a frame on the device. Therefore, its assigned value is determined by the direction of data flow. Specifically:

+
+
+
XMA_NV12_FMT_TYPE and XMA_P010LE_FMT_TYPE, with flags = XMA_FRAME_PROPERTY_FLAG_TILE_4x4, are internal formats that can only be generated by decoder/scaler and not by the upload filter.
+
XMA_PACKED10_FMT_TYPE is an internal format that can only be generated by decoder/scaler and not the upload filter.
+
XMA_RGB24_FMT_TYPE is reserved for future use.
+
XMA_YUV420P_FMT_TYPE and XMA_YUV420P10LE_FMT_TYPE are external formats that can be used by the upload filter
+
+
+
+
+
+

+
+
+
+

Common XMA Data Reference

+

This section describes the commonly used calls and APIs that are required in most applications.

+
+

XMA Log Interface

+

The external interface to the xma logging consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmalogger.h file.

+
+
+int32_t xma_log_init(XmaLogLevelType log_level, XmaLogType log_type, XmaLogHandle *handle, ...)
+
+ +

This function creates a log session and must be called prior to logging. (See /opt/amd/ama/ma35/include/xma/xmalogger.h for details on variadic usage.)

+
+
+void xma_logmsg(XmaLogHandle handle, XmaLogLevelType level, const char *name, const char *msg, ...)
+
+ +

This function logs a message.

+
+
+void xma_log_release(XmaLogHandle handle)
+
+ +

This function releases a log session that was previously created with the xma_log_init() function.

+
+
+

XMA Session Interface

+

The external interface to the xma session consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xma.h file.

+
+
+int32_t xma_initialize(XmaLogHandle log, XmaInitParameter *init_params, XmaHandle *handle)
+
+ +

This function creates a XMA session and must be called prior to creating any plugins.

+
+
+void xma_release(XmaHandle handle)
+
+ +

This function releases a XMA session that was previously created with the xma_initialize() function.

+
+
+

XMA Data Buffer Interface

+

The external interface to the xma data buffer consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+XmaDataBuffer *xma_data_buffer_alloc(XmaHandle handle, size_t size, bool dummy)
+
+ +

This function creates a XmaDataBuffer of the given size.

+
+
+XmaDataBuffer *xma_data_from_buffer_clone(XmaHandle handle, uint8_t *data, size_t size, xma_data_buffer_clone_free_callback_function free_callback, void *opaque)
+
+ +

This function creates a XmaDataBuffer that points to the provided buffer. xma_data_buffer_clone_free_callback_function will be called, when the buffer is no longer needed.

+
+
+void xma_data_buffer_free(XmaDataBuffer *data)
+
+ +

This function releases a previously created XmaDataBuffer.

+
+
+

XMA Frame Interface

+

The external interface to the xma Frame consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+int32_t xma_frame_planes_get(XmaHandle handle, XmaFrameProperties *frame_props)
+
+ +

This returns the number of planes for a given pixel format.

+
+
+int32_t xma_frame_get_plane_height(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the height of the plane based on the frame height, pixel format, and plane.

+
+
+int32_t xma_frame_get_plane_stride(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the stride of the plane based on the frame width, pixel format, and plane.

+
+
+int32_t xma_frame_get_plane_size(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the size of the plane based on the frame width, height, pixel format, and plane.

+
+
+XmaFrame *xma_frame_alloc(XmaHandle handle, XmaFrameProperties *frame_props, bool dummy)
+
+ +

This function creates a XmaFrame with the given properties.

+
+
+XmaFrame *xma_frame_from_buffers_clone(XmaHandle handle, XmaFrameProperties *frame_props, XmaFrameData *frame_data, xma_frame_clone_free_callback_function free_callback, void *opaque)
+
+ +

This function creates a XmaFrame that points to the provided data and with the given properties. xma_frame_clone_free_callback_function will be called when the data is no longer needed.

+
+
+XmaFrame *xma_frame_clone(XmaHandle handle, XmaFrame *xma_frame)
+
+ +

This function creates a XmaFrame that uses the same buffers as the provided XmaFrame, but can have side data added or removed without affecting the original XmaFrame.

+
+
+int32_t xma_frame_inc_ref(XmaFrame *frame)
+
+ +

This function increases the reference count of the given XmaFrame.

+
+
+int32_t xma_frame_dec_ref(XmaFrame *frame)
+
+ +

This function decreases the reference count of the given XmaFrame.

+
+
+void xma_frame_free(XmaFrame *frame)
+
+ +

This function releases a XmaFrame that was created with the previous functions.

+
+
+
+

1.0 SDK API

+

The following subsections describe APIs applicable to 1.0 SDK. Note that these APIs serve as bases for future versions. In order to allow forwards and backwards ABI compatibility, the application can now set which version of the API to use. If no version is set, version 1.0 is assumed. When a version is set, only features available in that version are allowed. This means if a feature was deprecated in an earlier version, or was added in a later version, it cannot be used and will either be ignored or returned as an error.

+

To set the API version, use the following code snippet:

+
XmaParameter params[1];
+uint32_t api_version = XMA_API_VERSION_M_ m;
+
+params[0].name = (char*)XMA_API_VERSION;
+params[0].type = XMA_UINT32;
+params[0].length = sizeof(uint32_t);
+params[0].value = &api_version;
+
+xma_init_param.params        = params;
+xma_init_param.param_cnt     = 1;
+xma_initialize(logger, &xma_init_param, handle);
+
+
+

, where M and m are major and minor versions of the SDK, e.g., for SDK 1.0 the macro becomes XMA_API_VERSION_1_0.

+
+

Decoder Plugin Reference

+
+

Decoder Interface

+

The external interface to the decoder plugin consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmadecoder.h file.

+
+
+XmaDecoderSession *xma_dec_session_create(XmaDecoderProperties *dec_props)
+
+ +

This function creates a decoder session and must be called prior to decoding data. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_dec_session_set_log(XmaDecoderSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_dec_session_send_data(XmaDecoderSession *session, XmaDataBuffer *data, int32_t *data_used)
+
+ +

This function sends input frame data to the hardware decoder by way of the plugin. The application needs to parse the input encoded stream and send one frame of data at a time in a XmaDataBuffer data structure.

+

The data_used value indicates the amount of input data consumed by the decoder.

+

If the function returns XMA_SUCCESS, then the decoder was able to consume the entirety of the available data and data_used will be set accordingly. In this case, the application can proceed with fetching decoded data using the xma_dec_session_recv_frame() API.

+

If the function returns XMA_TRY_AGAIN, then the decoder was did not consume any of the input data and data_used will be reported as 0. In this case, the application can proceed with fetching previously decoded data with the xma_dec_session_recv_frame() function but must send the same input again using using xma_dec_session_send_data() until the function returns XMA_SUCCESS.

+

If the function returns XMA_SEND_MORE_DATA, then the data sent is being processed, but more is required before any frames will be available.

+

Once the application has sent all the input frames to the decoder, it must notify the decoder by sending a null buffer. The application should then continue sending null buffers in order to flush out all the output YUV frames.

+
+
+int32_t xma_dec_session_get_properties(XmaDecoderSession *dec_session, XmaFrameProperties *fprops);
+
+ +

This function returns the decoder properties such as width, height, output format, and frame rate.

+
+
+int32_t xma_dec_session_recv_frame(XmaDecoderSession *session, XmaFrame *frame)
+
+ +

This function tries to fetch a decoded YUV frame from the hardware accelerator.

+

If the function returns XMA_SUCCESS, a valid YUV frame pointer is available in the buffer pointer of the XmaFrame argument.

+

If the function returns XMA_TRY_AGAIN, then the decoder still needs some input data to produce a complete YUV output frame.

+

If the function returns XMA_EOS, then the decoder has flushed out all the frames.

+
+
+int32_t xma_dec_session_destroy(XmaDecoderSession *session)
+
+ +

This function destroys a decoder session that was previously created with the xma_dec_session_create() function.

+
+
+

Decoder Properties

+

The AMD AMA Video SDK decoder is configured using a combination of standard XMA decoder properties and custom decoder parameters, both of which are specified using a XmaDecoderProperties data structure. The declaration of XmaDecoderProperties can be found in the /opt/amd/ama/ma35/include/xma/xmadecoder.h file.

+
+

+
+
+
+struct XmaDecoderProperties
+
+ +

This data structure is used to configure the AMD AMA Video SDK decoder.

+
+

+
+

Standard XMA Decoder Properties

+

When using the decoder plugin, the following members of the XmaDecoderProperties data structure must be set by the application:

+
+
hwdecoder_type

Specifying type of decoder to reserve.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the decoder plugin.

+
+
param_cnt

Count of custom parameters.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840. +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
bits_per_pixel

Bits per pixel for primary plane of output video. +Must be set to 8 or 10 bits per pixel.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS.

+
+
handle

handle to XMA device.

+
+
+

Custom Decoder Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the decoder plugin:

+
+
"out_fmt"

XMA pixel format. See -out_fmt for available options.

+
+
“low_latency”

Set to 1 to enable low latency mode.

+
+
"latency_logging"

Set to 1 to enable logging of latency information to the xma log.

+
+
+
+

+
+
+
+
+

Scaler Plugin Reference

+
+

Scaler Interface

+

The external interface to the scaler plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+
+XmaScalerSession *xma_scaler_session_create(XmaScalerProperties *props)
+
+ +

This function creates scaler session and must be called prior to sending input frames. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_scaler_session_send_frame(XmaScalerSession *session, XmaFrame *frame)
+
+ +

This function sends a YUV frame to the underlying XMA plugin( and eventually to hardware to scale the input frame to one or multiple resolutions.

+

The application can take further action depending upon the return value from this API.

+

If the function returns XMA_SUCCESS, then the application can proceed to fetch scaled output frames.

+

If the function returns XMA_SEND_MORE_DATA, then the application should proceed with sending next YUV frame.

+

If the function returns XMA_FLUSH_AGAIN it means that the application should keep flushing the scaler.

+

Once the application has sent all the input frames to the scaler, it must notify the scaler by sending a null frame to flush the scaler.

+
+
+int32_t xma_scaler_session_recv_frame_list(XmaScalerSession *session, XmaFrame **frame_list)
+
+ +

This function is called after calling the xma_scaler_session_send_frame(). This function returns a list of output frames with every call until it reaches end of scaling. Return codes can only be XMA_SUCCESS and XMA_ERROR.

+
+
+int32_t xma_scaler_session_destroy(XmaScalerSession *session)
+
+ +

This function destroys scaler session that was previously created with the xma_scaler_session_create() function.

+
+

+
+
+
+

Scaler Properties

+

The AMD AMA Video SDK scaler is configured using a combination of standard XMA scaler properties, standard XMA scaler input and output properties and custom scaler parameters, all of which are specified using XmaScalerProperties and XmaScalerInOutProperties data structures.

+
+

+
+
+
+struct XmaScalerProperties
+
+ +

This data structure is used to configure the video scaler. The declaration of XmaScalerProperties can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+
+struct XmaScalerInOutProperties
+
+ +

This data structure is used to configure the input and outputs of the video scaler. The XmaScalerFilterProperties data structure contains one XmaScalerInOutProperties for the scaler input and an array of 16 XmaScalerInOutProperties for the scaler outputs. The declaration of XmaScalerInOutProperties can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+

+
+

Standard XMA Scaler Properties

+

When using the scaler plugin, the following members of the XmaScalerProperties data structure must be set by the application:

+
+
hwscaler_type

Type of scaler. Must be set to XMA_ABR_SCALER_TYPE.

+
+
num_outputs

Number of scaler outputs.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the scaler plugin.

+
+
param_cnt

Count of custom parameters.

+
+
input

Input property of type XmaScalerInOutProperties

+
+
output

Output properties an array of type XmaScalerInOutProperties of size num_outputs

+
+
+

XMA Scaler Input and Output Properties

+

When configuring the scaler input and outputs, the following members of the XmaScalerInOutProperties data structure must be set by the application:

+
+
format

Host side input video format. +Must be set to XMA_VPE_FMT_TYPE

+
+
sw_format

Device side video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of video stream/data. +Valid values are integers between 128 and 3840, in multiples of 4. +Portrait mode is supported.

+
+
height

Height in pixels of video stream/data. +Valid values are even integers between 128 and 2160, in multiples of 4.

+
+
framerate

Framerate data structure specifying frame rate per second.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
+

Other members of XmaScalerInOutProperties are not applicable to the scaler plugin and should not be used.

+

Custom Scaler Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the scaler plugin:

+
+
"mix_rate"

This parameter is used to configure mix-rate sessions where some scaler outputs are configured at the input frame rate and some other outputs will be configured at half the rate.

+
+
“top”

Cropping the top of the video before scaling.

+
+
“width”

Cropping the width of the video before scaling.

+
+
“height”

Cropping the height of the video before scaling.

+
+
"latency_logging"

Set to 1 to enable logging of latency information to XMA logs. Set to 0 to disable logging.

+
+
+
+

+
+
+
+
+

Encoder Plugin Reference

+
+

Encoder Interface

+

The external interface to the encoder plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmaencoder.h file.

+
+
+XmaEncoderSession *xma_enc_session_create(XmaEncoderProperties *enc_props)
+
+ +

This function creates an encoder session and must be called prior to encoding input YUV. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_enc_session_set_log(XmaEncoderSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_enc_session_send_frame(XmaEncoderSession *session, XmaFrame *frame)
+
+ +

This function sends a YUV frame to the hardware encoder by way of the plugin.

+

Each time the application calls this function, it must provide a XmaFrame containing YUV data and information about this frame (XmaFrameProperties).

+

If the function returns XMA_SUCCESS, then the application can proceed to fetch the encoded data using the xma_enc_session_recv_data() API.

+

If the function returns XMA_SEND_MORE_DATA, then the application must send the next YUV frame before calling xma_enc_session_recv_data().

+

Once the application has sent all the input frames to the encoder, it should notify the hardware by sending a null frame. If the API returns XMA_SUCCESS after a null frame is sent, then the application can call xma_enc_session_recv_data() but must send a null frame again.

+
+
+int32_t xma_enc_session_recv_data(XmaEncoderSession *session, XmaDataBuffer *data, int32_t *data_size)
+
+ +

This function is called after calling the function xma_enc_session_send_frame(). The application is responsible for allocating the "dummy" XmaDataBuffer using one of the provided functions. It is also responsible for releasing it when done.

+

If the function returns XMA_SUCCESS, then valid output data is available.

+

If the function returns XMA_RESEND_AND_RECV, a data buffer is not ready to be returned and the length of the data buffer is set to 0. The XmaDataBuffer is untouched and can either be reused or released.

+

If the function returns XMA_EOS, the encoder has flushed all the output frames. The XmaDataBuffer is untouched and must be released.

+
+
+int32_t xma_enc_session_destroy(XmaEncoderSession *session)
+
+ +

This function destroys an encoder session that was previously created with the xma_enc_session_create() function.

+
+
+

Encoder Properties

+

The AMD AMA Video SDK encoder is configured using a combination of standard XMA encoder properties and custom encoder parameters, both of which are specified using a XmaEncoderProperties data structure.

+
+

+
+
+
+struct XmaEncoderProperties
+
+ +

This data structure is used to configure the video encoder. The declaration of XmaEncoderProperties can be found in the /opt/amd/ama/ma35/include/xma/xmaencoder.h file.

+

Standard XMA Encoder Properties

+

When using the encoder plugin, the following members of the XmaEncoderProperties data structure must be set by the application:

+
+
hwencoder_type

Specify type of encoder to reserve.

+
+
format

Host side input video format. +Must be set to XMA_VPE_FMT_TYPE

+
+
sw_format

Device side input video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840. +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
framerate

Framerate data structure specifying frame rate per second

+
+
lookahead_depth

The lookahead module depth to give start giving lookahead data. +Supported values are 0 to 40.

+
+
rc_mode

Rate control mode for custom rate control +Supported values are 0 (constant QP), 1 (CBR), 2 (VBR), and 3 (CVBR).

+
+
bitrate

Bitrate of output data (in kbps).

+
+
qp

Fixed quantization value. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
gop_size

Maximum group of pictures size in frames.

+
+
temp_aq_gain

Temporal AQ Gain. Valid values are 0-255.

+
+
spat_aq_gain

Spatial AQ Gain. Valid values are 0-255.

+
+
minQP

Minimum QP. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
maxQP

Maximum QP. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
profile

Encoding profile. Valid values are 0 (Baseline), 1 (Main), 2 (High), 3 (High 10), or 4 (High 10 Intra) for H.264, 100 (Main), 101 (Main Intra), 102 (Main 10), or 103 (Main 10 Intra) for HEVC, or 200 (Main) for AV1, or -1 (Auto) for any codec.

+
+
level

Encoding level.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the encoder plugin.

+
+
param_cnt

Count of custom parameters.

+
+
+

Custom Encoder Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the encoder plugin:

+
+
"slice"

Slice to perform the encode.

+
+
"latency_logging"

When enabled, it logs latency information to XMA log.

+
+
"spatial_aq"

Enables or disables adaptive spatial qp.

+
+
"temporal_aq"

Enables or disables adaptive temporal qp.

+
+
"qp_mode"

Sets qp mode to auto, relative load or uniform.

+
+
"tune_metrics"

Sets the tuning metric to none, VQ, PSNR, SSIM or VMAF.

+
+
"forced_idr"

Forces insertion of an IDR.

+
+
"crf"

Enables or disables CRF.

+
+
"expert_options"

sets encoder's expert option.

+
+
"device_type"

For AV1 encoder selects between Type 1 and Type 2.

+
+
+
+

+
+
+
+
+

Filter Plugin Reference

+
+

Filter Interface

+

The filter plugin is based on the Filter XMA plugin type. The external interface to the filter plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+
+
+XmaFilterSession *xma_filter_session_create(XmaFilterProperties *props)
+
+ +

This function creates a filter session and must be called prior to sending YUV frames to the filter. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_filter_session_set_log(XmaFilterSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_filter_session_send_frame(XmaFilterSession *session, XmaFrame *frame)
+
+ +

This function sends YUV frames to the filter module in hardware. After sending a frame, the application can take further action depending upon the return value from this API.

+

If this function returns XMA_SUCCESS, then the application can proceed to recieve a frame from this filter.

+

If this function returns XMA_TRY_AGAIN, it means the input frame has not been consumed and needs to re-send the same input frame after calling receive frame.

+

Once the application sends all input frames to the filter module, it should continue sending null frames until all the frames have been flushed out from the filter.

+
+
+int32_t xma_filter_session_recv_frame(XmaFilterSession *session, XmaFrame *frame)
+
+ +

This function is called after calling the function xma_filter_session_send_frame().

+

If this function returns XMA_SUCCESS, then the "dummy" frame provided by the application has been filled in and can be sent to the next plugin.

+

If this function returns XMA_RESEND_AND_RECV, then no frames have been sent to the filter for processing. The XmaFrame is untouched and may be reused or released. +If this function returns XMA_TRY_AGAIN, then frames have been sent and are currently being processed, but are not yet ready. The c:struct:XmaFrame is untouched and may be reused or released. +If this function returns XMA_EOS, then all frames have been processed. The c:struct:XmaFrame is untouched and must be released.

+
+
+int32_t xma_filter_session_destroy(XmaFilterSession *session)
+
+ +

This function destroys the filter session that was previously created with the xma_filter_session_create() function.

+
+
+

Filter Properties

+

The AMD AMA Video SDK filter is configured using a combination of standard XMA filter properties, standard XMA filter input and output properties and custom filter parameters, all of which are specified using XmaFilterProperties and XmaFilterPortProperties data structures.

+
+
+struct XmaFilterProperties
+
+ +

This data structure is used to configure the filter function. The declaration of XmaFilterProperties can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+
+
+struct XmaFilterPortProperties
+
+ +

This data structure is used to configure the input and output of the filter. The XmaFilterProperties data structure contains one XmaFilterPortProperties for the filter input and one XmaFilterPortProperties for the output output. The declaration of XmaFilterPortProperties can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+

Standard XMA Filter Properties

+

When using the filter plugin, the following members of the XmaFilterPortProperties data structure must be set by the application:

+
+
hwfilter_type

Sets the direction of stream entry to XMA_UPLOAD_FILTER_TYPE or XMA_DOWNLOAD_FILTER_TYPE.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the filter plugin.

+
+
param_cnt

Count of custom parameters.

+
+
input

Input property of type XmaFilterPortProperties

+
+
output

Output property of type XmaFilterPortProperties

+
+
+

Standard XMA Filter Port Properties

+

When configuring the filter input or output, the following members of the XmaFilterPortProperties data structure must be set by the application:

+
+
format

Input video format. +Must be set to XMA_VPE_FMT_TYPE.

+
+
sw_format

Device side input video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840 +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
framerate

Framerate data structure specifying frames per second.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
framerate

Framerate data structure specifying frame rate per second.

+
+
+

Custom Filter Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the filter plugin:

+
+
"latency_logging"

When enabled, it logs latency information to XMA log.

+
+
+
+

+
+
+
+
+

Ultra Low Latency Considerations

+
+

Decoder Low Latency Mode

+

To enable low latency in the decoder, add a XmaParameter with the name low_latency, of type XMA_INT32, and value of 1. After each frame is sent to the decoder, the decoder will return XMA_SUCCESS. The application can immediately call xma_dec_session_recv_frame(). It will return either XMA_SUCCESS (indicating a frame has been returned), XMA_EOS (indicating the end of stream has been reached), or XMA_RESEND_AND_RECV (indicating the frame is still being processed and xma_dec_session_recv_frame() must keep being called until it is ready).

+
+
+

Encoder Ultra Low Latency Mode

+

To enable Ultra Low Latency in the encoder, set XmaEncoderProperties.lookahead_depth = 0. After each frame is sent to the encoder, the encoder will return XMA_SUCCESS. The application can immediately call xma_enc_session_recv_data(). It will return either XMA_SUCCESS (indicating a frame has been returned), XMA_EOS (indicating the end of stream has been reached), or XMA_RESEND_AND_RECV (indicating the frame is still being processed and xma_enc_session_recv_data() must keep being called until it is ready).

+
+
+
+
+

1.1 SDK API

+

The following subsections delineate 1.1 API improvements over 1.0. To use 1.1 APIs, set XMA_API_VERSION parameter to XMA_API_VERSION_1_1. (See here for how to do this.)

+
+

Note

+

SDK 1.1.1 is not backward ABI compatible with SDK 1.0. This implies that 1.0 applications need to be migrated to 1.1.1 SDK, manually.

+
+
+

Sideband Data

+

The main difference between SDK 1.1 and 1.0 are:

+
    +
  1. v1.0 only allowed 1 sideband data of each type, adding another would replace the first. v1.1 allows multiple of each type. New functions are added to access/modify the sideband data.

  2. +
  3. HDR10 sideband data type are deprecated and replaced with several different SEI sideband data types

  4. +
  5. Applications can define their own sideband data types and add the sideband data to frames. Filters will pass this sideband data downstream. Currently, only frames can have sideband data.

  6. +
  7. All sideband data (both predefined and user defined) can have metadata. Metadata is XmaParameters attached to sideband data used for adding additional information about a sideband data buffer to a sideband data. Each sideband data can have only one sideband metadata with a given name. If an application tries to add new metadata to a sidedata and a metadata with the same name already exists, the original metadata will be deleted and replaced by the new metadata. Metadata exists solely on the host.

  8. +
  9. Added sidedata functions are:

    +
    - xma_side_data_get_metadata(): Gets the value of sideband metadata.
    +- xma_side_data_set_metadata(): Adds/replaces sideband metadata to sideband data.
    +- xma_frame_get_first_side_data(): Get the first sidedata of any type that is attached to a given frame.
    +- xma_frame_get_next_side_data(): Get the next sidedata of any type that is attached to a given frame.
    +- xma_frame_get_next_side_data_of_type(): Get the next sidedata of a given type that is attached to a given frame.
    +
    +
    +
  10. +
  11. Modified sidedata functions are:

    +
    - xma_frame_get_side_data(): In v1.0 it will continue to get the sidedata of a given type from a given frame. In v1.1 it will get the first sidedata of a given type from a given frame.
    +- xma_frame_remove_side_data_type(): In v1.0 it will continue to remove the sidedata of a given type. In v1.1 it will remove all sidedata of a given type.
    +
    +
    +
  12. +
  13. Deprecated sidedata functions are:

    +
    - xma_side_data_read(): In v1.0 it copies the contents of the sidedata buffer from the device to the host.
    +
    +
    +
  14. +
+
+
+

Multithreading

+
    +
  1. In the decoder, 2 XmaParameter parameters are added:XMA_DEC_PARAM_THREADS and XMA_DEC_PARAM_WAIT. If XMA_DEC_PARAM_THREADS is set to 1, a background thread is deployed to improve performance. Note that XMA_DEC_PARAM_THREADS is 0 by default. If the application is using different threads to send and receive data from the decoder, the parameter XMA_DEC_PARAM_WAIT will improve CPU utilization on the host. XMA_DEC_PARAM_WAIT is only available if XMA_DEC_PARAM_THREADS is 1. XMA_DEC_PARAM_WAIT is 0 by default.

  2. +
  3. Similarly, in the encoder, 2 XmaParameter parameters are added: XMA_ENC_PARAM_THREADS and XMA_ENC_PARAM_WAIT. These behave the same as in the decoder.

  4. +
  5. The encoder calling order of send and receive has changed to be more in line with the decoder and scaler.

    +
    +
      +
    • +
      xma_enc_session_send_frame() return values and expected application behavior:
        +
      • XMA_SUCCESS: A frame is successfully sent to the encoder, regardless of if any data can be pulled from the encoder. The application should try calling xma_enc_session_recv_data() and proceed depending on the return value from xma_enc_session_recv_data().

      • +
      • XMA_TRY_AGAIN: The encoder's internal buffers are currently full. The application should try calling xma_enc_session_recv_data() and proceed according to it's return code. The next time xma_enc_session_send_frame() is called, send the same frame as was last sent, as it has not yet been processed. XMA_TRY_AGAIN will only be returned if XMA_ENC_PARAM_WAIT is 0.

      • +
      +
      +
      +
    • +
    • +
      xma_enc_session_recv_data() return values and expected application behavior:
        +
      • XMA_SUCCESS: Compressed data was returned and xma_enc_session_send_frame() can be called.

      • +
      • XMA_RESEND_AND_RECV: No compressed data is ready and the application should call xma_enc_session_send_frame(). Multiple loops of xma_enc_session_send_frame() returning XMA_TRY_AGAIN and xma_enc_session_recv_data() returning XMA_RESEND_AND_RECV may occur if internal buffers are full but no compressed data is ready. Continue looping until one of the functions returns a different value. XMA_RESEND_AND_RECV will only be returned if XMA_ENC_PARAM_WAIT is 0.

      • +
      • XMA_EOS: The end of the stream has been reached.

      • +
      +
      +
      +
    • +
    +
    +
  6. +
+
+
+

Logging

+

XMA logging has been extended to be able to optionally output AMA logging. To use it, in the call to xma_log_init(), set the log type to XMA_LOG_TYPE_AMA.

+
+
+

Upgrading

+
    +
  1. If any frame returned by a session needs to have sideband data added/removed, e.g. adding XMA_FRAME_SIDE_DATA_DYN_ENC_PARAMS, then:

    +
      +
    • Original frame will need to be cloned, using xma_frame_clone()

    • +
    • Original frame itself, not its clone, has to have it's reference count decremented, using xma_frame_dec_ref()

    • +
    • Clone frame can have its sideband data added or removed using xma_frame_add_side_data(), xma_frame_remove_side_data(), or xma_frame_remove_side_data_type().

    • +
    +

    Following the above, the clone can then be passed on downstream, same as the original frame.

    +
  2. +
  3. xma_frame_add_side_data() does not remove existing sideband data from a frame, prior to adding a new sideband data. Instead it will add the new sideband data in addition to the old sideband data. To remove existing sideband data, call xma_frame_remove_side_data_type() first.

  4. +
+
+
+
+

XRM API Reference

+

The Xilinx® FPGA Resource Manager (XRM) library is used to manage the hardware accelerators available in the system. XRM keeps track of total system capacity for each of the compute units such as the decoder, scaler, and encoder.

+

The XRM library includes a daemon, a command line tool and a C application programming interface (API). Using the library API, external applications can communicate with the XRM daemon and perform actions such as reserving, allocating and releasing resources.

+

More details on the XRM command line tool (xrmadm) and the XRM daemon (xrmd) can be found in the XRM Reference Guide section of the documentation.

+

The XRM C APIs are defined in /opt/amd/ama/ma35/include/xrm/xrm.h.

+
+

Decoder Resource Reservation with XRM

+

The decoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file.

+
+
+int xrm_dec_reserve(XrmDecodeContext *xrm_dec_ctx, int dev_index, XrmInterfaceProperties *xrm_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant decoder parameters

+
+
+void xrm_dec_release(XrmDecodeContext *xrm_dec_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmDecodeContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file.

+
+
+

Encoder Resource Reservation with XRM

+

The encoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+int32_t xrm_enc_reserve(XrmEncodeContext *xrm_enc_ctx, int dev_index, int slice_id, bool is_xav1, bool is_ull, XrmInterfaceProperties *xrm_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_enc_release(XrmEncodeContext *xrm_enc_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmEncodeContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+

Scaler Resource Reservation with XRM

+

The scaler plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+
+int32_t xrm_scale_reserve(XrmScaleContext *scaler_xrm_ctx, int dev_index, XrmInterfaceProperties *input_props, XrmInterfaceProperties *output_props, int num_outputs)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_scale_release(XrmScaleContext *scaler_xrm_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmScaleContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+
+

Building Sample Examples

+

To build the included sample applications, follow the steps below:

+
cd /opt/amd/ama/ma35/examples/xma/
+chmod -R 777 .
+mkdir build && cd build
+cmake ..
+make -j
+
+
+
+

+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/card_management.html b/v1.1.1/card_management.html new file mode 100644 index 00000000..15508137 --- /dev/null +++ b/v1.1.1/card_management.html @@ -0,0 +1,610 @@ + + + + + + + + + + + + + + + Card Management — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Card Management
  • +
  • +
  • +
+
+
+
+
+ +
+

Card Management

+ +
+

Overview

+

The AMD AMA Video SDK builds on the Xilinx Resource Manager (XRM) to interface with AMD video acceleration cards. The AMD AMA Video SDK includes the mautil, mamgmt , maflash and xrmadm command line tools for card installation, upgrade, and management.

+
+

mautil, maflash, mamgmt and print_ma35_load

+

The AMD Board Utility (mautil), the AMD Flash Utility, (maflash) and the AMD Board Management Utility (mamgmt) are standalone command line tools used to query, flash and administer AMD acceleration cards. print_ma35_load prints load status of the card in a readable manner.

+
    +
  • mautil is used to examine and identify the installed accelerator card(s). This option is meant for use by unprivileged users to get status information on AMD AMA devices. mautil is available on both the bare-metal host and guest VM.

  • +
  • maflash is used to flash card(s) firmware.

  • +
  • mamgmt is used to examine devices, reset and administer the installed accelerator card(s). This option is meant for use by privileged users to get status information of AMD AMA devices, create VFs, and reset target evices. mamgmt is only available on the bare-metal host.

  • +
+

The mautil, maflash and mamgmt commands target one device at a time using a PCIe DBDF (Domain:Bus:Device.Function) identifier. The DBDF notation works as follows:

+
    +
  • PCI Domain number, often padded using leading zeros to four digits

  • +
  • A colon (:)

  • +
  • PCI Bus number in hexadecimal, often padded using a leading zeros to two or four digits

  • +
  • A colon (:)

  • +
  • PCI Device number in hexadecimal, often padded using a leading zero to two digits . Sometimes this is also referred to as the slot number.

  • +
  • A decimal point (.)

  • +
  • PCI Function number in hexadecimal.

  • +
+
+
+

xrmadm and xrmd

+

XRM is the software which manages the hardware accelerators available in the system. The XRM daemon (xrmd) is a background process supporting reservation, allocation, and release of hardware acceleration resources. The XRM xrmadm command line tool is used to interact with the XRM daemon (xrmd) in order to check status and generate resource utilization reports.

+

For more details about the XRM commands specific to the AMD AMA Video SDK refer to the XRM Command Reference Guide.

+
+
+
+

Card and Device Identifiers

+
+

Device DBDF (mautil)

+

The list of all installed AMD AMA Video SDK compatible devices, including their DBDF is obtained with the mautil examine command.

+

For example, the command below detected 2 devices and lists their BDFs:

+
$ mautil examine
+List of available devices:
+0000:01:00.0
+0000:02:00.0
+Info: No action taken, no reports given.
+Info: Use --help to check cmd options to use for reports
+
+
+

The last device listed has DBDF of 0000:02:00.0, which describes Domain 0, Bus 02, Device 00, Function 0.

+
+
+

Device DBDF (mamgmt)

+

The list of all installed AMD AMA Video SDK compatible devices, including their DBDF can also be obtained with the mamgmt examine command.

+

For example, the command below detected 2 devices and lists their DBDF designations:

+
$ mamgmt examine
+
+
+  List of available devices:
+  0000:01:00.0
+  0000:02:00.0
+  Info: No action taken, no reports given.
+  Info: Use --help to check cmd options to use for reports
+
+
+

The last device listed has DBDF of 0000:02:00.0, which describes Domain 0, Bus 2, Device 00, Function 0.

+
+
+

Bus ID

+

You can look-up the PCIe bus ID of a device through the following command:

+
cat /sys/class/misc/ama_transcoder{x}/bus_id
+
+
+

, where x is a number between 0 to total number of devices minus 1.

+

Example

+
    +
  • Bus id of /sys/class/misc/ama_transcoder0 is:

    +
    $ cat /sys/class/misc/ama_transcoder0/bus_id
    +  0000:01:00.0
    +
    +
    +
  • +
  • This can be verified by mautil examine command.

  • +
+
+
+

Firmware Version Number

+

To look-up the version number of each installed firmware, proceed as follows:

+
+
cat /sys/class/misc/ama_transcoder0/version_information
+
+
+

It should return:

+
+
+
ZSP Version = 2.0.4
+SC Version = 9.7.35
+eSecure Version = 1.0.0
+PCIe FW Version = 2.1.0
+PCIe CTRL Patch Version = 1.0.3
+PCIe PHY Patch A Version = 1.0.0
+
+
+
+
+
+
+

Checking System Status - mautil

+

The mautil commands provides useful details about your environment and can be used to ensure that your cards and devices are properly detected.:

+
mautil -d [<DBDF> | all] command, where "command" is one of the following: ("all" refers to every card in the chassis.)
+   examine    - Status of the system and device.
+   validate   - Validates the basic shell acceleration functionality
+
+
+
+

Note

+
    +
  • Running validate sub-command on a device running a video pipeline will impact the performance of the pipeline.

  • +
+
+

The list of applicable devices, for mautil sub-commands, can be obtained via mautil examine.

+

For more details on examine command, see Checking Device Status.

+
+
+

Checking Device Status

+

The mautil examine -d <DBDF> --report <type> commands provides additional details about the status of each AMD AMA Video SDK compatible device installed.

+

The --report (or -r) switch is used to view specific report(s) of interest:

+
    +
  • electrical: Reports Electrical and power sensors present on the device

  • +
  • device-hw: Provides information on the device's hardware

  • +
  • error-cnt: Reports on device's error counter

  • +
  • flash-info: Prints device's flash information

  • +
  • memory: Reports memory topology of the device

  • +
  • pcie-info: PCIe information of the device

  • +
  • thermal: Reports thermal sensors present on the device

  • +
  • all: Prints all the known status

  • +
+

These reports can also be generated in a JSON file, by adding --format JSON -o <filename> to the mautil examine command.

+

An example usage for thermal and electrical reports, for the device with DBDF 0000:02:00.0 is:

+
mautil examine -r thermal electrical -d 0000:02:00.0
+
+---------------------------------
+1/1 [0000:01:00.0] : MA35 Device
+---------------------------------
+MA35 Thermal Info:
+Device Temperature:
+  id: ma35_temp_s2 [85 C]
+Board Temperature:
+  id: board_temp [44 C]
+MA35 Electrical Info:
+Device Electrical Info:
+  id: aux [732 mV]
+  id: ddr0 [868 mV]
+  id: ml_engine [747 mV]
+  id: enc [748 mV]
+Board Electrical Info:
+  id: 3V PEX Voltage [3304 mV]
+  id: 3V AUX Voltage [3320 mV]
+  id: 12V PEX Voltage [12040 mV]
+  id: 3V PEX Current [293 mA]
+  id: 3V AUX Current [93 mA]
+  id: 12V PEX Current [426 mA]
+  id: board_power [6405 mW]
+
+
+
+
+

Checking Device Configuration - mamgmt

+

The mamgmt provides administrative commands for managing the installed devices. In addition to commands that are provided by mautil, mamgmt also allows for managing Virtual Functions (VF) on a device:

+
mamgmt -d [<DBDF> | all] command, where "command" is one of the following: ("all" refers to every card in the chassis.)
+  examine      - Status of the system and device
+  numvfs       - Create a VF or destroys the active VF
+  reset        - Resets the given device
+
+
+

An example usage for all available reports on 0000:01:00.0 is:

+
mamgmt examine -d 0000:01:00.0 -r all
+
+Memory Bandwidths:
+         Tag                 Current (MBps)
+  s2_dfi_w_MBps             : 0
+  s2_dfi_r_MBps             : 0
+  s2_axi_w_MBps             : 0
+  s2_axi_r_MBps             : 0
+  s1_dfi_w_MBps             : 0
+  s1_dfi_r_MBps             : 474
+  s1_axi_w_MBps             : 0
+  s1_axi_r_MBps             : 236
+
+  total_dfi_MBps            : 474
+       s1_dfi_bw(total)     : 474
+       s2_dfi_bw(total)     : 0
+  total_axi_MBps            : 236
+       s1_axi_bw(total)     : 236
+       s2_axi_bw(total)     : 0
+
+Pcie Info:
+  Vendor                 : 0x10ee
+  Device                 : 0x5070
+  PCIe                   : 16GT/s, Width 4
+
+MA35 Thermal Info:
+Device Temperature:
+  id: Device Temp [57 C]
+Board Temperature:
+  id: board_temp [53 C]
+
+MA35 Electrical Info:
+Device Electrical Info:
+  id: aux [736 mV]
+  id: ddr0 [864 mV]
+  id: ml_engine [752 mV]
+  id: enc [750 mV]
+Board Electrical Info:
+  id: 3V PEX Voltage [3304 mV]
+  id: 3V AUX Voltage [3296 mV]
+  id: 12V PEX Voltage [12208 mV]
+  id: 3V PEX Current [266 mA]
+  id: 3V AUX Current [80 mA]
+  id: 12V PEX Current [653 mA]
+  id: board_power [9114 mW]
+
+Device Hardware Info:
+Device uptime (sec):328344
+Device Firmware Info:
+  PciePhyPatch:  1.0.0
+  PcieCtlPatch:  1.0.3
+  PCIe:  2.1.0
+  eSecure:  1.0.0
+  SC:  9.7.32
+  ZSP:  2.0.4
+Device Threshold Info:
+  shutdown_temp_C:  110
+  max_operating_temp_C:  105
+  threshold_temp_C:  85
+Device Hardware Info:
+  oem_id:  0xe78
+  sku_number:  02
+  part_number:  05105-02
+  Product_Name:  ALVEO MA35D PQ
+  Product_Revision:  1
+  Product_SN:  XFL1AT3KLCY5
+  Processor_Type:  VPU (Video Processing Unit)
+
+MA35 Error Counter Info:
+         Tag                 Uncorrectable       Correctable
+    THS2_axi_sram            0                   0
+    THS1_axi_sram            0                   0
+    ddr_ch7                  0                   0
+    ddr_ch6                  0                   0
+    ddr_ch3                  0                   0
+    ddr_ch2                  0                   0
+    ddr_ch1                  0                   0
+    ddr_ch5                  0                   0
+    ddr_ch0                  0                   0
+    ddr_ch4                  0                   0
+    pcie                     0                   0
+
+
+

An example usage to reset device 0000:01:00.0 is:

+
mamgmt reset -d 0000:01:00.0
+Are you sure you wish to proceed? [Y/n]: y
+****************************************************
+Reset command completed
+****************************************************
+
+
+

To create and destroy a VF device, issue the following commands, respectively:

+
$ sudo mamgmt -d <DBDF> numvfs -v 1 # Create VF device
+$ sudo mamgmt -d <DBDF> numvfs -v 0 # Destroy VF device
+
+
+
+
+

Programming a Device - maflash

+

The maflash utility provides means of programming and verifying flash images from a target device or for getting meta-data from a binary image file.

+

To flash program or verify a flashing process, specify the <DBDF> of a target device or all for all devices in a chassis:

+
sudo maflash <sub-command> [-d [<DBDF> | all] | -p | -s | -b] <path_to_flash_image>
+    -d | --device         a comma separated list of PCIe DBDFs *or* the keyword "all" which will use all detected ma35 devices
+    -p | --parallel       perform the program or verify operation simultaneous across all specified devices
+    -s | --stop-on-error  for non-parallel operations, stop at the first error detected.  The default is to continue on error
+    -b | --backup         specify that the program or verify operation should use the backup regions (where appropriate)
+
+
+

, where sub-command is one of:

+
program             - To flash an image
+verify              - To verify proper image flashing
+
+
+

For example, the following command flashes all relevant subsystems for 0000:01:00.0 device using ma35_firmware.bin image.:

+
sudo /opt/amd/ama/ma35/bin/maflash program -d 0000:01:00.0 ma35_firmware.bin
+
+Using flash image: zsp_firmware_packed_pq.bin [type: ZSP, version: 2.0.4, package_timestamp: 2024-01-30_02:16:39+00:00, keyset: AMD, md5sum: a0c16839e94e1cba0a8c54e2e4f720ec, schema: 1]
+  Device: 0000:01:00.0
+EraseFlash Started..
+9%  19%  29%  38%  48%  58%  67%  77%  87%  96%  100%
+
+WriteFlash Started, please Wait..
+flash_progress:
+10%  20%  30%  40%  50%  60%  70%  80%  90%  100%
+
+    Operation completed successfully
+Using flash image: BMC-MSP432.bin [type: SC, version: BMC-MSP432-9.7.32, package_timestamp: 2024-01-30_02:16:31+00:00, md5sum: f92a87bb92749276d4ecd12dc4f9887b, schema: 1]
+  Device: 0000:01:00.0
+EraseFlash Started..
+9%  18%  28%  37%  46%  56%  65%  75%  84%  93%  100%
+
+WriteFlash Started, please Wait..
+flash_progress:
+10%  20%  30%  40%  50%  60%  70%  80% 100%
+
+
+

To verify proper programming of the primary ZSP flash, issue the following command:

+
sudo /opt/amd/ama/ma35/bin/maflash verify -d 0000:01:00.0  ma35_firmware.bin
+
+Using flash image: zsp_firmware_packed_pq.bin [type: ZSP, version: 2.0.4, package_timestamp: 2024-01-30_02:16:39+00:00, keyset: AMD, md5sum: a0c16839e94e1cba0a8c54e2e4f720ec, schema: 1]
+  Device: 0000:01:00.0
+    Operation completed successfully
+Using flash image: BMC-MSP432.bin [type: SC, version: BMC-MSP432-9.7.32, package_timestamp: 2024-01-30_02:16:31+00:00, md5sum: f92a87bb92749276d4ecd12dc4f9887b, schema: 1]
+  Device: 0000:01:00.0
+    Operation completed successfully
+
+
+

To get meta-data from a binary file, use the info sub-command:

+
 sudo /opt/amd/ama/ma35/bin/maflash info ma35_firmware.bin
+
+zsp_firmware_packed_pq.bin: type: ZSP, version: 2.0.4, package_timestamp: 2024-01-30_02:16:39+00:00, keyset: AMD, md5sum: a0c16839e94e1cba0a8c54e2e4f720ec, schema: 1
+BMC-MSP432.bin: type: SC, version: BMC-MSP432-9.7.32, package_timestamp: 2024-01-30_02:16:31+00:00, md5sum: f92a87bb92749276d4ecd12dc4f9887b, schema: 1
+
+
+
+
+

Checking Resource Utilization

+

Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

+
source /opt/amd/ama/ma35/scripts/setup.sh
+
+
+

Note that this command should be run only once per boot.

+

To check the current loading of all the devices in your system, use the following command:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

This will generate a report in JSON format containing the load information for all the compute unit (CU) resources. The report contains a section for each device in the system. The device sections contain sub-sections for each of the CUs (decoder, scaler, lookahead, encoder) in that device. For example, the load information for the encoder on device 0 may look as follows:

+
"device_0": {
+  ...
+  "cu_2": {
+       "cuId         ": "2",
+       "cuType       ": "IP Kernel",
+       "kernelName   ": "encoder",
+       "kernelAlias  ": "ENCODER_TYPE1_AMA",
+       "instanceName ": "encoder_1",
+       "cuName       ": "encoder:encoder_1",
+       "kernelPlugin ": "",
+       "maxCapacity  ": "497664000",
+       "numChanInuse ": "0",
+       "usedLoad     ": "0 of 1000000",
+       "reservedLoad ": "0 of 1000000",
+       "resrvUsedLoad": "0 of 1000000"
+   },
+
+
+

The usedLoad value indicates how much of that resource is currently being used. The value will range from 0 (nothing running) to 1000000 (fully loaded). The reservedLoad value indicates how much of that resource is being reserved using XRM. The resrvUsedLoad value indicates how much of the reserved load is actually being used.

+ +
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/encoder_comp_matrix.html b/v1.1.1/encoder_comp_matrix.html new file mode 100644 index 00000000..0859ba17 --- /dev/null +++ b/v1.1.1/encoder_comp_matrix.html @@ -0,0 +1,2028 @@ + + + + + + + + + + + + + + + Encoding Compatibility Matrix — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Encoding Compatibility Matrix
  • +
  • +
  • +
+
+
+
+
+ +
+

Encoding Compatibility Matrix

+ +

Given the many adjustable parameters of an AMD AMA Video encoder, not all combinations of such parameters are permissible. The following tables describe the compatibility matrix for each encoder type.

+
+

AVC and HEVC Encoders

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LA Depth

Latency Mode

Cores

Slow Preset

Medium Preset

Fast Preset

No B Frames

CQP

CBR

VBR

cVBR

CRF

CABR

Spatial AQ

Temporal AQ

ROI QP Map

7-49

+
Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-3
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

6

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-2
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

5

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

4

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

3

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

2

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

1

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
Y
+
+

0

+
ULL
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
+
+

AV1 Type 1 Encoder

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LA Depth

Latency Mode

Cores

Slow Preset

Medium Preset

Fast Preset

No B Frames

CQP

CBR

VBR

cVBR

CRF

CABR

Spatial AQ

Temporal AQ

ROI QP Map

11-53

+
Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-7
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

10

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-6
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

9

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-5
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

8

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-4
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

7

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-3
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

6

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-2
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

5

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

4

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

3

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

2

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

1

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

0

+
ULL
+
+
+
1 or 2
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
+

Note

+
    +
  1. When using 2 cores, the minimum resolution should have width >= 720 and height >= 720

  2. +
  3. The Slow preset only has an impact for 10-bit content. For 8-bit content it is identical to the medium preset. This statement applies to all values of lookahead depth.

  4. +
+
+
+
+

AV1 Type 2 Encoder

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LA Depth

Latency Mode

Cores

Slow Preset

Medium Preset

Fast Preset

No B Frames

CQP

CBR

VBR

cVBR

CRF

CABR

Spatial AQ

Temporal AQ

ROI QP Map

7-49

+
Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-3
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

6

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-2
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

5

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

4

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

3

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+

2

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+

1

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+

0

+
ULL
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/examples.html b/v1.1.1/examples.html new file mode 100644 index 00000000..b41218c2 --- /dev/null +++ b/v1.1.1/examples.html @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + Tutorials and Examples — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tutorials and Examples
  • +
  • +
  • +
+
+
+ + + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/examples/amf/amf_encoder.html b/v1.1.1/examples/amf/amf_encoder.html new file mode 100644 index 00000000..672de2c3 --- /dev/null +++ b/v1.1.1/examples/amf/amf_encoder.html @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + AMF Encoder Tutorial — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMF Encoder Tutorial
  • +
  • +
  • +
+
+
+
+
+ +

Under Construction

+
+

AMF Encoder Tutorial

+

The examples in the /opt/amd/ama/ma35/bin folder illustrate how C-based applications can perform encoding in AMD AMA Video SDK devices, using the AMF (Advanced Media Framework) APIs.

+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/examples/ffmpeg/filters.html b/v1.1.1/examples/ffmpeg/filters.html new file mode 100644 index 00000000..019f6b10 --- /dev/null +++ b/v1.1.1/examples/ffmpeg/filters.html @@ -0,0 +1,316 @@ + + + + + + + + + + + + + + + FFmpeg Examples using Software Filters — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

FFmpeg Examples using Software Filters

+ +

Examples shown in this section describe how to use FFmpeg combining both AMD accelerated functions and software filters. In all these examples, an AMA compatible device, e.g., MA35D, is used to decode the input stream, the decoded frames are transfered back to the host using the hwdownload filter, one or more software filters are applied to the decoded frames and the filtered frames are transfered back to the device using hwupload for encoding. It should be noted that, when possible, zero-copy filters such as split and fps should be used, to minimize the traffic between the host CPU and target device.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Video Rotation

+

The following example demonstrates how to generate multiple flip-over operations on the host CPU and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "split=2[a][b]; \
+  [a]hwdownload,transpose=dir=1:passthrough=none,hwupload[a1]; \
+  [b]hwdownload,transpose=dir=2:passthrough=none,hwupload[b1]" \
+ -map "[a1]" -c:v h264_ama  -f mp4 <OUT DIR>/90_flip.mp4 \
+ -map "[b1]" -c:v h264_ama  -f mp4 <OUT DIR>/270_flip.mp4
+
+
+

, where INPUT is the path to the input AVC clip and OUT DIR is the name of the output directory. See FFmpeg's filters for details on passthrough and split filters.

+
+
+

Logo Overlay

+

The following example demonstrates how to overlay a yuv420p image on a decoded video, through host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -i <y4M LOGO> -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "[1]hwdownload[vid],[vid][0]overlay=x=0:y=0[l],[l]format=yuv420p[lay],[lay]hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/overlay.mp4
+
+
+

Note that input to accelerated encoder, h264_ama, is in yuv420p format. See FFmpeg's overlay filter for detail usage.

+
+
+

Crop and Shift

+

The following example demonstrates how to crop a decoded video, at a given x and y offsets, through host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "hwdownload,crop=640:480:(in_w-800):(in_h-out_h)/2,hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/crop.mp4
+
+
+
+
+

Video Composition

+

The following example demonstrates how to compose a tiled video on the host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -out_fmt yuv420p -i <INPUT_1> -c:v h264_ama -out_fmt yuv420p -i <INPUT_2> \
+ -c:v h264_ama -out_fmt yuv420p -i <INPUT_3> -c:v h264_ama -out_fmt yuv420p -i <INPUT_4> \
+ -filter_complex "[0]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[00];[1]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[11];\
+  [2]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[22];[3]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[33]; [00][11]hstack[top];\
+  [22][33]hstack[bot]; [top][bot] vstack,hwupload" \
+ -c:v h264_ama -b:v 15M -vframes 600 -f mp4 <OUT DIR>/compose.mp4
+
+
+
+

Note

+

For 10-bit support, the following changes are required to the provided examples:

+
    +
  1. Replace -out_fmt yuv420p with -out_fmt yuv420p10le

  2. +
  3. Add format=yuv420p10le to the filter graph.

  4. +
+

As an example, the following command shows 10-bit crop and shift:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p10le -i <INPUT> \
+ -filter_complex "hwdownload,format=yuv420p10le,crop=640:480:(in_w-800):(in_h-out_h)/2,hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/crop_10b.mp4
+
+
+
+
+
+

Chroma Subsampling

+

The following example demonstrates how to perform 4:2:2 to 4:2:0 chroma subsampling on the host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -i <INPUT>  -vf "format=yuv420p,hwupload" -c:v h264_ama -b:v 1M -f mp4 <OUTPUT>
+
+
+

, where <INPUT> is path of the 442 input raw file and <OUTPUT> is the encoded video file.

+
+
+

Decoding and De-interlacing

+

Given that AMD AMA SDK neither accepts interlaced contents nor performs de-interlacing, such operations need to be performed on the host CPU. The following example demonstrates how to perform interlaced to progressive transcoding:

+
ffmpeg -hwaccel ama -i <INPUT>  -filter_complex  "yadif=0,hwupload" -c:v h264_ama -f mp4 <OUTPUT>
+
+
+

, where <INPUT> is path of the interlaced content and <OUTPUT> is the encoded video file.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/examples/ffmpeg/quality_analysis.html b/v1.1.1/examples/ffmpeg/quality_analysis.html new file mode 100644 index 00000000..d248d8b7 --- /dev/null +++ b/v1.1.1/examples/ffmpeg/quality_analysis.html @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + Video Quality Examples — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Video Quality Examples

+

This page is dedicated to explaining some of the details behind Video Quality (VQ), how it is measured, and how you can optimize your FFmpeg commands with the AMD AMA Video SDK to maximize its performance.

+

Further documentation on this topic can be found in the Tuning Video Quality section of the AMD AMA Video SDK user guide.

+ +
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Introduction to Video Quality

+

There has been a longstanding goal for video engineers to quantitatively determine the output quality of an encoder without having to watch and inspect every individual frame. This has led to an evolution of algorithmic solutions, the most common of which are:

+ +

Many people will argue which metric is best (although PSNR is commonly considered the least accurate). Jan Ozer from the Streaming Media Center posted his experimental correlation of MOS vs the above metrics. You can review the findings here.

+

Furthermore, due to the industry standard of tracking encoder "performance" to quantitative metrics like the ones listed above, many encoders have "taught to the test"; that is, they provide different command-line arguments that will give higher scores but may look worse to the human eye. For example, common CPU encoders x264 and x265 have a tune parameter which optimizes to objective metrics.

+

This page discusses the AMD AMA Video SDK command line flags used to optimize for objective quality (scores) and subjective quality (visual appeal) and provides additional details as to what is happening behind the scenes and why.

+
+
+

Optimized Settings for the AMD AMA Video SDK

+

It is highly recommended to perform encoding on raw video clips; that is, clips that have not undergone a transform/compression/encoding in the past. This ensures that the clips are in a universally known state in order to fairly compare encoders.

+

Alternatively, you can add the flags to decode before encoding, and the results will remain accurate as long as the same pre-encoded file is used as the source across all encoders under test. Information on this process can be found on the FFmpeg tutorial page.

+

Flags not illustrated in this page are covered in the Using FFmpeg chapter of the AMD AMA Video SDK user guide.

+

The following table demonstrates various encoder parameters that effect VQ and latency.

+ + ++++++ + + + + + + + + + + + + + + +
Video Tuning Parameters

Tune Mode

Latency Setting

Preset Type

Encoder

VMAF

+

VQ

+

SSIM

+

PSNR

+

(See -tune_metrics)

+

Normal

+

Ultra Low Latency

+

(See -lookahead_depth)

+

Medium

+

Slow

+

(See -preset)

+

h264_ama

+

hevc_ama

+

av1_ama

+

(See -c:v)

+
+

Various permutations of Metrics, Latency and Preset are possible. The following sections provide demonstrative examples.

+
+

AV1 VMAF - Normal Latency - Medium Preset

+

In this mode, which is the default mode, the only adjustable parameter is the tuning mode. The following example, illustrates the VMAF tune mode, for AV1 encoder

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v av1_ama -tune_metrics 4 -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -tune_metrics 4 specifies VMAF optimization mode.

+
+
+

AVC VMAF - Normal Latency - Slow Preset

+

In this mode, real-time performance at capacity is not guaranteed; however, better results are obtained, with respect to the selected tune metric. Note that this mode is not applicable to either types of AV1.

+

The following example, illustrates the VMAF tune mode, for AVC encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v h264_ama -tune_metrics 4 -preset slow -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -preset slow optimizes the objective tuning modes.

+
+
+

AV1 VMAF - Ultra Low Latency - Medium Preset

+

Ultra Low Latency (ULL) is achieved by setting the -lookahead_depth to 0. The following example, illustrates the VMAF tune ULL mode, for AV1 encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v av1_ama -tune_metrics 4 -b:v 2000k -lookahead_depth 0 -f rawvideo <OUTPUT>
+
+
+
+
+

AVC VMAF - Ultra Low Latency - Slow Preset

+

This mode is the combination of ULL and metric optimized options. Note that this mode is not applicable to either types of AV1.

+

The following example, illustrates the VMAF tune ULL mode, for AVC encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v h264_ama -tune_metrics 4 -lookahead_depth 0 -preset slow -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -preset slow optimizes the objective tuning modes.

+
+
+
+

Running PSNR/SSIM/VMAF Scores

+

Due to licensing reasons, the FFmpeg binary delivered in this package does not include a comprehensive set of codecs or plugins required for scoring video quality. You have many options:

+
    +
  1. (Easiest) Download a static FFmpeg build from John Van Sickle which has VMAF (among other plugins) precompiled + installed

  2. +
  3. Recompile another version FFmpeg and include the VMAF library

  4. +
  5. Recompile the FFmpeg starting from the source code included in this repository and include the VMAF library. For instructions on how to customize and rebuild the FFmpeg provided with the AMD AMA Video SDK, see the Rebuilding FFmpeg section

  6. +
+

The following sample command line demonstrates a typical VMAF calculation, through FFmpeg:

+
<FFMPEG PATH>/ffmpeg -i <DISTORTED FILE> -framerate <FRAME RATE> -s <RESOLUTION> -pix_fmt yuv420p -i <ORIGINAL> \
+-lavfi libvmaf="log_fmt=json:ms_ssim=1:ssim=1:psnr=1:log_path=/<LOG FILE PATH>.vmaf.json:model_path=<PATH TO VMAF MODEL>" -f null -
+
+
+

, where FFMPEG PATH is the path to modified FFmpeg, DISTORTED FILE is the encoded file, RESOLUTION is WidthxHeigth resolution of the original clip, ORIGINAL is the original clip, LOG FILE PATH is the path of log file and PATH TO VMAF MODEL is the path to an appropriate VMAF model, which typically is vmaf_4k_v0.6.1.pkl for 4K resolution or vmaf_float_v0.6.1.pkl for lower resolutions. See Models for relevant details. The above command line calculates PSNR, SSIM and VMAF, in json format.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/examples/ffmpeg/tutorials.html b/v1.1.1/examples/ffmpeg/tutorials.html new file mode 100644 index 00000000..27325036 --- /dev/null +++ b/v1.1.1/examples/ffmpeg/tutorials.html @@ -0,0 +1,579 @@ + + + + + + + + + + + + + + + FFmpeg Tutorials — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

FFmpeg Tutorials

+

This page provides tutorials on how to use FFmpeg with the AMD AMA Video SDK. The complete reference guide for the FFmpeg version included in the AMD AMA Video SDK can be found here.

+

The tutorials break down the commands, starting with simple decode, scale and encode pipelines. The tutorials end with different varieties of full transcode pipelines.

+ +
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+

+
+
+
+

Simple FFmpeg Examples

+

Some of the examples read or write RAW files from disk (encode-only or decode-only pipelines). There is a chance that due to the massive bandwidth required for operating on these RAW files, you will notice a drop in FPS; this is not due to the AMD AMA Video SDK but the disk speeds. We recommend reading/writing from /dev/shm which is a RAM disk.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Decode Only

+

This example accepts a clip that is already encoded in H.264, and will decode the file into a RAW format and save it to disk.

+

Command Line:

+
ffmpeg -y -hwaccel ama -c:v h264_ama -out_fmt nv12 -i <INPUT> \
+ -vf hwdownload,format=nv12 -f rawvideo /tmp/dec_out.nv12
+
+
+

Explanation of the flags:

+
    +
  • ffmpeg

    +
      +
    • The ffmpeg application, which is provided by AMD, and moved to the top of the PATH when you sourced the setup.sh script

    • +
    +
  • +
  • hwaccel ama

    +
      +
    • Instructs FFmpeg to use accelerated plugins provided by AMD AMA Video SDK

    • +
    +
  • +
  • -out_fmt nv12

    +
      +
    • Specifies nv12 output format for the decoded video. Note that this option has to be specified twice: 1) To convert from the internal buffer format to nv12 in the decoder and 2) To convert when transferring to the host.

    • +
    +
  • +
  • -f rawvideo

    +
      +
    • This signifies that the video is in a raw format, without container or other metadata/information about the clip

    • +
    +
  • +
  • -c:v h264_ama

    +
      +
    • Declares the decoder's codec for video (as opposed to, e.g., audio -c:a ac3) is the hardware-accelerated H.264 decoder

    • +
    +
  • +
  • -i <INPUT>

    +
      +
    • The input file to be transcoded

    • +
    +
  • +
  • -vf hwdownload

    +
      +
    • Internally, the decoder operates on AMD AMA Video SDK type buffers to improve performance. To convert back to a host-buffer, you must execute this filter.

    • +
    +
  • +
  • -y

    +
      +
    • Enable overwrite without prompting the user if they're sure

    • +
    +
  • +
  • /tmp/dec_out.yuv

    +
      +
    • The decoder will save the file to the path above

    • +
    +
  • +
+
+
+

Encode Only

+

This example accepts a RAW 1080p60 clip in YUV420 format. It will pass the clip to the encoder to produce an AV1 encoded MP4 output with a target bitrate of 5Mbps and saves it to disk. The command uses the default VQ setting. See FFmpeg Video Quality for details.

+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -b:v 5M -f mp4 -y sn1_av1.mp4
+
+
+

Explanation of the flags:

+
    +
  • -re

    +
      +
    • Flag to maintain the target frame rate

    • +
    +
  • +
  • -s 1920x1080

    +
      +
    • Since there is no container or metadata in a RAW clip, the user must define the input clip's resolution/size. This example states the input is 1080p

    • +
    +
  • +
  • -framerate 60

    +
      +
    • Again, without metadata, the encoder requires the framerate of the incoming stream

    • +
    +
  • +
  • -pix_fmt yuv420p

    +
      +
    • The color space of the encoder is by default yuv420p. this example is defining the input clip as being this same color space

    • +
    +
  • +
  • -f mp4

    +
      +
    • Sets the output video container to MP4

    • +
    +
  • +
  • -b:v 5M

    +
      +
    • The target bitrate of the encoded stream. 8M signifies a target bitrate of 8 Megabits per second. You can also use 8000K or 8000000.

    • +
    +
  • +
  • -c:v av1_ama

    +
      +
    • Declares the encoder's codec for video (as opposed to audio -c:a ...) is the hardware-accelerated AV1 encoder

    • +
    +
  • +
  • /tmp/enc_out.mp4

    +
      +
    • Save the output in the above path.

    • +
    +
  • +
+
+

4:2:2 10 Bit Conversion

+

To encode YUV, 4:2:2, 10 bit pixel format to YUV, 4:2:0, 8 bit use the following command:

+

Command Line:

+
ffmpeg -hwaccel ama -i <INPUT>  -vf "format=yuv420p,hwupload" -c:v h264_ama -b:v 1M <OUTPUT>
+
+
+

Explanation of the flags:

+
    +
  • -vf "format=yuv420p,hwupload"

    +
      +
    • Instructs the pipeline to upload and convert the input video as yuv420p.

    • +
    +
  • +
+
+
+

Constant Rate Factor (CRF) Mode

+

The following examples demonstrate the usage of the -crf flag and impact of the -qp option on the quality of the encoded streams.

+
+
High Quality Encoding
+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -crf 1 -qp 0 -f mp4 sn1_crf_hq.mp4
+
+
+

Explanation of the flags:

+
    +
  • -crf 1

    +
      +
    • Enables the -crf mode

    • +
    +
  • +
  • -qp 0

    +
      +
    • Sets the encoded AV1 stream to highest CRF quality

    • +
    +
  • +
+
+
+
Low Quality Encoding
+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -crf 1 -qp 255 -f mp4 sn1_crf_lq.mp4
+
+
+

Explanation of the flags:

+
    +
  • -qp 255

    +
      +
    • Sets the encoded AV1 stream to lowest CRF quality

    • +
    +
  • +
+
+
+
+
+

Basic Transcode

+

This example takes an H.264 clip and transcodes it to HEVC at the bitrate of 8Mbps. The output is written into /tmp/h264_to_hevc.

+

Command Line:

+
ffmpeg -y -hwaccel ama -c:v h264_ama -i <INPUT> \
+ -c:v hevc_ama -b:v 8M  -f rawvideo  /tmp/h264_to_hevc.hevc
+
+
+
+
+

Decode Only Into Multiple-Resolution Outputs

+

This example decodes an existing H.264 file and then scales it into multiple resolutions as defined below. It will not re-encode them, but save the RAW outputs to disk under /tmp/_scale<resolution>.yuv

+

Command Line:

+
 ffmpeg -y -hwaccel ama \
+-c:v h264_ama  -out_fmt nv12 -i <INPUT>  \
+-filter_complex "scaler_ama=outputs=4:out_res=(1920x1080|full|nv12)(1280x720|full|nv12)(720x480|full|nv12)(360x240|full|nv12) [a][b][c][d]; [a]hwdownload,format=nv12[a1];[b]hwdownload,format=nv12[b1];[c]hwdownload,format=nv12[c1];[d]hwdownload,format=nv12[d1]" \
+-map '[a1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_1080p.yuv \
+-map '[b1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_720p.yuv  \
+-map '[c1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_480p.yuv \
+-map '[d1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_240p.yuv
+
+
+

Explanation of the flags:

+
    +
  • -filter_complex

    +
      +
    • The FFmpeg -filter_complex flag allows combining multiple filters together using a graph-like syntax. This example uses the scaler_ama to create 4 output resolutions from the input stream.

    • +
    • The scaler_ama filter configures the hardware-accelerated scaler to produce 4 output resolutions (1920x1080, 1280x720, 720x480, and 360x240). For each output, the width, height, frame rate and pixel format are defined as arguments to out_res option as in (WidthxHeight|Rate|Format). The 4 outputs are transfered to the host as a1, b1, c1 and d1 respectively.

    • +
    +
  • +
  • -map "[ID]"

    +
      +
    • Selects an output of the filter graph. The flags that follow apply to the selected stream.

    • +
    +
  • +
  • /tmp/scale_<resolution>.yuv

    +
      +
    • Save the output files to the paths listed

    • +
    +
  • +
+
+
+

Encode Only Into Multiple-Resolution Outputs

+

This example takes a raw 1080p60 YUV file, scales it down to different resolutions and frame rates, encodes each of the scaled streams to different formats and saves them to disk under /tmp/<encode format>_<resolution>p<frame rate>.mp4

+

Command Line:

+
ffmpeg -y -hwaccel ama -f rawvideo -pix_fmt yuv420p -s:v 1920x1080 -framerate 60 -i <INPUT> \
+-filter_complex "hwupload,scaler_ama=outputs=4:out_res=(1920x1080|full)(1280x720|half)(720x480|half)(360x240|half) [a][b][c][d]" \
+-map '[a]' -c:v hevc_ama -b:v 6M -f mp4 -y /tmp/hevc_1080p60.mp4 \
+-map '[b]' -c:v av1_ama  -b:v 2M -f mp4 -y /tmp/av1_720p30.mp4 \
+-map '[c]' -c:v h264_ama -b:v 1M -f mp4 -y /tmp/h264_480p30.mp4 \
+-map '[d]' -c:v av1_ama  -b:v 1M -f mp4 -y /tmp/av1_240p30.mp4
+
+
+

Explanation of the flags:

+
    +
  • -filter_complex "hwupload...

    +
      +
    • Specifies that video clip gets upload to the device.

    • +
    +
  • +
  • -filter_complex "...scaler_ama=outputs=4:out_res=...(1280x720|half)...

    +
      +
    • Declares scaler output of given resolution and rate. See scaler_ama for more details.

    • +
    +
  • +
  • -c:v [hevc_ama | av1_ama | h264_ama]

    +
      +
    • Declares various encode types HEVC, AV1 and H.264, respectively.

    • +
    +
  • +
  • /tmp/encode-format_resoultion.encode-format

    +
      +
    • Saves the output clips to the location listed

    • +
    +
  • +
+
+
+

Transcode with Multiple-Resolution Outputs

+

This example implements a complete transcoding pipeline on an 1080p60 H.264 input. It decodes the input stream, scales it to 4 different resolutions and encodes scaler's outputs into various formats and saves them to disk under /tmp/<encoder format>_<resolution>.mp4

+

Command Line:

+
ffmpeg -y -hwaccel ama \
+-c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=4:out_res=(1920x1080)(1280x720)(720x480)(360x240) [a][b][c][d]" \
+-map '[a]' -c:v hevc_ama -b:v 6M -f mp4 -y /tmp/hevc_1080p.mp4 \
+-map '[b]' -c:v av1_ama  -b:v 2M -f mp4 -y /tmp/av1_720p.mp4 \
+-map '[c]' -c:v h264_ama -b:v 1M -f mp4 -y /tmp/h264_480p.mp4 \
+-map '[d]' -c:v av1_ama  -b:v 1M -f mp4 -y /tmp/av1_240p.mp4
+
+
+
+
+

Transcode in ULL Mode

+

This example implements an ultra low latency transcode pipeline. For more details refer Tuning Transcode Latency.

+

Command Line:

+
ffmpeg  -hide_banner -loglevel error -y -hwaccel ama -low_latency 1 -c:v h264_ama -i <INPUT> \
+-c:v hevc_ama -b:v 10M -lookahead_depth 0 -f rawvideo /tmp/h264_to_hevc.hevc
+
+
+

Explanation of the flags:

+
    +
  • -low_latency 1

    +
      +
    • Enables low latency decoding mode.

    • +
    +
  • +
  • -lookahead_depth 0

    +
      +
    • LA size of 0 triggers ultra low latency encoding mode.

    • +
    +
  • +
+
+
+

Double Density Example with xrmd

+

This example demonstrates an example on how to achieve 4x4kp60 density on a single device

+

Command Line:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -i <4Kp6 H.264 file> \
+ -filter_complex "split=4[a][b][c][d]" \
+ -map "[a]" -c:v av1_ama -f rawvideo -y /tmp/out_3840x2160_0.av1 \
+ -map "[b]" -c:v hevc_ama -f rawvideo -y /tmp/out_3840x2160_0.hevc \
+ -map "[c]" -c:v av1_ama -f rawvideo -y /tmp/out_3840x2160_1.av1 \
+ -map "[d]" -c:v hevc_ama -f rawvideo -y /tmp/out_3840x2160_1.hevc
+
+
+

Explanation of the flags:

+
    +
  • -split

    +
      +
    • Splits input into several identical outputs.

    • +
    +
  • +
+
+
+

Double Density Example without xrmd

+

This example demonstrates how to achieve 4x4kp60 density on a single device, by explicitly allocating tasks on slices 0 and 1. Note in this example xrmd service has to be stopped.

+

Command Line:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -i <4Kp6 H.264 file> \
+ -filter_complex "split=4[a][b][c][d]" \
+ -map "[a]" -c:v av1_ama -slice 0 -f rawvideo -y /tmp/out_3840x2160_0.av1 \
+ -map "[b]" -c:v hevc_ama -slice 0 -f rawvideo -y /tmp/out_3840x2160_0.hevc \
+ -map "[c]" -c:v av1_ama -slice 1 -f rawvideo -y /tmp/out_3840x2160_1.av1 \
+ -map "[d]" -c:v hevc_ama -slice 1 -f rawvideo -y /tmp/out_3840x2160_1.hevc
+
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/examples/gstreamer/filters.html b/v1.1.1/examples/gstreamer/filters.html new file mode 100644 index 00000000..48842c07 --- /dev/null +++ b/v1.1.1/examples/gstreamer/filters.html @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + GStreamer Examples using Software Filters — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Examples using Software Filters

+ +

The /opt/amd/ama/ma35/examples/gstreamer/ama_pipeline_scripts/filters/ folder contains different examples showing how to use GStreamer combining both AMD accelerated functions and software filters. In all these examples, an AMA compatible device, e.g., MA35D, is used to decode the input stream, the decoded frames are transfered back to the host using the ama_download filter, one of more software filters are applied to the decoded frames and the filtered frames are transfered back to the device using ama_upload for encoding. It should be noted that, when possible, zero-copy filters such as split and fps should be used, to minimize the traffic between the host CPU and target device.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Video Rotation

+
    +
  • Example script: 01_rotate_video.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and will send the rotated, encoded h.264 output to /tmp/xil_rotate_<N>.mp4.

+
+
+

Logo Overlay

+
    +
  • Example script: 02_logo_overlay.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and an image file ("logo"). It will scale the logo to 500x100, place it 16 pixels right and 16 pixels down from the top-left corner of the output video file, which will be an encoded h.264 output saved to /tmp/xil_logo_overlay.mp4.

+
+
+

Crop and Zoom

+
    +
  • Example script: 03_crop_zoom.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and will crop a 300x200 sized section of the original video. The section's top left corner begins at 20 pixels to the right, and 10 pixels down from the top-left corner of the original video. The output video is h.264 encoded and is saved to /tmp/xil_crop_zoom.mp4

+
+
+

Video Composition

+
    +
  • Example script: 04_multi_comp.sh

  • +
+

This example accepts 4x 8-bit, YUV420, pre-encoded h264 files of equal dimensions, and will create an output 2x2 composite video which will be an encoded h.264 output saved to /tmp/xil_multi_comp.mp4. The output resolution will be equal to the original input.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/examples/gstreamer/tutorials.html b/v1.1.1/examples/gstreamer/tutorials.html new file mode 100644 index 00000000..a606f223 --- /dev/null +++ b/v1.1.1/examples/gstreamer/tutorials.html @@ -0,0 +1,346 @@ + + + + + + + + + + + + + + + GStreamer Introductory Tutorials — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Introductory Tutorials

+

This page provides tutorials on how to use GStreamer with the AMD AMA Video SDK. The complete reference guide for the GStreamer version included in the AMD AMA Video SDK can be found here.

+ +
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Simple GStreamer Examples

+

By default, all the example scripts use the filesink plug-in and write the output files into the /tmp directory.

+

Some of the examples read or write RAW files from disk (encode-only or decode-only pipelines). There is a chance that due to the massive bandwidth required for operating on these RAW files, you will notice a drop in FPS; this is not due to the AMD AMA Video SDK but the disk speeds. We recommend reading/writing from /dev/shm which is a RAM disk.

+

Most of the scripts allow to use the fakesink plug-in which only displays performance numbers and will not write outputs to disk. This is done by setting the “fakesink” argument to 1.

+

Each script contains error checks before passing arguments to GStreamer pipeline command to help users avoid giving incorrect arguments.

+

Most of the example scripts included in this directory take H.264 input streams. To use H.265 input streams, update the scripts to use the h265parse GStreamer plug-in instead of h264parse.

+

For brevity purposes, explanations of the GStreamer element properties are not repeated after they have been explained once. The detailed explanation of the each GStreamer pipeline element property can be obtained by using gst-inspect-1.0 <element name> (e.g. gst-inspect-1.0 ama_av1enc).

+
+

Decode only

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! parsebin ! h264parse ! ama_h264dec ! capsfilter 'caps=video/x-raw(memory:AMAMemory),format=NV12' !  ama_download ! filesink location=/tmp/h264.nv12
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • gst-launch-1.0

    +
      +
    • The GStreamer application, which is provided by AMD, and moved to the top of the PATH when you sourced the setup.sh script

    • +
    +
  • +
  • filesrc location

    +
      +
    • Location of the file h.264 to read

    • +
    +
  • +
  • parsebin

    +
      +
    • Unpacks the container to elementary stream

    • +
    +
  • +
  • h264parse

    +
      +
    • Parses H.264 streams

    • +
    +
  • +
  • ama_h264dec

    +
      +
    • GStreamer plug-in that provides functionality to decode H.264 encoded streams. This plug-in accepts input encoded stream in byte-stream/NALU format only and produces NV12 frames.

    • +
    +
  • +
  • capsfilter

    +
      +
    • Specifies the capabilities of the streams. Note that keyword capsfilter is optional.

    • +
    +
  • +
+
+
+

Encode only

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! rawvideoparse width=1920 height=1080 format=i420 framerate=60/1 ! ama_upload ! ama_h264enc ! h264parse ! filesink location=/tmp/out.h264
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • ama_h264enc

    +
      +
    • GStreamer plug-in that provides functionality to encode raw bit streams into AVC byte-stream.

    • +
    +
  • +
  • rawvideoparse

    +
      +
    • This element converts unformatted data streams into timestamped raw video frames, with specified resolution, frame rate and pixel format.

    • +
    +
  • +
  • ama_upload

    +
      +
    • This plugin transfer raw video file content from host to the device

    • +
    +
  • +
+
+
+

Transcode with Multiple-Resolution outputs

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! parsebin ! \
+h264parse ! ama_h264dec ! identity eos-after=1200 ! ama_scaler name=s \
+s.src_0 ! 'video/x-raw(memory:AMAMemory),width=1920,height=1080' ! ama_h265enc bitrate=6000000 ! queue ! filesink location=/tmp/hevc_1080p.hevc \
+s.src_1 ! 'video/x-raw(memory:AMAMemory),width=1280,height=720' ! ama_av1enc bitrate=2000000 ! queue ! filesink location=/tmp/av1_720p.av1 \
+s.src_2 ! 'video/x-raw(memory:AMAMemory),width=720,height=480' ! ama_h264enc bitrate=1000000 ! queue ! filesink location=/tmp/h264_480p.h264 \
+s.src_3 ! 'video/x-raw(memory:AMAMemory),width=360,height=240' ! ama_av1enc bitrate=1000000 ! queue ! filesink location=/tmp/av1_240p.av1
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • queue

    +
    +
      +
    • The queue will create a new thread on the source pad to decouple the processing on sink and source pad.

    • +
    +
    +
  • +
  • identity

    +
    +
      +
    • In this usage, forces the insertion of EOS after 1200 buffers.

    • +
    +
    +
  • +
+

For more comprehensive sets of examples refer to /opt/amd/ama/ma35/examples/gstreamer/ama_pipeline_scripts/tutorials folder.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/examples/gstreamer/xabrladder.html b/v1.1.1/examples/gstreamer/xabrladder.html new file mode 100644 index 00000000..2a3c3e27 --- /dev/null +++ b/v1.1.1/examples/gstreamer/xabrladder.html @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + GStreamer ABR Ladder Application — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer ABR Ladder Application

+ +
+

Introduction

+

The sample multi-scale program located at /opt/amd/ama/ma35/bin/gstreamer/ is a command line utility which implements the GStreamer video transcoding pipeline described in the diagram below. This application expects an input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams. The resolution of each output stream is configured using a JSON file (by default: /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder/abrladder.json). The output streams produced by this application are saved in the /tmp/ladder_outputs/ folder.

+

This application is installed through the amd-ama-gstreamer package. If this package is not present on your system, install it by following the steps described in the package feed page. The source code for this application is also available under, /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder.

+GStreamer pipeline of the ama_xabrladder application +
+

Note

+

This example supports input files of elementary stream NAL type or mp4 containers, with H.264/H.265 elementary stream in it. No other formats are supported

+
+
+
+

Host System Requirement

+
    +
  • AMD AMA Video SDK

  • +
  • amd-ama-gstreamer package

  • +
+
+
+

Usage

+

Below are the input parameters required to run the application.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Parameter

Short Form

Description

+
+--devidx
+
+ +
+
+-i
+
+ +
+
device index
+
Type: int
+
Range: 0 to 31
+
Default: NA
+
Option: Mandatory
+
+
+
+--json
+
+ +
+
+-j
+
+ +
+
JSON file used to describe the configuration of the ABR ladder
+
Type: string
+
Range: NA
+
Default: /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder
+
Option: Optional
+
+
+
+--codectype
+
+ +
+
+-c
+
+ +
+
Output codec type
+
Type: int
+
Range: 0 (H264), 1 (H265)
+
Default: NA
+
Option: Mandatory
+
+
+
+--file
+
+ +
+
+-f
+
+ +
+
Input file path name (mp4/elementary-stream)
+
Type: string
+
Range: NA
+
Default: NA
+
Option: Mandatory
+
+
+
+--forcekeyframe
+
+ +
+
+-k
+
+ +
+
Keyframe (IDR frame) insertion frequency in number of frames
+
Type: int
+
Range: NA
+
Default: 0
+
Option: Optional
+
+
+
+
+

Examples

+

Below are example commands for the ABR ladder use case. The output files are stored in /tmp/ladder_outputs/ folder. Ensure that enough space is available in this folder.

+
    +
  1. Running one ABR ladder on one device:

    +
    ama_xabrladder  --devidx 0 --codectype 0 --file <path to file>
    +
    +
    +
  2. +
+

The above command takes the input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams based on the codec type provided (0 for H.264 and 1 for H.265) with the following resolutions: 720p60, 720p30, 480p30, 360p30 and 160p30.

+
    +
  1. Running one ABR ladder on one device without lookahead:

    +
    ama_xabrladder  --devidx 0 --lookahead_enable 0 --codectype 0 --file <path to file>
    +
    +
    +
  2. +
+

The above command takes the input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams based on the codec type provided (0 for H.264 and 1 for H.265) with the following resolutions: 720p60, 720p30, 480p30, 360p30 and 160p30.

+
    +
  1. Running one ABR ladder on one device with lookahead enabled, and using the short-form options:

    +
    ama_xabrladder -i 0  -c 0 -f <path to file>
    +
    +
    +
  2. +
  3. Running two ABR ladders, mapping each ladder to a specific device using the devidx option:

    +
    ama_xabrladder --devidx 0  --codectype 1 --file <path to file>
    +ama_xabrladder --devidx 1  --codectype 1 --file <path to file>
    +
    +
    +
  4. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/examples/gstreamer/xcompositor.html b/v1.1.1/examples/gstreamer/xcompositor.html new file mode 100644 index 00000000..d9146293 --- /dev/null +++ b/v1.1.1/examples/gstreamer/xcompositor.html @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + GStreamer Compositor Application — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Compositor Application

+ +
+

Introduction

+

The sample compositor program located at /opt/amd/ama/ma35/bin/gstreamer/ is a command line utility which implements the GStreamer video transcoding pipeline described in the diagram below. This application expects four input video files 60(mp4 with H.264/H.265 or H.264/H.265 elementary stream). The resolution of each input cannot exceed 1080p. The application creates an output stream by first composing the four inputs in a 2x2 grid, then by adding an optional logo and lastly by inserting a time stamp.

+

This application is installed through the amd-ama-gstreamer package. If this package is not present on your system, install it by following the steps described in the package feed page. The source code for this application is also available under, /opt/amd/ama/ma35/examples/gstreamer/ama_xcompositor.

+GStreamer pipeline of the ama_xcompositor application +
+

+
+
+
+

Host System Requirement

+
    +
  • AMD AMA Video SDK

  • +
  • amd-ama-gstreamer package

  • +
+
+
+

Usage

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Parameter

Description

-f

+
mp4/elementary-stream file path. Resolutions up to 1080p are supported.
+
Type: string
+
Range: NA
+
Default: NA
+
Option: Mandatory
+
+

-l

+
png/jpg logo file path. No logo will be overlayed if this option is not specified.
+
Type: string
+
Range: NA
+
Default: Null
+
Option: Optional
+
+

-b

+
Max bitrate for encoder in Kbps
+
Type: int
+
Range: 0 to 4294967295
+
Default: 5000
+
Option: Optional
+
+

-i

+
device index
+
Type: int
+
Range: 0 to 31
+
Default: 0
+
Option: Optional
+
+

-h

+
Horizontal offset of overlay logo in fractions of video image width, from top-left corner of video image (in relative positioning)
+
Type: double
+
Range: 0 to 1
+
Default: 0.9
+
Option: Optional
+
+

-v

+
Vertical offset of overlay logo in fractions of video image height, from top-left corner of video image (in relative positioning)
+
Type: double
+
Range: 0 to 1
+
Default: 0
+
Option: Optional
+
+

-n

+
Number of input buffers
+
Type: integer
+
Range: 20 to 2147483647
+
Default: 2000
+
Option: Optional
+
+

-o

+
Output file name and path
+
Type: String
+
Range: NA
+
Default: ./result.mp4
+
Option: Optional
+
+
+
+
+

Examples

+
    +
  1. Composition along with logo on top right of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png
    +
    +
    +
  2. +
  3. Composition with logo on top left of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png -h 0 -v 0
    +
    +
    +
  4. +
  5. Composition with logo on center of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png -h 0.5 -v 0.5
    +
    +
    +
  6. +
  7. Composition without logo layer:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265
    +
    +
    +
  8. +
  9. Composition on device with index 2:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -i 2
    +
    +
    +
  10. +
  11. Composition on decoder soft kernel start index at 8:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265
    +
    +
    +
  12. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/examples/xma/xma_apps.html b/v1.1.1/examples/xma/xma_apps.html new file mode 100644 index 00000000..03aad825 --- /dev/null +++ b/v1.1.1/examples/xma/xma_apps.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + + + XMA Examples for the AMD AMA Video SDK — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

XMA Examples for the AMD AMA Video SDK

+ +

The examples in the /opt/amd/ama/ma35/bin folder illustrate how C-based applications can natively interact with AMD AMA Video SDK devices using the XMA (Xilinx Media Accelerator) APIs. Source codes for decoder, encoder, scaler and transcoder can be found under /opt/amd/ama/ma35/examples/xma directory.

+

Detailed documentation on the AMD AMA Video SDK plugin interface and the XMA APIs can be found in the C API Programming Guide section of the documentation.

+

Requirements

+
    +
  • The XMA applications has been built for and verified on a supported OS.

  • +
  • The XMA applications only work with elementary streams. Container formats such as mp4 are not supported.

  • +
+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

XMA Decoder App

+
+

Decoder Test Instructions

+

The XMA decoder application supports most of the decode options supported by FFmpeg. The XMA decoder application supports only elementary H.264, HEVC and AV1 encoded bitstreams.

+
+

Decoder Usage

+

Running the decoder app with the --help option will print the complete list of options:

+
ma35_decoder_app --help
+encoded file and utilizes hardware acceleration to get the decoded
+output.
+
+Usage:
+        ma35_decoder_app [options] -i <input-file> -c:v <codec-type>
+        [codec_options] -o <output-file>
+
+Arguments:
+        --help                     Print this message and exit
+        -log_level <value>         Specify the log level
+        -log_location <value>      Log location. 0 for none,
+                                   1 console (default), 2 syslog, 3 file
+        -log_file <file>           Name and path of the log file. Default
+                                   ma35_decoder_app.log
+        -d <device_id>             Specify a device on which to run.
+                                   Default: 0
+
+Input Arguments:
+
+        -stream_loop <loop-count>  Number of times to loop the input
+                                   file
+        -i <input-file>            Input file to be used
+
+Codec Arguments:
+
+        -c:v <codec>               Specify H264 or H265 decoding.
+                                   (h264_ama, hevc_ama)
+        -latency_logging           Enable latency logging
+        -frames <frame-count>      Number of frames to be processed.
+        -pix_fmt fmt               The output format (nv12, yuv420p,
+                                   yuv420p10le, xv15) Default: nv12 8 bit,
+                                   yuv420p10le 10 bit
+        -o <file>                  File to which output is written.
+
+
+
+
+

Sample Decoder Command

+

Decode an hevc encoded file into raw N12 format:

+
ma35_decoder_app -c:v hevc_ama -i <INPUT> -frames 100 -pix_fmt nv12 -o out1.nv12
+
+
+
+

+
+
+
+
+
+

XMA Encoder App

+
+

Encoder Test Instructions

+

The encoder XMA application supports most of the encoder options supported by FFmpeg. The XMA application supports variety of input pixel formats, see -out_fmt, and can output H.264/HEVC/AV1 encoded elementary stream formats.

+
+

Encoder Usage

+

Running the encoder app with the --help option will print the complete list of options:

+
ma35_encoder_app --help
+XMA Encoder App Usage:
+     ./ma35_encoder_app [input options] -i input-file -c:v <codec-option>  [encoder options] -o <output-file>
+
+Arguments:
+
+     --help                     Print this message and exit.
+     -log_level <value>         Log level settings, supported are 0 or
+                                emergency, 1 or alert, 2 or critical, 3
+                                or error, 4 or warning, 5 or notice, 6
+                                or info, 7 or debug.
+                                Default is 3/error
+     -log_location <value>      Log location settings, supported are 0 or
+                                none, 1 or console, 2 or syslog, 3
+                                or file.
+                                Default is 1/console
+     -log_file <log-file>       Name and path of log file
+                                Default is ma35_encoder_app.log
+     -d <device-id>             Specify a device on which the
+                                encoder to run.
+                                Default is /dev/ama_transcoder0
+     -frames <frame-count>      Number of frames to be processed.
+
+Input options:
+
+     -stream_loop <loop-count>  Number of times to loop the input
+                                YUV file.
+     -w <width>                 Width of YUV input.
+     -h <height>                Height of YUV input.
+     -pix_fmt <pixel-format>    Pixel format of the input file. It must be yuv420p,
+
+     -i <input-file>            Name and path of input YUV file
+
+Codec option:
+
+     -c:v <codec>               Encoder codec to be used. Supported
+                                are h264_ama, hevc_ama, av1_ama
+     -device_type               When encoding to AV1, this sets which
+                                AV1 encoder will be used. Supported
+                                values are 1(Xilinx), 2(Vendor
+                                supplied), or any
+
+Encoder params:
+
+     -b:v <bitrate>             Bitrate can be given in Kbps or Mbps
+                                or bits i.e., 5000000, 5000K, 5M.
+                                Default is 5Mbps
+     -fps <fps>                 Input frame rate. Default is 30.
+     -g <intraperiod>           Intra period. Default is 15.
+     -qp <qp>                   QP. Supported are -1 to 51,
+                                default is -1
+     -min_qp <qp>               Minimum QP. Supported are 0 to 51,
+                                default is 0.
+     -max_qp <qp>               Maximum QP. Supported values are 0
+                                to 51, default is 51.
+     -spatial_aq_gain <gain>    Spatial AQ gain. Supported values are
+                                0 to 100 or 255, default is 255.
+     -temporal_aq_gain <gain>   Temporal AQ gain. Supported values are
+                                0 to 100 or 255, default is 255.
+     -temporal_aq <0/1>         Temporal AQ. Enable/Disable,
+                                default is -1.
+     -spatial_aq <0/1>          Spatial AQ. Enable/Disable,
+                                default is -1.
+     -qp_mode <qp>              QP Mode. Supported values 0, 1 and 2
+                                default is 0.
+     -control_rate <rc_mode>    Rate Control. Supported values -1, 0, 1, 2 and 3
+                                default is -1.
+     -bf <frames>               Number of B frames. Supported are -1
+                                to 3, default is -1.
+     -force_idr <0/1            Supported values are 0 and 1
+     -profile <value>           Encoder profile.
+                For HEVC, supported are 100 or main, 101 or main10_intra,
+                                102 or main10 , 103 or main10_intra
+                                or still.
+                                Default is 0/automatic
+                                ENC_HEVC_MAIN - 100 or main
+                                ENC_HEVC_MAIN_INTRA - 101 or main_intr
+                                ENC_HEVC_MAIN_10 - 102 or main10
+                                ENC_HEVC_MAIN10_INTRA - 103 or main10_intra
+                For H264, supported are auto or -1, 0 or baseline,
+                                1 or main, 2 or high, 3 or high10
+                                4 or high10_intra, Default is auto or -1
+                                ENC_H264_BASELINE - 0 or baseline.
+                                ENC_H264_MAIN - 1 or main.
+                                ENC_H264_HIGH - 2 or high.
+                                ENC_H264_HIGH_10 - 3 or high10.
+                                ENC_H264_HIGH_10_INTRA - 4 or high10_intra
+     -level <value>             Encoder level.
+                                For HEVC, supported are 10, 11, 20,
+                                21, 30, 31, 40, 41, 50, 51.
+                                default is 10.
+                                For H264, supported are 10, 11, 12,
+                                13, 20, 21, 22, 30, 31, 32, 40, 41,
+                                42, 50, 51, 52.
+                                Default is 0/automatic.
+     -tier <value>              HEVC tier, supported are -1 or auto, 0 or main,
+                                1 or high.
+                                Default is -1/auto
+     -crf <value>               CRF supported values are 0 and 1 i.e. enable
+                                and disable
+     -tune_metrics <value>      Tunes MPSoC H.264/HEVC encoder's video
+                                quality for objective metrics, default 1.
+                                Supported value from 1 to 4
+     -lookahead_depth <value>   Lookahead depth. Supported are 0 to
+                                20, default is 0.
+     -latency_mode <value>      0 normal latency (default), 1 low
+                                latency, or 2 ultra low latency
+     -latency_logging           Enable latency logging
+     -expert_options            Expert options
+     -o <file>                  File to which output is written.
+
+
+
+
+

Sample Encoder Commands

+

H.265 encoding, ultra low latency (Consult the Tuning Latency of Transcode Pipeline section for more details):

+
ma35_encoder_app -w 1920 -h 1080 -pix_fmt yuv420p -i <INPUT> -c:v hevc_ama -b:v 5M -lookahead_depth 0 -g 30 -o out0.265
+
+
+
+

+
+
+
+
+
+

XMA Scaler App

+
+

Scaler Test Instructions

+

The scaler XMA application supports most of the scaler options supported by FFmpeg. The XMA application supports -out_fmt pixel formats.

+
+

Scaler Usage

+

Running the scaler app with the --help option will print the complete list of options:

+
ma35_scaler_app --help
+This program ingests an nv12, yuv420p, yuv420p10le, or xv15 input
+file and utilizes hardware acceleration to scale to various resolutions.
+
+Usage:
+        ma35_scaler_app [options] -w <input-width> -h <input-height> -i
+        <input-file> [scaler_options] -w <output-1-width> -h
+        <output-1-height> -o <output-1-file> -w ...
+
+Arguments:
+        --help                     Print this message and exit
+        -log <level>               Specify the log level
+        -log_location <value>      Log location. 0 for none,
+                                   1 console (default), 2 syslog, 3 file
+        -log_file <file>           Name and path of the log file. Default
+                                    ma35_scaler_app.log
+        -d <device-id>             Specify a device on which to run.
+                                   Default: 0
+
+Input Arguments:
+
+        -stream_loop <loop-count>  Number of times to loop the input
+                                   file
+        -w <width>                 Specify the input's width
+        -h <height>                Specify the input's height
+        -pix_fmt <pixel-format>    Pixel format of the input file (nv12,
+                                   xv15, yuv420p10le). Default : nv12.
+        -fps <frame-rate>          Frame rate. Used for scaler load
+                                   calculation.
+        -i <input-file>            Input file to be used
+
+Output Arguments:
+        -rate <half/full>          Set the rate to half. Half rate drops
+                                   frames to reduce resource usage.
+                                   Default: full.
+        -latency_logging           Enable latency logging
+        -w <width>                 Specify the output's width
+        -h <height>                Specify the output's height
+        -pix_fmt <pixel-format>    Pixel format of the output file (nv12,
+                                   xv15, yuv420p10le). Default: input fmt
+        -frames <frame-count>      Number of frames to be processed.
+        -o <file>                  File to which output is written.
+
+
+
+
+

Sample Scaler Command

+

Scale 1080p nv12 to 720p, 480p, 360p, and 240p nv12:

+
ma35_scaler_app -pix_fmt nv12 -w 1920 -h 1080 -i <INPUT> \
+-w 1280 -h 720  -pix_fmt nv12 -o out1.nv12 \
+-w 848  -h 480  -pix_fmt nv12 -o out2.nv12 \
+-w 640  -h 360  -pix_fmt nv12 -o out3.nv12 \
+-w 288  -h 160  -pix_fmt nv12 -o out4.nv12
+
+
+
+

+
+
+
+
+
+

XMA Transcoder App

+
+

Transcoder Test Instructions

+

The transcoder XMA application supports most of the options supported by ffmpeg. The XMA application supports only elementary H.264, HEVC and AV1 encoded stream input and outputs H.264/HEVC/AV1 encoded elementary stream.

+
+

Transcoder Usage

+

Running the transcoder app with the --help option will print the complete list of options:

+
 ma35_transcoder_app --help
+ XMA Transcoder App Usage:
+        ./program [generic options] -c:v <decoder codec> [decoder options]  -i input-file -scaler_ma -outputs [num] [Scaler options]  -c:v <encoder codec> [encoder options] -o <output-file>  -c:v <encoder codec> [encoder options] -o <output-file>  -c:v <encoder codec> [encoder options] -o <output-file>.....
+
+Arguments:
+
+        --help                     Print this message and exit.
+        -d <device-id>             Specify a device on which the
+                                   transcoder to run. Default: 0
+        -stream_loop <loop-count>  Number of times to loop the input file
+        -frames <frame-count>      Number of input frames to be processed
+
+Decoder options:
+
+        -c:v <codec>               Decoder codec to be used. Supported
+                                   are hevc_ama, h264_ama
+        -latency_logging <0/1>     Latency logging for decoder. Default
+                                   disabled
+        -push-model <0/1>          Decoder streaming model (pull or push). Default
+                                   is pull (can be faster than real-time)
+        -i <input-file>            Name and path of input H.264/HEVC file
+
+Scaler options:
+
+        -scaler_ma                 Name of the ABR scaler filter
+        -num-output <value>        Number of output files from scaler
+        -out_1_width <width>       Width of the scaler output channel 1
+        -out_1_height <height>     Height of the scaler output channel 1
+        -out_1_rate <full/half>    Full of Half rate for output channel 1
+        -out_2_width <width>       Width of the scaler output channel 2
+        -out_2_height <height>     Height of the scaler output channel 2
+        -out_2_rate <full/half>    Full of Half rate for output channel 2
+        -out_3_width <width>       Width of the scaler output channel 3
+        -out_3_height <height>     Height of the scaler output channel 3
+        -out_3_rate <full/half>    Full of Half rate for output channel 3
+        -out_4_width <width>       Width of the scaler output channel 4
+        -out_4_height <height>     Height of the scaler output channel 4
+        -out_4_rate <full/half>    Full of Half rate for output channel 4
+        -out_5_width <width>       Width of the scaler output channel 5
+        -out_5_height <height>     Height of the scaler output channel 5
+        -out_5_rate <full/half>    Full of Half rate for output channel 5
+        -out_6_width <width>       Width of the scaler output channel 6
+        -out_6_height <height>     Height of the scaler output channel 6
+        -out_6_rate <full/half>    Full of Half rate for output channel 6
+        -out_7_width <width>       Width of the scaler output channel 7
+        -out_7_height <height>     Height of the scaler output channel 7
+        -out_7_rate <full/half>    Full of Half rate for output channel 7
+        -out_8_width <width>       Width of the scaler output channel 8
+        -out_8_height <height>     Height of the scaler output channel 8
+        -out_8_rate <full/half>    Full of Half rate for output channel 8
+        -latency_logging <0/1>     Latency logging for scaler. Default
+                                   disabled
+Encoder options:
+
+        -c:v <codec>               Encoder codec to be used. Supported
+                                   are hevc_ama, h264_ama, and av1_ama
+        -device_type               When encoding to AV1, this sets which
+                                   AV1 encoder will be used. Supported
+                                   values are 1(Xilinx), 2(Vendor
+                                   supplied), or any
+        -b:v <bitrate>             Bitrate can be given in Kbps or Mbps
+                                   or bits i.e., 5000000, 5000K, 5M.
+                                   Default is 200kbps
+        -fps <fps>                 Input frame rate. Default is 30.
+        -g <intraperiod>           Intra period. Default is 12.
+        -max-bitrate <bitrate>     Maximum bit rate. Supported are -1 to
+                                   350000000, default is -1
+        -min_qp <qp>               Minimum QP. Supported are 0 to 51,
+                                   default is 0.
+        -max_qp <qp>               Maximum QP. Supported values are 0
+                                   to 51, default is 51.
+        -spatial_aq_gain <gain>    Spatial AQ gain. Supported values are
+                                   0 to 100 or 255, default is 255.
+        -temporal_aq_gain <gain>   Temporal AQ gain. Supported values are
+                                   0 to 100 or 255, default is 255.
+        -bf <frames>               Number of B frames. Supported are 0
+                                   to 7, default is 2.
+        -force_idr <0/1            Supported values are 0 and 1
+        -profile <value>           Encoder profile.
+                   For HEVC, supported are 100 or main, 101 or main10_intra,
+                                   102 or main10 , 103 or main10_intra
+                                   or still.
+                                   Default is 0/automatic
+                                   ENC_HEVC_MAIN - 100 or main
+                                   ENC_HEVC_MAIN_INTRA - 101 or main_intr
+                                   ENC_HEVC_MAIN_10 - 102 or main10
+                                   ENC_HEVC_MAIN10_INTRA - 103 or main10_intra             For H264, supported are auto or -1, 0 or baseline,
+                                   1 or main, 2 or high, 3 or high10
+                                   4 or high10_intra, Default is auto or -1
+                                   ENC_H264_BASELINE - 0 or baseline.
+                                   ENC_H264_MAIN - 1 or main.
+                                   ENC_H264_HIGH - 2 or high.
+                                   ENC_H264_HIGH_10 - 3 or high10.
+                                   ENC_H264_HIGH_10_INTRA - 4 or high10_intra   -level <value>             Encoder level.
+                                   For HEVC, supported are 10 to 52,
+                                   default is 50.
+                                   For H264, supported are 10 to 52,
+                                   default is 50.
+        -slices <value>            Number of slices per frame. Supported
+                                   are 1 to 68, default is 1.
+        -qp_mode <qp>              QP Mode. Supported values 0, 1 and 2
+                                   default is 0.
+        -control_rate <rc_mode>    Rate Control. Supported values -1 to 3
+                                   default is -1.
+        -aspect_ratio <value>      Aspect ratio. Supported values are 0
+                                   to 3, default is 0.
+        -lookahead_depth <value>   Lookahead depth. Supported are 0 to
+                                   20, default is 0.
+        -temporal_aq <0/1>         Temporal AQ. Enable/Disable,
+                                   default is -1.
+        -spatial_aq <0/1>          Spatial AQ. Enable/Disable,
+                                   default is -1.
+        -tune_metrics <value>      Tunes MPSoC H.264/HEVC encoder's video
+                                   quality for objective metrics, default 1.
+                                   Supported value from 1 to 4
+        -tier <value>              HEVC tier, supported are -1 or auto, 0 or main,
+                                   1 or high.
+                                   Default is -1/auto
+        -crf <value>               CRF supported values are 0 and 1 i.e. enable
+                                   and disable
+                                   Default is -1/auto
+        -latency_logging           Enable latency logging
+        -latency_mode <value>      0 normal latency (default), 1 low
+                                   latency, or 2 ultra low latency      -o <file>                  File to which output is written.
+
+
+
+
+

Sample Transcoder Commands

+

H.264 to AV1 Transcoder:

+
ma35_transcoder_app -streams 1 -frames 2000 -c:v h264_ama \
+-i <INPUT> \
+-c:v av1_ama -b:v 10M  -o h264_av1_transcode.av1
+
+
+

H.264 to H264 ABR Transcoder:

+
ma35_transcoder_app -streams 1 -c:v h264_ama \
+-i <INPUT> \
+-scaler_ma -num-output 4 \
+-out_1_width 1280 -out_1_height 720 -out_2_width 848 -out_2_height 480 \
+-out_3_width 640 -out_3_height 360 -out_4_width 288 -out_4_height 160 \
+-c:v h264_ama -b:v 4000K -o abr_ladder1.264 \
+-c:v h264_ama -b:v 3000K -o abr_ladder2.264 \
+-c:v h264_ama -b:v 2500K -o abr_ladder3.264 \
+-c:v h264_ama -b:v 1250K -o abr_ladder4.264
+
+
+

H.264 to AV1 ULL Transcode

+
ma35_transcoder_app -streams 1 -frames 2000 -c:v h264_ama \
+-i <INPUT>\
+-c:v av1_ama  -b:v 10M -lookahead_depth 0 -o h264_av1_transcode.av1
+
+
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/genindex.html b/v1.1.1/genindex.html new file mode 100644 index 00000000..328d6889 --- /dev/null +++ b/v1.1.1/genindex.html @@ -0,0 +1,1204 @@ + + + + + + + + + + + + + + Index — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Index
  • +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ Symbols + | B + | C + | D + | E + | F + | G + | I + | L + | M + | P + | Q + | R + | S + | T + | X + +
+

Symbols

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + +
+ +

G

+ + +
+ +

I

+ + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

P

+ + +
+ +

Q

+ + + +
+ +

R

+ + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

X

+ + + +
+ + + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/v1.1.1/getting_started_on_prem.html b/v1.1.1/getting_started_on_prem.html new file mode 100644 index 00000000..845bf1b0 --- /dev/null +++ b/v1.1.1/getting_started_on_prem.html @@ -0,0 +1,403 @@ + + + + + + + + + + + + + + + Getting Started with AMD AMA Video SDK Cards on Premises — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Getting Started with AMD AMA Video SDK Cards on Premises
  • +
  • +
  • +
+
+
+
+
+ +
+

Getting Started with AMD AMA Video SDK Cards on Premises

+ +
+

Chassis Setup

+
    +
  1. BIOS setting:

    +
      +
    1. Ensure that chassis's BIOS is set to performance mode, e.g., sleep states, clock throttling, Active State Power Management (ASPM), etc. are disabled.

    2. +
    3. 4x4 PCIe bifurcation must be enabled on each slot with a MA35 card.

    4. +
    5. Enable Single Root IO/Virtualization (SR-IOV).

    6. +
    7. Secure boot must be disabled.

    8. +
    9. Enable Above 4G Decoding.

    10. +
    11. Enable Access Control Services (ACS)

    12. +
    13. Enable virtualization.

    14. +
    +
  2. +
  3. Install a compatible kernel, e.g., see Linux VM Guest, Step 2, for details on how to install kernel 5.15 and other required packages.

  4. +
  5. Enable IOMMU by updating /etc/default/grub file to include

    +
      +
    • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on iommu=pt pcie_aspm.policy=performance", for AMD based systems

    • +
    • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on iommu=pt pcie_aspm.policy=performance", for Intel based chassis

    • +
    +
  6. +
  7. Update Grub

    +
    sudo update-grub
    +
    +
    +
  8. +
  9. Allocate at least 4GB of huge pages, per device, plus an extra 96 huge pages, e.g., a single card with 2 devices requires 2*2048+96=4192 huge pages

    +
    sudo sh -c "echo 'vm.nr_hugepages=4192' >> /etc/sysctl.conf"
    +
    +
    +

    Note that if a chassis is being configured to host VMs, then the total number of huge pages, on the host, needs to be the sum of allocated RAM of all VM instances plus 96. As an example, running 6 VMs, each with 12GB of RAM, requires 6*12GB/2MB+96=36960 huge pages. (See Virtualization for details.)

    +
  10. +
  11. Reboot

    +
    sudo reboot
    +
    +
    +
  12. +
  13. Verify settings

    +
    cat /proc/cmdline
    +BOOT_IMAGE=/vmlinuz-5.15.0-50-generic root=/dev/mapper/vg00-rootlv ro quiet splash amd_iommu=on iommu=pt
    +
    +
    +

    and

    +
    cat /proc/meminfo | grep -i huge
    +
    +
    +

    , should return:

    +
    HugePages_Total:    4192
    +HugePages_Free:     4192
    +HugePages_Rsvd:        0
    +Hugepagesize:       2048 kB
    +
    +
    +
  14. +
+
+
+

Check Cards

+

To establish whether deployed cards have proper firmware installed, proceed as follows:

+
    +
  1. List AMD AMA Video SDK PCIe devices

    +
    sudo lspci -vvvd 10ee:
    +
    +
    +

    If devices are not listed as Multimedia controller and/or Region 4 size is not 512MB, a flash update is required. Refer to Flash Firmware section, for instructions.

    +
  2. +
+
+
+

Install the AMD AMA Video SDK

+
    +
  • Ensure that you PPA feed is setup. See Package Feed Setup

  • +
  • Ubuntu

    +
    +
      +
    1. Install packages

      +
      sudo apt -y install libhugetlbfs0 libboost-all-dev
      +dpkg --get-selections '*ma35*' | awk '{system("sudo apt -y purge " $1)}'
      +sudo apt-mark unhold amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer
      +dpkg --get-selections 'amd-ama*' | awk '{system("sudo apt -y purge " $1)}'
      +sudo apt update
      +sudo apt install amd-ama-driver=1.1.1-* amd-ama-core=1.1.1-* amd-ama-xma=1.1.1-* amd-ama-ffmpeg=1.1.1-* amd-ama-gstreamer=1.1.1-*
      +sudo apt-mark hold amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer
      +
      +
      +
    2. +
    3. Verify packages

      +
      sudo dpkg -l amd-ama*
      +
      +
      +

      The expected output is:

      +
      Desired=Unknown/Install/Remove/Purge/Hold
      +| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
      +|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
      +||/ Name              Version          Architecture Description
      ++++-=================-================-============-=================================
      +ii  amd-ama-core      1.1.1-2402121023 amd64        Supernova
      +ii  amd-ama-driver    1.1.1-2402121023 amd64        Supernova
      +ii  amd-ama-ffmpeg    1.1.1-2402121023 amd64        Supernova
      +ii  amd-ama-gstreamer 1.1.1-2402121023 amd64        Supernova
      +ii  amd-ama-xma       1.1.1-2402121023 amd64        Supernova
      +
      +
      +
    4. +
    5. Insert kernel module

      +
      sudo modprobe ama_transcoder
      +
      +
      +
    6. +
    +
    +
  • +
+
+
+

Flash Firmware

+

Flashing is required for this release:

+
    +
  1. Flash the security patch firmware:

    +
    sudo /opt/amd/ama/ma35/bin/maflash program -d all  <patch firmware bin>
    +
    +
    +

    , where patch firmware bin is /opt/amd/ama/ma35/firmware/ma35d_security_patch.bin.

    +
  2. +
  3. Cold reboot:

    +
    sudo systemctl poweroff
    +
    +
    +

    , and power up.

    +
  4. +
  5. To flash all devices, in parallel, issue the following:

    +
    sudo /opt/amd/ama/ma35/bin/maflash program -d all -p <firmware bin>
    +
    +
    +

    , where firmware bin is /opt/amd/ama/ma35/firmware/ma35_firmware.bin.

    +

    Ignore warning messages that state:

    +
    ...
    +Warning: SC update is not supported from ASIC 1 (skipping)
    +...
    +
    +
    +
  6. +
  7. Cold reboot:

    +
    sudo systemctl poweroff
    +
    +
    +

    , and power up.

    +
  8. +
+

For more details on flashing, refer to Programing a Device.

+
+
+

Installation Verification

+

After each reboot or SDK update execute the following command:

+
    +
  1. Confirm driver's successful installation by:

    +
    cat /sys/class/misc/ama_transcoder0/version_information
    +
    +
    +

    It should return:

    +
  2. +
+
+
ZSP Version = 2.0.4
+SC Version = 9.7.35
+eSecure Version = 1.0.0
+PCIe FW Version = 2.1.0
+PCIe CTRL Patch Version = 1.0.3
+PCIe PHY Patch A Version = 1.0.0
+
+
+
+

If the observed version numbers are older than the above, flashing is required. Refer to Flash Firmware section, for instructions.

+
+
+

Set Up the Runtime Environment

+
    +
  1. Run setup script

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  2. +
+

Note that this script requires Bash shell to run.

+
+
+

Run Your First Examples

+

See the tutorials and examples page to learn how to run jobs on your system.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/index.html b/v1.1.1/index.html new file mode 100644 index 00000000..c2b2283d --- /dev/null +++ b/v1.1.1/index.html @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA)
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA)

+

The AMD AMA Video SDK is a complete software stack allowing users to seamlessly leverage the hardware accelerated features of AMD video codec units and enable high-density real-time transcoding for live streaming video service providers, OEMs, and Content Delivery Network (CDNs), on compatible cards. Included in the AMD AMA Video SDK is a pre-compiled version of FFmpeg which integrates video transcoding plug-ins for AMD devices, enabling simple hardware acceleration of video decoding, scaling and encoding. The AMD AMA Video SDK also provides a C-based application programming interface (API) which facilitates the integration of AMD video codec units transcoding capabilities in proprietary frameworks.

+

Cards compatible with AMA SDK offer low power usage, high visual quality at high density. Specifically, MA35D video transcoding card, which is made of 2 Video Processing Units (VPU), is capable of transcoding to and from HEVC, AVC and AV1 formats, at an aggregate rate of up to two 4Kp60, for AVC and HEVC formats, and four 4Kp60 for AV1 format, per VPU.

+ +
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/managing_compute_resources.html b/v1.1.1/managing_compute_resources.html new file mode 100644 index 00000000..454fe1aa --- /dev/null +++ b/v1.1.1/managing_compute_resources.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + + + Managing Video Acceleration Compute Resources — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Managing Video Acceleration Compute Resources
  • +
  • +
  • +
+
+
+
+
+ +
+

Managing Video Acceleration Compute Resources

+ +
+

Introduction

+

The notion of compute units (CUs) and CU pool is central to resource management. A typical video transcode pipeline is made of multiple CUs such as decoder, scaler, lookahead, and encoder. These together form a CU pool. Based on the input resolution, framerate and type of transcode, the load of CUs within a CU pool varies. The number of required resources determines how many parallel jobs can run in real-time. CUs and CU pool are managed by the Xilinx® resource manager (XRM). XRM is a software layer responsible for managing the video hardware accelerators available in the host system. AMD AMA Video SDK compilable cards have a set processing capacity, e.g., an MA35 device is capable of an aggregate processing equivalent of 2 4kp60 H264/HEVC in parallel to 2 4kp60 AV1 streams. XRM allows for running and managing multiple heterogeneous job, in parallel, on all devices hosted in a chassis. It is noted that XRM strictly adheres to the total capacity of the hosted accelerators, i.e., it does not allow for over-subscription of resources.

+

The rest of this guide explains how to:

+
    +
  1. Assign jobs to specific devices using explicit device identifiers

  2. +
  3. Measure device load and determine where to run jobs using either manual or automated resource management techniques

  4. +
+
+
+

Assigning Jobs to Specific Devices

+

By default, a job is submitted to device 0 and slice handling/assignment by XRMD. When running multiple jobs in parallel, device 0 is bound to run out of resources rapidly and additional jobs will error out due to insufficient resources. By using explicit device identifiers, new jobs can be individually submitted to a specific device. This makes it easy and straightforward to leverage the entire video acceleration capacity of your system, based on the number of cards and devices.

+

The FFmpeg -hwaccel option can be used to specify the device on which a specific job should be run. This makes it possible to assign multiple jobs across all available devices in the host. +Determining on which device(s) to run a job can be done using either the manual or automated methods described in the following sections.

+
+

Examples using Explicit Device IDs

+

FFmpeg example of two different jobs run on two different devices

+

In this example, two different FFmpeg jobs are run in parallel. The -hwaccel option is used to submit each job to a different device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0  -c:v h264_ama -i INPUT1.h264 -f mp4 -c:v hevc_ama -y /dev/null &
+ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder1  -c:v h264_ama -i INPUT2.h264 -f mp4 -c:v hevc_ama -y /dev/null &
+
+
+
+

+
+
+
+
+

Manual Resource Management

+

The card management tools included in the AMD AMA Video SDK provide ways to query the status and utilization of the video accelerator devices. Using these tools the user can determine which resources are available and thereby determine on which device to submit a job (using explicit device identifies, as explained in the previous section).

+

Given that each device has a set compute capacity, the user is responsible for only submitting jobs which will not exceed the capacity of the specified device. If a job is submitted on a device where there are not enough compute unit resources available to support the job, the job will error out with a message about resource allocation failure.

+

The XRM and card management tools provide methods to estimate CU requirements and check current device load.

+
+

Checking System Load

+

Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

+
source /opt/amd/ama/ma35/scripts/setup.sh
+
+
+

Note that this command should be run only once per boot.

+

To check the current loading of all the devices in your system, use the following command:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

This will generate a report in JSON format containing the load information for all the compute unit (CU) resources. The report contains a section for each device in the system. The device sections contain sub-sections for each of the CUs (decoder, scaler, lookahead, encoder) in that device. For example, the load information for the encoder on device 0 may look as follows:

+
"device_0": {
+  ...
+  "cu_2": {
+       "cuId         ": "2",
+       "cuType       ": "IP Kernel",
+       "kernelName   ": "encoder",
+       "kernelAlias  ": "ENCODER_TYPE1_AMA",
+       "instanceName ": "encoder_1",
+       "cuName       ": "encoder:encoder_1",
+       "kernelPlugin ": "",
+       "maxCapacity  ": "497664000",
+       "numChanInuse ": "0",
+       "usedLoad     ": "0 of 1000000",
+       "reservedLoad ": "0 of 1000000",
+       "resrvUsedLoad": "0 of 1000000"
+   },
+
+
+

The usedLoad value indicates how much of that resource is currently being used. The value will range from 0 (nothing running) to 1000000 (fully loaded). The reservedLoad value indicates how much of that resource is being reserved using XRM. The resrvUsedLoad value indicates how much of the reserved load is actually being used.

+
+ +
+

Insufficient Resources

+

If there are not enough compute unit resources available on the device to support a FFmpeg job, the job will error out with a message about resource allocation failure:

+
Insufficient resources available for allocation
+
+
+

In this case, you can check the system load (as described in the section below) and look for a device with enough free resources, or wait until another job finishes and releases enough resources to run the desired job.

+
+
+

Job Resource Requirements

+

The load of a given job can be estimated by taking the resolution of the job as a percentage of the total capacity of a device. For instance, on an MA35D device, a 1080p60 stream will require 12.5% of the resources available on the device. Resource loads are reported with a precision of 1/1000000.

+
+

+
+
+
+
+

Automated Resource Management

+

The AMD AMA Video SDK provides a mechanism to automatically determine how many instances of various jobs can be submitted to the system and on which device(s) to dispatch each job instance. This mechanism relies on Job Descriptions files and a Job Slot Reservation tool which calculates the resources required for each job, determines on which device each job should be run and reserves the resources accordingly. Note that there is no requirement for job descriptions to be homogeneous.

+
+

Note

+

To observe the various job management log messages use tail -F /var/log/syslog command.

+
+
+

Video Transcode Job Descriptions

+

A video transcode Job Description File (JDF) provides information to the resource manager about what resources are needed to run a particular job. With this information, the resource manager can calculate the CU load for the specified job as well as the maximum possible number of jobs that can be run real-time in parallel.

+

A video transcode job description is specified through a JSON file and the key-value pairs specify the functions, formats, and resolutions needed.

+
+
function

Which HW resource to use (DECODER, SCALER, ENCODER)

+
+
format

Input/output format (H264, HEVC, AV1, yuv420p, yuv420p10le)

+
+
resolution

Input/output height, width, and frame-rate as a numerator / denominator fraction

+
+
type

Optional entry to select between Type 1 and Type 2 AV1 encoder. Valid values are 1 and 2, with default equal 1

+
+
load_factor

Optional entry that instructs XRM to allocate a multiple factor of required resources. The multiplication factor is either the default 1.0, i.e., no addition allocation or explicitly defined by this entry. A typical usage of this entry is in cases where there is a need for headroom, while allocating resources.

+
+
num_job_slots

Optional entry that explicitly specifies the number of resources or job slots for a particular job. The absence of this entry allows for a given job to reserve all available resources on a given device, instead of what is required to complete the job.

+
+
resources

All the resources listed in this section of the job description will be allocated on the same device. If the job requires a single device, this is the section in which resources should be specified.

+
+
cores

Optional entry to enable 2-core encoding in order to achieve higher throughput. Valid values are 1 and 2, for single core and double cores encodings, respectively. Default value is 1. See /opt/amd/ama/ma35/scripts/describe_job/example_2_core_encode.json for usage example.

+
+
preset

Optional entry to select one of fast, medium or slow encoding presets. Default value is medium. See /opt/amd/ama/ma35/scripts/describe_job/example_fast_preset.json for usage example.

+
+
+

Several examples of JSON job slot descriptions can be found in the /opt/amd/ama/ma35/scripts/describe_job folder once the AMD AMA Video SDK has been installed.

+

Below is the /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale example. This JSON example describes an ABR transcode job which uses a decoder, scaler, and encoder to generate 12 output renditions.

+
{
+    "request": {
+        "name": "t10_transcode_multiscale",
+        "request_id": 1,
+        "parameters": {
+            "name": "testjob",
+            "resources": 
+            [
+                {
+                    "function": "DECODER",
+                    "format":   "H264",
+                    "resolution": { "input": { "width": 3840, "height": 2160, "frame-rate": { "num":60, "den":1} } }
+                },
+                        {
+                    "function": "SCALER",
+                    "format":   "yuv420p",
+                    "resolution":{                                                                                 
+                        "input": { "width": 3840, "height": 2160, "frame-rate": { "num":60, "den":1} },
+                        "output":
+                        [        
+                            { "width": 1920, "height": 1080, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1600, "height": 900, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1440, "height": 900, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1360, "height": 768, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1280, "height": 720, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1024, "height": 768, "frame-rate": { "num":60, "den":1}},
+                            { "width": 960, "height": 540, "frame-rate": { "num":60, "den":1}},
+                            { "width": 848, "height": 480, "frame-rate": { "num":60, "den":1}},
+                            { "width": 640, "height": 360, "frame-rate": { "num":60, "den":1}},
+                            { "width": 540, "height": 480, "frame-rate": { "num":60, "den":1}},
+                            { "width": 352, "height": 288, "frame-rate": { "num":60, "den":1}},
+                            { "width": 288, "height": 160, "frame-rate": { "num":60, "den":1}}
+                        ]
+                    }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1920, "height": 1080, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1600, "height": 900, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1440, "height": 900, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1360, "height": 768, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1280, "height": 720, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1024, "height": 768, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 960, "height": 540, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 848, "height": 480, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 640, "height": 360, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 540, "height": 480, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 352, "height": 288, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 288, "height": 160, "frame-rate": { "num":60, "den":1} } } 
+                }
+            ]
+        }
+    }
+}
+
+
+

The next sections document the two different ways of using job descriptions to run multiple jobs across one or more devices:

+ +
+
+

The Job Slot Reservation Tool

+

The job slot reservation application, jobslot_reservation, takes as input multiple JSON job description files. Each JSON JDF provides information to the resource manager about what kind of transcode is intended to run on a card. With this information, the resource manager calculates the CU load for the specified job as well as the maximum possible number of jobs that can be run real-time in parallel.

+

Once the maximum possible number of jobs is known, CUs and job slots are reserved, and corresponding reservation IDs are stored in a bash file at /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh, where TIMESTAMP refers to Linux epoch timestamp and JDF is the name of JSON JDF, without its extension. A reservation ID is a unique identifier which is valid while the job slot reservation application is running. After sourcing the respective /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh files, the reservation IDs are then passed to individual FFmpeg processes via the XRM_RESERVE_ID environment variable. The FFmpeg processes then use this reservation ID to retrieve and use the corresponding CUs reserved by the job slot reservation tool.

+

The reserved resources are released by ending the job reservation process. Reserved slots can be reused after an FFmpeg job finishes, as long as the job reservation process is still running.

+

Optionally, jobslot_reservation can take --dry_run argument to check how many job slots are possible for a given job, without actual reservation. Additionally, this application is process-safe.

+

Ill-formed JSON Job Descriptions

+

If you run the jobslot_reservation tool with a syntactically incorrect JSON description, you will see the following messages:

+
decoder plugin function=0 fail to run the function
+scaler plugin function=0 fail to run the function
+encoder plugin function=0 fail to run the function
+
+
+

This indicates that the job description is ill-formed and needs to be corrected.

+
+

Example requiring a single device per job

+

This example uses the /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json file describing a 1080p ABR ladder running on a single device.

+
    +
  1. Setup the environment:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  2. +
  3. Run the job slot reservation application with the desired JSON job description. For example

    +
    JobDescriptionFile: /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json
    +Requested Loads:
    +scaler [0]: 523634
    +
    +decoder [0]: 250000
    +
    +...
    +
    +lookahead [0]: 6111
    +
    +encoder [0]: 5555
    +
    +lookahead [0]: 2777
    +
    +===============================================================
    +Total Job Slots possible : 2
    +Dry run: Disabled
    +
    +Job Type: /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json
    +Job Slots Alloted: 2
    +XRM_RESERVE_ID file - "/var/tmp/amd/xrm_jobReservation_79533431_t10_transcode_multiscale.sh"
    +================================================================
    +
    +---------------------------------------------------------------
    +
    +The Job-slot reservations are alive as long as this Application is alive!
    +(press Enter to close this app)
    +
    +---------------------------------------------------------------
    +
    +
    +
  4. +
+

The job slot reservation application creates a /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh with XRM_RESERVE_ID_{n} set to unique IDs generated by XRM (with n ranging from 1 to the number of possible job slots for the given job). Here is an example of this generated file:

+
export XRM_RESERVE_ID_0=1
+export XRM_RESERVE_ID_1=2
+
+
+
    +
  1. Launch individual FFmpeg processes in distinct shells after sourcing the /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh file and setting XRM_RESERVE_ID environment to a unique XRM_RESERVE_ID_{n}.

    +

    For job 1, within a new terminal:

    +
    source /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh
    +export XRM_RESERVE_ID=${XRM_RESERVE_ID_1}
    +ffmpeg -c:v h264_ama ...
    +
    +
    +

    For job 2, within a new terminal:

    +
    source /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh
    +export XRM_RESERVE_ID=${XRM_RESERVE_ID_2}
    +ffmpeg -c:v h264_ama ...
    +
    +
    +

    And so forth for the other jobs.

    +
  2. +
  3. Press Enter in the job reservation app terminal to release the resources after the jobs are complete.

  4. +
+
+
+
+

Automated Job Launching

+

The Job Slot Reservation tool automatically reserves job slots, but actual jobs still need to be manually launched using the generated reservations IDs. It is possible to create custom orchestration layers to automatically handle the reservation of job slots and the launching of jobs.

+

The AMD AMA Video SDK includes an example launcher application for FFmpeg. Source code for the FFmpeg Launcher example and the Job Slot Reservation tool are included in the Github repository of AMD AMA Video SDK and can be used as a starting point for developing custom orchestration layers.

+
+

The FFmpeg Launcher Example

+

The FFmpeg launcher, launcher, is an example application which automates the dispatching of FFmpeg jobs across multiple devices. It simplifies the process of manually setting up XRM reservation IDs and launching FFmpeg for many video streams. The FFmpeg launcher takes tuples of source, Transcode Job Description (TJD) files, where each line of source file is a full path to the location of an input file and TJD has the following format:

+
+
job_description = JDF_PATH

JDF_PATH value refers to the full path of a JDF

+
+
cmdline = FFMPEG_CMD

FFMPEG_CMD refers to a complete FFmpeg pipeline command, without input source file after -i.

+
+
+

As an example, the source1.txt and job1.txt tuple describes a decode pipeline running on device 0:

+

source1.txt:

+
/path/to/4kp60.h264
+
+
+

job1.txt:

+
job_description = /path/to/JDF file
+
+cmdline = ffmpeg -y -hwaccel ama -c:v h264_ama -out_fmt nv12 -i -filter_hw_device dev0 -filter_complex "hwdownload,format=nv12[out]" -map "out]" -vframes 300 -f rawvideo -pix_fmt nv12 /dev/null
+
+
+
+

Note

+

The FFmpeg launcher is only an example application. It is provided as an illustration of how an orchestration layer can use Job Descriptions, but it is not an official feature of the AMD AMA Video SDK.

+
+

The following steps show how to use the FFmpeg launcher for an arbitrary number of jobs, assuming all are within the total compute capacity of the accelerator cards.

+
    +
  1. Environment setup

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  2. +
  3. To run the FFmpeg launcher, use the following command:

    +
    launcher <(source, TJD)> {(source, TJD)}
    +
    +
    +

    Here is an example of the command:

    +
    launcher source1.txt job1.txt source2.txt job2.txt
    +
    +
    +
  4. +
+
+

+
+
+
+
+
+

XRM Reference Guide

+

The Xilinx® resource manager (XRM) is the software which manages the hardware accelerators available in the system. XRM includes the following components:

+
    +
  • xrmd: the XRM daemon, a background process supporting reservation, allocation, and release of hardware acceleration resources.

  • +
  • xrmadm the command line tool is used to interact with the XRM daemon (xrmd).

  • +
  • a C Application Programming Interface (API)

  • +
+
+

Command Line Interface

+

The XRM xrmadm command line tool is used to interact with the XRM daemon (xrmd). It provides the following capabilities and uses a JSON file as input for each action:

+
    +
  • Generate status reports for each device

  • +
  • Load and unload the hardware accelerators

  • +
  • Load and unload the software plugins

  • +
+

The XRM related files are installed under /opt/amd/ama/ma35/scripts/.

+
+

Setup

+

When sourced, the /opt/amd/ama/ma35/scripts/setup.sh script takes care of setting up the enviroment for the AMD AMA Video SDK, including its XRM components:

+
    +
  • The XRM daemon (xrmd) is started

  • +
  • The hardware accelerators (xclbin) and software plugins are loaded on the Xilinx devices

  • +
+
+
+

Generating Status Reports

+

xrmadm can generate reports with the status of each device in the system. This capability is particularly useful to check the loading of each hardware accelerator.

+

To generate a report for all the devices in the system:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

To generate a more detailed report for a single device, which is specified in the json file:

+
xrmadm /opt/amd/ama/ma35/scripts/list_onedevice_cmd.json
+
+
+

A sample JSON file for generating a report for device 0 is shown below:

+
{
+    "request": {
+        "name": "list",
+        "requestId": 1,
+        "device": 0
+    }
+}
+
+
+
+
+

Loading/Unloading Software Plugins

+

xrmadm can be used to load or unload the software plugins required to manage the compute resources. The software plugins perform resource management functions such as calculating CU load and CU max capacity. Once a plugin is loaded, it becomes usable by a host application through the XRM APIs. The XRM plugins need to be loaded before executing an application (such as FFmpeg/GStreamer) which relies on the plugins.

+

To load the plugins:

+
xrmadm /opt/amd/ama/ma35/scripts/load_xrm_plugins_cmd.json
+ {
+     "response": {
+         "name": "loadXrmPlugins",
+         "requestId": "1",
+         "status": "ok"
+     }
+ }
+
+
+

To unload the plugins:

+
xrmadm /opt/amd/ama/ma35/scripts/unload_xrm_plugins_cmd.json
+ {
+     "response": {
+         "name": "unloadXrmPlugins",
+         "requestId": "1",
+         "status": "ok"
+     }
+ }
+
+
+
+
+
+

C Application Programming Interface

+

XRM provides a C Application Programming Interface (API) to reserve, allocate and release CUs from within a custom application. For complete details about this programming interface, refer to the XRM API Reference Guide section of the documentation.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/migration.html b/v1.1.1/migration.html new file mode 100644 index 00000000..19233957 --- /dev/null +++ b/v1.1.1/migration.html @@ -0,0 +1,646 @@ + + + + + + + + + + + + + + + Software Migration Considerations — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Software Migration Considerations
  • +
  • +
  • +
+
+
+
+
+ +
+

Software Migration Considerations

+ +

This section of documentation covers the notable API differences between the current release of SDK, 1.1.1, and previous versions.

+
+

API Changes from Alveo U30

+

This sub-section describes differences between U30 and MA35D

+
+
+

FFmpeg API Changes

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + +

Options General

MA35D

U30

-c:v:

+

Used for codec selection. Aside from naming convention changes, new AV1 codec and VP9 decoder are now available.

+

-c:v

-c:v

-filter_complex:

+

Used for frame filtering operation. Aside from naming convention changes, new 2D composition and ML operations are now available.

+

-filter_complex

-filter_complex

-hwaccel:

+

Used to select hardware accelerator engine. This option was previously referred to as xlnx_hwdev.

+

-hwaccel

-xlnx_hwdev

-vf:

+

Used to select the DMA transfer direction between host and accelerator.

+

-vf

xvbm_convert

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Encoder

Version 1.1.1

U30

-level:

+

Used to specify encoder's level. It now supports AV1's levels.

+

-level

-level

-profile:

+

Used to set encoder's profile. It now supports AV1's main.

+

-profile

-profile

-control_rate:

+

Used to set rate control mode. Options to this setting have changed.

+

-control_rate

-control-rate

-tune_metrics:

+

Used to tune VQ metrics. Options to this setting have changed.

+

-tune_metrics

-tune-metrics

-cores:

+

Used to explicitly specify the number of processing cores.

+

Deprecated

-cores

-periodicity-idr:

+

Used to determine IDR frame frequency.

+

Deprecated

-periodicity-idr

-force_key_frames:

+

Used to force IDR frame insertion, at specified frame numbers.

+

Deprecated

-force_key_frames

-disable-pipeline:

+

Used to enable/disable pipelining.

+

Deprecated

-disable-pipeline

-aspect-ratio:

+

Used to set video's aspect ratio.

+

Deprecated

-aspect-ratio

-expert-options:

+

Used to set encoder's expert option.

+

Deprecated

-expert-options

-avc-lowlat:

+

Used to enable/disable ULL for AVC.

+

Deprecated

-avc-lowlat

+ +++++ + + + + + + + + + + + + + + + + +

Options Decoder

Version 1.1.1

U30

-splitbuff_mode:

+

Used to configure decoder's buffer mode.

+

Deprecated

-splitbuff_mode

-entropy_buffers_count:

+

Used to set number of decoder's entropy buffers.

+

Deprecated

-entropy_buffers_count

+ +++++ + + + + + + + + + + + + + + + + + + + + +

Options Scaler

Version 1.1.1

U30

-out_{N}_width:

+

Used to configure width of an output rung.

+

Deprecated

-out_{N}_width

-out_{N}_height:

+

Used to configure height of an output rung.

+

Deprecated

-out_{N}_height

-out_{N}_rate:

+

Used to configure frame rate of an output rung.

+

Deprecated

-out_{N}_rate

+
+
+

Gstreamer API Changes

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Encoder

Version 1.1.1

U30

tune_metrics:

+

Used to tune VQ metrics. Options to this setting have changed.

+

tune-metrics

tune-metrics

ultra-low-latency:

+

Used to set ULL mode.

+

Set lookahead-depth to 0.

ultra-low-latency

target-bitrate:

+

Used to set target bit rate.

+

bitrate

target-bitrate

control_rate:

+

Used to set rate control mode. Options to this setting have changed.

+

rate-control

control-rate

dev-idx:

+

Used to specify the index of the device on which the encoder should be executed.

+

device

dev-idx

aspect-ratio:

+

Used to set video’s aspect ratio.

+

Deprecated

aspect-ratio

avc-lowlat:

+

Used to enable/disable ULL for AVC.

+

Deprecated

avc-lowlat

dependent-slice:

+

Used to specify slice dependency.

+

Deprecated

dependent-slice

enable-pipeline:

+

Used to enable/disable pipelining.

+

Deprecated

enable-pipeline

ip-delta:

+

Used to set IP delta.

+

Deprecated

ip-delta

loop-filter-beta-offset:

+

Used to set loop filter beta offset.

+

Deprecated

loop-filter-beta-offset

loop-filter-tc-offset:

+

Used to set loop filter tc offset..

+

Deprecated

loop-filter-tc-offset

slice-qp:

+

Used to set slice QP mode.

+

Deprecated

slice-qp

scaling-list:

+

Used to set lscaling list mode.

+

Deprecated

scaling-list

reservation-id:

+

Used to set resource pool reservation id.

+

Deprecated

reservation-id

rc-mode:

+

Used to enable custom rate control mode.

+

Deprecated

rc-mode

qp-mode:

+

Used to set QP control mode used by the encoder.

+

Deprecated

qp-mode

pb-delta:

+

Used to set PB delta.

+

Deprecated

pb-delta

periodicity-idr:

+

Used to set periodicity of IDR frames.

+

Deprecated

periodicity-idr

num-cores:

+

Used to set the number of encoder cores to be used for current stream.

+

Deprecated

num-cores

num-slices:

+

Used to set the number of slices produced for each frame.

+

Deprecated

num-slices

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Decoder

Version 1.1.1

U30

dev-idx:

+

Used to specify the index of the device on which the decoder should be executed.

+

device

dev-idx

avoid-dynamic-alloc:

+

Used to set a flag to avoid dynamic allocation of output buffers.

+

Deprecated

avoid-dynamic-alloc

avoid-output-copy:

+

Used to set a flag to avoid output frames copy.

+

Deprecated

avoid-output-copy

disable-hdr10-sei:

+

Used to configure whether to passthrough HDR10/10+ SEI messages or not.

+

Deprecated

disable-hdr10-sei

interpolate-timestamps:

+

Used to configure interpolation of output buffers PTS.

+

Deprecated

interpolate-timestamps

num-entropy-buf:

+

Used to specifie the number of decoder internal entropy buffers.

+

Deprecated

num-entropy-buf

reservation-id:

+

Used to set resource Pool Reservation id.

+

Deprecated

reservation-id

splitbuff-mode:

+

Used to configure decoder in split/unsplit input buffer mode.

+

Deprecated

splitbuff-mode

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Scaler

Version 1.1.1

U30

dev-idx:

+

Used to specify the index of the device on which the scaler should be executed.

+

device

dev-idx

avoid-output-copy:

+

Used to set a flag to avoid output frames copy on all source pads.

+

Deprecated

avoid-output-copy

coef-load-type:

+

Used to configure coefficients loading type for scaling.

+

Deprecated

coef-load-type

enable-pipeline:

+

Used to enable buffer pipelining to improve performance in non zero-copy use cases.

+

Deprecated

enable-pipeline

reservation-id:

+

Used to configure resource pool reservation id.

+

Deprecated

reservation-id

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/objects.inv b/v1.1.1/objects.inv new file mode 100644 index 00000000..640c7951 Binary files /dev/null and b/v1.1.1/objects.inv differ diff --git a/v1.1.1/other_versions.html b/v1.1.1/other_versions.html new file mode 100644 index 00000000..8fefb019 --- /dev/null +++ b/v1.1.1/other_versions.html @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + <no title> — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • <no title>
  • +
  • +
  • +
+
+
+
+
+ +
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/package_feed.html b/v1.1.1/package_feed.html new file mode 100644 index 00000000..aa1ea2fc --- /dev/null +++ b/v1.1.1/package_feed.html @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + Distribution Package Feed — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Distribution Package Feed
  • +
  • +
  • +
+
+
+
+
+ +
+

Distribution Package Feed

+ +
+

Package Descriptions

+ ++++ + + + + + + + + + + + + + + + + + + + + + + +

Name

Description

amd-ama-core

This package includes all the core elements that are required for running applications.

amd-ama-driver

This package includes all kernel driver and firmware elements.

amd-ama-ffmpeg

This package includes all the relevant software for running hardware-accelerated FFmpeg pipelines.

amd-ama-gstreamer

This package includes all the relevant software for running hardware-accelerated Gstreamer pipelines.

amd-ama-xma

This package includes various XMA based application programs and development header files.

+
+
+

Configuring the Package Feed

+

Distribution based package feeds allow for convenient and robust methods to update and upgrade relevant packages of the AMD AMA Video SDK. In order to be able to install the AMD AMA Video SDK packages from the package feed, point your package management client to the remote AMD AMA Video SDK package repository according to the instructions described below.

+
+

Ubuntu

+
    +
  1. Add Xilinx key:

    +
    wget -qO - https://www.xilinx.com/support/download/2018-2-1/xilinx-master-signing-key.asc | sudo apt-key add -
    +
    +
    +
  2. +
  3. Add Xilinx PPA feed:

    +
    echo "deb [trusted=yes] https://packages.xilinx.com/artifactory/debian-packages $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/xilinx.list
    +
    +
    +
  4. +
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/preview.html b/v1.1.1/preview.html new file mode 100644 index 00000000..93bd5eb1 --- /dev/null +++ b/v1.1.1/preview.html @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + + New Feature Preview — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • New Feature Preview
  • +
  • +
  • +
+
+
+
+
+ +
+

New Feature Preview

+ +
+

Overview

+

This section describes new enhanced features, which are meant for demonstrative proposes and are only supported in FFmpeg. Note that although these features are not meant to be used in production environments; however, as they mature, they will become fully qualified as production ready. The following table delineates the list of available options:

+ + +++++ + + + + + + + + + + + + + + + + +
Video Processing Accelerators

Accelerator Core

Functions/Supported Models

Notes

2D Processor

Video Rotation, Color Space Conversion, Chroma Subsampling, Picture In Picture and Tiling.

+
Picture In Picture and Tiling require the same frame rate on all inputs to the 2d_ama plugin.
+
To cascade multiple 2D processor cores, pixel format yuv420p must be set, explicitly.
+
+

Machine Learning

ML Based Face ROI and ML Based Text ROI models

+
Supported ROI models are 1080p in landscape mode, 720p in both landscape and portrait modes.
+
Maximum supported instances of ml_ama plugin (ROI model) per device is limited to 4.
+
+
+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Video Rotation

+

The following example demonstrates how to transcode a flip-over operation on an AMA AMD compatible card:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -out_fmt yuv420p  -i <INPUT> \
+-filter_complex "[0:v]2d_ama=inputs=1:processor=rotate:rotation=180[c]" \
+-map "[c]" -c:v hevc_ama -f mp4 <OUTPUT>
+
+
+

, where 2d_ama is graphic processor's plugin, set for rotation operation; INPUT and OUTPUT are any one of supported encoded files. Note that only rotations which are multiples of 90 degrees are supported.

+
+
+

Color Space Conversion

+

The following example demonstrates how to convert from RGB to YUV on an AMA AMD compatible card:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 \
+-pix_fmt bgra -i <INPUT> \
+-filter_complex "[0:v]hwupload[a];[a]2d_ama=inputs=1:processor=csc:csc=rgb2yuv[c];[c]hwdownload" \
+-pix_fmt yuv420p -f rawvideo <OUTPUT>
+
+
+

, where graphic processor is set for color conversion operation.

+

The following example demonstrates how to encode a RGBA video file on an AMA AMD compatible card:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -f rawvideo -s 1920x1080 \
+-pix_fmt bgra -i <INPUT> \
+-filter_complex "[0:v]hwupload[a];[a]2d_ama=inputs=1:processor=csc:csc=rgb2yuv[c]" \
+-map "[c]" -c:v hevc_ama -f mp4 <OUTPUT>
+
+
+

Similarly, the following example demonstrates YUV to planar RGB conversion:

+
ffmpeg -y  -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=1:out_res=(1920x1080|rgbp)[a];[a]hwdownload,format=rgbp[a1]" \
+-map '[a1]' -f rawvideo -y <RGBP OUTPUT>
+
+
+
+
+

Chroma Subsampling

+

The following example demonstrates how to convert from 4:2:2 pixel format to 4:2:0 on an AMA AMD compatible card:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 \
+-pix_fmt yuv422p -i <INPUT> \
+-filter_complex "[0:v]hwupload[a];[a]2d_ama=inputs=1:processor=subsample[c];[c]hwdownload" \
+-pix_fmt yuv420p -f rawvideo <OUTPUT>
+
+
+

, where graphic processor is set for pixel subsampling operation.

+

The following example demonstrates how to transcode a 4:2:2 pixel format video to 4:2:0 using both the host, for decoding, and an AMA AMD compatible card, for subsampling and encoding:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-i <INPUT> \
+-filter_complex "[0:v]hwupload[a];[a]2d_ama=inputs=1:processor=subsample[c]" \
+-map [c] -c:v h264_ama -b:v 5M -f mp4 <OUTPUT>
+
+
+

, where graphic processor is set for pixel subsampling operation.

+
+
+

Picture In Picture (PIP)

+

The following example demonstrates how to create a PIP video on an AMA AMD compatible card:

+
ffmpeg -y -hide_banner  -hwaccel ama -hwaccel_device /dev/ama_transcoder0  \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 1> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 2> \
+-filter_complex "[1:v]scaler_ama=outputs=1:out_res=(720x480|yuv420p)[p];[0:v][p]2d_ama=inputs=2:processor=overlay:core_id=0:x=0:y=0[x]" \
+-map "[x]" -c:v h264_ama -frames 1000 -b:v 15M -f mp4 -y <OUTPUT>
+
+
+

, where graphic processor is set for scaling and overlay operations, with INPUT 1 set as the background.

+
+
+

Tiling

+

The following example demonstrates how to create a tiling video on an AMA AMD compatible card:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 1> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 2> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 3> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 4> \
+-filter_complex "[0:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[0];[1:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[1];[2:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[2];[3:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[3];[0][1][2][3]2d_ama=layout=2x2:inputs=4:processor=tile[c];  [c]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p)[r]" \
+-map "[r]" -c:v h264_ama -b:v 15M -f mp4 -y <OUTPUT>
+
+
+

, where graphic processor's is set for scaling and tiling operations, with INPUT 1 ... INPUT 4 set as tiles.

+
+
+

ML Region Of Interest (ROI)

+

The following sub-sections describe the current capabilities of the ML based ROI engine. This engine is capable of processing 4 independent 720p30 video streams in parallel for face and text detections.

+
+

ML Based Face ROI

+

The following example demonstrates how to perform ROI face encoding on an AMA AMD compatible card:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=3:out_res=(1280x720|yuv420p)(1280x720|yuv420p)(1280x720|rgbp)[def][ori][a];[a]ml_ama=model=roi:model_args=type=face[mlop];[ori][mlop]roi_scale_ama[res1]" \
+-map [res1] -c:v hevc_ama -b:v 300K -f mp4 <OUTPUT 1> \
+-map [def] -c:v hevc_ama -b:v 300K -f mp4 <OUTPUT 2>
+
+
+

, where ML engine is set for face ROI enhancement, and the resulting enhanced image, res1, is encoded.

+
+
+

ROI Face Detection

+

The following example demonstrates inference engine's ability to detect faces:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -i <INPUT> \
+-filter_complex "scaler_ama=outputs=2:out_res=(1280x720|yuv420p)(1280x720|rgbp)[ori][mlip];[mlip]ml_ama=model=roi:model_args=type=face[mlop]; [ori][mlop]roi_scale_ama=roi_map_type=roi[rso]; [rso]hwdownload, roi_overlay_ama[res1]" \
+-map [res1] -f rawvideo -pix_fmt yuv420p -f rawvideo <OUTPUT>
+
+
+

, where software plugin roi_overlay_ama overlays transparent rectangular boxes around all detected faces.

+
+
+

ML Based Text ROI

+

The following example demonstrates how to perform ROI text encoding on an AMA AMD compatible card:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -i <INPUT> \
+-filter_complex "scaler_ama=outputs=3:out_res=(1280x720|yuv420p)(1280x720|yuv420p)(1280x720|rgbp)[def][ori][a];[a]ml_ama=model=roi:model_args=type=text[mlop];[ori][mlop]roi_scale_ama[res1]" \
+-map [res1] -c:v hevc_ama -b:v 200K -f mp4  <OUTPUT 1> \
+-map [def] -c:v hevc_ama -b:v 200K -f mp4  <OUTPUT 2>
+
+
+

, where ML engine is set for text ROI enhancement, and the resulting enhanced image, res1, is encoded.

+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/release_notes.html b/v1.1.1/release_notes.html new file mode 100644 index 00000000..988ba1fe --- /dev/null +++ b/v1.1.1/release_notes.html @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) Release Notes — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA) Release Notes
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA) Release Notes

+
+

Note

+

Version: 1.1.1

+
+ +
+

+
+
+

Overview

+

This section describes various requirements, limitations, known issues and their respective workarounds that are applicable to AMD AMA Video SDK.

+
+
+

Release Requirements

+
    +
  1. The following firmware versions are required:

    +
    +
    ZSP Version = 2.0.4
    +SC Version = 9.7.35
    +eSecure Version = 1.0.0
    +PCIe FW Version = 2.1.0
    +PCIe CTRL Patch Version = 1.0.3
    +PCIe PHY Patch A Version = 1.0.0
    +
    +
    +
    +
  2. +
  3. This documentation is applicable to 1.1.1 release.

  4. +
  5. Ensure that chassis's BIOS is set to performance mode, e.g., sleep states, clock throttling, Active State Power Management (ASPM), etc. are disabled.

  6. +
+
+
+

Features in This Release

+
    +
  1. Support for video transcode using either our supplied FFmpeg (n5.1.2), Gstreamer (v1.22), or custom Xilinx Media Acceleration (XMA) applications.

  2. +
  3. Support for up to 4 x 4Kp60 8-bit or 10-bit video decode AV1, AVC or HEVC per device.

  4. +
  5. Support for up to 160 Mbps encode throughput per device.

  6. +
  7. Support for up to 2 x 4Kp60 8-bit or 10-bit video transcode of AVC or HEVC per device.

  8. +
  9. Support for up to 4 x 4Kp60 8-bit or 10-bit video transcode of AV1 per device.

  10. +
  11. Support for integration with software-based video image filters using our hardware DMA support to/from device memory (FFmpeg or Gstreamer).

  12. +
  13. Optional use of our supplied resource management daemon (xrmd) for automated accelerator selection and load balancing.

  14. +
  15. Resource utilization reporting when using our supplied resource management daemon (xrmd).

  16. +
  17. Utility applications enabling collection of power, voltage, temperature and memory for each device as well as aggregate values for the MA35D accelerator card.

  18. +
  19. Support for virtualization using either Ubuntu 20.04 or 22.04 in KVM mode with a guest OS also running either Ubuntu 20.04 or 22.04.

  20. +
  21. Dual core of AV1 encoding enabling >100 fps.

  22. +
  23. Low latency encoding support (lookahead depths of approximately 1-11 frames).

  24. +
  25. fast preset for AVC, HEVC and AV1 (type 2) encoding for enhanced throughput and/or density.

  26. +
  27. HDR10, HDR10+ and/or HLG metadata pass through transcode support.

  28. +
  29. New Content Adaptive Bit Rate (cabr) rate control mode for enhanced visual quality and bitrate efficiency.

  30. +
  31. Support for encoder levels >= 6.

  32. +
  33. Support for new encoder features in our resource management toolchain.

  34. +
  35. New latency_ms command-line parameter to, optionally, specify the encoder lookahead_depth in units of time instead of frames.

  36. +
+
+
+

Preview Features

+
    +
  1. Support for color space conversion, input rotation, and color subsampling using the 2D graphics engine of the card, via FFmpeg plugin

  2. +
  3. Face and text-based Machine Learning (ML) models for enhanced low resolution video encoding for fine text and faces using the ML engine of the card, via FFmpeg plugin

  4. +
+
+
+

Supported Kernels and Distributions

+

This release of AMD AMA Video SDK supports Ubuntu 22.04 and 20.04, with generic kernel 5.15.0, 5.19.0 and 6.2.0. However, kernels 5.15.0 and 6.2.0 are preferred.

+
+
+

Known Limitations

+
    +
  1. PF and VF must support PCIe memory regions BAR0 of 8 MB, BAR2 of 64 MB and BAR4 of 512 MB sizes.

  2. +
  3. PF and VF release versions must match.

  4. +
  5. A device that has been assigned to a VM cannot share its resources with its host.

  6. +
  7. Only a single VF may be assigned to a VM.

  8. +
  9. For maximum server scalability, ensure that a single VF is assigned to a VM.

  10. +
  11. Ensure that both the host and VMs are running the same SDK version.

  12. +
  13. MA35D only supports progressive content, i.e., interlaced contents are not supported in either the decoder or encoder.

  14. +
  15. For encoding, only resolutions that are divisible by 4 are supported, i.e., both height and width.

  16. +
  17. For decoding, only resolutions that are divisible by 2 are supported, i.e., both height and width.

  18. +
  19. This version of the SDK does not support splitting a video acceleration use case across multiple MA35D devices.

  20. +
  21. With the current version of FFmpeg, n5.1.2, it is not recommended to transport AV1 over MPEG TS.

  22. +
  23. XMA sample applications are not meant to be run at maximum density.

  24. +
  25. Encode rates up to maximum of 400 Mbps are supported.

  26. +
  27. 4Kp120 is only supported for AV1 (type 1) encoder, under ultra low latency mode, using both cores.

  28. +
  29. VBR and CVBR rate control modes are not supported for lookahead depth between 0 and 4.

  30. +
  31. Using an encoder lookahead_depth value of <11 may limit the number of b-frames or other encoder features such as rate control modes, aq modes and so forth. See Encoding Compatibility Matrix for details.

  32. +
  33. When using the encoder fast preset, lookahead_depth must be > 0.

  34. +
  35. Mixing 2-slice AV1 Type 1 encoding and 1-slice encoding is not supported on a single device

  36. +
  37. Encoder does not support dynamic QP maps in either AV1 Type 2 encoding or with lookahead_depth = 0.

  38. +
  39. AV1 decoder does not support 8k resolution in portrait mode.

  40. +
+
+
+

Known Issues

+
    +
  1. A secondary bus reset (SBR) will cause the server to hang. A cold boot of the server will restore function. After installation of our driver package, our setup.sh script should be run prior to utilizing any of the features of the SDK. The setup.sh will disable secondary bus reset.

  2. +
  3. AV1 decoding using the included ama_av1dec Gstreamer plugin requires the use of an IVF packaged AV1 raw video stream and a corresponding ivfparse plugin to be utilized to demux the AV1 video stream.

  4. +
  5. If the kernel driver is not loaded, tools such as mautil may crash when invoked.

  6. +
  7. An AV1 HLS stream may playback at slower than real time speeds. Recommend explicitly setting of fps playback frame rate when using ffplay or use ffplay from ffmpeg 5.1.2 or 6.0

  8. +
  9. Recommend playback of raw video using more recent versions of ffplay (n5.1.2n6.0 or later) or more recent versions of media players such as VLC v3.0.17.4. Alternatively, muxing the raw video into an IVF container format is also permitted.

  10. +
  11. Using Gstreamer, 1080p30 transcodes and or lower resolutions cannot run at full density with default lookahead depth.

  12. +
  13. A strict HDR10+ compliance checker may report some warnings in encoded HDR10+ bitstreams generated by this release.

  14. +
  15. Firmware downgrade to GA1.0 may not work on some desktop machines or low end servers. Warm boot the server to get to working state.

  16. +
  17. AV1 decoder accepts streams up to 40 Mbps.

  18. +
  19. Attempts to flash before the 10-minute mark, of card uptime, with 9.7.35 satellite controller firmware will fail.

  20. +
+
+
+

Upgrading from Previous Versions

+
    +
  1. Remove any ma35 and amd-ama packages as per installation instructions.

  2. +
  3. Remove any manually created Boost library soft links that may have been created, previously.

  4. +
  5. Remove all entries from /etc/apt/sources.list.d/xilinx.list if this file exists.

  6. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/search.html b/v1.1.1/search.html new file mode 100644 index 00000000..f998f2bd --- /dev/null +++ b/v1.1.1/search.html @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + Search — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Search
  • +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/v1.1.1/searchindex.js b/v1.1.1/searchindex.js new file mode 100644 index 00000000..1f1d0844 --- /dev/null +++ b/v1.1.1/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["c_apis", "card_management", "encoder_comp_matrix", "examples", "examples/amf/amf_encoder", "examples/ffmpeg/filters", "examples/ffmpeg/quality_analysis", "examples/ffmpeg/tutorials", "examples/gstreamer/filters", "examples/gstreamer/tutorials", "examples/gstreamer/xabrladder", "examples/gstreamer/xcompositor", "examples/xma/xma_apps", "getting_started_on_prem", "index", "managing_compute_resources", "migration", "other_versions", "package_feed", "preview", "release_notes", "specs_and_features", "troubleshooting", "tuning_pipeline_latency", "tuning_video_quality", "unified_logging", "using_ffmpeg", "using_gstreamer", "virtualization"], "filenames": ["c_apis.rst", "card_management.rst", "encoder_comp_matrix.rst", "examples.rst", "examples/amf/amf_encoder.rst", "examples/ffmpeg/filters.rst", "examples/ffmpeg/quality_analysis.rst", "examples/ffmpeg/tutorials.rst", "examples/gstreamer/filters.rst", "examples/gstreamer/tutorials.rst", "examples/gstreamer/xabrladder.rst", "examples/gstreamer/xcompositor.rst", "examples/xma/xma_apps.rst", "getting_started_on_prem.rst", "index.rst", "managing_compute_resources.rst", "migration.rst", "other_versions.rst", "package_feed.rst", "preview.rst", "release_notes.rst", "specs_and_features.rst", "troubleshooting.rst", "tuning_pipeline_latency.rst", "tuning_video_quality.rst", "unified_logging.rst", "using_ffmpeg.rst", "using_gstreamer.rst", "virtualization.rst"], "titles": ["C API Programming Guide", "Card Management", "Encoding Compatibility Matrix", "Tutorials and Examples", "AMF Encoder Tutorial", "FFmpeg Examples using Software Filters", "Video Quality Examples", "FFmpeg Tutorials", "GStreamer Examples using Software Filters", "GStreamer Introductory Tutorials", "GStreamer ABR Ladder Application", "GStreamer Compositor Application", "XMA Examples for the AMD AMA Video SDK", "Getting Started with AMD AMA Video SDK Cards on Premises", "AMD Advanced Media Acceleration (AMA)", "Managing Video Acceleration Compute Resources", "Software Migration Considerations", "<no title>", "Distribution Package Feed", "New Feature Preview", "AMD Advanced Media Acceleration (AMA) Release Notes", "Specs and Features of the AMD AMA Video SDK", "AMD Advanced Media Acceleration (AMA) Troubleshooting", "Tuning Latency", "Tuning Video Quality", "Unified Logging", "Using FFmpeg", "Using GStreamer", "Virtualization"], "terms": {"amazon": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "ec2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "vt2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "2022": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "2024": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "ma35": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "opt": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "The": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 19, 20, 22, 23, 24, 25, 26, 27, 28], "provid": [0, 1, 5, 6, 7, 9, 10, 14, 15, 21, 24, 25, 26, 27, 28], "base": [0, 3, 4, 10, 12, 13, 14, 15, 18, 20, 21, 26, 27], "which": [0, 1, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 19, 21, 23, 24, 25, 26, 27, 28], "facilit": [0, 14, 21], "integr": [0, 14, 20, 21], "transcod": [0, 5, 10, 11, 14, 19, 20, 22, 23, 24, 26, 27], "capabl": [0, 9, 14, 15, 19, 21, 24, 26], "proprietari": [0, 14, 21], "framework": [0, 4, 14, 21, 25, 27], "thi": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 18, 19, 21, 22, 23, 24, 26, 27, 28], "i": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "form": [0, 10, 15, 21, 24, 26], "leverag": [0, 14, 15, 21, 26, 27], "xilinx": [0, 1, 12, 15, 18, 20, 21, 28], "media": [0, 4, 6, 12, 21, 27], "acceler": [0, 1, 5, 7, 8, 12, 16, 18, 21, 25, 26, 27, 28], "librari": [0, 6, 20, 25], "manag": [0, 13, 18, 20, 21, 22, 28], "libxma": 0, "meant": [0, 1, 19, 20, 28], "simplifi": [0, 15], "control": [0, 12, 13, 16, 20, 21, 22, 24, 25, 26, 27, 28], "us": [0, 1, 2, 4, 6, 7, 9, 10, 12, 16, 19, 20, 21, 22, 23, 24, 28], "hardwar": [0, 1, 7, 12, 14, 15, 16, 18, 20, 21, 25, 26], "avail": [0, 1, 10, 11, 15, 16, 19, 21, 22, 26, 27, 28], "system": [0, 5, 6, 7, 8, 9, 12, 13, 21, 22, 27, 28], "keep": 0, "track": [0, 6], "total": [0, 1, 13, 15, 26, 27], "capac": [0, 6, 15, 27], "each": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 20, 21, 22, 24, 25, 26, 28], "comput": [0, 1, 21], "unit": [0, 1, 14, 15, 20, 28], "make": [0, 15, 21, 26, 27, 28], "possibl": [0, 5, 6, 8, 15, 22], "perform": [0, 1, 4, 5, 6, 7, 8, 9, 12, 13, 15, 16, 19, 20, 22, 23, 25, 26, 27], "action": [0, 1, 15, 21], "releas": [0, 1, 13, 14, 15, 16, 24, 26], "calcul": [0, 6, 12, 15, 21], "load": [0, 1, 12, 16, 20, 28], "max": [0, 11, 12, 15, 24, 25, 27], "4": [0, 1, 2, 5, 6, 12, 13, 19, 20, 21, 22, 23, 24, 26, 27, 28], "differ": [0, 6, 7, 8, 10, 15, 16, 21, 24, 25, 26, 27], "correspond": [0, 15, 20, 24], "specif": [0, 1, 10, 14, 21, 24, 25, 26, 27, 28], "featur": [0, 14, 15, 26, 28], "card": [0, 14, 15, 19, 20, 27, 28], "ani": [0, 12, 19, 20, 21, 22, 25, 26, 27], "combin": [0, 2, 5, 6, 7, 8, 21, 23], "can": [0, 1, 4, 5, 6, 7, 8, 9, 12, 15, 21, 22, 23, 24, 26, 27, 28], "when": [0, 2, 5, 7, 8, 9, 12, 15, 20, 22, 24, 26, 27], "layer": [0, 11, 15, 25], "ar": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "organ": 0, "around": [0, 19], "follow": [0, 1, 2, 5, 6, 7, 8, 10, 11, 13, 15, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "step": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 22, 28], "must": [0, 7, 12, 13, 19, 20, 21, 24, 26, 27], "first": [0, 1, 11, 28], "creat": [0, 1, 7, 8, 9, 11, 15, 19, 20, 22, 27, 28], "xrm_plugin_reserv": 0, "where": [0, 1, 5, 6, 13, 15, 19, 21, 24, 25, 26, 28], "one": [0, 1, 5, 8, 10, 15, 19, 21, 22, 24, 26, 28], "dec": [0, 25], "enc": [0, 1, 25], "scale": [0, 7, 8, 10, 12, 14, 16, 19, 27], "done": [0, 5, 7, 8, 9, 15, 19, 21, 22], "describ": [0, 1, 2, 5, 7, 8, 10, 11, 15, 16, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28], "detail": [0, 1, 5, 6, 7, 9, 12, 13, 15, 20, 21, 22, 24, 26, 27], "below": [0, 1, 7, 10, 11, 15, 18, 21, 22, 24, 26], "onc": [0, 1, 9, 15], "have": [0, 2, 6, 9, 13, 15, 16, 20, 21, 23, 24, 26, 27, 28], "been": [0, 6, 9, 12, 15, 20, 21, 22, 28], "dedic": [0, 6, 21], "need": [0, 5, 13, 15, 21, 27, 28], "To": [0, 1, 7, 9, 13, 15, 19, 21, 22, 24, 28], "all": [0, 1, 2, 5, 6, 7, 8, 9, 12, 13, 15, 16, 18, 19, 20, 21, 24, 25, 26, 27, 28], "requir": [0, 5, 6, 7, 8, 9, 12, 13, 18, 19, 21, 22, 23, 28], "paramet": [0, 2, 10, 11, 15, 20, 23, 25, 26, 28], "particular": [0, 15], "It": [0, 1, 5, 6, 7, 8, 12, 13, 15, 16, 21, 22, 23, 24, 26, 27], "call": [0, 21], "function": [0, 1, 5, 8, 9, 15, 19, 20, 24, 27, 28], "A": [0, 1, 13, 15, 20, 21, 26], "complet": [0, 1, 7, 9, 12, 14, 15, 21, 26, 27], "send": [0, 8, 25], "from": [0, 1, 6, 7, 8, 9, 11, 12, 13, 14, 15, 18, 19, 21, 22, 24, 25, 26, 27, 28], "host": [0, 1, 5, 7, 8, 9, 13, 15, 16, 19, 20, 21, 22, 26, 27], "receiv": 0, "devic": [0, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 16, 19, 20, 21, 24, 26, 28], "xmafram": 0, "also": [0, 1, 7, 10, 11, 14, 20, 22, 23, 24, 26, 28], "do": [0, 22, 23, 24, 28], "zero": [0, 1, 5, 8, 16, 27], "copi": [0, 5, 8, 16, 26, 27], "oper": [0, 1, 5, 7, 9, 16, 19, 21, 22, 25, 26, 28], "pass": [0, 7, 9, 15, 20, 21, 22, 28], "next": [0, 15], "without": [0, 6, 10, 11, 15, 21, 26, 27, 28], "being": [0, 1, 7, 13, 15, 26], "back": [0, 5, 7, 8, 22, 26], "return": [0, 1, 13, 22, 28], "code": [0, 6, 10, 11, 12, 15, 21], "should": [0, 1, 2, 5, 6, 7, 8, 9, 12, 13, 15, 16, 20, 21, 24, 26], "determin": [0, 6, 15, 16, 23, 24, 25], "suitabl": 0, "finish": [0, 15], "destroi": [0, 1], "so": [0, 15, 20, 21, 23], "free": [0, 15], "other": [0, 6, 7, 10, 13, 15, 20, 21, 22, 24, 26], "job": [0, 13, 26, 27], "ensur": [0, 1, 5, 6, 7, 8, 9, 10, 12, 13, 20, 22, 24, 26, 28], "everyth": 0, "clean": 0, "up": [0, 1, 11, 14, 15, 20, 21, 26], "properli": [0, 1, 22, 28], "xrm_plugin_releas": 0, "dynam": [0, 16, 20, 26, 27], "packag": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 20, 28], "part": [0, 21, 28], "necessari": 0, "declar": [0, 7], "your": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 15, 18, 22, 27], "includ": [0, 1, 6, 7, 9, 13, 14, 15, 18, 20, 21, 25, 26, 27], "header": [0, 18, 28], "sourc": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 18, 20, 21, 22, 25, 26], "h": [0, 7, 8, 9, 10, 11, 12, 21, 26], "add": [0, 5, 6, 18, 22, 23, 26, 28], "line": [0, 1, 5, 6, 7, 8, 9, 10, 11, 19, 20, 21, 24, 25], "cmakelist": 0, "txt": [0, 15, 24, 25], "file": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28], "target_link_librari": 0, "project_nam": 0, "public": 0, "xrm_interfac": 0, "target_include_directori": 0, "project_source_dir": 0, "target_properti": 0, "interface_include_directori": 0, "struct": 0, "xmaparamet": 0, "type": [0, 1, 6, 7, 10, 11, 12, 15, 16, 19, 20, 21, 22, 25, 26, 27, 28], "length": [0, 27], "valu": [0, 1, 2, 12, 15, 20, 22, 24, 25, 26, 27], "custom": [0, 6, 15, 16, 20, 21], "argument": [0, 6, 7, 9, 12, 15, 22, 26], "found": [0, 5, 6, 7, 8, 9, 12, 15, 23, 24, 26, 27], "xmaparam": 0, "xmaframeproperti": 0, "dimens": [0, 8], "xmabuff": 0, "raw": [0, 5, 6, 7, 9, 12, 20, 22, 24], "its": [0, 6, 15, 20, 21, 22, 24, 26, 28], "sent": 0, "thei": [0, 6, 7, 9, 19, 24, 26], "input": [0, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 19, 20, 21, 22, 23, 26], "output": [0, 1, 5, 6, 8, 10, 11, 12, 13, 15, 16, 19, 21, 22, 23, 24, 25, 26], "look": [0, 1, 6, 15, 21, 24, 26], "ahead": [0, 1, 15, 21, 24, 26], "support": [0, 1, 5, 10, 11, 12, 13, 15, 16, 18, 19, 21, 22, 23, 24, 27, 28], "3": [0, 1, 2, 5, 12, 13, 19, 20, 21, 22, 23, 24, 26, 27], "xma_host_buffer_typ": 0, "upload": [0, 7, 27], "befor": [0, 6, 9, 15, 20, 22, 26, 27], "xma_device_only_buffer_typ": 0, "download": [0, 6, 18, 27, 28], "no_buff": 0, "contain": [0, 1, 7, 8, 9, 10, 12, 15, 20, 22, 24, 26], "place": [0, 8], "holder": 0, "fill": 0, "onli": [0, 1, 2, 6, 12, 15, 19, 20, 21, 22, 23, 24, 26, 27], "while": [0, 15, 22, 24], "xma_device_buffer_typ": 0, "dummi": 0, "those": 0, "respect": [0, 1, 6, 7, 15, 20, 21, 26, 27], "xmadatabuff": 0, "sw_format": 0, "member": 0, "xmascalerproperti": 0, "xmaencoderproperti": 0, "xmafilterproperti": 0, "repres": 0, "pixel": [0, 7, 8, 9, 12, 19, 26], "format": [0, 1, 5, 6, 7, 9, 10, 12, 14, 15, 19, 20, 21, 22, 24, 26, 27], "therefor": 0, "assign": [0, 20, 21, 26], "direct": [0, 16, 21, 26, 27], "flow": [0, 25], "xma_nv12_fmt_typ": 0, "xma_p010le_fmt_typ": 0, "flag": [0, 6, 7, 16, 23], "xma_frame_property_flag_tile_4x4": 0, "intern": [0, 7, 16, 22], "xma_packed10_fmt_typ": 0, "an": [0, 1, 2, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 24, 25, 26, 27, 28], "xma_rgb24_fmt_typ": 0, "futur": [0, 27], "xma_yuv420p_fmt_typ": 0, "xma_yuv420p10le_fmt_typ": 0, "extern": [0, 21], "section": [0, 1, 5, 6, 7, 8, 12, 13, 15, 16, 19, 20, 21, 22, 24, 25, 26, 27, 28], "commonli": [0, 6], "most": [0, 6, 9, 12, 21, 24], "consist": 0, "xma_log_init": 0, "xma_logmsg": 0, "xma_log_releas": 0, "xmalogg": 0, "int32_t": 0, "xmalogleveltyp": 0, "log_level": [0, 12, 25], "xmalogtyp": 0, "log_typ": 0, "xmaloghandl": 0, "handl": [0, 15, 26], "prior": [0, 20, 24], "see": [0, 1, 5, 6, 7, 8, 9, 12, 13, 15, 20, 21, 22, 23, 24, 26], "variad": 0, "usag": [0, 1, 5, 7, 9, 14, 15, 24, 26, 27], "void": 0, "level": [0, 12, 16, 20, 21, 25, 26], "const": 0, "char": 0, "name": [0, 5, 9, 10, 11, 12, 13, 15, 16, 18, 25, 26, 27, 28], "msg": 0, "messag": [0, 12, 13, 15, 16, 22], "wa": [0, 16, 25], "previous": [0, 5, 7, 8, 16, 19, 20], "xma_initi": 0, "xma_releas": 0, "xmainitparamet": 0, "init_param": 0, "xmahandl": 0, "xma_data_buffer_alloc": 0, "xma_data_from_buffer_clon": 0, "xma_data_buffer_fre": 0, "size_t": 0, "size": [0, 7, 8, 13, 20, 22, 23, 24, 25, 26, 28], "bool": 0, "given": [0, 1, 2, 5, 7, 12, 15, 23, 24], "uint8_t": 0, "xma_data_buffer_clone_free_callback_funct": 0, "free_callback": 0, "opaqu": 0, "point": [0, 1, 15, 18, 22], "longer": 0, "xma_frame_planes_get": 0, "xma_frame_get_plane_height": 0, "xma_frame_get_plane_strid": 0, "xma_frame_get_plane_s": 0, "xma_frame_alloc": 0, "xma_frame_from_buffers_clon": 0, "xma_frame_clon": 0, "xma_frame_inc_ref": 0, "xma_frame_dec_ref": 0, "xma_frame_fre": 0, "frame_prop": 0, "number": [0, 9, 10, 11, 12, 13, 15, 16, 20, 22, 23, 24, 25, 26, 27], "plane": 0, "height": [0, 2, 7, 9, 11, 12, 15, 16, 20, 24, 26, 27], "stride": 0, "width": [0, 1, 2, 7, 9, 11, 12, 15, 16, 20, 22, 24, 26, 27], "xmaframedata": 0, "frame_data": 0, "xma_frame_clone_free_callback_funct": 0, "xma_fram": 0, "same": [0, 6, 7, 15, 19, 20, 24, 27], "side": 0, "ad": [0, 1, 11, 26], "remov": [0, 13, 20, 22, 28], "affect": 0, "origin": [0, 6, 8], "increas": [0, 21, 23, 24, 26, 27], "count": [0, 12], "decreas": [0, 21, 22, 24], "previou": [0, 15, 16], "subsect": 0, "note": [0, 1, 5, 6, 7, 8, 9, 13, 14, 15, 19, 21, 23, 24, 26, 27, 28], "serv": [0, 27], "version": [0, 5, 6, 7, 8, 9, 12, 13, 14, 16, 21, 22, 26, 27, 28], "In": [0, 1, 5, 6, 7, 8, 9, 15, 18, 21, 23], "order": [0, 1, 6, 15, 18, 23, 28], "allow": [0, 1, 7, 9, 14, 15, 18, 21, 23, 24, 26, 27, 28], "forward": 0, "backward": 0, "abi": 0, "compat": [0, 1, 5, 8, 13, 14, 15, 19, 20, 21, 23, 24, 27, 28], "now": [0, 16], "set": [0, 7, 9, 12, 15, 16, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "If": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 20, 22, 23, 25, 26, 27, 28], "assum": [0, 15, 21, 25, 28], "mean": [0, 1, 6, 24, 26], "deprec": [0, 16], "earlier": 0, "later": [0, 20, 22], "cannot": [0, 11, 20], "either": [0, 6, 15, 20, 21], "ignor": [0, 13, 26, 28], "error": [0, 1, 7, 9, 12, 15, 22, 25, 27], "snippet": [0, 28], "param": [0, 12, 24, 27], "uint32_t": 0, "api_vers": 0, "xma_api_version_m_": 0, "m": [0, 23, 27, 28], "xma_api_vers": 0, "xma_uint32": 0, "sizeof": 0, "xma_init_param": 0, "param_cnt": 0, "logger": 0, "major": [0, 24], "minor": 0, "e": [0, 5, 7, 8, 9, 12, 13, 15, 19, 20, 22, 24, 26, 27, 28], "g": [0, 5, 7, 8, 9, 12, 13, 15, 20, 24, 26, 27], "macro": 0, "becom": [0, 15, 19, 22], "xma_api_version_1_0": 0, "xma_dec_session_cr": 0, "xma_dec_set_log": 0, "xma_dec_session_send_data": 0, "xma_dec_session_get_properti": 0, "xma_dec_session_recv_fram": 0, "xma_dec_session_destroi": 0, "xmadecod": 0, "xmadecodersess": 0, "xmadecoderproperti": 0, "dec_prop": 0, "run": [0, 1, 10, 12, 15, 18, 20, 21, 22, 26, 27, 28], "until": [0, 15, 21], "after": [0, 9, 13, 15, 20, 22, 26, 28], "depend": [0, 16, 21, 22, 23, 24], "sever": [0, 7, 15, 21], "factor": [0, 15, 24, 26, 27], "resolut": [0, 2, 6, 8, 10, 11, 12, 15, 20, 21, 22, 26, 27], "rate": [0, 6, 9, 12, 14, 15, 16, 19, 20, 21, 23, 24, 26, 27], "bit": [0, 2, 5, 8, 9, 12, 16, 20, 23, 24, 26, 27], "depth": [0, 2, 12, 16, 20, 21, 22, 24, 26, 27], "xma_dec_session_set_log": 0, "chang": [0, 5, 21, 24], "default": [0, 1, 6, 7, 9, 10, 11, 12, 13, 15, 20, 22, 23, 24, 25, 26, 27, 28], "some": [0, 6, 7, 9, 20, 22, 24], "data_us": 0, "wai": [0, 15, 21, 26], "pars": [0, 9], "stream": [0, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 19, 20, 21, 22, 24, 26, 27], "time": [0, 1, 5, 6, 7, 8, 9, 11, 12, 14, 15, 20, 22, 23, 24], "indic": [0, 1, 15, 22, 28], "amount": [0, 24], "consum": [0, 1, 15], "xma_success": 0, "abl": [0, 18, 22, 28], "entireti": 0, "accordingli": [0, 15], "case": [0, 10, 15, 16, 20, 21, 22, 23, 24, 26], "proce": [0, 1, 13], "fetch": 0, "xma_try_again": 0, "did": 0, "report": [0, 1, 20, 21, 22, 23, 25], "again": [0, 7, 22], "xma_send_more_data": 0, "more": [0, 1, 5, 7, 8, 9, 12, 13, 15, 20, 21, 22, 24, 26, 27], "ha": [0, 1, 2, 6, 7, 12, 15, 20, 21, 22, 23, 24, 26, 27], "notifi": 0, "null": [0, 6, 11, 15], "continu": [0, 1], "flush": 0, "out": [0, 5, 9, 15, 22, 27], "yuv": [0, 7, 12, 19], "dec_sess": 0, "fprop": 0, "tri": 0, "valid": [0, 1, 15, 21, 24, 26, 27], "pointer": 0, "still": [0, 12, 15], "produc": [0, 7, 9, 10, 16, 21, 27], "xma_eo": 0, "configur": [0, 5, 6, 7, 8, 9, 10, 12, 13, 15, 16, 21, 22, 24, 25, 26, 27, 28], "standard": [0, 6, 21, 26], "both": [0, 1, 5, 8, 19, 20, 21, 23, 24, 26, 28], "specifi": [0, 1, 6, 7, 9, 11, 12, 15, 16, 20, 24, 26, 27], "hwdecoder_typ": 0, "arrai": 0, "list": [0, 1, 6, 7, 12, 13, 15, 16, 18, 19, 20, 23, 24, 26], "incom": [0, 7, 24, 26], "even": [0, 21], "integ": [0, 11, 26, 27], "between": [0, 1, 5, 8, 15, 16, 20, 21, 23, 26, 27, 28], "128": [0, 28], "3840": [0, 15], "portrait": [0, 19, 20, 21], "2160": [0, 15], "bits_per_pixel": 0, "per": [0, 1, 7, 12, 13, 14, 19, 20, 24, 27, 28], "primari": [0, 1, 24], "8": [0, 2, 7, 8, 11, 12, 20, 23, 27, 28], "10": [0, 1, 2, 5, 8, 12, 16, 20, 22, 23, 26, 27], "xma_frame_property_flag_compress": 0, "addit": [0, 1, 6, 15, 24, 25, 27], "out_fmt": [0, 5, 7, 12, 15, 19, 23, 26], "option": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 19, 20, 23, 24, 27], "low_lat": [0, 7, 23, 26], "enabl": [0, 7, 10, 12, 13, 14, 15, 16, 20, 21, 22, 23, 25, 26, 27, 28], "latency_log": [0, 12, 23, 26], "inform": [0, 1, 6, 7, 15, 25, 26], "xma_scaler_session_cr": 0, "xma_scaler_set_log": 0, "xma_scaler_session_send_fram": 0, "xma_scaler_session_recv_frame_list": 0, "xma_scaler_session_destroi": 0, "xmascal": 0, "xmascalersess": 0, "prop": 0, "underli": [0, 24], "eventu": 0, "multipl": [0, 5, 15, 19, 20, 21, 24, 26], "take": [0, 7, 9, 10, 15, 26, 27], "further": [0, 5, 6, 7, 8, 19, 23, 24], "upon": [0, 22], "xma_flush_again": 0, "frame_list": 0, "everi": [0, 1, 6, 23], "reach": [0, 21], "end": [0, 7, 15, 20, 22, 23, 24], "xma_error": 0, "xmascalerinoutproperti": 0, "xmascalerfilterproperti": 0, "16": [0, 1, 8, 21, 26], "hwscaler_typ": 0, "xma_abr_scaler_typ": 0, "num_output": 0, "xma_vpe_fmt_typ": 0, "framer": [0, 6, 7, 9, 15, 24], "second": [0, 7, 22, 24, 27, 28], "mix_rat": 0, "mix": [0, 20], "half": [0, 7, 12, 13, 22, 26], "top": [0, 5, 7, 8, 9, 11, 27], "crop": [0, 27], "disabl": [0, 12, 13, 15, 16, 20, 22, 25, 26, 27], "xma_enc_session_cr": 0, "xma_enc_session_set_log": 0, "xma_enc_session_send_fram": 0, "xma_enc_session_recv_data": 0, "xma_enc_session_destroi": 0, "xmaencod": 0, "xmaencodersess": 0, "enc_prop": 0, "about": [0, 1, 7, 15, 24], "data_s": 0, "respons": [0, 15], "xma_resend_and_recv": 0, "readi": [0, 19], "untouch": 0, "reus": [0, 15], "hwencoder_typ": 0, "lookahead_depth": [0, 6, 7, 12, 20, 22, 23, 24, 26], "lookahead": [0, 1, 2, 10, 12, 15, 16, 20, 22, 26, 27], "modul": [0, 13, 28], "give": [0, 6, 9], "start": [0, 1, 6, 7, 11, 14, 15, 22, 24, 28], "40": [0, 1, 12, 20, 21, 27], "rc_mode": [0, 12], "constant": [0, 21, 23, 26, 27], "qp": [0, 2, 7, 12, 16, 20, 21, 24, 26, 27], "cbr": [0, 2, 21, 23, 26, 27], "2": [0, 1, 5, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28], "vbr": [0, 2, 20, 21, 26, 27], "cvbr": [0, 2, 20, 21, 26, 27], "bitrat": [0, 7, 9, 11, 12, 16, 20, 22, 23, 24, 26, 27], "kbp": [0, 11, 12], "fix": [0, 22, 24, 27], "quantiz": [0, 21, 23, 24, 26, 27], "51": [0, 12, 24, 26, 27], "264": [0, 7, 8, 9, 10, 11, 12, 21, 26], "hevc": [0, 7, 9, 12, 14, 15, 20, 21, 23, 24, 26, 27], "255": [0, 7, 12, 24, 26, 27], "av1": [0, 1, 7, 9, 12, 14, 15, 16, 20, 21, 26, 27], "gop_siz": 0, "maximum": [0, 12, 15, 19, 20, 21, 24, 26, 27], "group": [0, 22, 28], "pictur": 0, "temp_aq_gain": 0, "tempor": [0, 2, 12, 21, 24, 26, 27], "aq": [0, 2, 12, 20, 24, 26, 27], "gain": [0, 12, 24, 26, 27], "spat_aq_gain": 0, "spatial": [0, 2, 12, 21, 24, 26, 27], "minqp": [0, 24], "minimum": [0, 2, 12, 26, 27], "maxqp": [0, 24], "profil": [0, 12, 16, 21, 26], "baselin": [0, 12, 21, 26], "main": [0, 12, 16, 18, 21, 26, 27], "high": [0, 12, 14, 21, 22, 26, 27], "intra": [0, 12, 21, 26, 27], "100": [0, 1, 12, 20, 22], "101": [0, 12], "102": [0, 12], "103": [0, 12], "200": 0, "auto": [0, 12, 26, 27], "codec": [0, 6, 7, 10, 12, 14, 16, 26], "slice": [0, 7, 12, 15, 16, 20, 21, 26, 27], "spatial_aq": [0, 12, 26], "adapt": [0, 20, 26, 27], "temporal_aq": [0, 12, 26], "qp_mode": [0, 12, 26], "rel": [0, 11, 27], "uniform": [0, 26, 27], "tune_metr": [0, 6, 12, 16, 24, 26], "tune": [0, 7, 12, 16, 21, 26, 27], "metric": [0, 6, 12, 16, 26, 27], "none": [0, 5, 12, 13, 28], "vq": [0, 6, 7, 16, 21, 23, 24, 26, 27], "psnr": [0, 24, 26, 27], "ssim": [0, 24, 26, 27], "vmaf": [0, 24, 26, 27], "forced_idr": [0, 26], "forc": [0, 9, 16, 25, 26, 27, 28], "insert": [0, 9, 10, 11, 13, 16, 23, 26, 28], "idr": [0, 10, 16, 21, 26, 27], "crf": [0, 2, 12, 26, 27], "expert_opt": [0, 12, 24, 26], "": [0, 1, 5, 6, 7, 8, 9, 12, 13, 15, 16, 19, 20, 22, 23, 24, 26, 28], "expert": [0, 12, 16], "device_typ": [0, 12], "For": [0, 1, 2, 5, 6, 7, 9, 12, 13, 15, 20, 21, 23, 24, 26, 27, 28], "select": [0, 6, 7, 13, 15, 16, 20, 21, 23, 26], "xma_filter_session_cr": 0, "xma_filter_session_set_log": 0, "xma_filter_session_send_fram": 0, "xma_filter_session_recv_fram": 0, "xma_filter_session_destroi": 0, "xmafilt": 0, "xmafiltersess": 0, "reciev": 0, "re": [0, 7, 21, 24], "mai": [0, 1, 6, 15, 20, 21, 22, 23, 24, 26, 28], "current": [0, 1, 15, 16, 19, 20, 24, 27], "yet": 0, "xmafilterportproperti": 0, "hwfilter_typ": 0, "entri": [0, 15, 20], "xma_upload_filter_typ": 0, "xma_download_filter_typ": 0, "port": [0, 22], "xma_int32": 0, "immedi": 0, "delin": [0, 19], "improv": [0, 7, 16, 21, 24, 26], "over": [0, 5, 15, 19, 20, 22], "xma_api_version_1_1": 0, "here": [0, 6, 7, 9, 15, 24], "how": [0, 1, 4, 5, 6, 7, 8, 9, 12, 13, 15, 19, 21, 24, 26, 27], "impli": [0, 21, 24, 26], "migrat": 0, "manual": [0, 20, 28], "v1": [0, 20], "anoth": [0, 6, 15], "would": 0, "replac": [0, 5], "new": [0, 5, 6, 7, 8, 9, 12, 15, 16, 20], "access": [0, 13, 21, 22, 27], "modifi": [0, 6, 24], "hdr10": [0, 16, 20, 21], "sei": [0, 16, 21], "defin": [0, 7, 15, 21, 24, 25, 26, 28], "own": [0, 22, 24, 28], "downstream": [0, 27], "predefin": 0, "user": [0, 1, 6, 7, 9, 14, 15, 21, 25, 27, 28], "metadata": [0, 7, 20], "attach": [0, 28], "sidedata": 0, "alreadi": [0, 7], "exist": [0, 7, 20, 28], "delet": 0, "sole": 0, "xma_side_data_get_metadata": 0, "get": [0, 1, 7, 12, 14, 20, 22, 25, 28], "xma_side_data_set_metadata": 0, "xma_frame_get_first_side_data": 0, "xma_frame_get_next_side_data": 0, "xma_frame_get_next_side_data_of_typ": 0, "xma_frame_get_side_data": 0, "xma_frame_remove_side_data_typ": 0, "xma_side_data_read": 0, "xma_dec_param_thread": 0, "xma_dec_param_wait": 0, "background": [0, 1, 15, 19], "thread": [0, 9, 21, 25], "deploi": [0, 13, 24], "cpu": [0, 5, 6, 8, 28], "util": [0, 10, 11, 12, 15, 20, 21, 22, 25, 26, 28], "similarli": [0, 19], "xma_enc_param_thread": 0, "xma_enc_param_wait": 0, "These": [0, 1, 15, 21, 24, 26], "behav": 0, "expect": [0, 10, 11, 13, 21, 22, 26, 27], "behavior": [0, 21, 24], "successfulli": [0, 1], "regardless": [0, 27], "pull": [0, 12], "try": [0, 22], "full": [0, 7, 12, 15, 20, 22, 26, 27], "accord": [0, 18, 21], "last": [0, 1], "compress": [0, 6, 23, 24, 26], "No": [0, 1, 2, 10, 11, 21], "loop": [0, 12, 16], "occur": 0, "extend": [0, 26], "xma_log_type_ama": 0, "xma_frame_side_data_dyn_enc_param": 0, "clone": 0, "itself": [0, 24], "decrement": [0, 22], "xma_frame_add_side_data": 0, "xma_frame_remove_side_data": 0, "abov": [0, 6, 7, 10, 13, 22, 23, 24, 25, 28], "doe": [0, 6, 15, 20, 22, 26, 27], "instead": [0, 9, 15, 20, 24], "old": 0, "fpga": 0, "daemon": [0, 1, 15, 20, 28], "command": [0, 1, 5, 6, 7, 8, 9, 10, 11, 13, 19, 20, 21, 22, 24, 28], "tool": [0, 1, 20, 21, 24], "commun": [0, 21, 26, 27], "xrmadm": [0, 15], "xrmd": [0, 15, 20, 26], "document": [0, 6, 12, 15, 16, 20, 24, 26, 27], "xrm_dec_reserv": 0, "xrm_dec_releas": 0, "xrm_dec_interfac": 0, "int": [0, 10, 11, 24], "xrmdecodecontext": 0, "xrm_dec_ctx": 0, "dev_index": 0, "xrminterfaceproperti": 0, "xrm_prop": 0, "check": [0, 9, 22, 28], "relev": [0, 1, 6, 18, 23], "were": 0, "xrm_enc_reserv": 0, "xrm_enc_releas": 0, "xrm_enc_interfac": 0, "xrmencodecontext": 0, "xrm_enc_ctx": 0, "slice_id": 0, "is_xav1": 0, "is_ul": 0, "xrm_scale_reserv": 0, "xrm_scale_releas": 0, "xrm_scale_interfac": 0, "xrmscalecontext": 0, "scaler_xrm_ctx": 0, "input_prop": 0, "output_prop": 0, "cd": 0, "chmod": 0, "r": [0, 1, 19, 26, 28], "777": 0, "mkdir": 0, "cmake": 0, "j": [0, 10], "amd": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 15, 16, 17, 18, 19, 23, 24, 25, 27, 28], "ama": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 15, 16, 17, 18, 19, 23, 24, 25, 27, 28], "video": [1, 2, 3, 4, 7, 9, 10, 11, 14, 16, 17, 18, 20, 22, 23, 25, 27, 28], "sdk": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27, 28], "build": [1, 6, 27, 28], "xrm": [1, 21, 22, 25], "interfac": [1, 12, 14, 21], "instal": [1, 5, 6, 7, 8, 9, 10, 11, 12, 15, 18, 20, 28], "upgrad": [1, 18], "board": 1, "flash": [1, 20], "standalon": 1, "queri": [1, 15, 21], "administ": 1, "print": [1, 12, 23], "readabl": [1, 15], "manner": [1, 5, 7, 8, 19], "examin": 1, "unprivileg": 1, "bare": 1, "metal": 1, "guest": [1, 13, 20], "vm": [1, 13, 20], "reset": [1, 20, 21, 22], "privileg": 1, "vf": [1, 5, 6, 7, 16, 20, 24, 26, 28], "target": [1, 5, 7, 8, 16, 21, 22, 24, 25, 28], "evic": 1, "pcie": [1, 13, 20, 21, 22, 28], "domain": [1, 28], "notat": 1, "work": [1, 12, 20, 22], "pci": [1, 21, 28], "often": 1, "pad": [1, 9, 16], "lead": 1, "four": [1, 11, 14], "digit": 1, "colon": 1, "hexadecim": 1, "two": [1, 10, 14, 15, 21, 24, 27], "sometim": [1, 22], "refer": [1, 7, 9, 13, 16, 21, 24, 25, 26, 27], "slot": [1, 13, 22], "decim": 1, "softwar": [1, 3, 14, 18, 19, 20, 21, 25], "process": [1, 6, 9, 12, 14, 15, 16, 21, 23, 24, 25, 26, 27], "reserv": [1, 16], "alloc": [1, 7, 13, 15, 16, 21, 27, 28], "interact": [1, 12, 15, 23, 25, 28], "gener": [1, 5, 12, 13, 16, 20, 21, 25, 28], "guid": [1, 6, 7, 9, 12, 26, 27], "obtain": [1, 6, 9, 23, 26, 28], "exampl": [1, 4, 14, 19, 21, 22, 24, 28], "detect": 1, "bdf": 1, "0000": [1, 22, 28], "01": [1, 23, 28], "00": [1, 5, 22, 23, 28], "0": [1, 2, 5, 6, 7, 9, 10, 11, 12, 13, 15, 16, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "02": [1, 22, 28], "info": [1, 12, 25, 28], "taken": 1, "help": [1, 9, 12, 26, 28], "cmd": 1, "design": [1, 27, 28], "you": [1, 5, 6, 7, 8, 9, 12, 13, 15, 26, 27, 28], "through": [1, 5, 6, 10, 11, 15, 20, 21, 24, 26, 28], "cat": [1, 13, 28], "sy": [1, 13, 22, 28], "class": [1, 13], "misc": [1, 13], "ama_transcod": [1, 13, 22, 28], "x": [1, 5, 9, 19, 20, 24], "bus_id": 1, "minu": 1, "1": [1, 5, 6, 7, 9, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "ama_transcoder0": [1, 5, 6, 12, 13, 15, 19, 22, 23, 26], "verifi": [1, 12, 13], "version_inform": [1, 13], "zsp": [1, 13, 20], "sc": [1, 13, 18, 20, 22], "9": [1, 2, 11, 13, 20, 22], "7": [1, 2, 12, 13, 20, 22, 26, 27], "35": [1, 13, 20, 22, 24], "esecur": [1, 13, 20], "fw": [1, 13, 20, 22], "ctrl": [1, 13, 20, 22], "patch": [1, 13, 20], "phy": [1, 13, 20], "environ": [1, 15, 19], "d": [1, 7, 12, 13, 18, 20, 22, 26, 28], "chassi": [1, 15, 20, 21, 22], "basic": 1, "shell": [1, 13, 15], "sub": [1, 15, 16, 19], "pipelin": [1, 7, 9, 10, 11, 12, 15, 16, 18, 21, 22, 23, 24, 26], "impact": [1, 2, 7, 24, 26], "applic": [1, 3, 4, 5, 6, 7, 8, 9, 12, 14, 18, 20, 21, 23, 24, 26, 28], "via": [1, 15, 20, 28], "switch": 1, "view": 1, "interest": 1, "electr": 1, "power": [1, 13, 14, 20, 21, 22], "sensor": 1, "present": [1, 5, 6, 7, 8, 9, 10, 11, 12, 21], "hw": [1, 15], "cnt": 1, "counter": 1, "memori": [1, 9, 20, 27, 28], "topologi": [1, 23, 24], "thermal": 1, "known": [1, 6, 15, 22, 24, 27], "json": [1, 6, 10, 15], "o": [1, 11, 12, 20, 28], "filenam": 1, "temperatur": [1, 20], "ma35_temp_s2": 1, "85": 1, "c": [1, 3, 4, 5, 6, 7, 10, 12, 13, 14, 16, 19, 21, 22, 23, 24, 26, 28], "board_temp": 1, "44": [1, 28], "aux": 1, "732": 1, "mv": 1, "ddr0": 1, "868": 1, "ml_engin": 1, "747": 1, "748": 1, "3v": 1, "pex": 1, "voltag": [1, 20], "3304": 1, "3320": 1, "12v": 1, "12040": 1, "293": 1, "ma": 1, "93": 1, "426": 1, "board_pow": 1, "6405": 1, "mw": 1, "administr": 1, "virtual": [1, 13, 20, 22], "numvf": [1, 28], "activ": [1, 13, 20, 22, 26, 28], "bandwidth": [1, 7, 9, 21, 23], "tag": 1, "mbp": [1, 12, 20], "s2_dfi_w_mbp": 1, "s2_dfi_r_mbp": 1, "s2_axi_w_mbp": 1, "s2_axi_r_mbp": 1, "s1_dfi_w_mbp": 1, "s1_dfi_r_mbp": 1, "474": 1, "s1_axi_w_mbp": 1, "s1_axi_r_mbp": 1, "236": 1, "total_dfi_mbp": 1, "s1_dfi_bw": 1, "s2_dfi_bw": 1, "total_axi_mbp": 1, "s1_axi_bw": 1, "s2_axi_bw": 1, "vendor": [1, 12, 28], "0x10ee": 1, "0x5070": 1, "16gt": [1, 22], "temp": 1, "57": 1, "53": [1, 2], "736": 1, "864": 1, "752": 1, "750": 1, "3296": 1, "12208": 1, "266": 1, "80": [1, 26], "653": 1, "9114": 1, "uptim": [1, 20], "sec": 1, "328344": 1, "pciephypatch": 1, "pciectlpatch": 1, "32": [1, 12, 21], "threshold": 1, "shutdown_temp_c": 1, "110": 1, "max_operating_temp_c": 1, "105": 1, "threshold_temp_c": 1, "oem_id": 1, "0xe78": 1, "sku_numb": 1, "part_numb": 1, "05105": 1, "product_nam": 1, "alveo": 1, "ma35d": [1, 5, 8, 14, 15, 16, 20], "pq": 1, "product_revis": 1, "product_sn": 1, "xfl1at3klcy5": 1, "processor_typ": 1, "vpu": [1, 14, 21], "uncorrect": 1, "correct": [1, 15], "ths2_axi_sram": 1, "ths1_axi_sram": 1, "ddr_ch7": 1, "ddr_ch6": 1, "ddr_ch3": 1, "ddr_ch2": 1, "ddr_ch1": 1, "ddr_ch5": 1, "ddr_ch0": 1, "ddr_ch4": 1, "sure": [1, 7], "wish": 1, "y": [1, 2, 5, 6, 7, 13, 15, 19, 23, 24, 26, 28], "n": [1, 2, 8, 11, 15, 16, 26], "issu": [1, 13, 28], "sudo": [1, 13, 18, 22, 28], "v": [1, 5, 6, 7, 11, 12, 15, 16, 19, 23, 24, 26, 28], "imag": [1, 5, 8, 11, 19, 20, 21, 28], "meta": 1, "data": [1, 9, 21, 22, 26], "binari": [1, 6], "p": [1, 7, 13, 19, 27], "b": [1, 2, 5, 6, 7, 11, 12, 19, 20, 23, 24, 26, 27], "path_to_flash_imag": 1, "comma": 1, "separ": 1, "keyword": [1, 9], "parallel": [1, 13, 15, 19, 21, 27], "simultan": [1, 21], "across": [1, 6, 15, 20, 21], "stop": [1, 7], "non": [1, 16, 21], "backup": 1, "region": [1, 13, 20], "appropri": [1, 6, 27], "proper": [1, 5, 6, 7, 8, 9, 12, 13], "subsystem": 1, "ma35_firmwar": [1, 13], "bin": [1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 22, 28], "zsp_firmware_packed_pq": 1, "package_timestamp": 1, "30_02": 1, "39": 1, "keyset": 1, "md5sum": 1, "a0c16839e94e1cba0a8c54e2e4f720ec": 1, "schema": 1, "eraseflash": 1, "19": [1, 20, 28], "29": 1, "38": 1, "48": 1, "58": 1, "67": 1, "77": 1, "87": 1, "96": [1, 13, 28], "writeflash": 1, "pleas": 1, "wait": [1, 15, 22], "flash_progress": 1, "20": [1, 8, 11, 12, 20, 24, 28], "30": [1, 12, 21, 24], "50": [1, 12, 13, 23, 24, 26], "60": [1, 6, 7, 9, 11, 15, 22, 24, 26, 28], "70": 1, "90": [1, 19], "bmc": [1, 22], "msp432": [1, 22], "31": [1, 10, 11, 12], "f92a87bb92749276d4ecd12dc4f9887b": 1, "18": 1, "28": 1, "37": 1, "46": [1, 22, 23], "56": 1, "65": 1, "75": 1, "84": 1, "mandatori": [1, 5, 6, 7, 8, 9, 10, 11, 12, 15], "script": [1, 5, 6, 7, 8, 9, 12, 13, 15, 20], "setup": [1, 20, 22, 28], "sh": [1, 5, 6, 7, 8, 9, 12, 13, 15, 20, 22, 28], "boot": [1, 13, 15, 20], "list_cmd": [1, 15], "cu": [1, 15], "decod": [1, 6, 8, 11, 13, 14, 15, 16, 19, 20, 21, 25], "scaler": [1, 7, 15, 16], "encod": [1, 5, 6, 8, 11, 14, 15, 16, 19, 20, 21, 25], "device_0": [1, 15], "cu_2": [1, 15], "cuid": [1, 15], "cutyp": [1, 15], "ip": [1, 15, 16, 28], "kernel": [1, 11, 13, 15, 18, 22, 28], "kernelnam": [1, 15], "kernelalia": [1, 15], "encoder_type1_ama": [1, 15], "instancenam": [1, 15], "encoder_1": [1, 15], "cunam": [1, 15], "kernelplugin": [1, 15], "maxcapac": [1, 15], "497664000": [1, 15], "numchaninus": [1, 15], "usedload": [1, 15], "1000000": [1, 9, 15], "reservedload": [1, 15], "resrvusedload": [1, 15], "much": [1, 15], "rang": [1, 10, 11, 15, 21, 22, 23, 24, 26, 27], "noth": [1, 15], "fulli": [1, 15, 19, 21], "actual": [1, 15, 21, 24], "snapshot": [1, 15], "1080p60": [1, 7, 15, 21], "singl": [1, 7, 13, 20, 21, 26, 28], "result": [1, 5, 6, 11, 15, 19, 21, 23, 24], "deviceid": [1, 15], "scaler_ama": [1, 5, 7, 15, 19, 23, 26], "decoder_ama": [1, 15], "250000": [1, 15], "25": [1, 15, 23, 24], "encoder_type2_ama": [1, 15], "lookahead_ama": [1, 15], "125000": [1, 15], "12": [1, 12, 15, 21, 23], "5": [1, 2, 10, 11, 12, 13, 15, 20, 21, 22, 23, 26, 28], "ml_ama": [1, 15, 19], "device_1": [1, 15], "Not": [1, 13, 15, 26, 27], "quarter": [1, 15], "8th": [1, 15], "mani": [2, 6, 15, 21, 26, 27, 28], "adjust": [2, 6, 24, 26], "permiss": 2, "la": [2, 7, 21], "latenc": [2, 7, 12, 16, 20, 21, 22, 26, 27], "mode": [2, 6, 12, 13, 16, 19, 20, 24, 25, 26, 27], "core": [2, 13, 15, 16, 18, 19, 20, 21, 26, 28], "slow": [2, 15, 21, 24, 26, 27], "preset": [2, 15, 20, 21, 26, 27, 28], "medium": [2, 15, 21, 24, 26, 27], "fast": [2, 15, 20, 24, 26, 27], "frame": [2, 5, 6, 7, 8, 9, 10, 12, 15, 16, 19, 20, 23, 24, 26, 27], "cqp": [2, 23, 27], "cabr": [2, 20, 26, 27], "roi": 2, "map": [2, 5, 7, 10, 15, 19, 20, 26], "49": [2, 23], "normal": [2, 12, 21], "6": [2, 6, 12, 13, 20, 22, 26], "low": [2, 12, 14, 16, 20, 21, 22, 26, 27], "ull": [2, 6, 12, 16, 24, 26, 27], "11": [2, 5, 12, 20, 28], "720": [2, 9, 12, 15], "ident": [2, 7, 9, 25, 26], "statement": 2, "appli": [2, 5, 7, 8, 26, 27], "ffmpeg": [3, 6, 8, 9, 12, 13, 14, 18, 19, 20, 21, 22, 24, 25], "qualiti": [3, 12, 14, 20, 22, 23, 26, 27], "filter": [3, 7, 12, 16, 20, 22, 25], "gstreamer": [3, 5, 6, 7, 12, 13, 15, 18, 20, 21, 24, 25], "compositor": 3, "abr": [3, 12, 15, 24, 25, 26], "ladder": [3, 15, 24, 25, 26], "xma": [3, 5, 6, 7, 8, 9, 13, 18, 20, 21, 25, 27], "under": [4, 6, 7, 10, 11, 12, 15, 20, 26, 27], "construct": [4, 26, 27], "folder": [4, 5, 6, 7, 8, 9, 10, 12, 15], "illustr": [4, 6, 12, 15, 21, 24, 26, 27], "advanc": [4, 21], "api": [4, 12, 14, 15, 21], "shown": [5, 15], "transfer": [5, 7, 8, 9, 16, 21, 26, 27], "hwdownload": [5, 7, 15, 19, 26], "hwupload": [5, 6, 7, 19, 24, 26], "split": [5, 7, 8, 16, 20, 21], "fp": [5, 7, 8, 9, 12, 20, 21, 23, 26], "minim": [5, 8, 25], "traffic": [5, 8], "descript": [5, 7, 8, 10, 11, 13, 19, 25, 26, 27], "accumul": [5, 7, 8, 19], "explain": [5, 6, 7, 8, 9, 15, 19], "On": [5, 6, 7, 8, 9, 12, 28], "premis": [5, 6, 7, 8, 9, 12, 14, 28], "export": [5, 6, 7, 8, 9, 12, 15, 25], "import": [5, 6, 7, 8, 9, 12, 24], "variabl": [5, 6, 7, 8, 9, 12, 15, 25, 26, 27], "execut": [5, 6, 7, 8, 9, 12, 13, 15, 16, 22, 28], "open": [5, 6, 7, 8, 9, 12, 26], "termin": [5, 6, 7, 8, 9, 12, 15, 25], "correctli": [5, 6, 7, 8, 9, 12], "demonstr": [5, 6, 7, 19], "flip": [5, 19], "hwaccel": [5, 6, 7, 15, 16, 19, 21, 23, 24, 26], "hwaccel_devic": [5, 6, 15, 19, 23, 26], "dev": [5, 6, 7, 9, 12, 13, 15, 16, 19, 23, 26, 28], "h264_ama": [5, 6, 7, 12, 15, 19, 23, 26], "yuv420p": [5, 6, 7, 12, 15, 19, 24, 26], "filter_complex": [5, 7, 15, 16, 19, 23, 26], "transpos": 5, "dir": [5, 22], "passthrough": [5, 16], "a1": [5, 7, 19], "b1": [5, 7], "f": [5, 6, 7, 10, 11, 15, 19, 23, 24, 26], "mp4": [5, 7, 8, 10, 11, 12, 15, 19, 26], "90_flip": 5, "270_flip": 5, "path": [5, 6, 7, 9, 10, 11, 12, 15, 25, 26, 27, 28], "avc": [5, 9, 14, 16, 20, 21, 23, 24, 26, 27], "clip": [5, 6, 7, 24], "directori": [5, 9, 12], "y4m": 5, "vid": 5, "l": [5, 11, 13, 22], "lai": 5, "offset": [5, 11, 16], "640": [5, 12, 15], "480": [5, 9, 12, 15], "in_w": 5, "800": [5, 23], "in_h": 5, "out_h": 5, "compos": [5, 11], "tile": 5, "hide_bann": [5, 7, 19], "input_1": 5, "input_2": 5, "input_3": 5, "input_4": 5, "out_r": [5, 7, 19, 23, 26], "1920x1080": [5, 6, 7, 19, 23, 24, 26], "22": [5, 12, 20], "33": 5, "hstack": 5, "bot": 5, "vstack": 5, "15m": [5, 19], "vframe": [5, 15], "600": [5, 23, 24], "yuv420p10l": [5, 12, 15, 26], "graph": [5, 7, 26], "As": [5, 13, 15, 22, 23, 24, 28], "show": [5, 8, 15, 21, 22, 26], "crop_10b": 5, "1m": [5, 7, 26], "442": 5, "neither": 5, "accept": [5, 7, 8, 9, 20], "nor": 5, "progress": [5, 20, 21], "yadif": 5, "page": [6, 7, 9, 10, 11, 13, 26, 28], "behind": 6, "measur": [6, 15, 24, 25], "maxim": 6, "topic": 6, "There": [6, 7, 9, 26], "longstand": 6, "goal": 6, "engin": [6, 16, 19, 20, 21, 24], "quantit": 6, "watch": 6, "inspect": [6, 9], "individu": [6, 15, 27], "led": 6, "evolut": 6, "algorithm": 6, "solut": [6, 21], "common": [6, 25], "peak": 6, "signal": 6, "nois": 6, "ratio": [6, 12, 16], "structur": [6, 24, 26], "similar": [6, 21], "index": [6, 10, 11, 16], "multimethod": 6, "assess": 6, "fusion": 6, "opinion": 6, "mo": 6, "human": 6, "visual": [6, 14, 20, 23, 24, 27], "screen": 6, "feedback": 6, "peopl": 6, "argu": 6, "best": [6, 21, 22, 23, 24, 26, 27], "although": [6, 19], "consid": 6, "least": [6, 13, 28], "accur": 6, "jan": 6, "ozer": 6, "center": [6, 11], "post": 6, "hi": 6, "experiment": 6, "correl": [6, 21], "review": 6, "find": [6, 22, 28], "furthermor": [6, 21, 23], "due": [6, 7, 9, 15, 22, 27], "industri": [6, 26], "like": [6, 7, 26], "ones": [6, 21, 24], "taught": 6, "test": [6, 21, 28], "higher": [6, 15, 23, 24], "wors": 6, "ey": 6, "x264": [6, 21], "x265": [6, 21], "object": [6, 12, 21, 23, 24, 26, 27], "discuss": 6, "subject": [6, 24], "appeal": 6, "what": [6, 15], "happen": [6, 24], "scene": [6, 24], "why": 6, "highli": [6, 21], "recommend": [6, 7, 9, 20, 21, 22, 23, 24], "undergon": 6, "transform": 6, "past": 6, "univers": 6, "state": [6, 7, 13, 20, 21, 28], "fairli": 6, "compar": 6, "altern": [6, 20, 21, 22], "remain": 6, "long": [6, 15], "pre": [6, 8, 14, 21], "tutori": [6, 13, 14, 21, 26, 28], "cover": [6, 16], "chapter": [6, 26], "variou": [6, 7, 12, 15, 18, 20, 22, 24, 26, 27], "effect": [6, 23, 24, 26, 27], "hevc_ama": [6, 7, 12, 15, 19, 23, 24, 26], "av1_ama": [6, 7, 12, 26], "permut": 6, "pix_fmt": [6, 7, 12, 15, 19], "2000k": 6, "rawvideo": [6, 7, 15, 19, 23, 24, 26], "real": [6, 12, 14, 15, 20, 22], "guarante": 6, "howev": [6, 19, 20, 21, 24], "better": [6, 23, 24], "achiev": [6, 7, 15, 21, 23, 28], "licens": 6, "reason": 6, "deliv": [6, 21], "comprehens": [6, 9], "plugin": [6, 7, 9, 12, 19, 20, 21, 22, 25], "easiest": 6, "static": [6, 21, 24], "john": 6, "van": 6, "sickl": 6, "among": [6, 21, 23, 24], "precompil": 6, "recompil": 6, "repositori": [6, 15, 18, 28], "instruct": [6, 7, 13, 15, 18, 20], "rebuild": 6, "sampl": [6, 10, 11, 15, 20, 23, 24], "typic": [6, 15, 21, 22, 24], "distort": [6, 24], "lavfi": [6, 24], "libvmaf": 6, "log_fmt": 6, "ms_ssim": 6, "log_path": 6, "log": [6, 12, 15, 22, 26], "model_path": 6, "TO": 6, "model": [6, 12, 19, 20, 28], "widthxheigth": 6, "vmaf_4k_v0": 6, "pkl": 6, "4k": 6, "vmaf_float_v0": 6, "lower": [6, 20, 21, 22, 23, 26, 27], "break": 7, "down": [7, 8, 21, 25], "varieti": [7, 12, 27], "read": [7, 9], "write": [7, 9, 25], "disk": [7, 9, 28], "chanc": [7, 9], "massiv": [7, 9], "notic": [7, 9, 12, 23], "drop": [7, 9, 12], "speed": [7, 9, 20, 21, 22, 23, 24], "we": [7, 9, 25], "shm": [7, 9], "ram": [7, 9, 13, 21, 28], "save": [7, 8, 10], "nv12": [7, 9, 12, 15, 23, 26, 27], "tmp": [7, 8, 9, 10, 15, 23, 25, 26], "dec_out": 7, "explan": [7, 9], "move": [7, 9, 24], "twice": [7, 26], "convert": [7, 9, 19, 26], "buffer": [7, 9, 11, 16, 22, 23, 24, 26, 27], "signifi": 7, "oppos": 7, "audio": [7, 26], "ac3": 7, "overwrit": 7, "prompt": 7, "yuv420": [7, 8], "5mbp": [7, 12], "5m": [7, 12, 19, 24], "sn1_av1": 7, "maintain": 7, "sinc": [7, 28], "1080p": [7, 11, 12, 15, 19], "color": [7, 20, 27], "space": [7, 10, 20, 25, 26, 27], "8m": 7, "megabit": 7, "8000k": 7, "8000000": 7, "enc_out": 7, "sn1_crf_hq": 7, "highest": 7, "sn1_crf_lq": 7, "lowest": [7, 23], "8mbp": 7, "written": [7, 12, 21], "h264_to_hevc": 7, "them": [7, 26], "_scale": 7, "1280x720": [7, 19, 26], "720x480": [7, 19, 26], "360x240": [7, 26], "c1": 7, "d1": 7, "scale_1080p": 7, "scale_720p": 7, "scale_480p": 7, "scale_240p": 7, "togeth": [7, 15, 27], "syntax": [7, 26], "widthxheight": [7, 26], "id": [7, 12, 16, 21, 25, 26, 27], "scale_": 7, "_": [7, 25], "6m": [7, 23, 26], "hevc_1080p60": 7, "2m": [7, 26], "av1_720p30": 7, "h264_480p30": 7, "av1_240p30": 7, "format_resoult": 7, "locat": [7, 9, 10, 11, 12, 15, 25, 26, 27, 28], "implement": [7, 10, 11, 26], "hevc_1080p": [7, 9, 26], "av1_720p": [7, 9, 26], "h264_480p": [7, 9, 26], "av1_240p": [7, 9, 26], "ultra": [7, 12, 16, 20], "loglevel": 7, "10m": [7, 12], "trigger": 7, "4x4kp60": 7, "4kp6": 7, "out_3840x2160_0": 7, "out_3840x2160_1": 7, "explicitli": [7, 15, 16, 19, 20, 21, 22, 23], "task": 7, "servic": [7, 13, 14, 21, 22, 28], "ama_pipeline_script": [8, 9], "ama_download": [8, 9, 27], "ama_upload": [8, 9, 24, 27], "01_rotate_video": 8, "h264": [8, 9, 10, 11, 12, 15, 23, 26, 27], "xil_rotate_": 8, "02_logo_overlai": 8, "500x100": 8, "right": [8, 11], "left": [8, 11, 27], "corner": [8, 11], "xil_logo_overlai": 8, "03_crop_zoom": 8, "300x200": 8, "begin": 8, "xil_crop_zoom": 8, "04_multi_comp": 8, "4x": [8, 21], "equal": [8, 15, 25], "2x2": [8, 11, 19], "xil_multi_comp": 8, "By": [9, 15, 24, 27], "filesink": [9, 27], "plug": [9, 14, 21], "fakesink": [9, 24], "displai": [9, 21, 23], "avoid": [9, 16, 22], "incorrect": [9, 15], "265": [9, 10, 11, 12, 21], "updat": [9, 13, 18, 22], "h265pars": 9, "h264pars": 9, "breviti": 9, "purpos": 9, "element": [9, 18, 21, 22, 27], "properti": [9, 27], "repeat": [9, 28], "gst": [9, 24, 25], "ama_av1enc": [9, 27], "launch": [9, 24], "filesrc": 9, "parsebin": 9, "ama_h264dec": [9, 27], "capsfilt": [9, 24], "cap": [9, 22, 24, 26], "amamemori": 9, "unpack": [9, 13], "elementari": [9, 10, 11, 12], "byte": [9, 22, 27], "nalu": 9, "rawvideopars": [9, 24], "1920": [9, 12, 15, 24], "1080": [9, 12, 15, 24], "i420": [9, 24, 27], "ama_h264enc": [9, 27], "unformat": 9, "timestamp": [9, 15, 16, 25], "eo": 9, "1200": [9, 24, 26], "ama_scal": [9, 27], "src_0": 9, "ama_h265enc": [9, 24, 27], "6000000": 9, "queue": 9, "src_1": 9, "1280": [9, 12, 15], "2000000": 9, "src_2": 9, "src_3": 9, "360": [9, 12, 15], "240": 9, "decoupl": 9, "sink": 9, "multi": [10, 21, 23], "program": [10, 11, 12, 13, 14, 18, 21, 22, 24], "diagram": [10, 11], "ama_xabrladd": 10, "abrladd": 10, "ladder_output": 10, "feed": [10, 11, 13], "nal": 10, "short": 10, "devidx": 10, "na": [10, 11], "string": [10, 11, 26], "codectyp": 10, "h265": [10, 11, 12, 24, 27], "forcekeyfram": 10, "k": 10, "keyfram": 10, "frequenc": [10, 16], "store": [10, 15], "enough": [10, 15], "720p60": [10, 21], "720p30": [10, 19, 21], "480p30": [10, 21], "360p30": [10, 21], "160p30": [10, 21], "lookahead_en": 10, "exce": [11, 15], "grid": 11, "logo": 11, "lastli": 11, "stamp": 11, "ama_xcompositor": 11, "png": 11, "jpg": 11, "overlai": [11, 19], "4294967295": [11, 27], "5000": [11, 24], "horizont": [11, 21], "fraction": [11, 15], "posit": [11, 26, 27], "doubl": [11, 15, 21], "vertic": [11, 21], "2147483647": [11, 27], "2000": [11, 12], "composit": [11, 16, 23, 26], "along": [11, 21], "video1": 11, "video2": 11, "video3": 11, "video4": 11, "soft": [11, 20], "nativ": 12, "built": 12, "bitstream": [12, 20], "ma35_decoder_app": 12, "codec_opt": 12, "exit": [12, 22], "log_loc": 12, "consol": [12, 25, 28], "syslog": [12, 15, 25, 26], "log_fil": 12, "device_id": 12, "stream_loop": 12, "fmt": 12, "xv15": 12, "n12": 12, "out1": 12, "ma35_encoder_app": 12, "emerg": 12, "alert": 12, "critic": 12, "warn": [12, 13, 20, 22, 25], "debug": [12, 25, 28], "w": [12, 22], "suppli": [12, 20], "5000000": [12, 27], "5000k": 12, "intraperiod": 12, "period": [12, 16, 23, 27], "15": [12, 13, 20, 24, 28], "min_qp": [12, 26], "max_qp": [12, 26], "spatial_aq_gain": [12, 26], "temporal_aq_gain": [12, 26], "control_r": [12, 16, 23, 26], "bf": [12, 26], "force_idr": 12, "main10_intra": 12, "main10": [12, 21], "automat": [12, 15, 21], "enc_hevc_main": 12, "enc_hevc_main_intra": 12, "main_intr": 12, "enc_hevc_main_10": 12, "enc_hevc_main10_intra": 12, "high10": 12, "high10_intra": 12, "enc_h264_baselin": 12, "enc_h264_main": 12, "enc_h264_high": 12, "enc_h264_high_10": 12, "enc_h264_high_10_intra": 12, "21": 12, "41": 12, "13": 12, "42": 12, "52": 12, "tier": [12, 26, 27], "mpsoc": 12, "latency_mod": 12, "consult": [12, 26, 27], "out0": 12, "ma35_scaler_app": 12, "ingest": 12, "scaler_opt": 12, "reduc": [12, 21, 22, 23, 24, 26], "resourc": [12, 16, 20, 21, 26, 27], "720p": [12, 19], "480p": 12, "360p": 12, "240p": 12, "848": [12, 15], "out2": 12, "out3": 12, "288": [12, 15], "160": [12, 15, 20], "out4": 12, "ma35_transcoder_app": 12, "scaler_ma": 12, "num": [12, 15, 16, 24], "push": 12, "faster": [12, 21], "than": [12, 13, 20, 21, 22, 23, 26, 27], "out_1_width": 12, "channel": [12, 21, 22, 23, 24, 26, 27], "out_1_height": 12, "out_1_rat": 12, "out_2_width": 12, "out_2_height": 12, "out_2_rat": 12, "out_3_width": 12, "out_3_height": 12, "out_3_rat": 12, "out_4_width": 12, "out_4_height": 12, "out_4_rat": 12, "out_5_width": 12, "out_5_height": 12, "out_5_rat": 12, "out_6_width": 12, "out_6_height": 12, "out_6_rat": 12, "out_7_width": 12, "out_7_height": 12, "out_7_rat": 12, "out_8_width": 12, "out_8_height": 12, "out_8_rat": 12, "200kbp": 12, "350000000": 12, "68": [12, 21], "aspect_ratio": 12, "aspect": [12, 16], "h264_av1_transcod": 12, "4000k": 12, "abr_ladder1": 12, "3000k": 12, "abr_ladder2": 12, "2500k": 12, "abr_ladder3": 12, "1250k": 12, "abr_ladder4": 12, "bio": [13, 20, 22], "sleep": [13, 20], "clock": [13, 20], "throttl": [13, 20], "aspm": [13, 20, 22], "etc": [13, 18, 20, 22, 23, 28], "4x4": [13, 22], "bifurc": [13, 22], "root": [13, 28], "io": 13, "sr": [13, 28], "iov": [13, 28], "secur": 13, "4g": 13, "ac": [13, 22], "linux": [13, 15], "iommu": [13, 22, 28], "grub": 13, "grub_cmdline_linux_default": 13, "quiet": 13, "splash": 13, "amd_iommu": 13, "pt": [13, 16], "pcie_aspm": [13, 22], "polici": [13, 22], "intel_iommu": 13, "intel": [13, 28], "4gb": 13, "huge": [13, 28], "plu": [13, 28], "extra": [13, 26, 28], "2048": [13, 28], "4192": 13, "echo": [13, 18, 28], "nr_hugepag": [13, 28], "sysctl": [13, 28], "conf": [13, 28], "sum": 13, "instanc": [13, 15, 19, 28], "12gb": [13, 21, 28], "2mb": 13, "36960": 13, "reboot": [13, 22, 28], "proc": 13, "cmdline": [13, 15], "boot_imag": 13, "vmlinuz": [13, 28], "mapper": 13, "vg00": 13, "rootlv": 13, "ro": 13, "meminfo": 13, "grep": [13, 22, 28], "hugepages_tot": 13, "hugepages_fre": 13, "hugepages_rsvd": 13, "hugepages": 13, "kb": [13, 26], "establish": 13, "whether": [13, 16, 24, 27], "lspci": [13, 22, 28], "vvvd": [13, 22], "10ee": [13, 22, 28], "multimedia": [13, 27, 28], "512mb": 13, "ppa": [13, 18, 28], "ubuntu": [13, 20, 28], "apt": [13, 18, 20, 28], "libhugetlbfs0": 13, "libboost": 13, "dpkg": 13, "awk": 13, "purg": 13, "mark": [13, 20], "unhold": 13, "driver": [13, 18, 20, 21, 22, 28], "hold": [13, 21], "desir": [13, 15, 22, 24, 26], "unknown": 13, "statu": [13, 21, 22, 28], "inst": 13, "trig": 13, "await": 13, "pend": 13, "err": 13, "reinst": 13, "uppercas": 13, "bad": 13, "architectur": 13, "ii": [13, 26], "2402121023": 13, "amd64": 13, "supernova": 13, "modprob": [13, 22, 28], "maflash": 13, "ma35d_security_patch": 13, "cold": [13, 20], "systemctl": [13, 28], "poweroff": 13, "asic": 13, "skip": 13, "confirm": [13, 28], "success": 13, "observ": [13, 15, 22, 24], "older": 13, "bash": [13, 15], "learn": [13, 19, 20], "stack": [14, 21], "seamlessli": [14, 21], "densiti": [14, 20, 21, 24, 26, 27], "live": [14, 21], "oem": [14, 21], "content": 14, "deliveri": [14, 21], "network": [14, 21, 23, 28], "cdn": [14, 21], "compil": [14, 15, 21], "ins": [14, 21], "simpl": [14, 21, 26], "offer": [14, 24], "made": [14, 15, 21], "aggreg": [14, 15, 20, 21, 26], "4kp60": [14, 15, 20, 21, 26, 27], "notion": 15, "pool": [15, 16], "central": 15, "within": [15, 24, 26, 27], "vari": [15, 21], "equival": 15, "heterogen": 15, "strictli": 15, "adher": 15, "subscript": [15, 22], "rest": 15, "identifi": [15, 27], "techniqu": 15, "submit": [15, 27], "bound": [15, 27], "rapidli": [15, 27], "easi": [15, 27], "straightforward": [15, 27], "entir": [15, 27], "method": [15, 18, 22], "input1": 15, "ama_transcoder1": 15, "input2": 15, "therebi": 15, "failur": 15, "estim": 15, "percentag": 15, "precis": 15, "mechan": 15, "dispatch": 15, "reli": [15, 28], "homogen": [15, 24, 26], "tail": 15, "var": 15, "jdf": 15, "With": [15, 20, 26], "well": [15, 20], "kei": [15, 18, 21, 24, 25], "pair": [15, 24], "numer": [15, 26, 27], "denomin": 15, "load_factor": 15, "headroom": 15, "num_job_slot": 15, "absenc": 15, "throughput": [15, 20, 24, 26, 27], "describe_job": 15, "example_2_core_encod": 15, "example_fast_preset": 15, "t10_transcode_multiscal": 15, "rendit": [15, 21], "request": 15, "request_id": 15, "testjob": 15, "den": 15, "1600": 15, "900": 15, "1440": 15, "1360": 15, "768": 15, "1024": 15, "960": 15, "540": 15, "352": 15, "jobslot_reserv": 15, "kind": 15, "intend": 15, "xrm_jobreservation_timestamp_jdf": 15, "epoch": 15, "extens": 15, "uniqu": [15, 22], "xrm_reserve_id": 15, "retriev": 15, "dry_run": 15, "addition": [15, 25], "safe": 15, "ill": [15, 24], "syntact": 15, "fail": [15, 20, 22], "jobdescriptionfil": 15, "523634": 15, "6111": 15, "5555": 15, "2777": 15, "dry": 15, "allot": 15, "xrm_jobreservation_79533431_t10_transcode_multiscal": 15, "aliv": 15, "press": 15, "enter": 15, "close": [15, 21], "app": 15, "xrm_reserve_id_": 15, "xrm_reserve_id_0": 15, "xrm_reserve_id_1": 15, "distinct": [15, 28], "xrm_reserve_id_2": 15, "And": 15, "forth": [15, 20], "orchestr": 15, "github": 15, "develop": [15, 18], "tupl": [15, 26], "tjd": 15, "job_descript": 15, "jdf_path": 15, "ffmpeg_cmd": 15, "source1": 15, "job1": 15, "filter_hw_devic": 15, "dev0": 15, "300": [15, 24], "offici": 15, "arbitrari": 15, "source2": 15, "job2": 15, "compon": 15, "relat": [15, 25], "care": [15, 27], "enviro": 15, "xclbin": 15, "particularli": 15, "list_onedevice_cmd": 15, "requestid": 15, "usabl": 15, "load_xrm_plugins_cmd": 15, "loadxrmplugin": 15, "ok": [15, 28], "unload_xrm_plugins_cmd": 15, "unloadxrmplugin": 15, "notabl": 16, "asid": [16, 21], "convent": [16, 26], "vp9": 16, "2d": [16, 19, 20], "ml": [16, 20, 21, 26], "xlnx_hwdev": 16, "dma": [16, 20, 26], "xvbm_convert": 16, "force_key_fram": 16, "lowlat": 16, "splitbuff_mod": 16, "entropy_buffers_count": 16, "entropi": 16, "out_": 16, "_width": 16, "rung": [16, 26], "_height": 16, "_rate": 16, "idx": 16, "delta": 16, "beta": 16, "tc": 16, "lscale": 16, "rc": 16, "pb": 16, "interpol": 16, "buf": 16, "splitbuff": 16, "unsplit": 16, "coef": 16, "coeffici": 16, "firmwar": [18, 20], "conveni": 18, "robust": 18, "client": [18, 28], "remot": 18, "wget": 18, "qo": 18, "http": [18, 26, 27], "www": [18, 26], "com": 18, "2018": 18, "master": [18, 21], "sign": 18, "asc": 18, "deb": 18, "trust": 18, "ye": 18, "artifactori": 18, "debian": 18, "lsb_releas": 18, "tee": [18, 28], "enhanc": [19, 20, 24, 26, 27], "propos": 19, "product": 19, "matur": 19, "qualifi": 19, "processor": 19, "2d_ama": 19, "cascad": 19, "machin": [19, 20, 28], "landscap": [19, 21], "limit": [19, 24, 26, 27], "180": 19, "graphic": [19, 20, 28], "degre": 19, "rgb": [19, 27], "bgra": [19, 27], "csc": 19, "rgb2yuv": 19, "rgba": [19, 27], "planar": 19, "rgbp": [19, 26], "yuv422p": 19, "core_id": 19, "1000": 19, "layout": 19, "independ": [19, 24], "def": 19, "ori": 19, "model_arg": 19, "mlop": 19, "roi_scale_ama": 19, "res1": 19, "300k": 19, "infer": 19, "abil": [19, 24], "mlip": 19, "roi_map_typ": 19, "rso": 19, "roi_overlay_ama": 19, "transpar": 19, "rectangular": 19, "box": 19, "200k": 19, "workaround": [20, 22], "our": 20, "n5": [20, 22], "autom": 20, "balanc": 20, "collect": 20, "04": [20, 28], "kvm": 20, "dual": 20, "approxim": 20, "hlg": 20, "effici": [20, 21, 27, 28], "toolchain": [20, 28], "latency_m": [20, 26], "convers": [20, 26, 27], "rotat": [20, 24], "subsampl": 20, "face": 20, "text": 20, "fine": 20, "prefer": 20, "pf": [20, 22, 28], "bar0": 20, "mb": [20, 26], "bar2": 20, "64": [20, 21, 22, 26], "bar4": 20, "512": 20, "match": [20, 21], "share": 20, "server": [20, 28], "scalabl": 20, "interlac": 20, "divis": 20, "transport": [20, 26], "mpeg": [20, 21], "t": [20, 28], "400": 20, "4kp120": [20, 26], "matrix": [20, 23], "8k": 20, "secondari": 20, "bu": [20, 28], "sbr": 20, "caus": 20, "hang": [20, 22], "restor": 20, "ama_av1dec": [20, 27], "ivf": [20, 22], "ivfpars": 20, "demux": 20, "mautil": 20, "crash": [20, 22], "invok": 20, "hl": [20, 22], "playback": 20, "slower": [20, 22], "ffplai": [20, 22], "recent": [20, 22], "2n6": 20, "player": [20, 22, 27], "vlc": [20, 22], "v3": [20, 22], "17": [20, 22], "mux": [20, 22], "permit": [20, 22], "1080p30": [20, 21], "strict": [20, 23, 26], "complianc": 20, "checker": [20, 28], "downgrad": 20, "ga1": 20, "desktop": 20, "warm": 20, "attempt": [20, 22], "minut": [20, 22], "satellit": [20, 22], "boost": 20, "link": [20, 21, 27], "offload": 21, "intens": 21, "workload": 21, "popular": 21, "experi": 21, "suit": 21, "fed": 21, "turn": [21, 22, 24], "special": [21, 23], "gpu": 21, "vcu": 21, "ycbcr": 21, "iso": [21, 28], "itu": 21, "constrain": [21, 22, 27], "aom": 21, "aomedia": 21, "128x128": 21, "3840x2160": [21, 26], "8x": 21, "driven": 21, "flexibl": 21, "hdr": 21, "popul": 21, "volum": 21, "light": 21, "charaterist": 21, "st2094_10": 21, "dolbyvis": 21, "st2094_40": 21, "samsung": 21, "mdcv": 21, "cll": 21, "atc": 21, "sequenc": 21, "persist": 21, "constraint": [21, 23, 26], "ts_103572v010101p": 21, "pdf": 21, "whenev": 21, "a341s34": 21, "582r4": 21, "a341": 21, "amend": 21, "2094": 21, "distribut": 21, "condit": [21, 22], "downscal": 21, "smaller": 21, "pyramid": 21, "tap": 21, "stage": 21, "polyphas": 21, "phase": 21, "luma": 21, "chroma": 21, "nomin": 21, "wherea": [21, 26], "har": 21, "few": 21, "definit": 21, "linearli": 21, "hyper": 21, "meet": [21, 26], "increment": 21, "met": 21, "thing": 21, "4x1080p60": 21, "1x1080p240": 21, "latter": 21, "vod": 21, "asset": 21, "540p30": 21, "ftrt": 21, "explicit": [21, 26], "4kp30": 21, "136": 21, "1440p60": 21, "1440p30": 21, "540p60": 21, "2160p60": 21, "240p30": 21, "144p30": 21, "2160p30": 21, "bifur": 22, "xxxxx": 22, "devicealloc": 22, "pressur": 22, "obviou": 22, "resolv": 22, "plai": 22, "off": [22, 23, 24, 27, 28], "videor": 22, "encount": 22, "bitdepth": 22, "30fp": 22, "26": 22, "60fp": 22, "greater": 22, "unavail": 22, "mamgmt": [22, 28], "rmmod": 22, "reload": 22, "dmesg": 22, "323": 22, "436842": 22, "05": [22, 23], "hdma": 22, "hdma_link_rc2ep_xf": 22, "0x1": 22, "440802": 22, "rc2ep": 22, "element_cnt": 22, "link_table_pa": 22, "0x160000": 22, "443387": 22, "ctl": 22, "0x01": 22, "0x4": 22, "0x2": 22, "sl": 22, "0x97e00000": 22, "dh": 22, "0x0": 22, "dl": 22, "0x20831000": 22, "445538": 22, "0x06": 22, "rsv": 22, "llp_h": 22, "llp_l": 22, "447257": 22, "0x500": 22, "io_page_fault": 22, "mi": 22, "could": 22, "iommu_group": 22, "sort": 22, "associ": [22, 24, 28], "34": 22, "lnkcap": 22, "x4": 22, "l1": 22, "64u": 22, "clockpm": 22, "surpris": 22, "llactrep": 22, "bwnot": 22, "aspmoptcomp": 22, "lnkctl": 22, "rcb": 22, "commclk": 22, "appear": 22, "e2": 22, "pl": 22, "trade": 23, "delai": [23, 24], "gop": [23, 26, 27], "understood": [23, 24], "come": [23, 24], "cost": 23, "optim": [23, 24, 26, 27], "compromis": 23, "let": 23, "unaccept": 23, "alwai": 23, "overal": 23, "bufsiz": [23, 26], "relax": [23, 26], "transmiss": 23, "restrict": [23, 26], "variat": 23, "expens": [23, 24], "larger": [23, 26], "Such": 23, "hevc_to_scale_to_h264": 23, "2023": [23, 28], "27": 23, "028958": 23, "24": 23, "152": 23, "79": 23, "157": 23, "194255": 23, "151": 23, "165": 23, "q": 23, "12m": 23, "lsize": 23, "189kb": 23, "83": 23, "1858": 23, "8kbit": 23, "27x": 23, "th": 23, "primarili": 24, "pertain": 24, "concept": 24, "signific": 24, "analysi": 24, "score": 24, "necessarili": 24, "spent": 24, "dure": [24, 28], "motion": 24, "vector": 24, "search": 24, "rdoq": 24, "term": 24, "bd": 24, "hierarch": 24, "unidirect": 24, "anchor": 24, "flavor": 24, "stai": 24, "stat": 24, "emploi": 24, "concern": 24, "runtim": 24, "segment": 24, "int_max": 24, "min": [24, 27], "consider": 24, "game": 24, "camera": 24, "pan": 24, "talk": 24, "head": 24, "conferenc": 24, "exact": 24, "config": 24, "initil": 24, "compli": 24, "unexpect": 24, "dynamic_params_fil": [24, 26], "framenumbern1": 24, "key1": 24, "value1": 24, "framenumbern2": 24, "key2": 24, "value2": 24, "key3": 24, "value3": 24, "numb": 24, "brkbp": 24, "taq": 24, "taqgain": 24, "saq": 24, "saqgain": 24, "testsrc": 24, "durat": [24, 26], "6000": 24, "1800": 24, "2400": 24, "10000": 24, "fakesrc": 24, "sizetyp": 24, "sizemax": 24, "4147200": 24, "4000": 24, "param1": 24, "ul": 25, "aim": 25, "three": 25, "environment": 25, "global": [25, 26], "destin": 25, "narrow": 25, "release_preset": 25, "debug_preset": 25, "async": 25, "max_siz": 25, "10mb": 25, "log_ama_": 25, "pid": 25, "localhost": 25, "facil": 25, "local0": 25, "shortcut": 25, "perf_log": 25, "debug_file_nam": 25, "debug_thread": 25, "debug_pid": 25, "debug_time_stamp": 25, "1gb": 25, "asynchron": 25, "fatal": 25, "trace": 25, "otherwis": [25, 28], "debug_file_lin": 25, "inclus": 25, "accel": 25, "vpi": 25, "gen": 25, "log_ama": 25, "100mb": 25, "want": [25, 26], "log_ama_perf": 25, "wide": [26, 27], "encapsul": 26, "extract": 26, "n4": 26, "scope": [26, 27], "exhaust": [26, 27], "onlin": [26, 27], "org": [26, 27], "html": 26, "howto": 26, "infil": 26, "1000k": 26, "uri": 26, "hz": 26, "transact": [26, 27], "roman": 26, "p010le": 26, "packed10": 26, "max_bitr": 26, "5e": 26, "unspecifi": 26, "uint32_max": 26, "vbv": 26, "400m": 26, "unless": 26, "impos": 26, "control_mod": 26, "treat": 26, "72": 26, "relative_load": 26, "const_qp": 26, "vsync": 26, "prevent": 26, "4kp75": [26, 27], "dynamic_gop": 26, "empti": [26, 27, 28], "176x144": 26, "144x176": 26, "720x720": 26, "millisecond": [26, 27], "60000": [26, 27], "bll": 26, "fals": [26, 27], "complex": [26, 27], "wxh": 26, "perf": 26, "enable_pipelin": 26, "worth": 26, "av": 26, "introductori": 26, "workflow": 27, "editor": 27, "broadcast": 27, "freedesktop": 27, "ama_h265dec": 27, "ama_hevcdec": 27, "obu": 27, "One": 27, "nv12_4l4": 27, "nv12_10le_4l4": 27, "i420_10l": 27, "i420_10b": 27, "argb": 27, "abgr": 27, "bgr": 27, "boolean": 27, "nv12_10le32": 27, "consecut": 27, "enum": 27, "true": 27, "distanc": 27, "interv": 27, "analyz": 27, "account": 27, "35000000000": 27, "temporal": 27, "vma": 27, "resiz": 27, "area": 27, "unnecessari": 27, "upstream": 27, "larg": 27, "insuffici": 27, "isol": 28, "technologi": 28, "qemu": 28, "libvirt": 28, "bridg": 28, "virt": 28, "lscpu": 28, "doesn": 28, "sbin": 28, "dbdf": 28, "corpor": 28, "5070": 28, "03": 28, "lsmod": 28, "831488": 28, "sriov_numvf": 28, "5071": 28, "physic": 28, "creation": 28, "libvirtd": 28, "lib": 28, "systemd": 28, "wed": 28, "06": 28, "07": 28, "09": 28, "pdt": 28, "7h": 28, "ago": 28, "focal": 28, "fossa": 28, "instanti": 28, "12288": 28, "vcpu": 28, "q35": 28, "qcow2": 28, "variant": 28, "ubuntu20": 28, "pty": 28, "target_typ": 28, "serial": 28, "arg": 28, "ttys0": 28, "casper": 28, "initrd": 28, "apic": 28, "ioapic": 28, "intremap": 28, "eim": 28, "caching_mod": 28, "memoryback": 28, "hugepag": 28, "nosharepag": 28, "lock": 28, "hostdev": 28, "xx": 28, "vfio": 28, "storag": 28, "virsh": 28, "edit": 28, "kib": 28, "acpi": 28, "vmport": 28, "rng": 28, "ssh": 28, "connect": 28, "openssh": 28, "address": 28, "net": 28, "dhcp": 28, "leas": 28, "6gb": 28, "3072": 28, "3168": 28, "dkm": 28, "gcc": 28, "essenti": 28}, "objects": {"": [[0, 0, 1, "c.XmaDataBuffer", "XmaDataBuffer"], [0, 0, 1, "c.XmaDecoderProperties", "XmaDecoderProperties"], [0, 0, 1, "c.XmaEncoderProperties", "XmaEncoderProperties"], [0, 0, 1, "c.XmaFilterPortProperties", "XmaFilterPortProperties"], [0, 0, 1, "c.XmaFilterProperties", "XmaFilterProperties"], [0, 0, 1, "c.XmaFrame", "XmaFrame"], [0, 0, 1, "c.XmaFrameProperties", "XmaFrameProperties"], [0, 0, 1, "c.XmaParameter", "XmaParameter"], [0, 0, 1, "c.XmaScalerInOutProperties", "XmaScalerInOutProperties"], [0, 0, 1, "c.XmaScalerProperties", "XmaScalerProperties"], [0, 1, 1, "c.xma_data_buffer_alloc", "xma_data_buffer_alloc"], [0, 1, 1, "c.xma_data_buffer_free", "xma_data_buffer_free"], [0, 1, 1, "c.xma_data_from_buffer_clone", "xma_data_from_buffer_clone"], [0, 1, 1, "c.xma_dec_session_create", "xma_dec_session_create"], [0, 1, 1, "c.xma_dec_session_destroy", "xma_dec_session_destroy"], [0, 1, 1, "c.xma_dec_session_get_properties", "xma_dec_session_get_properties"], [0, 1, 1, "c.xma_dec_session_recv_frame", "xma_dec_session_recv_frame"], [0, 1, 1, "c.xma_dec_session_send_data", "xma_dec_session_send_data"], [0, 1, 1, "c.xma_dec_session_set_log", "xma_dec_session_set_log"], [0, 1, 1, "c.xma_enc_session_create", "xma_enc_session_create"], [0, 1, 1, "c.xma_enc_session_destroy", "xma_enc_session_destroy"], [0, 1, 1, "c.xma_enc_session_recv_data", "xma_enc_session_recv_data"], [0, 1, 1, "c.xma_enc_session_send_frame", "xma_enc_session_send_frame"], [0, 1, 1, "c.xma_enc_session_set_log", "xma_enc_session_set_log"], [0, 1, 1, "c.xma_filter_session_create", "xma_filter_session_create"], [0, 1, 1, "c.xma_filter_session_destroy", "xma_filter_session_destroy"], [0, 1, 1, "c.xma_filter_session_recv_frame", "xma_filter_session_recv_frame"], [0, 1, 1, "c.xma_filter_session_send_frame", "xma_filter_session_send_frame"], [0, 1, 1, "c.xma_filter_session_set_log", "xma_filter_session_set_log"], [0, 1, 1, "c.xma_frame_alloc", "xma_frame_alloc"], [0, 1, 1, "c.xma_frame_clone", "xma_frame_clone"], [0, 1, 1, "c.xma_frame_dec_ref", "xma_frame_dec_ref"], [0, 1, 1, "c.xma_frame_free", "xma_frame_free"], [0, 1, 1, "c.xma_frame_from_buffers_clone", "xma_frame_from_buffers_clone"], [0, 1, 1, "c.xma_frame_get_plane_height", "xma_frame_get_plane_height"], [0, 1, 1, "c.xma_frame_get_plane_size", "xma_frame_get_plane_size"], [0, 1, 1, "c.xma_frame_get_plane_stride", "xma_frame_get_plane_stride"], [0, 1, 1, "c.xma_frame_inc_ref", "xma_frame_inc_ref"], [0, 1, 1, "c.xma_frame_planes_get", "xma_frame_planes_get"], [0, 1, 1, "c.xma_initialize", "xma_initialize"], [0, 1, 1, "c.xma_log_init", "xma_log_init"], [0, 1, 1, "c.xma_log_release", "xma_log_release"], [0, 1, 1, "c.xma_logmsg", "xma_logmsg"], [0, 1, 1, "c.xma_release", "xma_release"], [0, 1, 1, "c.xma_scaler_session_create", "xma_scaler_session_create"], [0, 1, 1, "c.xma_scaler_session_destroy", "xma_scaler_session_destroy"], [0, 1, 1, "c.xma_scaler_session_recv_frame_list", "xma_scaler_session_recv_frame_list"], [0, 1, 1, "c.xma_scaler_session_send_frame", "xma_scaler_session_send_frame"], [0, 1, 1, "c.xrm_dec_release", "xrm_dec_release"], [0, 1, 1, "c.xrm_dec_reserve", "xrm_dec_reserve"], [0, 1, 1, "c.xrm_enc_release", "xrm_enc_release"], [0, 1, 1, "c.xrm_enc_reserve", "xrm_enc_reserve"], [0, 1, 1, "c.xrm_scale_release", "xrm_scale_release"], [0, 1, 1, "c.xrm_scale_reserve", "xrm_scale_reserve"], [10, 3, 1, "cmdoption-codectype", "--codectype"], [10, 3, 1, "cmdoption-devidx", "--devidx"], [10, 3, 1, "cmdoption-file", "--file"], [10, 3, 1, "cmdoption-forcekeyframe", "--forcekeyframe"], [10, 3, 1, "cmdoption-json", "--json"], [26, 3, 1, "cmdoption-b-v", "-b:v"], [26, 3, 1, "cmdoption-bf", "-bf"], [26, 3, 1, "cmdoption-bufsize", "-bufsize"], [10, 3, 1, "cmdoption-c", "-c"], [26, 3, 1, "cmdoption-c-v", "-c:v"], [26, 3, 1, "cmdoption-control_rate", "-control_rate"], [26, 3, 1, "cmdoption-cores", "-cores"], [26, 3, 1, "cmdoption-crf", "-crf"], [26, 3, 1, "cmdoption-dynamic_gop", "-dynamic_gop"], [26, 3, 1, "cmdoption-dynamic_params_file", "-dynamic_params_file"], [26, 3, 1, "cmdoption-enable_pipeline", "-enable_pipeline"], [26, 3, 1, "cmdoption-expert_option", "-expert_option"], [10, 3, 1, "cmdoption-f", "-f"], [26, 3, 1, "cmdoption-filter_complex", "-filter_complex"], [26, 3, 1, "cmdoption-forced_idr", "-forced_idr"], [26, 3, 1, "cmdoption-g", "-g"], [26, 3, 1, "cmdoption-hwaccel", "-hwaccel"], [10, 3, 1, "cmdoption-i", "-i"], [10, 3, 1, "cmdoption-j", "-j"], [10, 3, 1, "cmdoption-k", "-k"], [26, 3, 1, "cmdoption-latency_logging", "-latency_logging"], [26, 3, 1, "cmdoption-latency_ms", "-latency_ms"], [26, 3, 1, "cmdoption-level", "-level"], [26, 3, 1, "cmdoption-lookahead_depth", "-lookahead_depth"], [26, 3, 1, "cmdoption-low_latency", "-low_latency"], [26, 3, 1, "cmdoption-max_bitrate", "-max_bitrate"], [26, 3, 1, "cmdoption-max_qp", "-max_qp"], [26, 3, 1, "cmdoption-min_qp", "-min_qp"], [26, 3, 1, "cmdoption-out_fmt", "-out_fmt"], [26, 3, 1, "cmdoption-out_res", "-out_res"], [26, 3, 1, "cmdoption-outputs", "-outputs"], [26, 3, 1, "cmdoption-perf", "-perf"], [26, 3, 1, "cmdoption-preset", "-preset"], [26, 3, 1, "cmdoption-profile", "-profile"], [26, 3, 1, "cmdoption-qp", "-qp"], [26, 3, 1, "cmdoption-qp_mode", "-qp_mode"], [26, 3, 1, "cmdoption-r", "-r"], [26, 3, 1, "cmdoption-s", "-s"], [26, 3, 1, "cmdoption-slice", "-slice"], [26, 3, 1, "cmdoption-spatial_aq", "-spatial_aq"], [26, 3, 1, "cmdoption-spatial_aq_gain", "-spatial_aq_gain"], [26, 3, 1, "cmdoption-temporal_aq", "-temporal_aq"], [26, 3, 1, "cmdoption-temporal_aq_gain", "-temporal_aq_gain"], [26, 3, 1, "cmdoption-tier", "-tier"], [26, 3, 1, "cmdoption-tune_metrics", "-tune_metrics"], [26, 3, 1, "cmdoption-type", "-type"], [26, 3, 1, "cmdoption-vf", "-vf"], [26, 3, 1, "cmdoption-vsync", "-vsync"], [27, 3, 1, "cmdoption-arg-b-frames", "b-frames"], [27, 3, 1, "cmdoption-arg-bitrate", "bitrate"], [27, 3, 1, "cmdoption-arg-crf", "crf"], [27, 3, 1, "cmdoption-arg-crop", "crop"], [27, 3, 1, "cmdoption-arg-crop-height", "crop-height"], [27, 3, 1, "cmdoption-arg-crop-left", "crop-left"], [27, 3, 1, "cmdoption-arg-crop-top", "crop-top"], [27, 3, 1, "cmdoption-arg-crop-width", "crop-width"], [27, 3, 1, "cmdoption-arg-device", "device"], [27, 3, 1, "cmdoption-arg-device-type", "device-type"], [27, 3, 1, "cmdoption-arg-encoding-params-file", "encoding-params-file"], [27, 3, 1, "cmdoption-arg-forced-idr", "forced-idr"], [27, 3, 1, "cmdoption-arg-gop-length", "gop-length"], [27, 3, 1, "cmdoption-arg-idr-interval", "idr-interval"], [27, 3, 1, "cmdoption-arg-latency-ms", "latency-ms"], [27, 3, 1, "cmdoption-arg-lookahead-depth", "lookahead-depth"], [27, 3, 1, "cmdoption-arg-low-latency", "low-latency"], [27, 3, 1, "cmdoption-arg-max-bitrate", "max-bitrate"], [27, 3, 1, "cmdoption-arg-max-qp", "max-qp"], [27, 3, 1, "cmdoption-arg-min-qp", "min-qp"], [27, 3, 1, "cmdoption-arg-preset", "preset"], [27, 3, 1, "cmdoption-arg-qp", "qp"], [27, 3, 1, "cmdoption-arg-qp-mode", "qp-mode"], [27, 3, 1, "cmdoption-arg-rate-control", "rate-control"], [26, 3, 1, "cmdoption-arg-scaler_ama", "scaler_ama"], [27, 3, 1, "cmdoption-arg-slice", "slice"], [27, 3, 1, "cmdoption-arg-spatial-aq", "spatial-aq"], [27, 3, 1, "cmdoption-arg-spatial-aq-gain", "spatial-aq-gain"], [27, 3, 1, "cmdoption-arg-temporal-aq-gain", "temporal-aq-gain"], [27, 3, 1, "cmdoption-arg-temporall-aq", "temporall-aq"], [27, 3, 1, "cmdoption-arg-tier", "tier"], [27, 3, 1, "cmdoption-arg-tune-metrics", "tune-metrics"]], "xma_data_buffer_alloc": [[0, 2, 1, "c.xma_data_buffer_alloc", "dummy"], [0, 2, 1, "c.xma_data_buffer_alloc", "handle"], [0, 2, 1, "c.xma_data_buffer_alloc", "size"]], "xma_data_buffer_free": [[0, 2, 1, "c.xma_data_buffer_free", "data"]], "xma_data_from_buffer_clone": [[0, 2, 1, "c.xma_data_from_buffer_clone", "data"], [0, 2, 1, "c.xma_data_from_buffer_clone", "free_callback"], [0, 2, 1, "c.xma_data_from_buffer_clone", "handle"], [0, 2, 1, "c.xma_data_from_buffer_clone", "opaque"], [0, 2, 1, "c.xma_data_from_buffer_clone", "size"]], "xma_dec_session_create": [[0, 2, 1, "c.xma_dec_session_create", "dec_props"]], "xma_dec_session_destroy": [[0, 2, 1, "c.xma_dec_session_destroy", "session"]], "xma_dec_session_get_properties": [[0, 2, 1, "c.xma_dec_session_get_properties", "dec_session"], [0, 2, 1, "c.xma_dec_session_get_properties", "fprops"]], "xma_dec_session_recv_frame": [[0, 2, 1, "c.xma_dec_session_recv_frame", "frame"], [0, 2, 1, "c.xma_dec_session_recv_frame", "session"]], "xma_dec_session_send_data": [[0, 2, 1, "c.xma_dec_session_send_data", "data"], [0, 2, 1, "c.xma_dec_session_send_data", "data_used"], [0, 2, 1, "c.xma_dec_session_send_data", "session"]], "xma_dec_session_set_log": [[0, 2, 1, "c.xma_dec_session_set_log", "handle"], [0, 2, 1, "c.xma_dec_session_set_log", "session"]], "xma_enc_session_create": [[0, 2, 1, "c.xma_enc_session_create", "enc_props"]], "xma_enc_session_destroy": [[0, 2, 1, "c.xma_enc_session_destroy", "session"]], "xma_enc_session_recv_data": [[0, 2, 1, "c.xma_enc_session_recv_data", "data"], [0, 2, 1, "c.xma_enc_session_recv_data", "data_size"], [0, 2, 1, "c.xma_enc_session_recv_data", "session"]], "xma_enc_session_send_frame": [[0, 2, 1, "c.xma_enc_session_send_frame", "frame"], [0, 2, 1, "c.xma_enc_session_send_frame", "session"]], "xma_enc_session_set_log": [[0, 2, 1, "c.xma_enc_session_set_log", "handle"], [0, 2, 1, "c.xma_enc_session_set_log", "session"]], "xma_filter_session_create": [[0, 2, 1, "c.xma_filter_session_create", "props"]], "xma_filter_session_destroy": [[0, 2, 1, "c.xma_filter_session_destroy", "session"]], "xma_filter_session_recv_frame": [[0, 2, 1, "c.xma_filter_session_recv_frame", "frame"], [0, 2, 1, "c.xma_filter_session_recv_frame", "session"]], "xma_filter_session_send_frame": [[0, 2, 1, "c.xma_filter_session_send_frame", "frame"], [0, 2, 1, "c.xma_filter_session_send_frame", "session"]], "xma_filter_session_set_log": [[0, 2, 1, "c.xma_filter_session_set_log", "handle"], [0, 2, 1, "c.xma_filter_session_set_log", "session"]], "xma_frame_alloc": [[0, 2, 1, "c.xma_frame_alloc", "dummy"], [0, 2, 1, "c.xma_frame_alloc", "frame_props"], [0, 2, 1, "c.xma_frame_alloc", "handle"]], "xma_frame_clone": [[0, 2, 1, "c.xma_frame_clone", "handle"], [0, 2, 1, "c.xma_frame_clone", "xma_frame"]], "xma_frame_dec_ref": [[0, 2, 1, "c.xma_frame_dec_ref", "frame"]], "xma_frame_free": [[0, 2, 1, "c.xma_frame_free", "frame"]], "xma_frame_from_buffers_clone": [[0, 2, 1, "c.xma_frame_from_buffers_clone", "frame_data"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "frame_props"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "free_callback"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "handle"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "opaque"]], "xma_frame_get_plane_height": [[0, 2, 1, "c.xma_frame_get_plane_height", "frame_props"], [0, 2, 1, "c.xma_frame_get_plane_height", "handle"], [0, 2, 1, "c.xma_frame_get_plane_height", "plane"]], "xma_frame_get_plane_size": [[0, 2, 1, "c.xma_frame_get_plane_size", "frame_props"], [0, 2, 1, "c.xma_frame_get_plane_size", "handle"], [0, 2, 1, "c.xma_frame_get_plane_size", "plane"]], "xma_frame_get_plane_stride": [[0, 2, 1, "c.xma_frame_get_plane_stride", "frame_props"], [0, 2, 1, "c.xma_frame_get_plane_stride", "handle"], [0, 2, 1, "c.xma_frame_get_plane_stride", "plane"]], "xma_frame_inc_ref": [[0, 2, 1, "c.xma_frame_inc_ref", "frame"]], "xma_frame_planes_get": [[0, 2, 1, "c.xma_frame_planes_get", "frame_props"], [0, 2, 1, "c.xma_frame_planes_get", "handle"]], "xma_initialize": [[0, 2, 1, "c.xma_initialize", "handle"], [0, 2, 1, "c.xma_initialize", "init_params"], [0, 2, 1, "c.xma_initialize", "log"]], "xma_log_init": [[0, 2, 1, "c.xma_log_init", "handle"], [0, 2, 1, "c.xma_log_init", "log_level"], [0, 2, 1, "c.xma_log_init", "log_type"]], "xma_log_release": [[0, 2, 1, "c.xma_log_release", "handle"]], "xma_logmsg": [[0, 2, 1, "c.xma_logmsg", "handle"], [0, 2, 1, "c.xma_logmsg", "level"], [0, 2, 1, "c.xma_logmsg", "msg"], [0, 2, 1, "c.xma_logmsg", "name"]], "xma_release": [[0, 2, 1, "c.xma_release", "handle"]], "xma_scaler_session_create": [[0, 2, 1, "c.xma_scaler_session_create", "props"]], "xma_scaler_session_destroy": [[0, 2, 1, "c.xma_scaler_session_destroy", "session"]], "xma_scaler_session_recv_frame_list": [[0, 2, 1, "c.xma_scaler_session_recv_frame_list", "frame_list"], [0, 2, 1, "c.xma_scaler_session_recv_frame_list", "session"]], "xma_scaler_session_send_frame": [[0, 2, 1, "c.xma_scaler_session_send_frame", "frame"], [0, 2, 1, "c.xma_scaler_session_send_frame", "session"]], "xrm_dec_release": [[0, 2, 1, "c.xrm_dec_release", "xrm_dec_ctx"]], "xrm_dec_reserve": [[0, 2, 1, "c.xrm_dec_reserve", "dev_index"], [0, 2, 1, "c.xrm_dec_reserve", "xrm_dec_ctx"], [0, 2, 1, "c.xrm_dec_reserve", "xrm_props"]], "xrm_enc_release": [[0, 2, 1, "c.xrm_enc_release", "xrm_enc_ctx"]], "xrm_enc_reserve": [[0, 2, 1, "c.xrm_enc_reserve", "dev_index"], [0, 2, 1, "c.xrm_enc_reserve", "is_ull"], [0, 2, 1, "c.xrm_enc_reserve", "is_xav1"], [0, 2, 1, "c.xrm_enc_reserve", "slice_id"], [0, 2, 1, "c.xrm_enc_reserve", "xrm_enc_ctx"], [0, 2, 1, "c.xrm_enc_reserve", "xrm_props"]], "xrm_scale_release": [[0, 2, 1, "c.xrm_scale_release", "scaler_xrm_ctx"]], "xrm_scale_reserve": [[0, 2, 1, "c.xrm_scale_reserve", "dev_index"], [0, 2, 1, "c.xrm_scale_reserve", "input_props"], [0, 2, 1, "c.xrm_scale_reserve", "num_outputs"], [0, 2, 1, "c.xrm_scale_reserve", "output_props"], [0, 2, 1, "c.xrm_scale_reserve", "scaler_xrm_ctx"]]}, "objtypes": {"0": "c:struct", "1": "c:function", "2": "c:functionParam", "3": "std:cmdoption"}, "objnames": {"0": ["c", "struct", "C struct"], "1": ["c", "function", "C function"], "2": ["c", "functionParam", "C function parameter"], "3": ["std", "cmdoption", "program option"]}, "titleterms": {"c": [0, 15], "api": [0, 16], "program": [0, 1, 15], "guid": [0, 15], "tabl": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "content": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "overview": [0, 1, 19, 20, 22, 27, 28], "gener": [0, 15, 26], "applic": [0, 10, 11, 15, 27], "develop": 0, "resourc": [0, 1, 15], "initi": 0, "alloc": 0, "session": 0, "creation": 0, "runtim": [0, 13], "process": [0, 19], "cleanup": 0, "compil": 0, "link": [0, 14], "amd": [0, 6, 12, 13, 14, 20, 21, 22, 26], "ama": [0, 6, 12, 13, 14, 20, 21, 22, 26], "video": [0, 5, 6, 8, 12, 13, 15, 19, 21, 24, 26], "sdk": [0, 6, 12, 13, 21, 26], "plugin": [0, 15, 27], "common": 0, "xma": [0, 12], "data": [0, 27], "structur": 0, "refer": [0, 15], "log": [0, 25], "interfac": [0, 15], "buffer": 0, "frame": [0, 22], "1": [0, 2], "0": 0, "decod": [0, 5, 7, 9, 12, 23, 26, 27], "properti": 0, "scaler": [0, 12, 21, 26, 27], "encod": [0, 2, 4, 7, 9, 12, 22, 23, 24, 26, 27], "filter": [0, 5, 8, 26], "ultra": [0, 6, 23], "low": [0, 6, 7, 23], "latenc": [0, 6, 23, 24], "consider": [0, 16], "mode": [0, 7, 23], "sideband": 0, "multithread": 0, "upgrad": [0, 20], "xrm": [0, 15], "reserv": [0, 15], "build": 0, "sampl": [0, 12], "exampl": [0, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 25, 26, 27], "card": [1, 13, 21, 22], "manag": [1, 15], "mautil": 1, "maflash": 1, "mamgmt": 1, "print_ma35_load": [1, 15], "xrmadm": 1, "xrmd": [1, 7], "devic": [1, 15, 22, 27], "identifi": 1, "dbdf": 1, "bu": 1, "id": [1, 15], "firmwar": [1, 13], "version": [1, 20], "number": [1, 21], "check": [1, 13, 15], "system": [1, 10, 11, 15], "statu": [1, 15], "configur": [1, 18, 23], "util": 1, "compat": 2, "matrix": 2, "avc": [2, 6], "hevc": 2, "av1": [2, 6, 22, 24], "type": [2, 24], "2": [2, 7], "tutori": [3, 4, 7, 9], "amf": 4, "ffmpeg": [5, 7, 15, 16, 23, 26], "us": [5, 8, 15, 26, 27], "softwar": [5, 8, 15, 16], "environ": [5, 6, 7, 8, 9, 12, 13], "setup": [5, 6, 7, 8, 9, 12, 13, 15], "rotat": [5, 8, 19], "logo": [5, 8], "overlai": [5, 8], "crop": [5, 8], "shift": 5, "composit": [5, 8, 24], "chroma": [5, 19], "subsampl": [5, 19], "de": 5, "interlac": 5, "qualiti": [6, 7, 21, 24], "introduct": [6, 10, 11, 15, 26, 27], "optim": 6, "set": [6, 13], "tune": [6, 23, 24], "paramet": [6, 24, 27], "vmaf": 6, "normal": 6, "medium": 6, "preset": [6, 24], "slow": [6, 22], "run": [6, 13], "psnr": 6, "ssim": 6, "score": 6, "simpl": [7, 9], "onli": [7, 9], "4": 7, "10": [7, 21], "bit": [7, 21, 22], "convers": [7, 19], "constant": 7, "rate": [7, 22], "factor": 7, "crf": 7, "high": 7, "basic": 7, "transcod": [7, 9, 12, 15, 21], "Into": 7, "multipl": [7, 9, 27], "resolut": [7, 9], "output": [7, 9, 27], "ull": [7, 23], "doubl": 7, "densiti": [7, 22], "without": 7, "gstreamer": [8, 9, 10, 11, 16, 22, 27], "zoom": 8, "introductori": 9, "abr": [10, 21], "ladder": [10, 21], "host": [10, 11, 28], "requir": [10, 11, 15, 20], "usag": [10, 11, 12, 22], "compositor": 11, "app": 12, "test": 12, "instruct": 12, "command": [12, 15, 26], "get": 13, "start": 13, "premis": 13, "chassi": 13, "instal": 13, "flash": [13, 22], "verif": 13, "up": [13, 27], "your": 13, "first": 13, "advanc": [14, 20, 22], "media": [14, 20, 22], "acceler": [14, 15, 19, 20, 22], "quick": 14, "comput": 15, "assign": [15, 22], "job": [15, 21], "specif": 15, "explicit": 15, "manual": 15, "load": [15, 27], "insuffici": 15, "autom": 15, "descript": [15, 18], "The": [15, 21], "slot": 15, "tool": 15, "singl": [15, 22], "per": [15, 21, 22], "launch": 15, "launcher": 15, "line": 15, "report": 15, "unload": 15, "migrat": 16, "chang": 16, "from": [16, 20], "alveo": 16, "u30": 16, "distribut": [18, 20], "packag": 18, "feed": 18, "ubuntu": 18, "new": 19, "featur": [19, 20, 21], "preview": [19, 20], "color": [19, 21], "space": 19, "pictur": 19, "In": 19, "pip": 19, "tile": 19, "ml": 19, "region": 19, "Of": 19, "interest": 19, "roi": 19, "base": 19, "face": 19, "detect": 19, "text": 19, "releas": 20, "note": 20, "thi": 20, "support": 20, "kernel": 20, "known": 20, "limit": 20, "issu": [20, 22], "previou": 20, "spec": 21, "ma35d": 21, "codec": [21, 22], "unit": 21, "adapt": 21, "bitrat": 21, "perform": 21, "8": 21, "real": 21, "time": 21, "scale": [21, 26], "troubleshoot": 22, "memori": 22, "playback": 22, "mp4": 22, "30": 22, "fp": 22, "variabl": 22, "400": 22, "mbp": 22, "max": 22, "mani": 22, "parallel": 22, "hdr": 22, "spatialaqgain": 22, "nonrespons": 22, "vm": [22, 28], "cannot": 22, "vf": 22, "reach": 22, "state": 22, "guidelin": 23, "automat": 23, "look": 23, "ahead": 23, "depth": 23, "calcul": 23, "adjust": 23, "measur": 23, "metric": 24, "gop": 24, "select": 24, "dynam": 24, "unifi": 25, "log_ama_config": 25, "log_ama_filt": 25, "log_ama_filter_perf": 25, "option": 26, "multiscal": 26, "rebuild": [26, 27], "input": 27, "pipelin": 27, "hardwar": 27, "down": 27, "dma": 27, "move": 27, "through": 27, "work": 27, "virtual": 28, "linux": 28, "kvm": 28, "guest": 28}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"C API Programming Guide": [[0, "c-api-programming-guide"]], "Table of Contents": [[0, "table-of-contents"], [1, "table-of-contents"], [2, "table-of-contents"], [5, "table-of-contents"], [6, "table-of-contents"], [7, "table-of-contents"], [8, "table-of-contents"], [9, "table-of-contents"], [10, "table-of-contents"], [11, "table-of-contents"], [12, "table-of-contents"], [13, "table-of-contents"], [15, "table-of-contents"], [16, "table-of-contents"], [18, "table-of-contents"], [19, "table-of-contents"], [20, "table-of-contents"], [21, "table-of-contents"], [22, "table-of-contents"], [23, "table-of-contents"], [24, "table-of-contents"], [25, "table-of-contents"], [26, "table-of-contents"], [27, "table-of-contents"], [28, "table-of-contents"]], "Overview": [[0, "overview"], [1, "overview"], [19, "overview"], [20, "overview"], [22, "overview"], [28, "overview"]], "General Application Development Guide": [[0, "general-application-development-guide"]], "Resource Initialization and Allocation": [[0, "resource-initialization-and-allocation"]], "Session Creation": [[0, "session-creation"]], "Runtime Processing": [[0, "runtime-processing"]], "Cleanup": [[0, "cleanup"]], "Compiling and Linking with the AMD AMA Video SDK Plugins": [[0, "compiling-and-linking-with-the-sdk-plugins"]], "Common XMA Data Structures": [[0, "common-xma-data-structures"]], "Common XMA Data Reference": [[0, "common-xma-data-reference"]], "XMA Log Interface": [[0, "xma-log-interface"]], "XMA Session Interface": [[0, "xma-session-interface"]], "XMA Data Buffer Interface": [[0, "xma-data-buffer-interface"]], "XMA Frame Interface": [[0, "xma-frame-interface"]], "1.0 SDK API": [[0, "sdk-api"]], "Decoder Plugin Reference": [[0, "decoder-plugin-reference"]], "Decoder Interface": [[0, "decoder-interface"]], "Decoder Properties": [[0, "decoder-properties"]], "Scaler Plugin Reference": [[0, "scaler-plugin-reference"]], "Scaler Interface": [[0, "scaler-interface"]], "Scaler Properties": [[0, "scaler-properties"]], "Encoder Plugin Reference": [[0, "encoder-plugin-reference"]], "Encoder Interface": [[0, "encoder-interface"]], "Encoder Properties": [[0, "encoder-properties"]], "Filter Plugin Reference": [[0, "filter-plugin-reference"]], "Filter Interface": [[0, "filter-interface"]], "Filter Properties": [[0, "filter-properties"]], "Ultra Low Latency Considerations": [[0, "ultra-low-latency-considerations"]], "Decoder Low Latency Mode": [[0, "decoder-low-latency-mode"]], "Encoder Ultra Low Latency Mode": [[0, "encoder-ultra-low-latency-mode"]], "1.1 SDK API": [[0, "id3"]], "Sideband Data": [[0, "sideband-data"]], "Multithreading": [[0, "multithreading"]], "Logging": [[0, "logging"]], "Upgrading": [[0, "upgrading"]], "XRM API Reference": [[0, "xrm-api-reference"]], "Decoder Resource Reservation with XRM": [[0, "decoder-resource-reservation-with-xrm"]], "Encoder Resource Reservation with XRM": [[0, "encoder-resource-reservation-with-xrm"]], "Scaler Resource Reservation with XRM": [[0, "scaler-resource-reservation-with-xrm"]], "Building Sample Examples": [[0, "building-sample-examples"]], "Card Management": [[1, "card-management"]], "mautil, maflash, mamgmt and print_ma35_load": [[1, "mautil-maflash-mamgmt-and-print-ma35-load"]], "xrmadm and xrmd": [[1, "xrmadm-and-xrmd"]], "Card and Device Identifiers": [[1, "card-and-device-identifiers"]], "Device DBDF (mautil)": [[1, "device-dbdf-mautil"]], "Device DBDF (mamgmt)": [[1, "device-dbdf-mamgmt"]], "Bus ID": [[1, "bus-id"]], "Firmware Version Number": [[1, "firmware-version-number"]], "Checking System Status - mautil": [[1, "checking-system-status-mautil"]], "Checking Device Status": [[1, "checking-device-status"]], "Checking Device Configuration - mamgmt": [[1, "checking-device-configuration-mamgmt"]], "Programming a Device - maflash": [[1, "programming-a-device-maflash"]], "Checking Resource Utilization": [[1, "checking-resource-utilization"]], "print_ma35_load": [[1, "print-ma35-load"], [15, "print-ma35-load"]], "Encoding Compatibility Matrix": [[2, "encoding-compatibility-matrix"]], "AVC and HEVC Encoders": [[2, "avc-and-hevc-encoders"]], "AV1 Type 1 Encoder": [[2, "av1-type-1-encoder"]], "AV1 Type 2 Encoder": [[2, "av1-type-2-encoder"]], "Tutorials and Examples": [[3, "tutorials-and-examples"]], "AMF Encoder Tutorial": [[4, "amf-encoder-tutorial"]], "FFmpeg Examples using Software Filters": [[5, "ffmpeg-examples-using-software-filters"]], "Environment Setup": [[5, "environment-setup"], [6, "environment-setup"], [7, "environment-setup"], [8, "environment-setup"], [9, "environment-setup"], [12, "environment-setup"]], "Video Rotation": [[5, "video-rotation"], [8, "video-rotation"], [19, "video-rotation"]], "Logo Overlay": [[5, "logo-overlay"], [8, "logo-overlay"]], "Crop and Shift": [[5, "crop-and-shift"]], "Video Composition": [[5, "video-composition"], [8, "video-composition"]], "Chroma Subsampling": [[5, "chroma-subsampling"], [19, "chroma-subsampling"]], "Decoding and De-interlacing": [[5, "decoding-and-de-interlacing"]], "Video Quality Examples": [[6, "video-quality-examples"]], "Introduction to Video Quality": [[6, "introduction-to-video-quality"]], "Optimized Settings for the AMD AMA Video SDK": [[6, "optimized-settings-for-the-sdk"]], "Video Tuning Parameters": [[6, "id1"]], "AV1 VMAF - Normal Latency - Medium Preset": [[6, "av1-vmaf-normal-latency-medium-preset"]], "AVC VMAF - Normal Latency - Slow Preset": [[6, "avc-vmaf-normal-latency-slow-preset"]], "AV1 VMAF - Ultra Low Latency - Medium Preset": [[6, "av1-vmaf-ultra-low-latency-medium-preset"]], "AVC VMAF - Ultra Low Latency - Slow Preset": [[6, "avc-vmaf-ultra-low-latency-slow-preset"]], "Running PSNR/SSIM/VMAF Scores": [[6, "running-psnr-ssim-vmaf-scores"]], "FFmpeg Tutorials": [[7, "ffmpeg-tutorials"]], "Simple FFmpeg Examples": [[7, "simple-ffmpeg-examples"]], "Decode Only": [[7, "decode-only"]], "Encode Only": [[7, "encode-only"]], "4:2:2 10 Bit Conversion": [[7, "bit-conversion"]], "Constant Rate Factor (CRF) Mode": [[7, "constant-rate-factor-crf-mode"]], "High Quality Encoding": [[7, "high-quality-encoding"]], "Low Quality Encoding": [[7, "low-quality-encoding"]], "Basic Transcode": [[7, "basic-transcode"]], "Decode Only Into Multiple-Resolution Outputs": [[7, "decode-only-into-multiple-resolution-outputs"]], "Encode Only Into Multiple-Resolution Outputs": [[7, "encode-only-into-multiple-resolution-outputs"]], "Transcode with Multiple-Resolution Outputs": [[7, "transcode-with-multiple-resolution-outputs"]], "Transcode in ULL Mode": [[7, "transcode-in-ull-mode"]], "Double Density Example with xrmd": [[7, "double-density-example-with-xrmd"]], "Double Density Example without xrmd": [[7, "double-density-example-without-xrmd"]], "GStreamer Examples using Software Filters": [[8, "gstreamer-examples-using-software-filters"]], "Crop and Zoom": [[8, "crop-and-zoom"]], "GStreamer Introductory Tutorials": [[9, "gstreamer-introductory-tutorials"]], "Simple GStreamer Examples": [[9, "simple-gstreamer-examples"]], "Decode only": [[9, "decode-only"]], "Encode only": [[9, "encode-only"]], "Transcode with Multiple-Resolution outputs": [[9, "transcode-with-multiple-resolution-outputs"]], "GStreamer ABR Ladder Application": [[10, "gstreamer-abr-ladder-application"]], "Introduction": [[10, "introduction"], [11, "introduction"], [15, "introduction"], [26, "introduction"], [27, "introduction"]], "Host System Requirement": [[10, "host-system-requirement"], [11, "host-system-requirement"]], "Usage": [[10, "usage"], [11, "usage"]], "Examples": [[10, "examples"], [11, "examples"], [25, "examples"]], "GStreamer Compositor Application": [[11, "gstreamer-compositor-application"]], "XMA Examples for the AMD AMA Video SDK": [[12, "xma-examples-for-the-sdk"]], "XMA Decoder App": [[12, "xma-decoder-app"]], "Decoder Test Instructions": [[12, "decoder-test-instructions"]], "Decoder Usage": [[12, "decoder-usage"]], "Sample Decoder Command": [[12, "sample-decoder-command"]], "XMA Encoder App": [[12, "xma-encoder-app"]], "Encoder Test Instructions": [[12, "encoder-test-instructions"]], "Encoder Usage": [[12, "encoder-usage"]], "Sample Encoder Commands": [[12, "sample-encoder-commands"]], "XMA Scaler App": [[12, "xma-scaler-app"]], "Scaler Test Instructions": [[12, "scaler-test-instructions"]], "Scaler Usage": [[12, "scaler-usage"]], "Sample Scaler Command": [[12, "sample-scaler-command"]], "XMA Transcoder App": [[12, "xma-transcoder-app"]], "Transcoder Test Instructions": [[12, "transcoder-test-instructions"]], "Transcoder Usage": [[12, "transcoder-usage"]], "Sample Transcoder Commands": [[12, "sample-transcoder-commands"]], "Getting Started with AMD AMA Video SDK Cards on Premises": [[13, "getting-started-with-sdk-cards-on-premises"]], "Chassis Setup": [[13, "chassis-setup"]], "Check Cards": [[13, "check-cards"]], "Install the AMD AMA Video SDK": [[13, "install-the-sdk"]], "Flash Firmware": [[13, "flash-firmware"]], "Installation Verification": [[13, "installation-verification"]], "Set Up the Runtime Environment": [[13, "set-up-the-runtime-environment"]], "Run Your First Examples": [[13, "run-your-first-examples"]], "AMD Advanced Media Acceleration (AMA)": [[14, "amd-advanced-media-acceleration-ama"]], "Quick Links": [[14, "quick-links"]], "Managing Video Acceleration Compute Resources": [[15, "managing-video-acceleration-compute-resources"]], "Assigning Jobs to Specific Devices": [[15, "assigning-jobs-to-specific-devices"]], "Examples using Explicit Device IDs": [[15, "examples-using-explicit-device-ids"]], "Manual Resource Management": [[15, "manual-resource-management"]], "Checking System Load": [[15, "checking-system-load"]], "Insufficient Resources": [[15, "insufficient-resources"]], "Job Resource Requirements": [[15, "job-resource-requirements"]], "Automated Resource Management": [[15, "automated-resource-management"]], "Video Transcode Job Descriptions": [[15, "video-transcode-job-descriptions"]], "The Job Slot Reservation Tool": [[15, "the-job-slot-reservation-tool"]], "Example requiring a single device per job": [[15, "example-requiring-a-single-device-per-job"]], "Automated Job Launching": [[15, "automated-job-launching"]], "The FFmpeg Launcher Example": [[15, "the-ffmpeg-launcher-example"]], "XRM Reference Guide": [[15, "xrm-reference-guide"]], "Command Line Interface": [[15, "command-line-interface"]], "Setup": [[15, "setup"]], "Generating Status Reports": [[15, "generating-status-reports"]], "Loading/Unloading Software Plugins": [[15, "loading-unloading-software-plugins"]], "C Application Programming Interface": [[15, "c-application-programming-interface"]], "Software Migration Considerations": [[16, "software-migration-considerations"]], "API Changes from Alveo U30": [[16, "api-changes-from-alveo-u30"]], "FFmpeg API Changes": [[16, "ffmpeg-api-changes"]], "Gstreamer API Changes": [[16, "gstreamer-api-changes"]], "Distribution Package Feed": [[18, "distribution-package-feed"]], "Package Descriptions": [[18, "package-descriptions"]], "Configuring the Package Feed": [[18, "configuring-the-package-feed"]], "Ubuntu": [[18, "ubuntu"]], "New Feature Preview": [[19, "new-feature-preview"]], "Video Processing Accelerators": [[19, "id5"]], "Color Space Conversion": [[19, "color-space-conversion"]], "Picture In Picture (PIP)": [[19, "picture-in-picture-pip"]], "Tiling": [[19, "tiling"]], "ML Region Of Interest (ROI)": [[19, "ml-region-of-interest-roi"]], "ML Based Face ROI": [[19, "ml-based-face-roi"]], "ROI Face Detection": [[19, "roi-face-detection"]], "ML Based Text ROI": [[19, "ml-based-text-roi"]], "AMD Advanced Media Acceleration (AMA) Release Notes": [[20, "amd-advanced-media-acceleration-ama-release-notes"]], "Release Requirements": [[20, "release-requirements"]], "Features in This Release": [[20, "features-in-this-release"]], "Preview Features": [[20, "preview-features"]], "Supported Kernels and Distributions": [[20, "supported-kernels-and-distributions"]], "Known Limitations": [[20, "known-limitations"]], "Known Issues": [[20, "known-issues"]], "Upgrading from Previous Versions": [[20, "upgrading-from-previous-versions"]], "Specs and Features of the AMD AMA Video SDK": [[21, "specs-and-features-of-the-sdk"]], "The AMD AMA Video SDK": [[21, "the-sdk"]], "The AMD MA35D Card": [[21, "the-amd-ma35d-card"]], "Video Codec Unit": [[21, "video-codec-unit"]], "Adaptive Bitrate Scaler": [[21, "adaptive-bitrate-scaler"]], "Video Quality": [[21, "video-quality"]], "Performance Tables": [[21, "performance-tables"]], "Performance Tables for 8-bit Color": [[21, "performance-tables-for-8-bit-color"]], "Number of Real-Time Transcode Jobs per Card (8-bit)": [[21, "id3"]], "Number of Real-Time Transcode with Scale Jobs per Card (8-bit)": [[21, "id4"]], "Number of Real-Time ABR Ladders (8-bit)": [[21, "id5"]], "Performance Tables for 10-bit Color": [[21, "performance-tables-for-10-bit-color"]], "Number of Real-Time Transcode Jobs per Card (10-bit)": [[21, "id6"]], "Number of Real-Time Transcode with Scale Jobs per Card (10-bit)": [[21, "id7"]], "Number of Real-Time ABR Ladders (10-bit)": [[21, "id8"]], "AMD Advanced Media Acceleration (AMA) Troubleshooting": [[22, "amd-advanced-media-acceleration-ama-troubleshooting"]], "Single Device Per Card": [[22, "single-device-per-card"]], "Memory Usage": [[22, "memory-usage"]], "AV1 Slow Playback": [[22, "av1-slow-playback"]], "AV1 MP4 Playback": [[22, "av1-mp4-playback"]], "30 FPS Density": [[22, "fps-density"]], "Gstreamer Variable Frame Rate": [[22, "gstreamer-variable-frame-rate"]], "400 Mbps Max Bit Rate": [[22, "mbps-max-bit-rate"]], "Many Parallel Encodes": [[22, "many-parallel-encodes"]], "HDR & spatialAqGain": [[22, "hdr-spatialaqgain"]], "Nonresponsive Devices": [[22, "nonresponsive-devices"]], "Codec Issues in VM": [[22, "codec-issues-in-vm"]], "Cannot Assign a VF to a VM": [[22, "cannot-assign-a-vf-to-a-vm"]], "Cannot Reach Stated FPS": [[22, "cannot-reach-stated-fps"]], "Cannot Flash the Card": [[22, "cannot-flash-the-card"]], "Tuning Latency": [[23, "tuning-latency"]], "Decoder Latency": [[23, "decoder-latency"]], "Encoder Latency": [[23, "encoder-latency"]], "Guidelines on Encoder Latency Configuration": [[23, "guidelines-on-encoder-latency-configuration"]], "Automatic Look Ahead Depth Calculation": [[23, "automatic-look-ahead-depth-calculation"]], "Ultra Low Latency (ULL) Mode": [[23, "ultra-low-latency-ull-mode"]], "Latency Adjustment": [[23, "latency-adjustment"]], "FFmpeg Latency Measurements": [[23, "ffmpeg-latency-measurements"]], "Tuning Video Quality": [[24, "tuning-video-quality"]], "Metrics": [[24, "metrics"]], "Latency": [[24, "latency"]], "Preset": [[24, "preset"]], "GOP Composition": [[24, "gop-composition"]], "AV1 Type Selection": [[24, "av1-type-selection"]], "Dynamic Encoder Parameters": [[24, "dynamic-encoder-parameters"]], "Unified Logging": [[25, "unified-logging"]], "LOG_AMA_CONFIG": [[25, "log-ama-config"]], "LOG_AMA_FILTER": [[25, "log-ama-filter"]], "LOG_AMA_FILTER_PERF": [[25, "log-ama-filter-perf"]], "Using FFmpeg": [[26, "using-ffmpeg"]], "Example Commands": [[26, "example-commands"]], "General FFmpeg Options": [[26, "general-ffmpeg-options"]], "Video Decoding": [[26, "video-decoding"]], "Video Encoding": [[26, "video-encoding"]], "Video Scaling": [[26, "video-scaling"]], "Multiscale Filter Options": [[26, "id1"]], "Using the AMD AMA Video SDK Scaler Filter": [[26, "using-the-sdk-scaler-filter"]], "Rebuilding FFmpeg": [[26, "rebuilding-ffmpeg"]], "Using GStreamer": [[27, "using-gstreamer"]], "Overview of the GStreamer Plugins": [[27, "overview-of-the-gstreamer-plugins"]], "Decoder Plugin": [[27, "decoder-plugin"]], "Decoder Inputs and Outputs": [[27, "decoder-inputs-and-outputs"]], "Decoder Parameters": [[27, "decoder-parameters"]], "Decoder Example Pipelines": [[27, "decoder-example-pipelines"]], "Encoder Plugin": [[27, "encoder-plugin"]], "Encoder Inputs and Outputs": [[27, "encoder-inputs-and-outputs"]], "Encoder Parameters": [[27, "encoder-parameters"]], "Encoder Example Pipelines": [[27, "encoder-example-pipelines"]], "Scaler Plugin": [[27, "scaler-plugin"]], "Scaler Inputs and Outputs": [[27, "scaler-inputs-and-outputs"]], "Scaler Parameters": [[27, "scaler-parameters"]], "Scaler Example Pipelines": [[27, "scaler-example-pipelines"]], "Hardware Down and Up Loads": [[27, "hardware-down-and-up-loads"]], "Inputs and Outputs": [[27, "inputs-and-outputs"]], "DMA Parameters": [[27, "dma-parameters"]], "Moving Data through the Pipeline": [[27, "moving-data-through-the-pipeline"]], "Working with Multiple Devices": [[27, "working-with-multiple-devices"]], "Rebuilding GStreamer and Application Examples": [[27, "rebuilding-gstreamer-and-application-examples"]], "Virtualization": [[28, "virtualization"]], "Linux KVM": [[28, "linux-kvm"]], "Linux Host": [[28, "linux-host"]], "Linux VM Guest": [[28, "linux-vm-guest"]]}, "indexentries": {"xmadatabuffer (c struct)": [[0, "c.XmaDataBuffer"]], "xmadecoderproperties (c struct)": [[0, "c.XmaDecoderProperties"]], "xmaencoderproperties (c struct)": [[0, "c.XmaEncoderProperties"]], "xmafilterportproperties (c struct)": [[0, "c.XmaFilterPortProperties"]], "xmafilterproperties (c struct)": [[0, "c.XmaFilterProperties"]], "xmaframe (c struct)": [[0, "c.XmaFrame"]], "xmaframeproperties (c struct)": [[0, "c.XmaFrameProperties"]], "xmaparameter (c struct)": [[0, "c.XmaParameter"]], "xmascalerinoutproperties (c struct)": [[0, "c.XmaScalerInOutProperties"]], "xmascalerproperties (c struct)": [[0, "c.XmaScalerProperties"]], "xma_data_buffer_alloc (c function)": [[0, "c.xma_data_buffer_alloc"]], "xma_data_buffer_free (c function)": [[0, "c.xma_data_buffer_free"]], "xma_data_from_buffer_clone (c function)": [[0, "c.xma_data_from_buffer_clone"]], "xma_dec_session_create (c function)": [[0, "c.xma_dec_session_create"]], "xma_dec_session_destroy (c function)": [[0, "c.xma_dec_session_destroy"]], "xma_dec_session_get_properties (c function)": [[0, "c.xma_dec_session_get_properties"]], "xma_dec_session_recv_frame (c function)": [[0, "c.xma_dec_session_recv_frame"]], "xma_dec_session_send_data (c function)": [[0, "c.xma_dec_session_send_data"]], "xma_dec_session_set_log (c function)": [[0, "c.xma_dec_session_set_log"]], "xma_enc_session_create (c function)": [[0, "c.xma_enc_session_create"]], "xma_enc_session_destroy (c function)": [[0, "c.xma_enc_session_destroy"]], "xma_enc_session_recv_data (c function)": [[0, "c.xma_enc_session_recv_data"]], "xma_enc_session_send_frame (c function)": [[0, "c.xma_enc_session_send_frame"]], "xma_enc_session_set_log (c function)": [[0, "c.xma_enc_session_set_log"]], "xma_filter_session_create (c function)": [[0, "c.xma_filter_session_create"]], "xma_filter_session_destroy (c function)": [[0, "c.xma_filter_session_destroy"]], "xma_filter_session_recv_frame (c function)": [[0, "c.xma_filter_session_recv_frame"]], "xma_filter_session_send_frame (c function)": [[0, "c.xma_filter_session_send_frame"]], "xma_filter_session_set_log (c function)": [[0, "c.xma_filter_session_set_log"]], "xma_frame_alloc (c function)": [[0, "c.xma_frame_alloc"]], "xma_frame_clone (c function)": [[0, "c.xma_frame_clone"]], "xma_frame_dec_ref (c function)": [[0, "c.xma_frame_dec_ref"]], "xma_frame_free (c function)": [[0, "c.xma_frame_free"]], "xma_frame_from_buffers_clone (c function)": [[0, "c.xma_frame_from_buffers_clone"]], "xma_frame_get_plane_height (c function)": [[0, "c.xma_frame_get_plane_height"]], "xma_frame_get_plane_size (c function)": [[0, "c.xma_frame_get_plane_size"]], "xma_frame_get_plane_stride (c function)": [[0, "c.xma_frame_get_plane_stride"]], "xma_frame_inc_ref (c function)": [[0, "c.xma_frame_inc_ref"]], "xma_frame_planes_get (c function)": [[0, "c.xma_frame_planes_get"]], "xma_initialize (c function)": [[0, "c.xma_initialize"]], "xma_log_init (c function)": [[0, "c.xma_log_init"]], "xma_log_release (c function)": [[0, "c.xma_log_release"]], "xma_logmsg (c function)": [[0, "c.xma_logmsg"]], "xma_release (c function)": [[0, "c.xma_release"]], "xma_scaler_session_create (c function)": [[0, "c.xma_scaler_session_create"]], "xma_scaler_session_destroy (c function)": [[0, "c.xma_scaler_session_destroy"]], "xma_scaler_session_recv_frame_list (c function)": [[0, "c.xma_scaler_session_recv_frame_list"]], "xma_scaler_session_send_frame (c function)": [[0, "c.xma_scaler_session_send_frame"]], "xrm_dec_release (c function)": [[0, "c.xrm_dec_release"]], "xrm_dec_reserve (c function)": [[0, "c.xrm_dec_reserve"]], "xrm_enc_release (c function)": [[0, "c.xrm_enc_release"]], "xrm_enc_reserve (c function)": [[0, "c.xrm_enc_reserve"]], "xrm_scale_release (c function)": [[0, "c.xrm_scale_release"]], "xrm_scale_reserve (c function)": [[0, "c.xrm_scale_reserve"]], "--codectype": [[10, "cmdoption-codectype"]], "--devidx": [[10, "cmdoption-devidx"]], "--file": [[10, "cmdoption-file"]], "--forcekeyframe": [[10, "cmdoption-forcekeyframe"]], "--json": [[10, "cmdoption-json"]], "-c": [[10, "cmdoption-c"]], "-f": [[10, "cmdoption-f"], [26, "cmdoption-f"]], "-i": [[10, "cmdoption-i"], [26, "cmdoption-i"]], "-j": [[10, "cmdoption-j"]], "-k": [[10, "cmdoption-k"]], "command line option": [[10, "cmdoption-c"], [10, "cmdoption-codectype"], [10, "cmdoption-devidx"], [10, "cmdoption-f"], [10, "cmdoption-file"], [10, "cmdoption-forcekeyframe"], [10, "cmdoption-i"], [10, "cmdoption-j"], [10, "cmdoption-json"], [10, "cmdoption-k"], [26, "cmdoption-arg-scaler_ama"], [26, "cmdoption-b-v"], [26, "cmdoption-bf"], [26, "cmdoption-bufsize"], [26, "cmdoption-c-v"], [26, "cmdoption-control_rate"], [26, "cmdoption-cores"], [26, "cmdoption-crf"], [26, "cmdoption-dynamic_gop"], [26, "cmdoption-dynamic_params_file"], [26, "cmdoption-enable_pipeline"], [26, "cmdoption-expert_option"], [26, "cmdoption-f"], [26, "cmdoption-filter_complex"], [26, "cmdoption-forced_idr"], [26, "cmdoption-g"], [26, "cmdoption-hwaccel"], [26, "cmdoption-i"], [26, "cmdoption-latency_logging"], [26, "cmdoption-latency_ms"], [26, "cmdoption-level"], [26, "cmdoption-lookahead_depth"], [26, "cmdoption-low_latency"], [26, "cmdoption-max_bitrate"], [26, "cmdoption-max_qp"], [26, "cmdoption-min_qp"], [26, "cmdoption-out_fmt"], [26, "cmdoption-out_res"], [26, "cmdoption-outputs"], [26, "cmdoption-perf"], [26, "cmdoption-preset"], [26, "cmdoption-profile"], [26, "cmdoption-qp"], [26, "cmdoption-qp_mode"], [26, "cmdoption-r"], [26, "cmdoption-s"], [26, "cmdoption-slice"], [26, "cmdoption-spatial_aq"], [26, "cmdoption-spatial_aq_gain"], [26, "cmdoption-temporal_aq"], [26, "cmdoption-temporal_aq_gain"], [26, "cmdoption-tier"], [26, "cmdoption-tune_metrics"], [26, "cmdoption-type"], [26, "cmdoption-vf"], [26, "cmdoption-vsync"], [27, "cmdoption-arg-0"], [27, "cmdoption-arg-1"], [27, "cmdoption-arg-2"], [27, "cmdoption-arg-b-frames"], [27, "cmdoption-arg-bitrate"], [27, "cmdoption-arg-crf"], [27, "cmdoption-arg-crop"], [27, "cmdoption-arg-crop-height"], [27, "cmdoption-arg-crop-left"], [27, "cmdoption-arg-crop-top"], [27, "cmdoption-arg-crop-width"], [27, "cmdoption-arg-device"], [27, "cmdoption-arg-device-type"], [27, "cmdoption-arg-encoding-params-file"], [27, "cmdoption-arg-forced-idr"], [27, "cmdoption-arg-gop-length"], [27, "cmdoption-arg-idr-interval"], [27, "cmdoption-arg-latency-ms"], [27, "cmdoption-arg-lookahead-depth"], [27, "cmdoption-arg-low-latency"], [27, "cmdoption-arg-max-bitrate"], [27, "cmdoption-arg-max-qp"], [27, "cmdoption-arg-min-qp"], [27, "cmdoption-arg-preset"], [27, "cmdoption-arg-qp"], [27, "cmdoption-arg-qp-mode"], [27, "cmdoption-arg-rate-control"], [27, "cmdoption-arg-slice"], [27, "cmdoption-arg-spatial-aq"], [27, "cmdoption-arg-spatial-aq-gain"], [27, "cmdoption-arg-temporal-aq-gain"], [27, "cmdoption-arg-temporall-aq"], [27, "cmdoption-arg-tier"], [27, "cmdoption-arg-tune-metrics"]], "xrm_reserve_id": [[15, "index-0"], [15, "index-2"]], "xrm_reserve_id_{n}": [[15, "index-1"], [15, "index-3"]], "environment variable": [[15, "index-0"], [15, "index-1"], [15, "index-2"], [15, "index-3"]], "-b:v": [[26, "cmdoption-b-v"]], "-bf": [[26, "cmdoption-bf"]], "-bufsize": [[26, "cmdoption-bufsize"]], "-c:v": [[26, "cmdoption-c-v"]], "-control_rate": [[26, "cmdoption-control_rate"]], "-cores": [[26, "cmdoption-cores"]], "-crf": [[26, "cmdoption-crf"]], "-dynamic_gop": [[26, "cmdoption-dynamic_gop"]], "-dynamic_params_file": [[26, "cmdoption-dynamic_params_file"]], "-enable_pipeline": [[26, "cmdoption-enable_pipeline"]], "-expert_option": [[26, "cmdoption-expert_option"]], "-filter_complex": [[26, "cmdoption-filter_complex"]], "-forced_idr": [[26, "cmdoption-forced_idr"]], "-g": [[26, "cmdoption-g"]], "-hwaccel": [[26, "cmdoption-hwaccel"]], "-latency_logging": [[26, "cmdoption-latency_logging"]], "-latency_ms": [[26, "cmdoption-latency_ms"]], "-level": [[26, "cmdoption-level"]], "-lookahead_depth": [[26, "cmdoption-lookahead_depth"]], "-low_latency": [[26, "cmdoption-low_latency"]], "-max_bitrate": [[26, "cmdoption-max_bitrate"]], "-max_qp": [[26, "cmdoption-max_qp"]], "-min_qp": [[26, "cmdoption-min_qp"]], "-out_fmt": [[26, "cmdoption-out_fmt"]], "-out_res": [[26, "cmdoption-out_res"]], "-outputs": [[26, "cmdoption-outputs"]], "-perf": [[26, "cmdoption-perf"]], "-preset": [[26, "cmdoption-preset"]], "-profile": [[26, "cmdoption-profile"]], "-qp": [[26, "cmdoption-qp"]], "-qp_mode": [[26, "cmdoption-qp_mode"]], "-r": [[26, "cmdoption-r"]], "-s": [[26, "cmdoption-s"]], "-slice": [[26, "cmdoption-slice"]], "-spatial_aq": [[26, "cmdoption-spatial_aq"]], "-spatial_aq_gain": [[26, "cmdoption-spatial_aq_gain"]], "-temporal_aq": [[26, "cmdoption-temporal_aq"]], "-temporal_aq_gain": [[26, "cmdoption-temporal_aq_gain"]], "-tier": [[26, "cmdoption-tier"]], "-tune_metrics": [[26, "cmdoption-tune_metrics"]], "-type": [[26, "cmdoption-type"]], "-vf": [[26, "cmdoption-vf"]], "-vsync": [[26, "cmdoption-vsync"]], "scaler_ama": [[26, "cmdoption-arg-scaler_ama"]], "b-frames": [[27, "cmdoption-arg-b-frames"]], "bitrate": [[27, "cmdoption-arg-bitrate"]], "crf": [[27, "cmdoption-arg-crf"]], "crop": [[27, "cmdoption-arg-crop"]], "crop-height": [[27, "cmdoption-arg-crop-height"]], "crop-left": [[27, "cmdoption-arg-crop-left"]], "crop-top": [[27, "cmdoption-arg-crop-top"]], "crop-width": [[27, "cmdoption-arg-crop-width"]], "device": [[27, "cmdoption-arg-0"], [27, "cmdoption-arg-1"], [27, "cmdoption-arg-2"], [27, "cmdoption-arg-device"]], "device-type": [[27, "cmdoption-arg-device-type"]], "encoding-params-file": [[27, "cmdoption-arg-encoding-params-file"]], "forced-idr": [[27, "cmdoption-arg-forced-idr"]], "gop-length": [[27, "cmdoption-arg-gop-length"]], "idr-interval": [[27, "cmdoption-arg-idr-interval"]], "latency-ms": [[27, "cmdoption-arg-latency-ms"]], "lookahead-depth": [[27, "cmdoption-arg-lookahead-depth"]], "low-latency": [[27, "cmdoption-arg-low-latency"]], "max-bitrate": [[27, "cmdoption-arg-max-bitrate"]], "max-qp": [[27, "cmdoption-arg-max-qp"]], "min-qp": [[27, "cmdoption-arg-min-qp"]], "preset": [[27, "cmdoption-arg-preset"]], "qp": [[27, "cmdoption-arg-qp"]], "qp-mode": [[27, "cmdoption-arg-qp-mode"]], "rate-control": [[27, "cmdoption-arg-rate-control"]], "slice": [[27, "cmdoption-arg-slice"]], "spatial-aq": [[27, "cmdoption-arg-spatial-aq"]], "spatial-aq-gain": [[27, "cmdoption-arg-spatial-aq-gain"]], "temporal-aq-gain": [[27, "cmdoption-arg-temporal-aq-gain"]], "temporall-aq": [[27, "cmdoption-arg-temporall-aq"]], "tier": [[27, "cmdoption-arg-tier"]], "tune-metrics": [[27, "cmdoption-arg-tune-metrics"]]}}) \ No newline at end of file diff --git a/v1.1.1/specs_and_features.html b/v1.1.1/specs_and_features.html new file mode 100644 index 00000000..f480212b --- /dev/null +++ b/v1.1.1/specs_and_features.html @@ -0,0 +1,551 @@ + + + + + + + + + + + + + + + Specs and Features of the AMD AMA Video SDK — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Specs and Features of the AMD AMA Video SDK
  • +
  • +
  • +
+
+
+
+
+ +
+

Specs and Features of the AMD AMA Video SDK

+ +
+

The AMD AMA Video SDK

+

The AMD AMA Video SDK is a complete software stack allowing users to seamlessly leverage the features of AMD video acceleration units such as MA35D. It includes the following elements:

+
    +
  • Pre-compiled versions of FFmpeg and GStreamer which integrate key video transcoding plug-ins, enabling simple hardware offloading of compute-intensive workloads using these two popular frameworks. These custom versions of FFmpeg and GStreamer link to a host driver which communicates with the hardware on the PCIe card. No hardware experience is required to run FFmpeg or GStreamer commands with the AMD AMA Video SDK.

  • +
  • The Xilinx Resource Manager (XRM) which is the software used to manage and allocate all the hardware-accelerated features available in the system. XRM allows running multiple video processing jobs across multiple devices and multiple AMD video acceleration cards.

  • +
  • A C-based application programming interface (API) which facilitates the integration of AMD video transcoding capabilities in proprietary frameworks. This API is provided in the form plugins which can be called from external application using the Xilinx Media Accelerator (XMA) interface.

  • +
  • A suite of card management tools used to perform actions such as programming, resetting, or querying the status of AMD video acceleration cards.

  • +
  • Many examples and tutorials illustrating how to use and make the most of the AMD AMA Video SDK.

  • +
+MA35D Pipeline +
+
+

The AMD MA35D Card

+

The MA35D, which is compatible with AMD AMA Video SDK, is a low-profile, PCI™-based media accelerator card that delivers a high-density real-time transcoding solution for live streaming video service providers, OEMs, and Content Delivery Network (CDNs).

+

The MA35D card is targeted for both real-time and faster than real-time video workloads. It is expected that one or more sources of video input, either from files or from live video streams, are fed into the transcode pipeline. The encoder encodes one or more output streams from each scaled rendition of the input.

+
+

Video Codec Unit

+

The MA35D accelerator card has 2 VPUs, where each VPU is made of 2 video processing slices. These slices in turn are made of specialized decode, scale, GPU, ML, look ahead, and encode units.

+MA35D VPU +

Video Codec Unit (VCU) cores are capable of:

+
    +
  • Video format: YCbCr 4:2:0, 8 or 10-bit per color channel

  • +
  • Multi-standard encoding/decoding support, including:

    +
      +
    • ISO MPEG-4 Part 10: Advanced Video Coding (AVC)/ITU H.264 - Baseline, Constrained Baseline, High, High-10, High-10-Intra up to Level 5.2

    • +
    • ISO MPEG-H Part 2: High Efficiency Video Coding (HEVC)/ITU H.265 - Main, Main-Intra, Main10, Main-10-Intra, up to Level 5.2

    • +
    • AOM AV1: AOMedia Video 1 - Main, High up to Level 5.3

    • +
    +
  • +
  • Supports resolutions from 128x128 to 3840x2160 portrait and landscape

  • +
  • Simultaneous transcoding with a maximum aggregated bandwidth of 4x 4Kp60 per card for AVC or HEVC and 8x 4Kp60 for AV1

  • +
  • Look-ahead driven video quality improvements through temporal adaptive and spatial adaptive quantization

  • +
  • Low latency rate control

  • +
  • Flexible rate control: CBR, VBR, CVBR, and Constant QP

  • +
  • Progressive support for H.264, H.265 and AV1

  • +
  • HDR10/10+: HDR data is automatically populated by the decoder and passed to other accelerators in the transcode pipeline.

    +
      +
    • The following HDR10 SEI are supported:

      +
        +
      • Mastering Display Color Volume (SEI ITU)

      • +
      • Content Light Level (SEI ITU)

      • +
      • Alternative Transfer Charateristics (SEI ITU)

      • +
      +
    • +
    • The following HDR10+ SEI are supported:

      +
        +
      • ST2094_10 (DolbyVision, User defined SEI)

      • +
      • ST2094_40 (Samsung, User defined SEI)

      • +
      +
    • +
    • Behavior for HDR10/10+ SEI is as follows:

      +
        +
      • Static HDR SEI (MDCV, CLL & ATC) will not change in-between IDRs (and even in the video sequence according the HDR standards).

      • +
      • MDCV, CLL & ATC will be written only on IDRs, according to the persistency of MDCV, CLL & ATC SEIs.

      • +
      • ST2094_10 will be written on each access unit as per constraint of section A.2.1 ts_103572v010101p.pdf.

      • +
      • ST2094_40 will be written on IDRs, and whenever the user changes its content, according to the persistency specification in A341S34-1-582r4-A341-Amendment-2094-40.pdf

      • +
      +
    • +
    +
  • +
+
+
+

Adaptive Bitrate Scaler

+

For streaming applications, video is distributed in different resolutions and bit rates to adapt to varying network bandwidth conditions. All adaptive bitrate (ABR) transcoding systems require an ABR scaler that downscales an input video stream to several different smaller resolutions that are then re-encoded. These smaller resolutions are referred to as an image pyramid or an ABR ladder.

+

The MA35D ABR scaler is an accelerator capable of generating up to 16 lower resolution output images from a single input image. The ABR scaler supports the following features:

+
    +
  • Supports up to 12 taps in both horizontal and vertical direction per stage

  • +
  • High quality polyphase scaling with 64 phases and up to 12 taps in both horizontal and vertical direction per stage

  • +
  • Supports 8 and 10-bit 4:2:0

  • +
  • Luma and Chroma processed in parallel

  • +
  • Supports resolutions from 128x128 to 3840x2160, in multiples of 4

  • +
  • The scaler is tuned for downscaling and expects non-increasing resolutions in an ABR ladder. Increasing resolutions between outputs is supported but will reduce video quality.

  • +
+
+
+

Video Quality

+

The MA35D card nominally produces video quality (VQ) that is closely correlated to x264 medium, x265 medium and x265 slow presets, with respect to its accelerated AVC, HEVC and AV1 encoders. Furthermore, in case of AV1 encoders, -type-1 AV1 matches a similar VQ as x265 slow; whereas, -type-2 that of x265 medium. This video quality is highly dependent on video content so actual results may vary.

+
+
+

Performance Tables

+

The video processing power of the MA35D cards can be harnessed in many different ways, from running a few high-definition jobs to running many low-resolution ones, with or without scaling. The tables below show how many jobs can be run at real-time speed based on the use case and the number of cards available. All these configurations have been tested and validated by AMD and assume normal operating ranges.

+
+

Note

+
    +
  1. In the following tables, density numbers linearly scale to up to 16 devices.

  2. +
  3. It is assumed that per device, host chassis has set aside 8 hyper-threaded cores with 12GB of RAM.

  4. +
+
+
+

Note

+

To meet the following density numbers for 30 FPS pipelines, it is recommended to decrease LA depth incrementally, until target density objectives are met. Refer to Automatic Look Ahead Depth Calculation for valid range of LA depth.

+
+

The following tables present density numbers for typical video renditions. However, it should be noted that encode capability of each engine, 4 per device, is best described as aggregated 4kp60. This, among other things, implies that densities of 4x1080p60 or rate of 1x1080p240 can be achieved. The latter implies that a 1080p60 VOD asset can be encoded at 4 times the speed. Furthermore, speed up rate holds linearly for renditions down to 540p30. To encode two Faster Than Real Time (FTRT) jobs on a single device, each job must be assigned to a dedicated slice. See -slice for details.

+

In tables, below, Single Density refers to any combination of AVC, HEVC or AV1 Type-2 encoders, whereas, Double Density refers to any combination of AVC, HEVC or AV1 Type-2 encoders along with AV1 Type-1 encoder.

+

It is noted that with respect to Transcode with Scale Jobs Tables, below, the output of a decoder can be split and encoded with any combination of AMA encoders. This in turn implies that the expected density numbers can vary from reported Single Density to Double Density, depending on encoder selection, for each output of the scaler.

+

To fully utilize all devices on a card and reach the stated densities, device selection needs to be explicitly done in a command line. See -hwaccel and Using Explicit Device IDs for more details.

+
+

Performance Tables for 8-bit Color

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode Jobs per Card (8-bit)

Transcode Use Case

Single Density

Double Density

4kp60

4

8

4kp30

8

16

1080p60

16

32

1080p30

32

64

720p60

32

64

720p30

68

136

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode with Scale Jobs per Card (8-bit)

Transcode with Scale Use Case

Single Density

Double Density

4kp60 to 1440p60

4

8

4kp30 to 1440p30

8

16

1080p60 to 720p60

16

32

1080p30 to 720p30

32

64

720p60 to 540p60

32

64

720p30 to 540p30

68

136

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time ABR Ladders (8-bit)

ABR Ladders Use Case

1 Card

2160p60 to 1440p60, 1080p60, 720p30, 480p30, 360p30, 240p30, 144p30

4

2160p30 to 2160p30, 1440p30, 1080p30, 720p30, 480p30, 360p30, 240p30, 144p30

4

1080p60 to 1080p60, 720p60, 720p30, 480p30, 360p30, 160p30

8

1080p60 to 720p60, 720p30, 480p30, 360p30, 160p30

16

1080p30 to 1080p30, 720p30, 480p30, 240p30

16

720p30 to 720p30, 480p30, 240p30

40

+
+
+

Performance Tables for 10-bit Color

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode Jobs per Card (10-bit)

Transcode Use Case

Single Density

Double Density

4kp60

4

8

4kp30

8

16

1080p60

16

32

1080p30

32

64

720p60

32

64

720p30

68

136

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode with Scale Jobs per Card (10-bit)

Transcode with Scale Use Case

Single Density

Double Density

4kp60 to 1440p60

4

8

4kp30 to 1440p30

8

16

1080p60 to 720p60

16

32

1080p30 to 720p30

32

64

720p60 to 540p60

32

64

720p30 to 540p30

68

136

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time ABR Ladders (10-bit)

ABR Ladders Use Case

1 Card

2160p60 to 1440p60, 1080p60, 720p30, 480p30, 360p30, 240p30, 144p30

4

2160p30 to 2160p30, 1440p30, 1080p30, 720p30, 480p30, 360p30, 240p30, 144p30

4

1080p60 to 1080p60, 720p60, 720p30, 480p30, 360p30, 160p30

8

1080p60 to 720p60, 720p30, 480p30, 360p30, 160p30

16

1080p30 to 1080p30, 720p30, 480p30, 240p30

16

720p30 to 720p30, 480p30, 240p30

40

+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/troubleshooting.html b/v1.1.1/troubleshooting.html new file mode 100644 index 00000000..ca6999a3 --- /dev/null +++ b/v1.1.1/troubleshooting.html @@ -0,0 +1,360 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) Troubleshooting — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA) Troubleshooting
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA) Troubleshooting

+ +
+

Overview

+

This section describes various troubleshooting methods and workarounds for some known issues such as out of memory errors, low frame-rate, etc.

+
+

Single Device Per Card

+

If SDK has access to only a single device on a card, i.e.,:

+
lspci -d 10ee:
+
+
+

returns half the expected devices, then bifurication has not been enabled in the BIOS.

+

Workaround: Check your BIOS and enable 4x4 PCIe bifurcation on each slot with a MA35 card.

+
+
+

Memory Usage

+

Messages such as:

+
    +
  • ERROR: from element xxxxx: Internal data stream error.

  • +
  • ERROR [Channel] Cannot create channel: DeviceAllocate failed

  • +
+

...

+

, indicate memory pressure on the accelerator card.

+

Workaround: Other than the obvious over-subscription use-cases, these issues can be resolved by decrementing the lookahead buffer size.

+
+
+

AV1 Slow Playback

+

An AV1 HLS stream may playback at slower than real time speeds.

+

Workaround: Recommend explicitly setting of FPS playback frame rate when using ffplay or use ffplay from FFmpeg 5.1.2 or 6.0.

+
+
+

AV1 MP4 Playback

+

AV1 muxed into an MP4 container may not play back properly.

+

Workaround: Recommend playback of raw video using more recent versions of ffplay (n5.1.2 or later) or more recent versions of media players such as VLC v3.0.17.4. Alternatively, muxing the raw video into an IVF container format is also permitted.

+
+
+

30 FPS Density

+

30 FPS transcodes and below can not run at full density with default lookahead depth.

+

Workaround: Decrease lookahead depth or density. Required decrease is dependent upon resolution/frame rate. See Performance Tables Section for details.

+
+
+

Gstreamer Variable Frame Rate

+

Variable frame rate files are not supported by the Gstreamer AMA plugins.

+

Workaround: Turn XRM off and add a videorate filter and caps filter before the encoder to set a fixed frame rate.

+
+
+

400 Mbps Max Bit Rate

+

Encoders do not support a target or max bitrate above 400 Mbps.

+

Workaround: This issue can be avoided by constraining the bitrate values below to 400 Mbps.

+
+
+

Many Parallel Encodes

+

Encountering Cannot create channel: DeviceAllocate failed error, when running high number of encoding operations in parallel.

+

Workaround: Reduce the memory requirements by lowering the lookahead depth of the encoding operation. This can be controlled with the -lookahead_depth argument. Default values depend on the FPS and bitdepth of the input source. The following are some starting points:

+
+

30fps: -lookahead_depth 26 (reduce by steps of 2)

+

60fps: -lookahead_depth 46 (reduce by steps of 4)

+
+
+
+

HDR & spatialAqGain

+

Encoding HDR content with a spatialAqGain of 1 or 2 is not supported.

+

Workaround: Using the default values of spatialAqGain is recommended for best video quality when possible. If it is desirable to reduce the spatialAqGain from the recommended range of 60 - 100, using a value of 3 or greater will avoid this issue.

+
+
+

Nonresponsive Devices

+

It is possible that codec services and utilities may become unavailable, due to crashed SDK driver and as such mamgmt reset will not be able to reset any of the available devices.

+

Workaround: Execute the following commands:

+
sudo rmmod ama_transcoder
+sudo modprobe ama_transcoder
+
+
+

If removal and reloading of the driver does not work, then system reboot is required.

+
+
+

Codec Issues in VM

+

If codec operations are hanging in a VM, while the following sudo dmesg -w output log is observed:

+
...
+[  323.436842] ama_transcoder0 0000:05:00.0 hdma: warning:hdma_link_rc2ep_xfer status is done, c:2,status=0x1,condition=0
+[  323.440802] ama_transcoder0 0000:05:00.0 hdma: dir:rc2ep element_cnt=1 channel:2 link_table_pa:0x160000
+[  323.443387] ama_transcoder0 0000:05:00.0 hdma: ctl:0x01 size:0x4 sh:0x2 sl:0x97e00000 dh:0x0 dl:0x20831000
+[  323.445538] ama_transcoder0 0000:05:00.0 hdma: end ctrl:0x06 rsv:0x0 llp_h:0x0 llp_l:0x160000
+[  323.447257] ama_transcoder0 0000:05:00.0 hdma: rc2ep PF c=2 0x500 = 0x1
+...
+
+
+

, with host reporting IO_PAGE_FAULT in its dmesg logs, then this is an indication of a mis-configured VM.

+

Workaround: Ensure that VM has been properly created as per Virtualization.

+
+
+

Cannot Assign a VF to a VM

+

If passing a VF to a VM fails, this could be due to VF not getting its own IOMMU group. To check this, run the following command:

+
for a in /sys/kernel/iommu_groups/*; do find $a -type l; done | sort --version-sort
+
+
+

, and ensure that VF is assign to a unique group. As an example, the following output shows that VF associated with device 0000:02:00.0 , i.e., 0000:02:00.1, has its own unique group 34:

+
...
+/sys/kernel/iommu_groups/34/devices/0000:02:00.1
+...
+
+
+

Workaround: Ensure that ACS has been enabled in the BIOS.

+
+
+

Cannot Reach Stated FPS

+

While running typical pipelines, if the reported Frame Per Second (FPS) is below the reported one, ensure that Active State Power Management (ASPM) is disabled. To check the status of ASPM, issue the following command:

+
sudo lspci -vvvd 10ee: | grep -i aspm
+
+
+

and check that ASPM is disabled:

+
LnkCap: Port #0, Speed 16GT/s, Width x4, ASPM L1, Exit Latency L1 <64us
+      ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp+
+LnkCtl: ASPM Disabled; RCB 64 bytes, Disabled- CommClk+
+
+
+

Workaround: Ensure that ASPM is disabled as per pcie_aspm.policy, in Chassis Setup.

+
+
+

Cannot Flash the Card

+

While attempting to flash from satellite controller version 9.7.35, the following message may appear:

+
...
+Device: 0000:e2:00.0
+**** ERROR Programming BMC-MSP432.bin of type [SC] SC is accessing flash, pls try FW update after sometime.
+...
+
+
+

Workaround: Wait for 10 minutes and try to flash again.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/tuning_pipeline_latency.html b/v1.1.1/tuning_pipeline_latency.html new file mode 100644 index 00000000..9d21ab10 --- /dev/null +++ b/v1.1.1/tuning_pipeline_latency.html @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + Tuning Latency — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tuning Latency
  • +
  • +
  • +
+
+
+
+
+ +
+

Tuning Latency

+ +

Latency tuning allows for trade off among end to end delay, video bit rate, GOP composition, etc. Interactive applications that require low latency, can do so by setting relevant parameters in the video pipeline. It is understood that lowering the latency comes at the cost of increased bit rate, for a given visual quality.

+
+

Decoder Latency

+

Decoding latency can be reduced by enabling the -low_latency decoder option in FFmpeg.

+
+
+

Encoder Latency

+

AMD AMA Video SDK encoder performs multi-objective optimization with set constraints on bit rate, GOP topology, visual quality measures, etc. As such, it may be tuned to achieve a compromise between latency and quality or be specialized to ultra low latency.

+
+

Guidelines on Encoder Latency Configuration

+

Encoding latency can also be reduced by trading off compression rate or visual quality. The following table lists the encoder options which can used to reduce to that effect.

+ ++++ + + + + + + + + + + + + + +

Encode Options

Notes

Look Ahead Depth

+
For best visual quality, it is recommend to let the buffer depth be determined automatically. If it is found that the selected depth adds unacceptable delay, then this option can be set explicitly. Supported range is 0 - 46+number of B frames.
+
+

Number of B frames

+
It is understood that for every inserted B frame there will be a frame period delay.
+
+
+

See Encoding Compatibility Matrix combination of allowable parameters.

+
+
+

Automatic Look Ahead Depth Calculation

+

The default VQ optimized look ahead buffer depths are:

+
+
    +
  1. 800 ms for 8 bit

  2. +
  3. 600 ms for 10 bit

  4. +
+
+
+
+

Ultra Low Latency (ULL) Mode

+

Ultra Low Latency (ULL) encoding is enabled by setting -lookahead_depth flag to 0.

+

Notes

+
    +
  • In ULL encoding mode, frames are always processed in display order. As such, this mode is not compatible with B frames. Furthermore, only Constant Quantization Parameter (CQP) and Constant Bit Rate (CBR) options are allowed. See -control_rate.

  • +
+
+

Latency Adjustment

+

The overall latency can be further tuned by adjusting the -bufsize parameter. This parameter allows for tuning strict and relaxed ULL modes. Both relaxed ULL and strict ULL modes have the lowest achievable encoding latency, in AMD AMA SDK. Strict ULL has lower transmission latency than relaxed ULL, by restricting frame size variations at the expense of lower VQ. Relaxed ULL has better VQ than strict ULL, by allowing larger frame size variations. Such variations may results in higher transmission latency, depending on network bandwidth.

+
+
+
+
+

FFmpeg Latency Measurements

+

Latency measurements can be obtained by enabling -latency_logging. The following is a sample transcode, HEVC to AVC, pipeline:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v hevc_ama -out_fmt nv12 -i <INPUT> -filter_complex "scaler_ama=outputs=1:out_res=(1920x1080)" -c:v h264_ama -frames 50 -lookahead_depth 0 -latency_logging enable -f rawvideo -b:v 6M /tmp/hevc_to_scale_to_h264.h264
+
+...
+2023-05-25 12:27:01.028958 NOTICE [Channel] Latency @ output frame  24:  0 frames, 4.5 ms; 152.79 fps = (24-0)/(157.1 ms)
+2023-05-25 12:27:01.194255 NOTICE [Channel] Latency @ output frame  49:  0 frames, 4.5 ms; 151.24 fps = (49-24)/(165.3 ms)
+frame=   50 fps=0.0 q=-0.0 latency= 12ms Lsize=     189kB time=00:00:00.83 bitrate=1858.8kbits/s speed=2.27x
+...
+
+
+

Note that latency reports are printed every 25th frame. In the case noted above, the end to end latency is 12 [ms].

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/tuning_video_quality.html b/v1.1.1/tuning_video_quality.html new file mode 100644 index 00000000..6f3adec3 --- /dev/null +++ b/v1.1.1/tuning_video_quality.html @@ -0,0 +1,337 @@ + + + + + + + + + + + + + + + Tuning Video Quality — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tuning Video Quality
  • +
  • +
  • +
+
+
+
+
+ +
+

Tuning Video Quality

+ +

The quality of encoded video depends on various factors. It is primarily a function of the target bit rate and the type of video content. However, there are some encoder parameters which can be used to adjust the video quality. This document describes the major parameters impacting video quality, as they specifically pertain to AMA SDK compatible devices. These parameters and the underlying concepts are applicable whether using FFmpeg or the C example programs.

+

Currently, there are 3 significant parameters that effect the visual quality of the video:

+
    +
  1. Metric, which is specified by -tune_metrics

  2. +
  3. Latency, which is specified by -lookahead_depth

  4. +
  5. Preset, which is specified by -preset

  6. +
+

Sections below will describe each of these parameters in detail.

+

Various examples illustrating the effect of these settings can be found here:

+ +
+

Metrics

+

This parameters defines means of scoring the observed video quality, for both subjective and objective measures. To control this parameter, set -tune_metrics to its desired target value. It is important to note that the encode engine has specific optimizations per mode, e.g., while setting the -tune_metrics parameter to 1, will optimize the visual quality, it may not necessarily provide the best PSNR, SSIM or VMAF scores.

+
+
+

Latency

+

Through this parameter one has the ability to control the end to end delay, within a transcode pipeline. See Tuning Latency of Transcode Pipeline for more details. It is understood that typically allowing for more delay in a pipeline, results in a better visual quality, e.g., increasing the depth of the look ahead buffer, results in a higher score, for a given bit rate. This parameter is controlled -lookahead_depth. See FFmpeg Video Quality for example usage. Note that look ahead depth can be reduced to 15 frames with (limited) impact to video quality.

+
+
+

Preset

+

Speed preset determines the amount of time that is spent in encoding the incoming bit stream. This time in turn is determined by the number of encode optimization tools deployed, during the encoding process. Specifically, for this release, motion vector search range, Rate-Distortion Optimized Quantization (RDOQ) and other such tools are used to enhance the visual quality, at the expense of processing time. For example, -preset slow provides about 2% improvement, in terms of BD Rate, for AVC encoding, while decreasing the throughput by 20%. It should be noted that slow preset also increases the ULL mode latency, by 25%. See FFmpeg quality analysis examples for example usage. Note that the specific values noted in these example are the only ones that are recommended for usage.

+
+
+

GOP Composition

+

By default, the GOP structure of all AMD AMA encoders is configured to ensure optimal VQ. This implies that GOP topologies among different encoders may not be the same or the GOP itself may not have a homogeneous structure. As an example, while both AVC and HEVC encoders use hierarchical B frames, to further enhance AVC's VQ measure, unidirectional B frames that only reference prior anchor frames are also used. See -expert_option for how to turn this option off.

+
+
+

AV1 Type Selection

+

AMD AMA Video SDK offers 2 flavors of AV1 encoding: the default type 1 and type 2. For most use-cases, it is recommended to stay with the default value, as it not only provides better visual quality, but also provides per frame objective stats. However, given that these 2 encoders employ 2 independent pipelines if the primary concern is to increase the number of encoded streams, then addition of type 2 AV1 will increase the channel density.

+
+
+

Dynamic Encoder Parameters

+

Dynamic parameters are parameters which can be changed during runtime. This is useful to optimize video quality and compression rate for different segments of the video. This capability is supported for FFmpeg and GStreamer.

+

The following encoder parameters can be dynamically modified:

+
    +
  • Number of B frames (0 to 4)

  • +
  • Bitrate (0 to INT_MAX)

  • +
  • Temporal AQ mode (0 to 1)

  • +
  • Temporal AQ gain (0 to 255)

  • +
  • Spatial AQ mode (0 to 1)

  • +
  • Spatial AQ gain (0 to 255)

  • +
  • Min/Max QP (0-51)

  • +
+

When using FFmpeg or GStreamer, the encoder parameters which should be changed are specified in a configuration file as key-value pairs. This means that these key-value pairs must be known ahead of time.

+

Dynamic Parameters Considerations

+
    +
  • Recommended settings for dynamic B frames are:

    +
      +
    • 0 for gaming clips with fast motion, camera pan/rotation scenes

    • +
    • 2 for static or slow moving scenes, talking heads, or video conferencing type of content

    • +
    • 1 for all medium motion and all other content

    • +
    +
  • +
  • B frames changes do not happen at the exact frame number specified. Instead, the change comes into effect one or two frames from the actual frame number specified in the config file.

  • +
  • The maximum value for the number of B frames is the value configured at initilization

  • +
  • The configuration files for dynamic parameters must comply with the format specified above. Ill-formed files may result in unexpected behavior.

  • +
+

FFmpeg

+

Encoder parameters which should be changed dynamically are specified as key-value pairs in a configuration file. This configuration file is provided to FFmpeg using the -dynamic_params_file encoder option.

+

The -dynamic_params_file option is specific to an encoded output. For use cases with multiple encoded outputs (such as ABR ladders), each output can have its own -dynamic_params_file option and associated configuration file.

+

The configuration file should contain one line for each frame where one or more parameters are changed. Each line should start with the frame number followed by a list of key-value pairs for all the modified parameters:

+
<frameNumberN1>:<key1>=<value1>
+<frameNumberN2>:<key2>=<value2>,<key3>=<value3>
+
+
+

Below is a table listing the parameters which can be changed at runtime, the corresponding key and valid values.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Dynamic Parameter

Key

Valid Values

Number of B frames

NumB=<int>

0 to 4

Bitrate (in bits per second)

BRkbps=<int>

0 to INT_MAX

Temporal AQ mode

tAQ=<int>

0 to 1

Temporal AQ gain

tAQGain=<int>

0 to 255

Spatial AQ mode

sAQ=<int>

0 to 1

Spatial AQ gain

sAQGain=<int>

0 to 255

Min/Max QP

MinQP=<int>,MaxQP=<int>

0 to 51

+

Sample FFmpeg encode command:

+
ffmpeg -hwaccel ama -re -f lavfi -i testsrc=duration=60:size=1920x1080:rate=60,format=yuv420p -f rawvideo  -vf "hwupload" -c:v hevc_ama -b:v 5M  -dynamic_params_file ./param.txt -y -f rawvideo  output.h265
+
+
+

Sample configuration file for dynamic parameters:

+
300:NumB=1
+600:BRkbps=6000
+1200:sAQ=1,sAQGain=50
+1800:tAQ=1,tAQGain=50
+2400:NumB=0,BRkbps=10000,sAQ=0,sAQGain=50,tAQ=0
+5000:MinQP=30,MaxQP=35
+
+
+

GStreamer

+

Gstreamer uses the same formated configuration file as FFmpeg:

+
gst-launch-1.0 fakesrc sizetype=fixed sizemax=4147200 num-buffers=4000 ! capsfilter caps='video/x-raw' ! rawvideoparse width=1920 height=1080 format=i420 framerate=60/1 ! ama_upload ! ama_h265enc encoding-params-file=./param1.txt ! fakesink
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/unified_logging.html b/v1.1.1/unified_logging.html new file mode 100644 index 00000000..79a611a3 --- /dev/null +++ b/v1.1.1/unified_logging.html @@ -0,0 +1,416 @@ + + + + + + + + + + + + + + + Unified Logging — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Unified Logging
  • +
  • +
  • +
+
+
+
+
+ +
+

Unified Logging

+ +

Unified Logging (UL) utility is aimed at providing an identical logging output, configuration and interaction for different video frameworks provided by AMD AMA Video SDK. Three environmental variables LOG_AMA_CONFIG, LOG_AMA_FILTER and LOG_AMA_FILTER_PERF control interactions with UL. LOG_AMA_CONFIG variable controls the global setting of logging, which includes log destination, max size, log source info, and log levels. LOG_AMA_FILTER variable filters the global configuration and narrows down the logging output to specific software layer, accelerator type or level. LOG_AMA_FILTER_PERF variable controls the flow of performance related logs. The following sections describe the configuration parameters of each variable.

+
+

LOG_AMA_CONFIG

+

LOG_AMA_CONFIG is utilized as follows:

+
export LOG_AMA_CONFIG="[key=value | ...]"
+
+
+

, where key and value are defined as:

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key

value

Description

destination

console, file, syslog, release_preset or debug_preset

Determines the target destination of output logs.

+

console: Terminal output

+

file: Defaults to "async=1, max_size=10MB, location=log_ama_<pid>_<timestamp>.txt"

+

syslog: Defaults to "async=1, location=localhost, facility=LOCAL0"

+

release_preset: Shortcut for "destination=syslog, async=1 | log_level = WARN| perf_log=0 | debug_file_name=0 | debug_thread = 0 | debug_pid=0 | debug_time_stamp=0"

+

debug_preset: Shortcut for "destination=file, max_size=1GB | log_level = DEBUG | async=1 | perf_log=1 | debug_file_name=1 | debug_thread = 1 | debug_pid=1 | debug_time_stamp=1"

+

async refers to asynchronous mode of write operation

+

location refers to output path of logs

+

log_level

FATAL, ERROR, WARN, INFO, DEBUG, TRACE or ALL

Determines the log level.

+

Defaults to WARN

+

perf_log

0 or 1

Enables or disables performance measurements. If enabled, minimal information log level is set. Otherwise, log level is set by log_level.

+

Defaults to 0

+

debug_file_name

0 or 1

Enables or disables addition of log file names.

+

Defaults to 0

+

debug_file_line

0 or 1

Enables or disables inclusion of log line numbers.

+

Defaults to 0

+

debug_time_stamp

0 or 1

Enables or disables addition of timestamps.

+

Defaults to 0

+

debug_pid

0 or 1

Enables or disables reporting of process id.

+

Defaults to 0

+

debug_thread

0 or 1

Enables or disables reporting of thread id.

+

Defaults to 0

+
+
+
+

LOG_AMA_FILTER

+

LOG_AMA_FILTER is utilized as follows:

+
export LOG_AMA_FILTER="[LAYER.ACCEL=log_level | ...]"
+
+
+

, where LAYER and ACCEL are defined as:

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LAYER

Description

SDK

Any user space library

VPI

Video processing plugins

XMA

XMA library

FFMPEG

FFmpeg plugins

GST

Gstreamer plugins

GEN

General and common layers

XRM

XRM library

+ ++++ + + + + + + + + + + + + + + + + + + + +

ACCEL

Description

ABR

ABR ladder

DEC

Decoder

ENC

Encoder

GEN

General hardware logs

+
+
+

LOG_AMA_FILTER_PERF

+

LOG_AMA_FILTER_PERF is utilized as follows:

+
export LOG_AMA_FILTER_PERF="[LAYER.ACCEL=log_level | ...]"
+
+
+

, where LAYER and ACCEL are defined as above.

+
+
+

Examples

+
    +
  1. Send output to log_ama_<pid>_<timestamp>.txt file, and set log_level to warning:

    +
    export LOG_AMA_CONFIG="destination=file | log_level=WARN | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  2. +
  3. Send output to /tmp/log_ama.txt file, and set log_level to info:

    +
    export LOG_AMA_CONFIG="destination=file, location=/tmp/log_ama.txt | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  4. +
  5. Send output to /tmp/log_ama.txt file, and set log_level to info, with max log file size equal to 100MB:

    +
    export LOG_AMA_CONFIG="destination=file, max_size=100MB, location=/tmp/log_ama.txt | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  6. +
  7. Get output on console, with log_level set to info:

    +
    export LOG_AMA_CONFIG="destination=console | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  8. +
  9. Assume log_level was WARN in LOG_AMA_CONFIG, the following filter will additionally enable TRACE log level of VPI layer for ABR plugins:

    +
    export LOG_AMA_FILTER=" VPI.ABR=TRACE"
    +
    +
    +
  10. +
  11. If we want all layers logs for ABR:

    +
    export LOG_AMA_FILTER=" *.ABR=TRACE"
    +
    +
    +
  12. +
  13. If we want all layers logs for ABR & ENC:

    +
    export LOG_AMA_FILTER=" *.ABR=TRACE | *.ENC=TRACE"
    +
    +
    +
  14. +
  15. Force all logs to ERROR, and generate debug logs from SDK for ABR type:

    +
    export LOG_AMA_FILTER=" *.*=ERROR | *.ABR=DEBUG"
    +
    +
    +
  16. +
  17. Set performance logs to info level:

    +
    export LOG_AMA_CONFIG="destination=file, location=log_ama_perf.txt | log_level=WARN | perf_log=1"
    +
    +
    +
  18. +
  19. Set performance log level to DEBUG for ABR at SDK layer:

    +
    export LOG_AMA_FILTER_PERF="SDK.ABR=DEBUG"
    +
    +
    +
  20. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/using_ffmpeg.html b/v1.1.1/using_ffmpeg.html new file mode 100644 index 00000000..9980c50e --- /dev/null +++ b/v1.1.1/using_ffmpeg.html @@ -0,0 +1,1059 @@ + + + + + + + + + + + + + + + Using FFmpeg — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Using FFmpeg
  • +
  • +
  • +
+
+
+
+
+ +
+

Using FFmpeg

+

This page documents how to use FFmpeg with the AMD AMA Video SDK.

+ +
+

+
+
+

Introduction

+

FFmpeg is an industry standard, open source, widely used utility for handling video. FFmpeg has many capabilities, including encoding and decoding of all video compression formats, encoding and decoding of audio, encapsulating, and extracting audio, and video from transport streams, and many more. The AMD AMA Video SDK includes an enhanced version of FFmpeg, version n4.4, which communicates with the hardware accelerated transcode pipeline.

+

It is not within the scope of this document to provide an exhaustive guide on the usage of FFmpeg. Various resources can be found online, for example:

+ +

The following sections describe the options used with FFmpeg to configure the various hardware accelerators available on an MA35 device.

+
+

+
+
+

Example Commands

+

A simple FFmpeg command for accelerated transcoding with the AMD AMA Video SDK will look like this one:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i infile.mp4 -c:v hevc_ama -b:v 1000K -r 60 -f mp4 -y transcoded.mp4
+
+
+

There are many other ways in which FFmpeg can be used to leverage the video transcoding features of an MA35 device. Examples illustrating how to run FFmpeg for encoding, decoding, and transcoding with or without ABR scaling, video composition and ML are included in FFmpeg tutorials.

+
+

+
+
+
+

General FFmpeg Options

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options

Descriptions

+
+-i
+
+ +
+
Input video URI.
+
+
+
+-c:v
+
+ +
+
Specify the video codec
+
This option must be set for any video stream processed on an MA35 device.
+
Valid decode values are h264_ama, hevc_ama, and av1_ama for H.264, HEVC, and AV1, respectively.
+
Valid encode values are h264_ama, hevc_ama, and av1_ama for H.264, HEVC, and AV1, respectively.
+
+
+
+-s
+
+ +
+
The frame size (WidthxHeight). For example 1920x1080 or 3840x2160.
+
+
+
+-f
+
+ +
+
The container format.
+
+
+
+-r
+
+ +
+
The frame rate in fps (Hz).
+
+
+
+-filter_complex
+
+ +
+
Used for frame filtering operation.
+
Valid value is scaler_ama, for ABR scaler.
+
Consult MA35 Filters for more details on how to use this option.
+
+
+
+-hwaccel
+
+ +
+
Global option used to specify on which MA35 device the FFmpeg job should run. Consult Using Explicit Device IDs for more details on how to use this option. Valid values are positive integers in [0..N-1] range. Default is device 0.
+
+
+
+-vf
+
+ +
+
Specify DMA direction. Valid options are hwdownload and hwupload, for DMA transfer of data to and from the host, respectively. Note that transaction directions are with respect to the host.
+
+
+
+

Note

+

Detailed help for encoder, decoder and scaler is obtained through FFmpeg extended help, e.g. ffmpeg -h encoder=h264_ama, ffmpeg -h decoder=hevc_ama or ffmpeg -h filter=scaler_ama.

+
+

The following conventions are used in the following tables:

+
    +
  1. When parameters can be specified as both numerical and string values, they are noted as:

    +
    (<number>) <string>
    +
    +
    +

    Conversely, when this is not the case, options are noted with Roman numerals as:

    +
    <Roman numeral>) <option>
    +
    +
    +
  2. +
  3. auto or -1 note that values are selected by the SDK to optimally meet the specified constraints.

  4. +
+
+

+
+
+
+
+

Video Decoding

+

For the complete list of features and capabilities of the AMD AMA Video SDK decoder, refer to Release Notes chapter of the documentation.

+

The table below describes all the options for the AMD AMA Video SDK decoder.

+ ++++ + + + + + + + + + + + + + +

Options

Descriptions

+
+-out_fmt
+
+ +
+
Decoder output pixel format
+
Valid global values for pixel format: nv12, p010le, packed10, rgbp, yuv420p, and yuv420p10le.
+
Note that an identical pixel format must be specified as value to format option, within -vf. See Decode Only for an example.
+
+
+
+-low_latency
+
+ +
+
Enable/Disable single frame level decode
+
When enabled, the decoding latency of streams not containing any B frames is reduced. This option has no impact on streams that include B frames.
+
Valid values: 0 or 1. (default is 0)
+
+
(0) disable - default
+
(1) enable
+
+
+
+
+

+
+
+
+

Video Encoding

+

For the complete list of features and capabilities of the AMD AMA Video SDK encoder, refer to Release Notes chapter of the documentation.

+

The table below describes all the options for the AMD AMA Video SDK encoder.

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options

Descriptions

+
+-b:v
+
+ +
+
Specify the video bitrate
+
You can specify this in Mb or Kb. For example -b:v 1M or -b:v 1000K.
+
+
+
+-max_bitrate
+
+ +
+
Maximum bitrate
+
Valid values: 0 to 3.5e+10
+
You may want to use this to limit encoding bitrate if you have not specified a -b:v bitrate
+
Default value -1 implies unspecified.
+
+
+
+-g
+
+ +
+
GOP size
+
Valid values: 0 to UINT32_MAX
+
Default value is -1, implying 2[s] gop duration, i.e., twice the frame rate
+
+
+
+-level
+
+ +
+
Encoding level restriction
+
Valid values for H.264: 1, 1.1, 1.2, 1.3, 2, 2.1, 2.2, 3, 3.1, 3.2, 4, 4.1, 4.2, 5, 5.1, 5.2 6, 6.1, 6.2
+
Valid values for HEVC: 1, 2, 2.1, 3, 3.1, 4, 4.1, 5, 5.1,5.2, 6, 6.1, 6.2
+
Valid values for AV1: 2, 2.1, 3, 4, 4.1, 5, 5.1, 5.2, 5.3 6, 6.1, 6.2, 6.3
+
Default value is auto.
+
+
+
+-profile
+
+ +
+
Set the encoding profile
+
Valid values for H.264: baseline, main, high
+
Valid values for HEVC: main, main-intra, main-10 and main-10-intra
+
Valid values for AV1: main
+
Default value is auto.
+
+
+
+-tier
+
+ +
+
Set the encoding tier (AV1 and HEVC only)
+
Valid values: -1, 0, 1
+
+
(-1) auto
+
(0) main
+
(1) high
+
+
Default value is auto
+
+
+
+-bufsize
+
+ +
+
Rate Control (VBV) Buffer Size
+
Valid values: -1, 400M [bits] (default is -1)
+
+
(-1) For auto selection
+
+
This option is ignored unless:
+
+
1) lookahead_depth is 0 (ULL)
+
2) control_rate is CBR
+
3) Encoder is set to one of h264_ama, hevc_ama or av1_ama Type 2
+
+
Value 0 implies strict ULL, whereas, larger values imply relaxed ULL. See Latency Adjustment.
+
+
+
+-crf
+
+ +
+
Constant Rate Factor
+
Valid values: 0, 1 (default is 0)
+
+
(0) disable - default
+
(1) enable
+
+
This option uses -qp for its quality assignment.
+
Note that this option ignores all other options that may impose restrictions on qp values. These include -min_qp, -max_qp, -b:v, -max_bitrate and -control_mode.
+
+
+
+-qp
+
+ +
+
Quantization Parameter
+
Valid values for H.264 and HEVC 0-51
+
Valid values for AV1 0-255
+
Default value -1 implies not used. Note that if this option is used, it implies Constant QP for -control_rate option.
+
+
+
+-bf
+
+ +
+
Number of B frames
+
Valid values for H.264, HEVC and type-2 AV1: 0-3
+
Valid values for type-1 AV1: 0-7
+
Default auto selection value is -1.
+
+
+
+-lookahead_depth
+
+ +
+
Number of frames to lookahead for qp maps
+
Valid values: -1 to 50
+
Lookahead depth of 0 implies ULL mode
+
Default auto selection value, based on frame rate, is -1.
+
+
+
+-spatial_aq
+
+ +
+
Enable spatial AQ
+
Valid values: auto, disable or enable
+
+
(-1) auto
+
(0) disable
+
(1) enable
+
+
Default value is auto.
+
When qp_mode is uniform, this parameter is ignored and treated as disable.
+
+
+
+-spatial_aq_gain
+
+ +
+
Scale for spatial AQ gain
+
Valid values: 0 to 255
+
+
(255) For auto selection
+
+
Default value for H264, HEVC and AV1 is 64
+
Default value for type-1 AV1 is 72
+
+
+
+-temporal_aq
+
+ +
+
Enable temporal AQ
+
Valid values: auto, disable or enable
+
+
(-1) auto
+
(0) disable
+
(1) enable
+
+
Default value is auto.
+
+
When qp_mode is uniform, this parameter is ignored and treated as disable.
+
+
+
+
+-temporal_aq_gain
+
+ +
+
Scale for temporal AQ gain
+
Valid values: 0 to 255
+
+
(255) For auto selection
+
+
Default value for H264, HEVC and AV1 is 80
+
Default value for type-1 AV1 is 0
+
+
+
+-qp_mode
+
+ +
+
QP control mode
+
Valid values: auto, relative_load and uniform.
+
+
(0) auto for best VQ
+
(1) relative_load implying both spatial and temporal AQ
+
(2) uniform meaning no AQ
+
+
Default value is auto.
+
+
+
+-control_rate
+
+ +
+
Set the Rate Control mode
+
Valid values: -1 to 4
+
+
(-1) auto
+
(0) const_qp for Constant QP
+
(1) cbr for Constant Bitrate
+
(2) vbr for Variable Bitrate
+
(3) cvbr for Capped Variable Bitrate
+
(4) cabr for content adaptive bit-rate
+
+
Default value is auto.
+
+
+
+-min_qp
+
+ +
+
Minimum QP value allowed for rate control
+
Valid values for H264 and HEVC: 0 to 51
+
Valid values for AV1: 0 to 255
+
Default auto selection value is -1.
+
This option has no effect when -control_rate is set to Constant QP (0).
+
+
+
+-max_qp
+
+ +
+
Maximum QP value allowed for rate control
+
Valid values for H264 and HEVC: 0 to 51
+
Valid values for AV1: 0 to 255
+
Default auto selection value is -1.
+
This option has no effect when -control_rate is set to Constant QP (0).
+
+
+
+-forced_idr
+
+ +
+
Force insertion of IDR frames
+
Valid values: 0, 1 (default is 1)
+
+
(0) disable
+
(1) enable - default
+
+
Encodes all the intra frames as IDR
+
+
+
+-slice
+
+ +
+
Select a slice to run an encode job
+
Valid values if xrmd is not used are: 0, 1 (default is 0). If xrmd is active and this option is not set, xrmd will make the slice selection.
+
+
+
+-tune_metrics
+
+ +
+
Enable tuning video quality for the best objective metrics
+
This option optimizes the encoder for the selected tuning metric. See Tuning Video Quality for details.
+
Valid values: 1 to 4 (default is 1)
+
+
(1) vq - default
+
(2) psnr
+
(3) ssim
+
(4) vmaf
+
+
+
+
+-vsync
+
+ +
+
Add a vsync frame
+
Valid values: 0, 1 (default is 0)
+
Set this to 0 to prevent extra frames being added.
+
+
+
+-latency_logging
+
+ +
+
Log latency information to syslog
+
Valid values: enable and disable.
+
Default value is disable.
+
+
+
+-type
+
+ +
+
Applicable to AV1 encoders only
+
Valid values: 1 or 2.
+
+
i) 1 - default
+
ii) 2
+
+
Default value is 1.
+
Consult the AV1 Selection section for more details on how to use this option.
+
+
+
+-preset
+
+ +
+
Encoder VQ-Density preset
+
Valid values: fast, medium or slow. (default is medium)
+
+
(fast) Allows for increase in total throughput from 4kp60 to 4kp75 , when 2 or more channels are used. Does not apply to AV1 -type 1 encoding. Not applicable under ULL setting. Note lower VQ than medium preset is to be expected.
+
(medium) Full density with medium VQ - default
+
(slow) High VQ at lower density. Applicable to 10 bit contents only.
+
+
Consult the Tuning Video Quality section for more details on how to use this option.
+
+
+
+-dynamic_gop
+
+ +
+
Enable Dynamic GOP
+
Valid values: -1, 0 or 1.
+
+
(-1) auto
+
(0) disabled
+
(1) enable
+
+
Default value is auto.
+
+
+
+-dynamic_params_file
+
+ +
+
Dynamic Configuration File
+
Path to dynamic file location (default is empty)
+
Consult the Dynamic Encoder Parameters section for more details on how to use this option.
+
+
+
+-cores
+
+ +
+
AV1 Type 1 Cores
+
Valid values: 1 or 2
+
+
i) 1 - default, with minimum resolution of 176x144 or 144x176, and aggregate rate of 4kp60
+
ii) 2 - minimum resolution of 720x720, with with aggregate rate of 4kp120, in ULL mode
+
+
+
+
+-latency_ms
+
+ +
+
Look Ahead Depth in Milliseconds
+
Valid values: 0 to 60000
+
Default auto selection value, based on frame rate, is -1.
+
+
+
+-expert_option
+
+ +
+
Disable Low Latency B Frames (AVC only)
+
Valid value: bll=false
+
bll=false argument ensures that the generated GOP has a homogeneous structure. See GOP Composition.
+
+
+
+

+
+
+
+

Video Scaling

+

The AMD AMA Video SDK hardware scaler is leveraged in FFmpeg by using the scaler_ama complex filter and the FFmpeg filter graph syntax. This section describes the options of the scaler_ama complex filter.

+
+
+scaler_ama
+

Filter implementing the AMD AMA Video SDK ABR multiscaler. Takes one input and up to 16 output streams. The complete list of options is described below.

+
+ + + ++++ + + + + + + + + + + + + + + + + + + + +
Multiscale Filter Options

Options

Description

+
+-outputs
+
+ +
+
Specify the number of scaler outputs
+
Valid values are integers between 1 and desired number of outputs.
+
+
+
+-out_res
+
+ +
+
Specify ABR ladder rungs <1>*<16>(WxH|Rate|Format)
+
List of up to 16 tuples of form (Resolution|Rate|Pixel Format). Note that no spaces are allowed before or after |.
+
Valid values for resolution: 176x144 to 3840x2160 - default 1920x1080
+
Valid values for frame rate: half and full - default full, where full refers to the incoming frame rate and half to the half of the incoming frame rate.
+
Valid global values for pixel format: nv12, p010le, packed10, rgbp, yuv420p, and yuv420p10le
+
+
+
+-perf
+
+ +
+
Extract performance data
+
Valid values: 0 and 1 (default 0)
+
+
(0) disable - default
+
(1) enable
+
+
+
+
+-enable_pipeline
+
+ +
+
Enable pipelining to improve performance
+
Valid values: 0 and 1 (default 1)
+
+
(0) disable
+
(1) enable - default
+
+
Note that enabling this option adds 2 frames worth of latency to the pipeline.
+
+
+
+

+
+
+

Using the AMD AMA Video SDK Scaler Filter

+

The filter graph specification for the scaler_ama filter should be constructed in the following way:

+
    +
  • Add the scaler_ama filter to the graph

  • +
  • Set the number of scaler outputs

  • +
  • Set the width, height, pixel format and rate settings for each scaler output

  • +
  • Define the name each scaler output

  • +
  • If the outputs are not to encoded on the device, add -vf filters to the filter graph to copy the frames back to the host and convert them to AV frames.

  • +
+

The following example shows a complete command to decode, scale and encode to 4 different resolutions and 3 different encode formats, where the input is an H.264 file:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=4:out_res=(1920x1080)(1280x720)(720x480)(360x240) [a][b][c][d]" \
+-map '[a]' -c:v hevc_ama -b:v 6M -frames 1200 -f rawvideo -y /tmp/hevc_1080p.hevc \
+-map '[b]' -c:v av1_ama  -b:v 2M -frames 1200 -f rawvideo -y /tmp/av1_720p.av1 \
+-map '[c]' -c:v h264_ama -b:v 1M -frames 1200 -f rawvideo -y /tmp/h264_480p.h264 \
+-map '[d]' -c:v av1_ama  -b:v 1M -frames 1200 -f rawvideo -y /tmp/av1_240p.av1
+
+
+

This example can also be found in the FFmpeg introductory tutorials: Transcode With Multiple-Resolution Outputs.

+
+

+
+
+
+
+

Rebuilding FFmpeg

+
+

Section under construction.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/using_gstreamer.html b/v1.1.1/using_gstreamer.html new file mode 100644 index 00000000..a8c17e1c --- /dev/null +++ b/v1.1.1/using_gstreamer.html @@ -0,0 +1,906 @@ + + + + + + + + + + + + + + + Using GStreamer — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Using GStreamer
  • +
  • +
  • +
+
+
+
+
+ +
+

Using GStreamer

+ +
+

Introduction

+

GStreamer is a pipeline-based multimedia framework that links together a wide variety of media processing systems to complete complex workflows. The pipeline design serves as a base to create many types of multimedia applications such as video editors, transcoders, streaming media broadcasters and media players. The AMD AMA Video SDK includes an enhanced version of GStreamer which can communicate with the hardware accelerated transcode pipeline in AMD devices.

+

It is not within the scope of this document to provide an exhaustive guide on the usage of GStreamer. Various resources can be found online, for example:

+ +
+

Overview of the GStreamer Plugins

+

The AMD AMA Video SDK provides the following GStreamer plugins for building hardware-accelerated video pipelines using AMA compatible devices:

+
    +
  • ama_av1dec for av1 decoding

  • +
  • ama_av1enc for av1 encoding

  • +
  • ama_h264dec for h264 decoding

  • +
  • ama_h264enc for h264 encoding

  • +
  • ama_h265dec for h264 decoding

  • +
  • ama_h264enc for h265 encoding

  • +
  • ama_scaler for hardware accelerated scaling and color conversion

  • +
  • ama_download data download from device to host

  • +
  • ama_upload data upload from host to device

  • +
+

The following sections describe the options used with GStreamer to configure and use the various hardware accelerators available on AMA compatible devices.

+
+

+
+
+
+
+

Decoder Plugin

+

The ama_av1dec, ama_h264dec and ama_hevcdec plugins provide support for hardware-accelerated decoding using AMA compatible devices, for AV1, AVC and HEVC.

+
+

Decoder Inputs and Outputs

+
    +
  • Input: 8 or 10 bits AV1, AVC or HEVC encoded stream, in OBU format for AV1 or byte-stream format for AVC or HEVC

  • +
  • Output: One of NV12_4L4, NV12_10LE_4L4, I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB or BGR formats

  • +
+
+
+

Decoder Parameters

+ ++++ + + + + + + + + + + + + + +

Property Name

Description

+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Default Value: -1 (auto)
+
Range -1 to 2147483647
+
+
+
+low-latency
+
+ +
+
Whether to enable low latency decoding
+
Type: Boolean
+
Default Value: false
+
+
+
+
+

Decoder Example Pipelines

+

Refer to the Decoder Pipeline example for an illustration of how to use this plugin.

+
+
+
+

Encoder Plugin

+

The ama_av1enc, ama_h264enc and ama_h265enc plugins provide support for hardware-accelerated encoding using AMA compatible devices, for AV1, AVC and HEVC.

+
+

Encoder Inputs and Outputs

+
    +
  • Input: NV12_4L4, NV12_10LE_4L4, I420, I420_10LE, I420_10BE, NV12 or NV12_10LE32

  • +
  • Output: One of AV1, AVC or HEVC 8-bit/10-bit encoded stream, in OBU format for AV1 and byte-stream for AVC and HEVC

  • +
+
+
+

Encoder Parameters

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Property Name

Description

+
+b-frames
+
+ +
+
Number of B-frames between two consecutive P-frames
+
Type: Integer
+
Range: -1 - 7, for AV1
+
Range: -1 - 3, for AVC and HEVC
+
Default: -1 (auto)
+
+
+
+bitrate
+
+ +
+
Fixed output bitrate in bits per second
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 5000000
+
+
+
+crf
+
+ +
+
If specified, enable CRF mode
+
Type: Boolean
+
Default: False
+
+
+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+device-type
+
+ +
+
AV1 device type to use
+
Type: Enum
+
+
(0): any
+
(1): Type 1
+
(2): Type 2
+
+
Default: 1
+
+
+
+forced-idr
+
+ +
+
Encode all intra frames as IDR
+
Type: Boolean
+
Default: True
+
+
+
+gop-length
+
+ +
+
Maximum distance between two consecutive I frames
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+idr-interval
+
+ +
+
The periodicity of IDR frames
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 4294967295
+
+
+
+lookahead-depth
+
+ +
+
Number of frames in the future of the currently encoded frame that the encoder will analyze and take into account
+
Type: Integer
+
Range: 0 - 40
+
Default: -1 (auto)
+
+
+
+max-bitrate
+
+ +
+
Use to limit encoding bitrate if you have not specified bitrate parameter
+
Type: Integer
+
Range: 0 - 35000000000
+
Default: -1 (auto)
+
+
+
+max-qp
+
+ +
+
Maximum QP value allowed for the rate control
+
Type: Integer
+
Range: 0 - 51, for AVC and HEVC
+
Range: 0 - 255, for AV1
+
Default: 51, for AVC and HEVC
+
Default: 255, for AV1
+
+
+
+min-qp
+
+ +
+
Minimum QP value allowed for the rate control
+
Type: Integer
+
Range: 0 - 51, for AVC and HEVC
+
Range: 0 - 255, for AV1
+
Default: 0
+
+
+
+qp
+
+ +
+
Fixed quantization value. When constant quality is enabled, bitrate must be set to 0
+
Type: Integer
+
Range: -1 - 255
+
Default: -1 (disable)
+
+
+
+qp-mode
+
+ +
+
QP control mode.
+
Type: Enum
+
+
(0): auto - Auto
+
(1): relative-load - Relative load (spatial AQ + temporal AQ)
+
(2): uniform - Uniform (AQ off)
+
+
+
+
+rate-control
+
+ +
+
Rate control mode to use for encoding
+
Type: Enum
+
+
(-1): auto - Auto
+
(0): cqp - Constant QP
+
(1): cbr - Constant bitrate
+
(2): vbr - Variable bitrate
+
(3): cvbr - Constrained variable bitrate
+
(4): cabr - Content adaptive bitrate
+
+
+
+
+slice
+
+ +
+
Which slice of the XMA device to use
+
Type: Integer
+
Range: -1 - 1
+
Default: -1
+
+
+
+spatial-aq
+
+ +
+
Enable spatial AQ
+
Type: Boolean
+
Default: True
+
+
+
+spatial-aq-gain
+
+ +
+
Spatial AQ gain scale factor
+
Type: Integer
+
Range: 0 -255
+
Default: 255
+
+
+
+temporall-aq
+
+ +
+
Enable temporal AQ
+
Type: Boolean
+
Default: True
+
+
+
+temporal-aq-gain
+
+ +
+
Temporal AQ gain scale factor
+
Type: Integer
+
Range: 0 -255
+
Default: 255
+
Default: 1
+
+
+
+tier
+
+ +
+
Tier
+
Type: Boolean
+
+
(-1): auto - Auto
+
(0): main - Main
+
(1): high - High
+
+
+
+
+preset
+
+ +
+
Encoder VQ-Density preset
+
Valid values: medium or slow. (default is medium)
+
+
(medium) Full density with medium VQ - default
+
(fast) Allows for increase in total throughput from 4kp60 to 4kp75 , when 2 or more channels are used. Does not apply to AV1 -type 1 encoding. Not applicable under ULL setting. Note lower VQ than medium preset is to be expected.
+
(slow) High VQ at lower density
+
+
Consult the Tuning Video Quality section for more details on how to use this option.
+
Note that this option has no effects on AV1 device-type 1 encoding.
+
+
+
+tune-metrics
+
+ +
+
Tune VQ for objective metrics
+
Type: Enum
+
+
(1): vq - Best visual quality
+
(2): psnr - Best PSNR
+
(3): ssim - Best SSIM
+
(4): vmaf - Best VMA
+
+
+
+
+encoding-params-file
+
+ +
+
Dynamic Configuration File
+
Path to dynamic file location (default is empty)
+
Consult the Dynamic Encoder Parameters section for more details on how to use this option.
+
+
+
+latency-ms
+
+ +
+
Encoder latency in milliseconds that the encoder will analyze and take into account
+
Type: Integer
+
Range: -1 - 60000
+
Default: -1 (auto)
+
+
+
+
+

Encoder Example Pipelines

+

Refer to the Encoder Pipeline example for an illustration of how to use this plugin.

+
+

+
+
+
+
+

Scaler Plugin

+

The ama_scaler plugin provides support for hardware-accelerated resizing and cropping.

+
+

Scaler Inputs and Outputs

+
    +
  • Input: NV12_4L4, NV12_10LE_4L4, I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, and BGR

  • +
  • Output: NV12_4L4, NV12_10LE_4L4, I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, and BGR

  • +
+
+
+

Scaler Parameters

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +

Property Name

Description

+
+crop
+
+ +
+
Crop the input frame before scaling.
+
Type: Boolean
+
Default Value: false
+
+
+
+crop-height
+
+ +
+
Height of crop area. Must be < input height - crop-top and a multiple of 2
+
Type: Integer
+
Range: 0 - 2147483647
+
Default: 0
+
+
+
+crop-left
+
+ +
+
Left position of crop area. Must be < input width and a multiple of 2
+
Type: Integer
+
Range: 0 - 2147483647
+
Default: 0
+
+
+
+crop-top
+
+ +
+
Top position of crop area. Must be < input height and a multiple of 2
+
Type: Integer
+
Range: 0 - 2147483647
+
Default: 0
+
+
+
+crop-width
+
+ +
+
** Width of crop area. Must be < input width - crop-left and a multiple of 2**
+
Type: Integer
+
Range: 0 - 2147483647
+
Default: 0
+
+
+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+
+

Scaler Example Pipelines

+

Refer to the Transcode with Multiple-Resolution Outputs example for an illustration of how to use this plugin.

+
+
+
+

Hardware Down and Up Loads

+

The ama_download and ama_upload plugins provide support for DMA transfer of data to and from the host, respectively. Note that transaction directions are with respect to the host.

+
+

Inputs and Outputs

+
    +
  • Input: I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, BGR

  • +
  • Output: I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, BGR

  • +
+
+
+

DMA Parameters

+ ++++ + + + + + + + + + + +

Property Name

Description

+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+
+
+

Moving Data through the Pipeline

+

The GStreamer plugins included in the AMD AMA Video SDK take care of efficiently moving data through the video processing pipeline. For optimal performance, video buffers will be moved between the host and the appropriate device only if needed by plugins in the pipeline. This is known as "zero-copy".

+
    +
  • The decoder plugin will only copy the output buffer from the device to the host if a downstream element (e.g. filesink) running on the host needs to access the decoded frame. This allows downstream hardware-accelerated plugins (e.g. scaler, encoder) running on the same AMD device to process the decoded frames without unnecessary data transfers.

  • +
  • The encoder plugin will only copy the input buffer from host to the device if it is allocated in user-space memory on the host or in a different device. This allows the encoder to process frames produced by upstream hardware-accelerated plugins (e.g. decoder, scaler) running on the same AMD device without unnecessary data transfers.

  • +
+
+
+

Working with Multiple Devices

+

By default (if no device identifier is specified) a job is submitted to device 0. When running large jobs or multiple jobs in parallel, device 0 is bound to run out of resources rapidly and additional jobs will error out due to insufficient resources.

+

By using the device option of the GStreamer plugins included in the AMD AMA Video SDK, the different functions (decoder, scaler, encoder) of a pipeline can be individually submitted to a specific device. This makes it easy and straightforward to leverage the entire video acceleration capacity of your system, regardless of the number of cards and devices.

+
+
+

Rebuilding GStreamer and Application Examples

+
+

Section under construction.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.1/virtualization.html b/v1.1.1/virtualization.html new file mode 100644 index 00000000..08541ea0 --- /dev/null +++ b/v1.1.1/virtualization.html @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + Virtualization — AMD AMA 1.1.1 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Virtualization
  • +
  • +
  • +
+
+
+
+
+ +
+

Virtualization

+ +
+

Overview

+

AMA virtualization support allows for isolated interaction of clients' operating systems with AMA compatible cards, in Linux. Specifically, isolation is achieved by relying on I/O Memory Management Unit (IOMMU) and Single Root I/O virtualization (SR-IOV) technologies. As such, AMA virtualization support provides an efficient interaction path between client applications and AMA compatible cards. This section describes Linux virtualization setup.

+
+
+

Linux KVM

+

The following 2 sections, Linux Host and Linux VM Guest, describe both the host and VM guest required configurations.

+
+

Linux Host

+
    +
  1. Ensure that host system is setup as per On Premises.

  2. +
  3. Install CPU checker and KVM packages on the host. For an Ubuntu host, do the following:

    +
    sudo apt install -y cpu-checker qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
    +
    +
    +
  4. +
  5. Ensure that virtualization is enabled on the host:

    +
    lscpu | grep Virtualization
    +Virtualization:                  AMD-V
    +$ kvm-ok
    +INFO: /dev/kvm exists
    +KVM acceleration can be used
    +
    +
    +
  6. +
  7. If /etc/modules-load.d/ama_transcoder.conf doesn't exists, execute the following:

    +
    echo ama_transcoder | sudo tee /etc/modules-load.d/ama_transcoder.conf
    +
    +
    +
  8. +
  9. If /etc/modprobe.d/ama_transcoder.conf doesn't exists, execute the following:

    +
    echo 'install ama_transcoder /sbin/modprobe --ignore-install ama_transcoder && /opt/amd/ama/ma35/bin/mamgmt --force -d <DBDF> numvfs -v 1 && <REPEAT>' | sudo tee /etc/modprobe.d/ama_transcoder.conf
    +echo 'remove ama_transcoder /sbin/modprobe -r --ignore-install ama_transcoder; /opt/amd/ama/ma35/bin/mamgmt --force -d <DBDF> numvfs -v 0; <REPEAT>' | sudo tee -a /etc/modprobe.d/ama_transcoder.conf
    +
    +
    +

    , where DBDF is PCIe Domain:Bus:Device.Function designation of the device(s) and REPEAT indicates that the /opt/amd/ama/ma35/bin/mamgmt commands are to be repeated for all devices that are meant to be passed to a VM.

    +

    As an example, in a system with 2 cards:

    +
    lspci -d 10ee:
    +01:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +02:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +03:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +04:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +
    +
    +

    , in order to make one device, of each card, available to 2 distinct VMs, /etc/modprobe.d/ama_transcoder.conf will have the following content:

    +
    install ama_transcoder /sbin/modprobe --ignore-install ama_transcoder && /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:02:00.0 numvfs -v 1 && /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:04:00.0 numvfs -v 1
    +remove  ama_transcoder /sbin/modprobe --ignore-install ama_transcoder;   /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:02:00.0 numvfs -v 0;   /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:04:00.0 numvfs -v 0
    +
    +
    +
  10. +
  11. Reboot the host. After reboot execute and confirm the following:

    +
    lsmod | grep ama_transcoder
    +  ama_transcoder        831488  0
    +
    +
    +

    If the above returns empty, then insert the module manually, by sudo modprobe ama_transcoder. Otherwise, confirm that driver is properly configured:

    +
    cat /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
    +1
    +
    +$ lspci -d 10ee:
    +01:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +01:00.1 Multimedia controller: Xilinx Corporation Device 5071
    +...
    +
    +
    +

    The first command confirms that VM guest's Virtual Function (VF) that is associated with host's Physical Function (PF) is enabled and the second one confirms its creation. Note that this snippet assumes target device is 01.00.0.

    +
  12. +
  13. Setup KVM on the host and confirm that it is running:

    +
    sudo systemctl enable libvirtd
    +sudo systemctl start libvirtd
    +systemctl status libvirtd
    +libvirtd.service - Virtualization daemon
    +   Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
    +   Active: active (running) since Wed 2023-06-07 09:19:44 PDT; 7h ago
    +   ...
    +
    +
    +
  14. +
  15. Obtain Ubuntu 20.04 server image, from Ubuntu Focal Fossa.

  16. +
  17. Instantiate the VM guest, by allocating it at least 8 CPU cores and 12GB of RAM.

    +

    Check virt-install version:

    +
    virt-install --version
    +
    +
    +

    If it is 4.0.0 or above, execute the following:

    +
    sudo virt-install --name <VM name> \
    +--ram 12288 --vcpu 8 --virt-type kvm --machine q35 \
    +--disk path=<Path to qcow2 disk file>,size=128 \
    +--os-type linux --os-variant ubuntu20.04 --network network:default --graphics none --console pty,target_type=serial --extra-args "console=ttyS0" \
    +--location <Path to Ubuntu 20.04 ISO file>,kernel=casper/vmlinuz,initrd=casper/initrd \
    +--force --debug --features  apic=on,ioapic.driver=qemu --iommu model=intel,driver.intremap=on,driver.eim=on,driver.caching_mode=on --memorybacking hugepages.page.size=2,hugepages.page.unit=M,nosharepages=1,locked=1 \
    +--hostdev 0<xx>:00.1,driver.name=vfio
    +
    +
    +

    , where VM name is the name of the VM image and Path to qcow2 disk file is the path to VM's disk storage, which will be created. Note that this file will be owned by libvirt-qemu user and kvm group. Also, Path to Ubuntu 20.04 ISO file is the path to the downloaded ISO image and xx is part of DBDF designation as described above. Repeat this step for as many VMs that have been defined in /etc/modprobe.d/ama_transcoder.conf.

    +

    Otherwise, first create the VM without ioapic.driver and --iommu parameters:

    +
    sudo virt-install --name <VM name> \
    +--ram 12288 --vcpu 8 --virt-type kvm --machine q35 \
    +--disk path=<Path to qcow2 disk file>,size=128 \
    +--os-type linux --os-variant ubuntu20.04 --network network:default --graphics none --console pty,target_type=serial --extra-args "console=ttyS0" \
    +--location <Path to Ubuntu 20.04 ISO file>,kernel=casper/vmlinuz,initrd=casper/initrd \
    +--force --debug --hostdev 0<xx>:00.1,driver.name=vfio
    +
    +
    +

    and after VM creation add ioapic.driver and --iommu parameters, via virsh edit:

    +
    virsh edit <VM name>
    +<domain type='kvm'>
    +   ...
    +   <memoryBacking>
    +    <hugepages>
    +      <page size='2048' unit='KiB'/>
    +    </hugepages>
    +    <nosharepages/>
    +    <locked/>
    +  </memoryBacking>
    +   ...
    +   <features>
    +     <acpi/>
    +     <apic/>
    +     <vmport state='off'/>
    +     <ioapic driver='qemu'/>
    +   </features>
    + ...
    +   </rng>
    +   <iommu model='intel'>
    +     <driver intremap='on' caching_mode='on'/>
    +   </iommu>
    + </devices>
    +</domain>
    +
    +
    +

    During or after creation of a VM, it is helpful to install ssh server on the guest VM, in order to be able to connect to the instance:

    +
    sudo apt-get install openssh-server
    +
    +
    +

    (To find the IP address of the running VM, run sudo virsh net-dhcp-leases default or attach to the instance virsh --connect qemu:///system console <VM name> and issue the ip a command)

    +
  18. +
+
+
+

Linux VM Guest

+

On the running VM instance execute the following:

+
+
    +
  1. Set the huge table pages to 6GB, plus an extra 96 pages, i.e. 3072+96:

    +
    sudo sh -c "echo 'vm.nr_hugepages=3168' >> /etc/sysctl.conf"
    +
    +
    +
  2. +
  3. Note that if you are running 20.04 Server edition, you may need to install generic kernel 5.15, dkms and gcc-11:

  4. +
+
+
+
+
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
+sudo apt install -y gcc-11 linux-image-5.15.0-60-generic dkms build-essential linux-headers-5.15.0-60-generic
+
+
+
+
    +
  1. Reboot the VM

  2. +
  3. Install the AMD AMA Video SDK and run through Tutorials and Examples

  4. +
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/.buildinfo b/v1.1.2/.buildinfo new file mode 100644 index 00000000..d7532a0d --- /dev/null +++ b/v1.1.2/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 7af1040ff7169faa5bc7c4d3d7091cab +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/v1.1.2/.nojekyll b/v1.1.2/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/v1.1.2/_images/MA35D_VPU.png b/v1.1.2/_images/MA35D_VPU.png new file mode 100644 index 00000000..d55cabf6 Binary files /dev/null and b/v1.1.2/_images/MA35D_VPU.png differ diff --git a/v1.1.2/_images/MA35D_pipeline.png b/v1.1.2/_images/MA35D_pipeline.png new file mode 100644 index 00000000..fc17564b Binary files /dev/null and b/v1.1.2/_images/MA35D_pipeline.png differ diff --git a/v1.1.2/_images/gst_xabrladder.png b/v1.1.2/_images/gst_xabrladder.png new file mode 100644 index 00000000..75d9d2ba Binary files /dev/null and b/v1.1.2/_images/gst_xabrladder.png differ diff --git a/v1.1.2/_images/gst_xcompositor.png b/v1.1.2/_images/gst_xcompositor.png new file mode 100644 index 00000000..1848b6b3 Binary files /dev/null and b/v1.1.2/_images/gst_xcompositor.png differ diff --git a/v1.1.2/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css b/v1.1.2/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css new file mode 100644 index 00000000..eb19f698 --- /dev/null +++ b/v1.1.2/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/v1.1.2/_sphinx_design_static/design-tabs.js b/v1.1.2/_sphinx_design_static/design-tabs.js new file mode 100644 index 00000000..36b38cf0 --- /dev/null +++ b/v1.1.2/_sphinx_design_static/design-tabs.js @@ -0,0 +1,27 @@ +var sd_labels_by_text = {}; + +function ready() { + const li = document.getElementsByClassName("sd-tab-label"); + for (const label of li) { + syncId = label.getAttribute("data-sync-id"); + if (syncId) { + label.onclick = onLabelClick; + if (!sd_labels_by_text[syncId]) { + sd_labels_by_text[syncId] = []; + } + sd_labels_by_text[syncId].push(label); + } + } +} + +function onLabelClick() { + // Activate other inputs with the same sync id. + syncId = this.getAttribute("data-sync-id"); + for (label of sd_labels_by_text[syncId]) { + if (label === this) continue; + label.previousElementSibling.checked = true; + } + window.localStorage.setItem("sphinx-design-last-tab", syncId); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/v1.1.2/_static/_sphinx_javascript_frameworks_compat.js b/v1.1.2/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/v1.1.2/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/v1.1.2/_static/basic.css b/v1.1.2/_static/basic.css new file mode 100644 index 00000000..30fee9d0 --- /dev/null +++ b/v1.1.2/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/v1.1.2/_static/css/badge_only.css b/v1.1.2/_static/css/badge_only.css new file mode 100644 index 00000000..e380325b --- /dev/null +++ b/v1.1.2/_static/css/badge_only.css @@ -0,0 +1 @@ +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/v1.1.2/_static/css/fonts/Roboto-Slab-Bold.woff b/v1.1.2/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/v1.1.2/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/v1.1.2/_static/css/fonts/Roboto-Slab-Bold.woff2 b/v1.1.2/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/v1.1.2/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/v1.1.2/_static/css/fonts/Roboto-Slab-Regular.woff b/v1.1.2/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/v1.1.2/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/v1.1.2/_static/css/fonts/Roboto-Slab-Regular.woff2 b/v1.1.2/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/v1.1.2/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/v1.1.2/_static/css/fonts/fontawesome-webfont.eot b/v1.1.2/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/v1.1.2/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/v1.1.2/_static/css/fonts/fontawesome-webfont.svg b/v1.1.2/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/v1.1.2/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v1.1.2/_static/css/fonts/fontawesome-webfont.ttf b/v1.1.2/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/v1.1.2/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/v1.1.2/_static/css/fonts/fontawesome-webfont.woff b/v1.1.2/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/v1.1.2/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/v1.1.2/_static/css/fonts/fontawesome-webfont.woff2 b/v1.1.2/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/v1.1.2/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/v1.1.2/_static/css/fonts/lato-bold-italic.woff b/v1.1.2/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/v1.1.2/_static/css/fonts/lato-bold-italic.woff differ diff --git a/v1.1.2/_static/css/fonts/lato-bold-italic.woff2 b/v1.1.2/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/v1.1.2/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/v1.1.2/_static/css/fonts/lato-bold.woff b/v1.1.2/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/v1.1.2/_static/css/fonts/lato-bold.woff differ diff --git a/v1.1.2/_static/css/fonts/lato-bold.woff2 b/v1.1.2/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/v1.1.2/_static/css/fonts/lato-bold.woff2 differ diff --git a/v1.1.2/_static/css/fonts/lato-normal-italic.woff b/v1.1.2/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/v1.1.2/_static/css/fonts/lato-normal-italic.woff differ diff --git a/v1.1.2/_static/css/fonts/lato-normal-italic.woff2 b/v1.1.2/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/v1.1.2/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/v1.1.2/_static/css/fonts/lato-normal.woff b/v1.1.2/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/v1.1.2/_static/css/fonts/lato-normal.woff differ diff --git a/v1.1.2/_static/css/fonts/lato-normal.woff2 b/v1.1.2/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/v1.1.2/_static/css/fonts/lato-normal.woff2 differ diff --git a/v1.1.2/_static/css/theme.css b/v1.1.2/_static/css/theme.css new file mode 100644 index 00000000..2814741e --- /dev/null +++ b/v1.1.2/_static/css/theme.css @@ -0,0 +1,4771 @@ +html{ + box-sizing:border-box +} +*,:after,:before{ + box-sizing:inherit +} +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{ + display:block +} +audio,canvas,video{ + display:inline-block; + *display:inline; + *zoom:1 +} +[hidden],audio:not([controls]){ + display:none +} +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box +} +html{ + font-size:100%; + -webkit-text-size-adjust:100%; + -ms-text-size-adjust:100% +} +body{ + margin:0 +} +a:active,a:hover{ + outline:0 +} +abbr[title]{ + border-bottom:1px dotted +} +b,strong{ + font-weight:700 +} +blockquote{ + margin:0 +} +dfn{ + font-style:italic +} +ins{ + background:#ff9; + text-decoration:none +} +ins,mark{ + color:#000 +} +mark{ + background:#ff0; + font-style:italic; + font-weight:700 +} +.rst-content code,.rst-content tt,code,kbd,pre,samp{ + font-family:monospace,serif; + _font-family:courier new,monospace; + font-size:1em +} +pre{ + white-space:pre +} +q{ + quotes:none +} +q:after,q:before{ + content:""; + content:none +} +small{ + font-size:85% +} +sub,sup{ + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline +} +sup{ + top:-.5em +} +sub{ + bottom:-.25em +} +dl,ol,ul{ + margin:0; + padding:0; + list-style:none; + list-style-image:none +} +li{ + list-style:none +} +dd{ + margin:0 +} +img{ + border:0; + -ms-interpolation-mode:bicubic; + vertical-align:middle; + max-width:100% +} +svg:not(:root){ + overflow:hidden +} +figure,form{ + margin:0 +} +label{ + cursor:pointer +} +button,input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle +} +button,input{ + line-height:normal +} +button,input[type=button],input[type=reset],input[type=submit]{ + cursor:pointer; + -webkit-appearance:button; + *overflow:visible +} +button[disabled],input[disabled]{ + cursor:default +} +input[type=search]{ + -webkit-appearance:textfield; + -moz-box-sizing:content-box; + -webkit-box-sizing:content-box; + box-sizing:content-box +} +textarea{ + resize:vertical +} +table{ + border-collapse:collapse; + border-spacing:0 +} +td{ + vertical-align:top +} +.chromeframe{ + margin:.2em 0; + background:#ccc; + color:#000; + padding:.2em 0 +} +.ir{ + display:block; + border:0; + text-indent:-999em; + overflow:hidden; + background-color:transparent; + background-repeat:no-repeat; + text-align:left; + direction:ltr; + *line-height:0 +} +.ir br{ + display:none +} +.hidden{ + display:none!important; + visibility:hidden +} +.visuallyhidden{ + border:0; + clip:rect(0 0 0 0); + height:1px; + margin:-1px; + overflow:hidden; + padding:0; + position:absolute; + width:1px +} +.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{ + clip:auto; + height:auto; + margin:0; + overflow:visible; + position:static; + width:auto +} +.invisible{ + visibility:hidden +} +.relative{ + position:relative +} +big,small{ + font-size:100% +} +@media print{ + body,html,section{ + background:none!important + } + *{ + box-shadow:none!important; + text-shadow:none!important; + filter:none!important; + -ms-filter:none!important + } + a,a:visited{ + text-decoration:underline + } + .ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{ + content:"" + } + blockquote,pre{ + page-break-inside:avoid + } + thead{ + display:table-header-group + } + img,tr{ + page-break-inside:avoid + } + img{ + max-width:100%!important + } + @page{ + margin:.5cm + } + .rst-content .toctree-wrapper>p.caption,h2,h3,p{ + orphans:3; + widows:3 + } + .rst-content .toctree-wrapper>p.caption,h2,h3{ + page-break-after:avoid + } +} +.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{ + -webkit-font-smoothing:antialiased +} +/*! * Custome CSS styles for Xilinx GitHub Tutorials */ + p .footerinfo { + font-size:small; +} + footer .sphinxfooter{ + z-index:0; + background:#ffffff; +} + .sphinxhide { + display:none; +} + a:visited { + color: #9b59b6; +} + a:link { + color: blue; +} + .wy-nav-side a:hover { + color: white; +} + .headerlink { + padding-top: 60px; + margin-top: -50px; +} +/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ +@font-face{ + font-family:FontAwesome; + src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713); + src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg"); + font-weight:400; + font-style:normal +} +.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{ + display:inline-block; + font:normal normal normal 14px/1 FontAwesome; + font-size:inherit; + text-rendering:auto; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale +} +.fa-lg{ + font-size:1.33333em; + line-height:.75em; + vertical-align:-15% +} +.fa-2x{ + font-size:2em +} +.fa-3x{ + font-size:3em +} +.fa-4x{ + font-size:4em +} +.fa-5x{ + font-size:5em +} +.fa-fw{ + width:1.28571em; + text-align:center +} +.fa-ul{ + padding-left:0; + margin-left:2.14286em; + list-style-type:none +} +.fa-ul>li{ + position:relative +} +.fa-li{ + position:absolute; + left:-2.14286em; + width:2.14286em; + top:.14286em; + text-align:center +} +.fa-li.fa-lg{ + left:-1.85714em +} +.fa-border{ + padding:.2em .25em .15em; + border:.08em solid #eee; + border-radius:.1em +} +.fa-pull-left{ + float:left +} +.fa-pull-right{ + float:right +} +.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{ + margin-right:.3em +} +.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{ + margin-left:.3em +} +.pull-right{ + float:right +} +.pull-left{ + float:left +} +.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{ + margin-right:.3em +} +.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{ + margin-left:.3em +} +.fa-spin{ + -webkit-animation:fa-spin 2s linear infinite; + animation:fa-spin 2s linear infinite +} +.fa-pulse{ + -webkit-animation:fa-spin 1s steps(8) infinite; + animation:fa-spin 1s steps(8) infinite +} +@-webkit-keyframes fa-spin{ + 0%{ + -webkit-transform:rotate(0deg); + transform:rotate(0deg) + } + to{ + -webkit-transform:rotate(359deg); + transform:rotate(359deg) + } +} +@keyframes fa-spin{ + 0%{ + -webkit-transform:rotate(0deg); + transform:rotate(0deg) + } + to{ + -webkit-transform:rotate(359deg); + transform:rotate(359deg) + } +} +.fa-rotate-90{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform:rotate(90deg); + -ms-transform:rotate(90deg); + transform:rotate(90deg) +} +.fa-rotate-180{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform:rotate(180deg); + -ms-transform:rotate(180deg); + transform:rotate(180deg) +} +.fa-rotate-270{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform:rotate(270deg); + -ms-transform:rotate(270deg); + transform:rotate(270deg) +} +.fa-flip-horizontal{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform:scaleX(-1); + -ms-transform:scaleX(-1); + transform:scaleX(-1) +} +.fa-flip-vertical{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform:scaleY(-1); + -ms-transform:scaleY(-1); + transform:scaleY(-1) +} +:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{ + filter:none +} +.fa-stack{ + position:relative; + display:inline-block; + width:2em; + height:2em; + line-height:2em; + vertical-align:middle +} +.fa-stack-1x,.fa-stack-2x{ + position:absolute; + left:0; + width:100%; + text-align:center +} +.fa-stack-1x{ + line-height:inherit +} +.fa-stack-2x{ + font-size:2em +} +.fa-inverse{ + color:#fff +} +.fa-glass:before{ + content:"" +} +.fa-music:before{ + content:"" +} +.fa-search:before,.icon-search:before{ + content:"" +} +.fa-envelope-o:before{ + content:"" +} +.fa-heart:before{ + content:"" +} +.fa-star:before{ + content:"" +} +.fa-star-o:before{ + content:"" +} +.fa-user:before{ + content:"" +} +.fa-film:before{ + content:"" +} +.fa-th-large:before{ + content:"" +} +.fa-th:before{ + content:"" +} +.fa-th-list:before{ + content:"" +} +.fa-check:before{ + content:"" +} +.fa-close:before,.fa-remove:before,.fa-times:before{ + content:"" +} +.fa-search-plus:before{ + content:"" +} +.fa-search-minus:before{ + content:"" +} +.fa-power-off:before{ + content:"" +} +.fa-signal:before{ + content:"" +} +.fa-cog:before,.fa-gear:before{ + content:"" +} +.fa-trash-o:before{ + content:"" +} +.fa-home:before,.icon-home:before{ + content:"" +} +.fa-file-o:before{ + content:"" +} +.fa-clock-o:before{ + content:"" +} +.fa-road:before{ + content:"" +} +.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{ + content:"" +} +.fa-arrow-circle-o-down:before{ + content:"" +} +.fa-arrow-circle-o-up:before{ + content:"" +} +.fa-inbox:before{ + content:"" +} +.fa-play-circle-o:before{ + content:"" +} +.fa-repeat:before,.fa-rotate-right:before{ + content:"" +} +.fa-refresh:before{ + content:"" +} +.fa-list-alt:before{ + content:"" +} +.fa-lock:before{ + content:"" +} +.fa-flag:before{ + content:"" +} +.fa-headphones:before{ + content:"" +} +.fa-volume-off:before{ + content:"" +} +.fa-volume-down:before{ + content:"" +} +.fa-volume-up:before{ + content:"" +} +.fa-qrcode:before{ + content:"" +} +.fa-barcode:before{ + content:"" +} +.fa-tag:before{ + content:"" +} +.fa-tags:before{ + content:"" +} +.fa-book:before,.icon-book:before{ + content:"" +} +.fa-bookmark:before{ + content:"" +} +.fa-print:before{ + content:"" +} +.fa-camera:before{ + content:"" +} +.fa-font:before{ + content:"" +} +.fa-bold:before{ + content:"" +} +.fa-italic:before{ + content:"" +} +.fa-text-height:before{ + content:"" +} +.fa-text-width:before{ + content:"" +} +.fa-align-left:before{ + content:"" +} +.fa-align-center:before{ + content:"" +} +.fa-align-right:before{ + content:"" +} +.fa-align-justify:before{ + content:"" +} +.fa-list:before{ + content:"" +} +.fa-dedent:before,.fa-outdent:before{ + content:"" +} +.fa-indent:before{ + content:"" +} +.fa-video-camera:before{ + content:"" +} +.fa-image:before,.fa-photo:before,.fa-picture-o:before{ + content:"" +} +.fa-pencil:before{ + content:"" +} +.fa-map-marker:before{ + content:"" +} +.fa-adjust:before{ + content:"" +} +.fa-tint:before{ + content:"" +} +.fa-edit:before,.fa-pencil-square-o:before{ + content:"" +} +.fa-share-square-o:before{ + content:"" +} +.fa-check-square-o:before{ + content:"" +} +.fa-arrows:before{ + content:"" +} +.fa-step-backward:before{ + content:"" +} +.fa-fast-backward:before{ + content:"" +} +.fa-backward:before{ + content:"" +} +.fa-play:before{ + content:"" +} +.fa-pause:before{ + content:"" +} +.fa-stop:before{ + content:"" +} +.fa-forward:before{ + content:"" +} +.fa-fast-forward:before{ + content:"" +} +.fa-step-forward:before{ + content:"" +} +.fa-eject:before{ + content:"" +} +.fa-chevron-left:before{ + content:"" +} +.fa-chevron-right:before{ + content:"" +} +.fa-plus-circle:before{ + content:"" +} +.fa-minus-circle:before{ + content:"" +} +.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{ + content:"" +} +.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{ + content:"" +} +.fa-question-circle:before{ + content:"" +} +.fa-info-circle:before{ + content:"" +} +.fa-crosshairs:before{ + content:"" +} +.fa-times-circle-o:before{ + content:"" +} +.fa-check-circle-o:before{ + content:"" +} +.fa-ban:before{ + content:"" +} +.fa-arrow-left:before{ + content:"" +} +.fa-arrow-right:before{ + content:"" +} +.fa-arrow-up:before{ + content:"" +} +.fa-arrow-down:before{ + content:"" +} +.fa-mail-forward:before,.fa-share:before{ + content:"" +} +.fa-expand:before{ + content:"" +} +.fa-compress:before{ + content:"" +} +.fa-plus:before{ + content:"" +} +.fa-minus:before{ + content:"" +} +.fa-asterisk:before{ + content:"" +} +.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{ + content:"" +} +.fa-gift:before{ + content:"" +} +.fa-leaf:before{ + content:"" +} +.fa-fire:before,.icon-fire:before{ + content:"" +} +.fa-eye:before{ + content:"" +} +.fa-eye-slash:before{ + content:"" +} +.fa-exclamation-triangle:before,.fa-warning:before{ + content:"" +} +.fa-plane:before{ + content:"" +} +.fa-calendar:before{ + content:"" +} +.fa-random:before{ + content:"" +} +.fa-comment:before{ + content:"" +} +.fa-magnet:before{ + content:"" +} +.fa-chevron-up:before{ + content:"" +} +.fa-chevron-down:before{ + content:"" +} +.fa-retweet:before{ + content:"" +} +.fa-shopping-cart:before{ + content:"" +} +.fa-folder:before{ + content:"" +} +.fa-folder-open:before{ + content:"" +} +.fa-arrows-v:before{ + content:"" +} +.fa-arrows-h:before{ + content:"" +} +.fa-bar-chart-o:before,.fa-bar-chart:before{ + content:"" +} +.fa-twitter-square:before{ + content:"" +} +.fa-facebook-square:before{ + content:"" +} +.fa-camera-retro:before{ + content:"" +} +.fa-key:before{ + content:"" +} +.fa-cogs:before,.fa-gears:before{ + content:"" +} +.fa-comments:before{ + content:"" +} +.fa-thumbs-o-up:before{ + content:"" +} +.fa-thumbs-o-down:before{ + content:"" +} +.fa-star-half:before{ + content:"" +} +.fa-heart-o:before{ + content:"" +} +.fa-sign-out:before{ + content:"" +} +.fa-linkedin-square:before{ + content:"" +} +.fa-thumb-tack:before{ + content:"" +} +.fa-external-link:before{ + content:"" +} +.fa-sign-in:before{ + content:"" +} +.fa-trophy:before{ + content:"" +} +.fa-github-square:before{ + content:"" +} +.fa-upload:before{ + content:"" +} +.fa-lemon-o:before{ + content:"" +} +.fa-phone:before{ + content:"" +} +.fa-square-o:before{ + content:"" +} +.fa-bookmark-o:before{ + content:"" +} +.fa-phone-square:before{ + content:"" +} +.fa-twitter:before{ + content:"" +} +.fa-facebook-f:before,.fa-facebook:before{ + content:"" +} +.fa-github:before,.icon-github:before{ + content:"" +} +.fa-unlock:before{ + content:"" +} +.fa-credit-card:before{ + content:"" +} +.fa-feed:before,.fa-rss:before{ + content:"" +} +.fa-hdd-o:before{ + content:"" +} +.fa-bullhorn:before{ + content:"" +} +.fa-bell:before{ + content:"" +} +.fa-certificate:before{ + content:"" +} +.fa-hand-o-right:before{ + content:"" +} +.fa-hand-o-left:before{ + content:"" +} +.fa-hand-o-up:before{ + content:"" +} +.fa-hand-o-down:before{ + content:"" +} +.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{ + content:"" +} +.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{ + content:"" +} +.fa-arrow-circle-up:before{ + content:"" +} +.fa-arrow-circle-down:before{ + content:"" +} +.fa-globe:before{ + content:"" +} +.fa-wrench:before{ + content:"" +} +.fa-tasks:before{ + content:"" +} +.fa-filter:before{ + content:"" +} +.fa-briefcase:before{ + content:"" +} +.fa-arrows-alt:before{ + content:"" +} +.fa-group:before,.fa-users:before{ + content:"" +} +.fa-chain:before,.fa-link:before,.icon-link:before{ + content:"" +} +.fa-cloud:before{ + content:"" +} +.fa-flask:before{ + content:"" +} +.fa-cut:before,.fa-scissors:before{ + content:"" +} +.fa-copy:before,.fa-files-o:before{ + content:"" +} +.fa-paperclip:before{ + content:"" +} +.fa-floppy-o:before,.fa-save:before{ + content:"" +} +.fa-square:before{ + content:"" +} +.fa-bars:before,.fa-navicon:before,.fa-reorder:before{ + content:"" +} +.fa-list-ul:before{ + content:"" +} +.fa-list-ol:before{ + content:"" +} +.fa-strikethrough:before{ + content:"" +} +.fa-underline:before{ + content:"" +} +.fa-table:before{ + content:"" +} +.fa-magic:before{ + content:"" +} +.fa-truck:before{ + content:"" +} +.fa-pinterest:before{ + content:"" +} +.fa-pinterest-square:before{ + content:"" +} +.fa-google-plus-square:before{ + content:"" +} +.fa-google-plus:before{ + content:"" +} +.fa-money:before{ + content:"" +} +.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{ + content:"" +} +.fa-caret-up:before{ + content:"" +} +.fa-caret-left:before{ + content:"" +} +.fa-caret-right:before{ + content:"" +} +.fa-columns:before{ + content:"" +} +.fa-sort:before,.fa-unsorted:before{ + content:"" +} +.fa-sort-desc:before,.fa-sort-down:before{ + content:"" +} +.fa-sort-asc:before,.fa-sort-up:before{ + content:"" +} +.fa-envelope:before{ + content:"" +} +.fa-linkedin:before{ + content:"" +} +.fa-rotate-left:before,.fa-undo:before{ + content:"" +} +.fa-gavel:before,.fa-legal:before{ + content:"" +} +.fa-dashboard:before,.fa-tachometer:before{ + content:"" +} +.fa-comment-o:before{ + content:"" +} +.fa-comments-o:before{ + content:"" +} +.fa-bolt:before,.fa-flash:before{ + content:"" +} +.fa-sitemap:before{ + content:"" +} +.fa-umbrella:before{ + content:"" +} +.fa-clipboard:before,.fa-paste:before{ + content:"" +} +.fa-lightbulb-o:before{ + content:"" +} +.fa-exchange:before{ + content:"" +} +.fa-cloud-download:before{ + content:"" +} +.fa-cloud-upload:before{ + content:"" +} +.fa-user-md:before{ + content:"" +} +.fa-stethoscope:before{ + content:"" +} +.fa-suitcase:before{ + content:"" +} +.fa-bell-o:before{ + content:"" +} +.fa-coffee:before{ + content:"" +} +.fa-cutlery:before{ + content:"" +} +.fa-file-text-o:before{ + content:"" +} +.fa-building-o:before{ + content:"" +} +.fa-hospital-o:before{ + content:"" +} +.fa-ambulance:before{ + content:"" +} +.fa-medkit:before{ + content:"" +} +.fa-fighter-jet:before{ + content:"" +} +.fa-beer:before{ + content:"" +} +.fa-h-square:before{ + content:"" +} +.fa-plus-square:before{ + content:"" +} +.fa-angle-double-left:before{ + content:"" +} +.fa-angle-double-right:before{ + content:"" +} +.fa-angle-double-up:before{ + content:"" +} +.fa-angle-double-down:before{ + content:"" +} +.fa-angle-left:before{ + content:"" +} +.fa-angle-right:before{ + content:"" +} +.fa-angle-up:before{ + content:"" +} +.fa-angle-down:before{ + content:"" +} +.fa-desktop:before{ + content:"" +} +.fa-laptop:before{ + content:"" +} +.fa-tablet:before{ + content:"" +} +.fa-mobile-phone:before,.fa-mobile:before{ + content:"" +} +.fa-circle-o:before{ + content:"" +} +.fa-quote-left:before{ + content:"" +} +.fa-quote-right:before{ + content:"" +} +.fa-spinner:before{ + content:"" +} +.fa-circle:before{ + content:"" +} +.fa-mail-reply:before,.fa-reply:before{ + content:"" +} +.fa-github-alt:before{ + content:"" +} +.fa-folder-o:before{ + content:"" +} +.fa-folder-open-o:before{ + content:"" +} +.fa-smile-o:before{ + content:"" +} +.fa-frown-o:before{ + content:"" +} +.fa-meh-o:before{ + content:"" +} +.fa-gamepad:before{ + content:"" +} +.fa-keyboard-o:before{ + content:"" +} +.fa-flag-o:before{ + content:"" +} +.fa-flag-checkered:before{ + content:"" +} +.fa-terminal:before{ + content:"" +} +.fa-code:before{ + content:"" +} +.fa-mail-reply-all:before,.fa-reply-all:before{ + content:"" +} +.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{ + content:"" +} +.fa-location-arrow:before{ + content:"" +} +.fa-crop:before{ + content:"" +} +.fa-code-fork:before{ + content:"" +} +.fa-chain-broken:before,.fa-unlink:before{ + content:"" +} +.fa-question:before{ + content:"" +} +.fa-info:before{ + content:"" +} +.fa-exclamation:before{ + content:"" +} +.fa-superscript:before{ + content:"" +} +.fa-subscript:before{ + content:"" +} +.fa-eraser:before{ + content:"" +} +.fa-puzzle-piece:before{ + content:"" +} +.fa-microphone:before{ + content:"" +} +.fa-microphone-slash:before{ + content:"" +} +.fa-shield:before{ + content:"" +} +.fa-calendar-o:before{ + content:"" +} +.fa-fire-extinguisher:before{ + content:"" +} +.fa-rocket:before{ + content:"" +} +.fa-maxcdn:before{ + content:"" +} +.fa-chevron-circle-left:before{ + content:"" +} +.fa-chevron-circle-right:before{ + content:"" +} +.fa-chevron-circle-up:before{ + content:"" +} +.fa-chevron-circle-down:before{ + content:"" +} +.fa-html5:before{ + content:"" +} +.fa-css3:before{ + content:"" +} +.fa-anchor:before{ + content:"" +} +.fa-unlock-alt:before{ + content:"" +} +.fa-bullseye:before{ + content:"" +} +.fa-ellipsis-h:before{ + content:"" +} +.fa-ellipsis-v:before{ + content:"" +} +.fa-rss-square:before{ + content:"" +} +.fa-play-circle:before{ + content:"" +} +.fa-ticket:before{ + content:"" +} +.fa-minus-square:before{ + content:"" +} +.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{ + content:"" +} +.fa-level-up:before{ + content:"" +} +.fa-level-down:before{ + content:"" +} +.fa-check-square:before{ + content:"" +} +.fa-pencil-square:before{ + content:"" +} +.fa-external-link-square:before{ + content:"" +} +.fa-share-square:before{ + content:"" +} +.fa-compass:before{ + content:"" +} +.fa-caret-square-o-down:before,.fa-toggle-down:before{ + content:"" +} +.fa-caret-square-o-up:before,.fa-toggle-up:before{ + content:"" +} +.fa-caret-square-o-right:before,.fa-toggle-right:before{ + content:"" +} +.fa-eur:before,.fa-euro:before{ + content:"" +} +.fa-gbp:before{ + content:"" +} +.fa-dollar:before,.fa-usd:before{ + content:"" +} +.fa-inr:before,.fa-rupee:before{ + content:"" +} +.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{ + content:"" +} +.fa-rouble:before,.fa-rub:before,.fa-ruble:before{ + content:"" +} +.fa-krw:before,.fa-won:before{ + content:"" +} +.fa-bitcoin:before,.fa-btc:before{ + content:"" +} +.fa-file:before{ + content:"" +} +.fa-file-text:before{ + content:"" +} +.fa-sort-alpha-asc:before{ + content:"" +} +.fa-sort-alpha-desc:before{ + content:"" +} +.fa-sort-amount-asc:before{ + content:"" +} +.fa-sort-amount-desc:before{ + content:"" +} +.fa-sort-numeric-asc:before{ + content:"" +} +.fa-sort-numeric-desc:before{ + content:"" +} +.fa-thumbs-up:before{ + content:"" +} +.fa-thumbs-down:before{ + content:"" +} +.fa-youtube-square:before{ + content:"" +} +.fa-youtube:before{ + content:"" +} +.fa-xing:before{ + content:"" +} +.fa-xing-square:before{ + content:"" +} +.fa-youtube-play:before{ + content:"" +} +.fa-dropbox:before{ + content:"" +} +.fa-stack-overflow:before{ + content:"" +} +.fa-instagram:before{ + content:"" +} +.fa-flickr:before{ + content:"" +} +.fa-adn:before{ + content:"" +} +.fa-bitbucket:before,.icon-bitbucket:before{ + content:"" +} +.fa-bitbucket-square:before{ + content:"" +} +.fa-tumblr:before{ + content:"" +} +.fa-tumblr-square:before{ + content:"" +} +.fa-long-arrow-down:before{ + content:"" +} +.fa-long-arrow-up:before{ + content:"" +} +.fa-long-arrow-left:before{ + content:"" +} +.fa-long-arrow-right:before{ + content:"" +} +.fa-apple:before{ + content:"" +} +.fa-windows:before{ + content:"" +} +.fa-android:before{ + content:"" +} +.fa-linux:before{ + content:"" +} +.fa-dribbble:before{ + content:"" +} +.fa-skype:before{ + content:"" +} +.fa-foursquare:before{ + content:"" +} +.fa-trello:before{ + content:"" +} +.fa-female:before{ + content:"" +} +.fa-male:before{ + content:"" +} +.fa-gittip:before,.fa-gratipay:before{ + content:"" +} +.fa-sun-o:before{ + content:"" +} +.fa-moon-o:before{ + content:"" +} +.fa-archive:before{ + content:"" +} +.fa-bug:before{ + content:"" +} +.fa-vk:before{ + content:"" +} +.fa-weibo:before{ + content:"" +} +.fa-renren:before{ + content:"" +} +.fa-pagelines:before{ + content:"" +} +.fa-stack-exchange:before{ + content:"" +} +.fa-arrow-circle-o-right:before{ + content:"" +} +.fa-arrow-circle-o-left:before{ + content:"" +} +.fa-caret-square-o-left:before,.fa-toggle-left:before{ + content:"" +} +.fa-dot-circle-o:before{ + content:"" +} +.fa-wheelchair:before{ + content:"" +} +.fa-vimeo-square:before{ + content:"" +} +.fa-try:before,.fa-turkish-lira:before{ + content:"" +} +.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{ + content:"" +} +.fa-space-shuttle:before{ + content:"" +} +.fa-slack:before{ + content:"" +} +.fa-envelope-square:before{ + content:"" +} +.fa-wordpress:before{ + content:"" +} +.fa-openid:before{ + content:"" +} +.fa-bank:before,.fa-institution:before,.fa-university:before{ + content:"" +} +.fa-graduation-cap:before,.fa-mortar-board:before{ + content:"" +} +.fa-yahoo:before{ + content:"" +} +.fa-google:before{ + content:"" +} +.fa-reddit:before{ + content:"" +} +.fa-reddit-square:before{ + content:"" +} +.fa-stumbleupon-circle:before{ + content:"" +} +.fa-stumbleupon:before{ + content:"" +} +.fa-delicious:before{ + content:"" +} +.fa-digg:before{ + content:"" +} +.fa-pied-piper-pp:before{ + content:"" +} +.fa-pied-piper-alt:before{ + content:"" +} +.fa-drupal:before{ + content:"" +} +.fa-joomla:before{ + content:"" +} +.fa-language:before{ + content:"" +} +.fa-fax:before{ + content:"" +} +.fa-building:before{ + content:"" +} +.fa-child:before{ + content:"" +} +.fa-paw:before{ + content:"" +} +.fa-spoon:before{ + content:"" +} +.fa-cube:before{ + content:"" +} +.fa-cubes:before{ + content:"" +} +.fa-behance:before{ + content:"" +} +.fa-behance-square:before{ + content:"" +} +.fa-steam:before{ + content:"" +} +.fa-steam-square:before{ + content:"" +} +.fa-recycle:before{ + content:"" +} +.fa-automobile:before,.fa-car:before{ + content:"" +} +.fa-cab:before,.fa-taxi:before{ + content:"" +} +.fa-tree:before{ + content:"" +} +.fa-spotify:before{ + content:"" +} +.fa-deviantart:before{ + content:"" +} +.fa-soundcloud:before{ + content:"" +} +.fa-database:before{ + content:"" +} +.fa-file-pdf-o:before{ + content:"" +} +.fa-file-word-o:before{ + content:"" +} +.fa-file-excel-o:before{ + content:"" +} +.fa-file-powerpoint-o:before{ + content:"" +} +.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{ + content:"" +} +.fa-file-archive-o:before,.fa-file-zip-o:before{ + content:"" +} +.fa-file-audio-o:before,.fa-file-sound-o:before{ + content:"" +} +.fa-file-movie-o:before,.fa-file-video-o:before{ + content:"" +} +.fa-file-code-o:before{ + content:"" +} +.fa-vine:before{ + content:"" +} +.fa-codepen:before{ + content:"" +} +.fa-jsfiddle:before{ + content:"" +} +.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{ + content:"" +} +.fa-circle-o-notch:before{ + content:"" +} +.fa-ra:before,.fa-rebel:before,.fa-resistance:before{ + content:"" +} +.fa-empire:before,.fa-ge:before{ + content:"" +} +.fa-git-square:before{ + content:"" +} +.fa-git:before{ + content:"" +} +.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{ + content:"" +} +.fa-tencent-weibo:before{ + content:"" +} +.fa-qq:before{ + content:"" +} +.fa-wechat:before,.fa-weixin:before{ + content:"" +} +.fa-paper-plane:before,.fa-send:before{ + content:"" +} +.fa-paper-plane-o:before,.fa-send-o:before{ + content:"" +} +.fa-history:before{ + content:"" +} +.fa-circle-thin:before{ + content:"" +} +.fa-header:before{ + content:"" +} +.fa-paragraph:before{ + content:"" +} +.fa-sliders:before{ + content:"" +} +.fa-share-alt:before{ + content:"" +} +.fa-share-alt-square:before{ + content:"" +} +.fa-bomb:before{ + content:"" +} +.fa-futbol-o:before,.fa-soccer-ball-o:before{ + content:"" +} +.fa-tty:before{ + content:"" +} +.fa-binoculars:before{ + content:"" +} +.fa-plug:before{ + content:"" +} +.fa-slideshare:before{ + content:"" +} +.fa-twitch:before{ + content:"" +} +.fa-yelp:before{ + content:"" +} +.fa-newspaper-o:before{ + content:"" +} +.fa-wifi:before{ + content:"" +} +.fa-calculator:before{ + content:"" +} +.fa-paypal:before{ + content:"" +} +.fa-google-wallet:before{ + content:"" +} +.fa-cc-visa:before{ + content:"" +} +.fa-cc-mastercard:before{ + content:"" +} +.fa-cc-discover:before{ + content:"" +} +.fa-cc-amex:before{ + content:"" +} +.fa-cc-paypal:before{ + content:"" +} +.fa-cc-stripe:before{ + content:"" +} +.fa-bell-slash:before{ + content:"" +} +.fa-bell-slash-o:before{ + content:"" +} +.fa-trash:before{ + content:"" +} +.fa-copyright:before{ + content:"" +} +.fa-at:before{ + content:"" +} +.fa-eyedropper:before{ + content:"" +} +.fa-paint-brush:before{ + content:"" +} +.fa-birthday-cake:before{ + content:"" +} +.fa-area-chart:before{ + content:"" +} +.fa-pie-chart:before{ + content:"" +} +.fa-line-chart:before{ + content:"" +} +.fa-lastfm:before{ + content:"" +} +.fa-lastfm-square:before{ + content:"" +} +.fa-toggle-off:before{ + content:"" +} +.fa-toggle-on:before{ + content:"" +} +.fa-bicycle:before{ + content:"" +} +.fa-bus:before{ + content:"" +} +.fa-ioxhost:before{ + content:"" +} +.fa-angellist:before{ + content:"" +} +.fa-cc:before{ + content:"" +} +.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{ + content:"" +} +.fa-meanpath:before{ + content:"" +} +.fa-buysellads:before{ + content:"" +} +.fa-connectdevelop:before{ + content:"" +} +.fa-dashcube:before{ + content:"" +} +.fa-forumbee:before{ + content:"" +} +.fa-leanpub:before{ + content:"" +} +.fa-sellsy:before{ + content:"" +} +.fa-shirtsinbulk:before{ + content:"" +} +.fa-simplybuilt:before{ + content:"" +} +.fa-skyatlas:before{ + content:"" +} +.fa-cart-plus:before{ + content:"" +} +.fa-cart-arrow-down:before{ + content:"" +} +.fa-diamond:before{ + content:"" +} +.fa-ship:before{ + content:"" +} +.fa-user-secret:before{ + content:"" +} +.fa-motorcycle:before{ + content:"" +} +.fa-street-view:before{ + content:"" +} +.fa-heartbeat:before{ + content:"" +} +.fa-venus:before{ + content:"" +} +.fa-mars:before{ + content:"" +} +.fa-mercury:before{ + content:"" +} +.fa-intersex:before,.fa-transgender:before{ + content:"" +} +.fa-transgender-alt:before{ + content:"" +} +.fa-venus-double:before{ + content:"" +} +.fa-mars-double:before{ + content:"" +} +.fa-venus-mars:before{ + content:"" +} +.fa-mars-stroke:before{ + content:"" +} +.fa-mars-stroke-v:before{ + content:"" +} +.fa-mars-stroke-h:before{ + content:"" +} +.fa-neuter:before{ + content:"" +} +.fa-genderless:before{ + content:"" +} +.fa-facebook-official:before{ + content:"" +} +.fa-pinterest-p:before{ + content:"" +} +.fa-whatsapp:before{ + content:"" +} +.fa-server:before{ + content:"" +} +.fa-user-plus:before{ + content:"" +} +.fa-user-times:before{ + content:"" +} +.fa-bed:before,.fa-hotel:before{ + content:"" +} +.fa-viacoin:before{ + content:"" +} +.fa-train:before{ + content:"" +} +.fa-subway:before{ + content:"" +} +.fa-medium:before{ + content:"" +} +.fa-y-combinator:before,.fa-yc:before{ + content:"" +} +.fa-optin-monster:before{ + content:"" +} +.fa-opencart:before{ + content:"" +} +.fa-expeditedssl:before{ + content:"" +} +.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{ + content:"" +} +.fa-battery-3:before,.fa-battery-three-quarters:before{ + content:"" +} +.fa-battery-2:before,.fa-battery-half:before{ + content:"" +} +.fa-battery-1:before,.fa-battery-quarter:before{ + content:"" +} +.fa-battery-0:before,.fa-battery-empty:before{ + content:"" +} +.fa-mouse-pointer:before{ + content:"" +} +.fa-i-cursor:before{ + content:"" +} +.fa-object-group:before{ + content:"" +} +.fa-object-ungroup:before{ + content:"" +} +.fa-sticky-note:before{ + content:"" +} +.fa-sticky-note-o:before{ + content:"" +} +.fa-cc-jcb:before{ + content:"" +} +.fa-cc-diners-club:before{ + content:"" +} +.fa-clone:before{ + content:"" +} +.fa-balance-scale:before{ + content:"" +} +.fa-hourglass-o:before{ + content:"" +} +.fa-hourglass-1:before,.fa-hourglass-start:before{ + content:"" +} +.fa-hourglass-2:before,.fa-hourglass-half:before{ + content:"" +} +.fa-hourglass-3:before,.fa-hourglass-end:before{ + content:"" +} +.fa-hourglass:before{ + content:"" +} +.fa-hand-grab-o:before,.fa-hand-rock-o:before{ + content:"" +} +.fa-hand-paper-o:before,.fa-hand-stop-o:before{ + content:"" +} +.fa-hand-scissors-o:before{ + content:"" +} +.fa-hand-lizard-o:before{ + content:"" +} +.fa-hand-spock-o:before{ + content:"" +} +.fa-hand-pointer-o:before{ + content:"" +} +.fa-hand-peace-o:before{ + content:"" +} +.fa-trademark:before{ + content:"" +} +.fa-registered:before{ + content:"" +} +.fa-creative-commons:before{ + content:"" +} +.fa-gg:before{ + content:"" +} +.fa-gg-circle:before{ + content:"" +} +.fa-tripadvisor:before{ + content:"" +} +.fa-odnoklassniki:before{ + content:"" +} +.fa-odnoklassniki-square:before{ + content:"" +} +.fa-get-pocket:before{ + content:"" +} +.fa-wikipedia-w:before{ + content:"" +} +.fa-safari:before{ + content:"" +} +.fa-chrome:before{ + content:"" +} +.fa-firefox:before{ + content:"" +} +.fa-opera:before{ + content:"" +} +.fa-internet-explorer:before{ + content:"" +} +.fa-television:before,.fa-tv:before{ + content:"" +} +.fa-contao:before{ + content:"" +} +.fa-500px:before{ + content:"" +} +.fa-amazon:before{ + content:"" +} +.fa-calendar-plus-o:before{ + content:"" +} +.fa-calendar-minus-o:before{ + content:"" +} +.fa-calendar-times-o:before{ + content:"" +} +.fa-calendar-check-o:before{ + content:"" +} +.fa-industry:before{ + content:"" +} +.fa-map-pin:before{ + content:"" +} +.fa-map-signs:before{ + content:"" +} +.fa-map-o:before{ + content:"" +} +.fa-map:before{ + content:"" +} +.fa-commenting:before{ + content:"" +} +.fa-commenting-o:before{ + content:"" +} +.fa-houzz:before{ + content:"" +} +.fa-vimeo:before{ + content:"" +} +.fa-black-tie:before{ + content:"" +} +.fa-fonticons:before{ + content:"" +} +.fa-reddit-alien:before{ + content:"" +} +.fa-edge:before{ + content:"" +} +.fa-credit-card-alt:before{ + content:"" +} +.fa-codiepie:before{ + content:"" +} +.fa-modx:before{ + content:"" +} +.fa-fort-awesome:before{ + content:"" +} +.fa-usb:before{ + content:"" +} +.fa-product-hunt:before{ + content:"" +} +.fa-mixcloud:before{ + content:"" +} +.fa-scribd:before{ + content:"" +} +.fa-pause-circle:before{ + content:"" +} +.fa-pause-circle-o:before{ + content:"" +} +.fa-stop-circle:before{ + content:"" +} +.fa-stop-circle-o:before{ + content:"" +} +.fa-shopping-bag:before{ + content:"" +} +.fa-shopping-basket:before{ + content:"" +} +.fa-hashtag:before{ + content:"" +} +.fa-bluetooth:before{ + content:"" +} +.fa-bluetooth-b:before{ + content:"" +} +.fa-percent:before{ + content:"" +} +.fa-gitlab:before,.icon-gitlab:before{ + content:"" +} +.fa-wpbeginner:before{ + content:"" +} +.fa-wpforms:before{ + content:"" +} +.fa-envira:before{ + content:"" +} +.fa-universal-access:before{ + content:"" +} +.fa-wheelchair-alt:before{ + content:"" +} +.fa-question-circle-o:before{ + content:"" +} +.fa-blind:before{ + content:"" +} +.fa-audio-description:before{ + content:"" +} +.fa-volume-control-phone:before{ + content:"" +} +.fa-braille:before{ + content:"" +} +.fa-assistive-listening-systems:before{ + content:"" +} +.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{ + content:"" +} +.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{ + content:"" +} +.fa-glide:before{ + content:"" +} +.fa-glide-g:before{ + content:"" +} +.fa-sign-language:before,.fa-signing:before{ + content:"" +} +.fa-low-vision:before{ + content:"" +} +.fa-viadeo:before{ + content:"" +} +.fa-viadeo-square:before{ + content:"" +} +.fa-snapchat:before{ + content:"" +} +.fa-snapchat-ghost:before{ + content:"" +} +.fa-snapchat-square:before{ + content:"" +} +.fa-pied-piper:before{ + content:"" +} +.fa-first-order:before{ + content:"" +} +.fa-yoast:before{ + content:"" +} +.fa-themeisle:before{ + content:"" +} +.fa-google-plus-circle:before,.fa-google-plus-official:before{ + content:"" +} +.fa-fa:before,.fa-font-awesome:before{ + content:"" +} +.fa-handshake-o:before{ + content:"" +} +.fa-envelope-open:before{ + content:"" +} +.fa-envelope-open-o:before{ + content:"" +} +.fa-linode:before{ + content:"" +} +.fa-address-book:before{ + content:"" +} +.fa-address-book-o:before{ + content:"" +} +.fa-address-card:before,.fa-vcard:before{ + content:"" +} +.fa-address-card-o:before,.fa-vcard-o:before{ + content:"" +} +.fa-user-circle:before{ + content:"" +} +.fa-user-circle-o:before{ + content:"" +} +.fa-user-o:before{ + content:"" +} +.fa-id-badge:before{ + content:"" +} +.fa-drivers-license:before,.fa-id-card:before{ + content:"" +} +.fa-drivers-license-o:before,.fa-id-card-o:before{ + content:"" +} +.fa-quora:before{ + content:"" +} +.fa-free-code-camp:before{ + content:"" +} +.fa-telegram:before{ + content:"" +} +.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{ + content:"" +} +.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{ + content:"" +} +.fa-thermometer-2:before,.fa-thermometer-half:before{ + content:"" +} +.fa-thermometer-1:before,.fa-thermometer-quarter:before{ + content:"" +} +.fa-thermometer-0:before,.fa-thermometer-empty:before{ + content:"" +} +.fa-shower:before{ + content:"" +} +.fa-bath:before,.fa-bathtub:before,.fa-s15:before{ + content:"" +} +.fa-podcast:before{ + content:"" +} +.fa-window-maximize:before{ + content:"" +} +.fa-window-minimize:before{ + content:"" +} +.fa-window-restore:before{ + content:"" +} +.fa-times-rectangle:before,.fa-window-close:before{ + content:"" +} +.fa-times-rectangle-o:before,.fa-window-close-o:before{ + content:"" +} +.fa-bandcamp:before{ + content:"" +} +.fa-grav:before{ + content:"" +} +.fa-etsy:before{ + content:"" +} +.fa-imdb:before{ + content:"" +} +.fa-ravelry:before{ + content:"" +} +.fa-eercast:before{ + content:"" +} +.fa-microchip:before{ + content:"" +} +.fa-snowflake-o:before{ + content:"" +} +.fa-superpowers:before{ + content:"" +} +.fa-wpexplorer:before{ + content:"" +} +.fa-meetup:before{ + content:"" +} +.sr-only{ + position:absolute; + width:1px; + height:1px; + padding:0; + margin:-1px; + overflow:hidden; + clip:rect(0,0,0,0); + border:0 +} +.sr-only-focusable:active,.sr-only-focusable:focus{ + position:static; + width:auto; + height:auto; + margin:0; + overflow:visible; + clip:auto +} +.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{ + font-family:inherit +} +.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{ + font-family:FontAwesome; + display:inline-block; + font-style:normal; + font-weight:400; + line-height:1; + text-decoration:inherit +} +.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{ + display:inline-block; + text-decoration:inherit +} +.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{ + display:inline +} +.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{ + line-height:.9em +} +.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{ + display:inline-block +} +.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{ + opacity:.5; + -webkit-transition:opacity .05s ease-in; + -moz-transition:opacity .05s ease-in; + transition:opacity .05s ease-in +} +.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{ + opacity:1 +} +.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{ + font-size:14px; + vertical-align:-15% +} +.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{ + padding:12px; + line-height:24px; + margin-bottom:24px; + background:#e7f2fa +} +.rst-content .admonition-title,.wy-alert-title{ + font-weight:700; + display:block; + color:#fff; + background:#6ab0de; + padding:6px 12px; + margin:-12px -12px 12px +} +.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{ + background:#fdf3f2 +} +.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{ + background:#f29f97 +} +.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{ + background:#ffedcc +} +.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{ + background:#f0b37e +} +.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{ + background:#e7f2fa +} +.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{ + background:#6ab0de +} +.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{ + background:#dbfaf4 +} +.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{ + background:#1abc9c +} +.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{ + background:#f3f6f6 +} +.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{ + color:#404040; + background:#e1e4e5 +} +.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{ + color:#2980b9 +} +.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{ + margin-bottom:0 +} +.wy-tray-container{ + position:fixed; + bottom:0; + left:0; + z-index:600 +} +.wy-tray-container li{ + display:block; + width:300px; + background:transparent; + color:#fff; + text-align:center; + box-shadow:0 5px 5px 0 rgba(0,0,0,.1); + padding:0 24px; + min-width:20%; + opacity:0; + height:0; + line-height:56px; + overflow:hidden; + -webkit-transition:all .3s ease-in; + -moz-transition:all .3s ease-in; + transition:all .3s ease-in +} +.wy-tray-container li.wy-tray-item-success{ + background:#27ae60 +} +.wy-tray-container li.wy-tray-item-info{ + background:#2980b9 +} +.wy-tray-container li.wy-tray-item-warning{ + background:#e67e22 +} +.wy-tray-container li.wy-tray-item-danger{ + background:#e74c3c +} +.wy-tray-container li.on{ + opacity:1; + height:56px +} +@media screen and (max-width:768px){ + .wy-tray-container{ + bottom:auto; + top:0; + width:100% + } + .wy-tray-container li{ + width:100% + } +} +button{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle; + cursor:pointer; + line-height:normal; + -webkit-appearance:button; + *overflow:visible +} +button::-moz-focus-inner,input::-moz-focus-inner{ + border:0; + padding:0 +} +button[disabled]{ + cursor:default +} +.btn{ + display:inline-block; + border-radius:2px; + line-height:normal; + white-space:nowrap; + text-align:center; + cursor:pointer; + font-size:100%; + padding:6px 12px 8px; + color:#fff; + border:1px solid rgba(0,0,0,.1); + background-color:#27ae60; + text-decoration:none; + font-weight:400; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1); + outline-none:false; + vertical-align:middle; + *display:inline; + zoom:1; + -webkit-user-drag:none; + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; + -webkit-transition:all .1s linear; + -moz-transition:all .1s linear; + transition:all .1s linear +} +.btn-hover{ + background:#2e8ece; + color:#fff +} +.btn:hover{ + background:#2cc36b; + color:#fff +} +.btn:focus{ + background:#2cc36b; + outline:0 +} +.btn:active{ + box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1); + padding:8px 12px 6px +} +.btn:visited{ + color:#fff +} +.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:.4; + cursor:not-allowed; + box-shadow:none +} +.btn::-moz-focus-inner{ + padding:0; + border:0 +} +.btn-small{ + font-size:80% +} +.btn-info{ + background-color:#2980b9!important +} +.btn-info:hover{ + background-color:#2e8ece!important +} +.btn-neutral{ + background-color:#f3f6f6!important; + color:#404040!important +} +.btn-neutral:hover{ + background-color:#e5ebeb!important; + color:#404040 +} +.btn-neutral:visited{ + color:#404040!important +} +.btn-success{ + background-color:#27ae60!important +} +.btn-success:hover{ + background-color:#295!important +} +.btn-danger{ + background-color:#e74c3c!important +} +.btn-danger:hover{ + background-color:#ea6153!important +} +.btn-warning{ + background-color:#e67e22!important +} +.btn-warning:hover{ + background-color:#e98b39!important +} +.btn-invert{ + background-color:#222 +} +.btn-invert:hover{ + background-color:#2f2f2f!important +} +.btn-link{ + background-color:transparent!important; + color:#2980b9; + box-shadow:none; + border-color:transparent!important +} +.btn-link:active,.btn-link:hover{ + background-color:transparent!important; + color:#409ad5!important; + box-shadow:none +} +.btn-link:visited{ + color:#9b59b6 +} +.wy-btn-group .btn,.wy-control .btn{ + vertical-align:middle +} +.wy-btn-group{ + margin-bottom:24px; + *zoom:1 +} +.wy-btn-group:after,.wy-btn-group:before{ + display:table; + content:"" +} +.wy-btn-group:after{ + clear:both +} +.wy-dropdown{ + position:relative; + display:inline-block +} +.wy-dropdown-active .wy-dropdown-menu{ + display:block +} +.wy-dropdown-menu{ + position:absolute; + left:0; + display:none; + float:left; + top:100%; + min-width:100%; + background:#fcfcfc; + z-index:100; + border:1px solid #cfd7dd; + box-shadow:0 2px 2px 0 rgba(0,0,0,.1); + padding:12px +} +.wy-dropdown-menu>dd>a{ + display:block; + clear:both; + color:#404040; + white-space:nowrap; + font-size:90%; + padding:0 12px; + cursor:pointer +} +.wy-dropdown-menu>dd>a:hover{ + background:#2980b9; + color:#fff +} +.wy-dropdown-menu>dd.divider{ + border-top:1px solid #cfd7dd; + margin:6px 0 +} +.wy-dropdown-menu>dd.search{ + padding-bottom:12px +} +.wy-dropdown-menu>dd.search input[type=search]{ + width:100% +} +.wy-dropdown-menu>dd.call-to-action{ + background:#e3e3e3; + text-transform:uppercase; + font-weight:500; + font-size:80% +} +.wy-dropdown-menu>dd.call-to-action:hover{ + background:#e3e3e3 +} +.wy-dropdown-menu>dd.call-to-action .btn{ + color:#fff +} +.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{ + bottom:100%; + top:auto; + left:auto; + right:0 +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{ + background:#fcfcfc; + margin-top:2px +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{ + padding:6px 12px +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{ + background:#2980b9; + color:#fff +} +.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{ + right:0; + left:auto; + text-align:right +} +.wy-dropdown-arrow:before{ + content:" "; + border-bottom:5px solid #f5f5f5; + border-left:5px solid transparent; + border-right:5px solid transparent; + position:absolute; + display:block; + top:-4px; + left:50%; + margin-left:-3px +} +.wy-dropdown-arrow.wy-dropdown-arrow-left:before{ + left:11px +} +.wy-form-stacked select{ + display:block +} +.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle +} +.wy-form-aligned .wy-control-group>label{ + display:inline-block; + vertical-align:middle; + width:10em; + margin:6px 12px 0 0; + float:left +} +.wy-form-aligned .wy-control{ + float:left +} +.wy-form-aligned .wy-control label{ + display:block +} +.wy-form-aligned .wy-control select{ + margin-top:6px +} +fieldset{ + margin:0 +} +fieldset,legend{ + border:0; + padding:0 +} +legend{ + width:100%; + white-space:normal; + margin-bottom:24px; + font-size:150%; + *margin-left:-7px +} +label,legend{ + display:block +} +label{ + margin:0 0 .3125em; + color:#333; + font-size:90% +} +input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle +} +.wy-control-group{ + margin-bottom:24px; + max-width:1200px; + margin-left:auto; + margin-right:auto; + *zoom:1 +} +.wy-control-group:after,.wy-control-group:before{ + display:table; + content:"" +} +.wy-control-group:after{ + clear:both +} +.wy-control-group.wy-control-group-required>label:after{ + content:" *"; + color:#e74c3c +} +.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{ + padding-bottom:12px +} +.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{ + width:100% +} +.wy-control-group .wy-form-full{ + float:left; + display:block; + width:100%; + margin-right:0 +} +.wy-control-group .wy-form-full:last-child{ + margin-right:0 +} +.wy-control-group .wy-form-halves{ + float:left; + display:block; + margin-right:2.35765%; + width:48.82117% +} +.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){ + margin-right:0 +} +.wy-control-group .wy-form-halves:nth-of-type(odd){ + clear:left +} +.wy-control-group .wy-form-thirds{ + float:left; + display:block; + margin-right:2.35765%; + width:31.76157% +} +.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){ + margin-right:0 +} +.wy-control-group .wy-form-thirds:nth-of-type(3n+1){ + clear:left +} +.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{ + margin:6px 0 0; + font-size:90% +} +.wy-control-no-input{ + display:inline-block +} +.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{ + width:100% +} +.wy-form-message-inline{ + padding-left:.3em; + color:#666; + font-size:90% +} +.wy-form-message{ + display:block; + color:#999; + font-size:70%; + margin-top:.3125em; + font-style:italic +} +.wy-form-message p{ + font-size:inherit; + font-style:italic; + margin-bottom:6px +} +.wy-form-message p:last-child{ + margin-bottom:0 +} +input{ + line-height:normal +} +input[type=button],input[type=reset],input[type=submit]{ + -webkit-appearance:button; + cursor:pointer; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + *overflow:visible +} +input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{ + -webkit-appearance:none; + padding:6px; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + box-shadow:inset 0 1px 3px #ddd; + border-radius:0; + -webkit-transition:border .3s linear; + -moz-transition:border .3s linear; + transition:border .3s linear +} +input[type=datetime-local]{ + padding:.34375em .625em +} +input[disabled]{ + cursor:default +} +input[type=checkbox],input[type=radio]{ + padding:0; + margin-right:.3125em; + *height:13px; + *width:13px +} +input[type=checkbox],input[type=radio],input[type=search]{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box +} +input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{ + -webkit-appearance:none +} +input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{ + outline:0; + outline:thin dotted\9; + border-color:#333 +} +input.no-focus:focus{ + border-color:#ccc!important +} +input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{ + outline:thin dotted #333; + outline:1px auto #129fea +} +input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{ + cursor:not-allowed; + background-color:#fafafa +} +input:focus:invalid,select:focus:invalid,textarea:focus:invalid{ + color:#e74c3c; + border:1px solid #e74c3c +} +input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{ + border-color:#e74c3c +} +input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{ + outline-color:#e74c3c +} +input.wy-input-large{ + padding:12px; + font-size:100% +} +textarea{ + overflow:auto; + vertical-align:top; + width:100%; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif +} +select,textarea{ + padding:.5em .625em; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + box-shadow:inset 0 1px 3px #ddd; + -webkit-transition:border .3s linear; + -moz-transition:border .3s linear; + transition:border .3s linear +} +select{ + border:1px solid #ccc; + background-color:#fff +} +select[multiple]{ + height:auto +} +select:focus,textarea:focus{ + outline:0 +} +input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{ + cursor:not-allowed; + background-color:#fafafa +} +input[type=checkbox][disabled],input[type=radio][disabled]{ + cursor:not-allowed +} +.wy-checkbox,.wy-radio{ + margin:6px 0; + color:#404040; + display:block +} +.wy-checkbox input,.wy-radio input{ + vertical-align:baseline +} +.wy-form-message-inline{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle +} +.wy-input-prefix,.wy-input-suffix{ + white-space:nowrap; + padding:6px +} +.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{ + line-height:27px; + padding:0 8px; + display:inline-block; + font-size:80%; + background-color:#f3f6f6; + border:1px solid #ccc; + color:#999 +} +.wy-input-suffix .wy-input-context{ + border-left:0 +} +.wy-input-prefix .wy-input-context{ + border-right:0 +} +.wy-switch{ + position:relative; + display:block; + height:24px; + margin-top:12px; + cursor:pointer +} +.wy-switch:before{ + left:0; + top:0; + width:36px; + height:12px; + background:#ccc +} +.wy-switch:after,.wy-switch:before{ + position:absolute; + content:""; + display:block; + border-radius:4px; + -webkit-transition:all .2s ease-in-out; + -moz-transition:all .2s ease-in-out; + transition:all .2s ease-in-out +} +.wy-switch:after{ + width:18px; + height:18px; + background:#999; + left:-3px; + top:-3px +} +.wy-switch span{ + position:absolute; + left:48px; + display:block; + font-size:12px; + color:#ccc; + line-height:1 +} +.wy-switch.active:before{ + background:#1e8449 +} +.wy-switch.active:after{ + left:24px; + background:#27ae60 +} +.wy-switch.disabled{ + cursor:not-allowed; + opacity:.8 +} +.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{ + color:#e74c3c +} +.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{ + border:1px solid #e74c3c +} +.wy-inline-validate{ + white-space:nowrap +} +.wy-inline-validate .wy-input-context{ + padding:.5em .625em; + display:inline-block; + font-size:80% +} +.wy-inline-validate.wy-inline-validate-success .wy-input-context{ + color:#27ae60 +} +.wy-inline-validate.wy-inline-validate-danger .wy-input-context{ + color:#e74c3c +} +.wy-inline-validate.wy-inline-validate-warning .wy-input-context{ + color:#e67e22 +} +.wy-inline-validate.wy-inline-validate-info .wy-input-context{ + color:#2980b9 +} +.rotate-90{ + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -ms-transform:rotate(90deg); + -o-transform:rotate(90deg); + transform:rotate(90deg) +} +.rotate-180{ + -webkit-transform:rotate(180deg); + -moz-transform:rotate(180deg); + -ms-transform:rotate(180deg); + -o-transform:rotate(180deg); + transform:rotate(180deg) +} +.rotate-270{ + -webkit-transform:rotate(270deg); + -moz-transform:rotate(270deg); + -ms-transform:rotate(270deg); + -o-transform:rotate(270deg); + transform:rotate(270deg) +} +.mirror{ + -webkit-transform:scaleX(-1); + -moz-transform:scaleX(-1); + -ms-transform:scaleX(-1); + -o-transform:scaleX(-1); + transform:scaleX(-1) +} +.mirror.rotate-90{ + -webkit-transform:scaleX(-1) rotate(90deg); + -moz-transform:scaleX(-1) rotate(90deg); + -ms-transform:scaleX(-1) rotate(90deg); + -o-transform:scaleX(-1) rotate(90deg); + transform:scaleX(-1) rotate(90deg) +} +.mirror.rotate-180{ + -webkit-transform:scaleX(-1) rotate(180deg); + -moz-transform:scaleX(-1) rotate(180deg); + -ms-transform:scaleX(-1) rotate(180deg); + -o-transform:scaleX(-1) rotate(180deg); + transform:scaleX(-1) rotate(180deg) +} +.mirror.rotate-270{ + -webkit-transform:scaleX(-1) rotate(270deg); + -moz-transform:scaleX(-1) rotate(270deg); + -ms-transform:scaleX(-1) rotate(270deg); + -o-transform:scaleX(-1) rotate(270deg); + transform:scaleX(-1) rotate(270deg) +} +@media only screen and (max-width:480px){ + .wy-form button[type=submit]{ + margin:.7em 0 0 + } + .wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{ + margin-bottom:.3em; + display:block + } + .wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{ + margin-bottom:0 + } + .wy-form-aligned .wy-control-group label{ + margin-bottom:.3em; + text-align:left; + display:block; + width:100% + } + .wy-form-aligned .wy-control{ + margin:1.5em 0 0 + } + .wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{ + display:block; + font-size:80%; + padding:6px 0 + } +} +@media screen and (max-width:768px){ + .tablet-hide{ + display:none + } +} +@media screen and (max-width:480px){ + .mobile-hide{ + display:none + } +} +.float-left{ + float:left +} +.float-right{ + float:right +} +.full-width{ + width:100% +} +.rst-content table.docutils,.rst-content table.field-list,.wy-table{ + border-collapse:collapse; + border-spacing:0; + empty-cells:show; + margin-bottom:24px +} +.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; + text-align:center +} +.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{ + font-size:90%; + margin:0; + overflow:visible; + padding:8px 16px +} +.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{ + border-left-width:0 +} +.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{ + color:#000; + text-align:left; + vertical-align:bottom; + white-space:nowrap +} +.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{ + font-weight:700; + border-bottom:2px solid #e1e4e5 +} +.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{ + background-color:transparent; + vertical-align:middle +} +.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{ + line-height:18px +} +.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{ + margin-bottom:0 +} +.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{ + width:1%; + padding-right:0 +} +.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{ + margin:0 +} +.wy-table-secondary{ + color:grey; + font-size:90% +} +.wy-table-tertiary{ + color:grey; + font-size:80% +} +.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{ + background-color:#f3f6f6 +} +.rst-content table.docutils,.wy-table-bordered-all{ + border:1px solid #e1e4e5 +} +.rst-content table.docutils td,.wy-table-bordered-all td{ + border-bottom:1px solid #e1e4e5; + border-left:1px solid #e1e4e5 +} +.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-bordered{ + border:1px solid #e1e4e5 +} +.wy-table-bordered-rows td{ + border-bottom:1px solid #e1e4e5 +} +.wy-table-bordered-rows tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-horizontal td,.wy-table-horizontal th{ + border-width:0 0 1px; + border-bottom:1px solid #e1e4e5 +} +.wy-table-horizontal tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-responsive{ + margin-bottom:24px; + max-width:100%; + overflow:auto +} +.wy-table-responsive table{ + margin-bottom:0!important +} +.wy-table-responsive table td,.wy-table-responsive table th{ + white-space:auto +} +a{ + color:#2980b9; + text-decoration:none; + cursor:pointer +} +a:hover{ + color:#3091d1 +} +a:visited{ + color:#9b59b6 +} +html{ + height:100% +} +body,html{ + overflow-x:hidden +} +body{ + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + font-weight:400; + color:#404040; + min-height:100%; + background:#edf0f2 +} +.wy-text-left{ + text-align:left +} +.wy-text-center{ + text-align:center +} +.wy-text-right{ + text-align:right +} +.wy-text-large{ + font-size:120% +} +.wy-text-normal{ + font-size:100% +} +.wy-text-small,small{ + font-size:80% +} +.wy-text-strike{ + text-decoration:line-through +} +.wy-text-warning{ + color:#e67e22!important +} +a.wy-text-warning:hover{ + color:#eb9950!important +} +.wy-text-info{ + color:#2980b9!important +} +a.wy-text-info:hover{ + color:#409ad5!important +} +.wy-text-success{ + color:#27ae60!important +} +a.wy-text-success:hover{ + color:#36d278!important +} +.wy-text-danger{ + color:#e74c3c!important +} +a.wy-text-danger:hover{ + color:#ed7669!important +} +.wy-text-neutral{ + color:#404040!important +} +a.wy-text-neutral:hover{ + color:#595959!important +} +.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{ + margin-top:0; + font-weight:700; + font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif +} +p{ + line-height:24px; + font-size:16px; + margin:0 0 24px; +} +h1{ + font-size:175% +} +.rst-content .toctree-wrapper>p.caption,h2{ + font-size:150% +} +h3{ + font-size:125% +} +h4{ + font-size:115% +} +h5{ + font-size:110% +} +h6{ + font-size:100% +} +hr{ + display:block; + height:1px; + border:0; + border-top:1px solid #e1e4e5; + margin:24px 0; + padding:0 +} +.rst-content code,.rst-content tt,code{ + white-space:nowrap; + max-width:100%; + background:#fff; + border:1px solid #e1e4e5; + font-size:75%; + padding:0 5px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + color:#e74c3c; + overflow-x:auto +} +.rst-content tt.code-large,code.code-large{ + font-size:90% +} +.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{ + list-style:disc; + line-height:24px; + margin-bottom:24px +} +.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{ + list-style:disc; + margin-left:24px +} +.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{ + margin-bottom:0 +} +.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{ + list-style:circle +} +.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{ + list-style:square +} +.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{ + list-style:decimal +} +.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{ + list-style:decimal; + line-height:24px; + margin-bottom:24px +} +.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{ + list-style:decimal; + margin-left:24px +} +.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{ + margin-bottom:0 +} +.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{ + list-style:disc +} +.wy-breadcrumbs{ + *zoom:1 +} +.wy-breadcrumbs:after,.wy-breadcrumbs:before{ + display:table; + content:"" +} +.wy-breadcrumbs:after{ + clear:both +} +.wy-breadcrumbs li{ + display:inline-block +} +.wy-breadcrumbs li.wy-breadcrumbs-aside{ + float:right +} +.wy-breadcrumbs li a{ + display:inline-block; + padding:5px +} +.wy-breadcrumbs li a:first-child{ + padding-left:0 +} +.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{ + padding:5px; + border:none; + background:none +} +.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{ + color:#404040 +} +.wy-breadcrumbs-extra{ + margin-bottom:0; + color:#b3b3b3; + font-size:80%; + display:inline-block +} +@media screen and (max-width:480px){ + .wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none + } +} +@media print{ + .wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none + } +} +html{ + font-size:16px +} +.wy-affix{ + position:fixed; + top:1.618em +} +.wy-menu a:hover{ + text-decoration:none +} +.wy-menu-horiz{ + *zoom:1 +} +.wy-menu-horiz:after,.wy-menu-horiz:before{ + display:table; + content:"" +} +.wy-menu-horiz:after{ + clear:both +} +.wy-menu-horiz li,.wy-menu-horiz ul{ + display:inline-block +} +.wy-menu-horiz li:hover{ + background:hsla(0,0%,100%,.1) +} +.wy-menu-horiz li.divide-left{ + border-left:1px solid #404040 +} +.wy-menu-horiz li.divide-right{ + border-right:1px solid #404040 +} +.wy-menu-horiz a{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 16px +} +.wy-menu-vertical{ + width:300px + margin-bottom: 20px; +} +.wy-menu-vertical header,.wy-menu-vertical p.caption{ + color:#007C97; + height:32px; + line-height:32px; + padding:0 1.618em; + margin:12px 0 0; + display:block; + font-weight:700; + text-transform:uppercase; + font-size:100%; + white-space:nowrap; +} +.wy-menu-vertical ul{ + margin-bottom:0 +} +.wy-menu-vertical li.divide-top{ + border-top:1px solid #404040 +} +.wy-menu-vertical li.divide-bottom{ + border-bottom:1px solid #404040 +} +.wy-menu-vertical li.current{ + background:#e3e3e3 +} +.wy-menu-vertical li.current a{ + color:grey; + border-right:1px solid #c9c9c9; + padding:.4045em 2.427em +} +.wy-menu-vertical li.current a:hover{ + background:#d6d6d6 +} +.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{ + border:none; + background:inherit; + color:inherit; + padding-left:0; + padding-right:0 +} +.wy-menu-vertical li button.toctree-expand{ + display:block; + float:left; + margin-left:-1.2em; + line-height:18px; + color:#4d4d4d; + border:none; + background:none; + padding:0 +} +.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{ + color:#404040; + font-weight:700; + position:relative; + background:#fcfcfc; + border:none; + padding:.4045em 1.618em +} +.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{ + background:#fcfcfc +} +.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{ + color:grey +} +.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{ + display:block; + line-height:18px; + color:#333 +} +.wy-menu-vertical li.toctree-l1.current>a{ + border-bottom:1px solid #c9c9c9; + border-top:1px solid #c9c9c9 +} +.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{ + display:none +} +.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{ + display:block +} +.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{ + font-size:.9em +} +.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{ + color:#404040 +} +.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{ + color:grey +} +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{ + display:block +} +.wy-menu-vertical li.toctree-l2.current>a{ + padding:.4045em 2.427em +} +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{ + padding:.4045em 1.618em .4045em 4.045em +} +.wy-menu-vertical li.toctree-l3.current>a{ + padding:.4045em 4.045em +} +.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{ + padding:.4045em 1.618em .4045em 5.663em +} +.wy-menu-vertical li.toctree-l4.current>a{ + padding:.4045em 5.663em +} +.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{ + padding:.4045em 1.618em .4045em 7.281em +} +.wy-menu-vertical li.toctree-l5.current>a{ + padding:.4045em 7.281em +} +.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{ + padding:.4045em 1.618em .4045em 8.899em +} +.wy-menu-vertical li.toctree-l6.current>a{ + padding:.4045em 8.899em +} +.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{ + padding:.4045em 1.618em .4045em 10.517em +} +.wy-menu-vertical li.toctree-l7.current>a{ + padding:.4045em 10.517em +} +.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{ + padding:.4045em 1.618em .4045em 12.135em +} +.wy-menu-vertical li.toctree-l8.current>a{ + padding:.4045em 12.135em +} +.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{ + padding:.4045em 1.618em .4045em 13.753em +} +.wy-menu-vertical li.toctree-l9.current>a{ + padding:.4045em 13.753em +} +.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{ + padding:.4045em 1.618em .4045em 15.371em +} +.wy-menu-vertical li.toctree-l10.current>a{ + padding:.4045em 15.371em +} +.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{ + padding:.4045em 1.618em .4045em 16.989em +} +.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{ + background:#c9c9c9 +} +.wy-menu-vertical li.toctree-l2 button.toctree-expand{ + color:#a3a3a3 +} +.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{ + background:#bdbdbd +} +.wy-menu-vertical li.toctree-l3 button.toctree-expand{ + color:#969696 +} +.wy-menu-vertical li.current ul{ + display:block +} +.wy-menu-vertical li ul{ + margin-bottom:0; + display:none +} +.wy-menu-vertical li ul li a{ + margin-bottom:0; + color:#d9d9d9; + font-weight:400 +} +.wy-menu-vertical a{ + line-height:18px; + padding:.4045em 1.618em; + display:block; + position:relative; + font-size:90%; + color:#d9d9d9 +} +.wy-menu-vertical a:hover{ + background-color:#4e4a4a; + cursor:pointer +} +.wy-menu-vertical a:hover button.toctree-expand{ + color:#d9d9d9 +} +.wy-menu-vertical a:active{ + background-color:#2980b9; + cursor:pointer; + color:#fff +} +.wy-menu-vertical a:active button.toctree-expand{ + color:#fff +} +.wy-side-nav-search{ + display:block; + width:300px; + padding:.809em; + margin-bottom:.809em; + z-index:200; + background-color:#171c2d; + text-align:center; + color:#fcfcfc +} +.wy-side-nav-search input[type=text]{ + width:100%; + border-radius:50px; + padding:6px 12px; + border-color:#2472a4 +} +.wy-side-nav-search img{ + display:block; + margin:auto auto .809em; + height:45px; + width:45px; + background-color:#171c2d; + padding:5px; + border-radius:100% +} +.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{ + color:#fcfcfc; + font-size:100%; + font-weight:700; + display:inline-block; + padding:4px 6px; + margin-bottom:.809em; + max-width:100% +} +.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{ + background:hsla(0,0%,100%,.1) +} +.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{ + display:block; + margin:0 auto; + height:auto; + width:auto; + border-radius:0; + max-width:100%; + background:transparent +} +.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{ + margin-top:.85em +} +.wy-side-nav-search>div.version{ + margin-top:-.4045em; + margin-bottom:.809em; + font-weight:400; + color:hsla(0,0%,100%,.3) +} +.wy-nav .wy-menu-vertical header{ + color:#2980b9 +} +.wy-nav .wy-menu-vertical a{ + color:#b3b3b3 +} +.wy-nav .wy-menu-vertical a:hover{ + background-color:#2980b9; + color:#fff +} +[data-menu-wrap]{ + -webkit-transition:all .2s ease-in; + -moz-transition:all .2s ease-in; + transition:all .2s ease-in; + position:absolute; + opacity:1; + width:100%; + opacity:0 +} +[data-menu-wrap].move-center{ + left:0; + right:auto; + opacity:1 +} +[data-menu-wrap].move-left{ + right:auto; + left:-100%; + opacity:0 +} +[data-menu-wrap].move-right{ + right:-100%; + left:auto; + opacity:0 +} +.wy-body-for-nav{ + background:#fcfcfc +} +.wy-grid-for-nav{ + position:absolute; + width:100%; + height:100% +} +.wy-nav-side{ + position:fixed; + top:0; + bottom:0; + left:0; + padding-bottom:2em; + width:300px; + overflow-x:hidden; + overflow-y:hidden; + min-height:100%; + color:#9b9b9b; + background:#171c2d; + z-index:200 +} +.wy-side-scroll{ + width:320px; + position:relative; + overflow-x:hidden; + overflow-y:scroll; + height:100%; +} +.wy-nav-top{ + display:none; + background:#E9102B; + color:#fff; + padding:.4045em .809em; + position:relative; + line-height:50px; + text-align:center; + font-size:100%; + *zoom:1 +} +.wy-nav-top:after,.wy-nav-top:before{ + display:table; + content:"" +} +.wy-nav-top:after{ + clear:both +} +.wy-nav-top a{ + color:#fff; + font-weight:700 +} +.wy-nav-top img{ + margin-right:12px; + height:45px; + width:45px; + background-color:#2980b9; + padding:5px; + border-radius:100% +} +.wy-nav-top i{ + font-size:30px; + float:left; + cursor:pointer; + padding-top:inherit +} +.wy-nav-content-wrap{ + margin-left:300px; + background:#fcfcfc; + min-height:100% +} +.wy-nav-content{ + padding:1.618em 3.236em; + height:100%; + margin:auto +} +.wy-body-mask{ + position:fixed; + width:100%; + height:100%; + background:rgba(0,0,0,.2); + display:none; + z-index:499 +} +.wy-body-mask.on{ + display:block +} +footer{ + color:grey +} +footer p{ + margin-bottom:12px +} +.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{ + padding:0; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + font-size:1em; + background:none; + border:none; + color:grey +} +.rst-footer-buttons{ + *zoom:1 +} +.rst-footer-buttons:after,.rst-footer-buttons:before{ + width:100%; + display:table; + content:"" +} +.rst-footer-buttons:after{ + clear:both +} +.rst-breadcrumbs-buttons{ + margin-top:12px; + *zoom:1 +} +.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{ + display:table; + content:"" +} +.rst-breadcrumbs-buttons:after{ + clear:both +} +#search-results .search li{ + margin-bottom:24px; + border-bottom:1px solid #e1e4e5; + padding-bottom:24px +} +#search-results .search li:first-child{ + border-top:1px solid #e1e4e5; + padding-top:24px +} +#search-results .search li a{ + font-size:120%; + margin-bottom:12px; + display:inline-block +} +#search-results .context{ + color:grey; + font-size:90% +} +.genindextable li>ul{ + margin-left:24px +} +@media screen and (max-width:768px){ + .wy-body-for-nav{ + background:#fcfcfc + } + .wy-nav-top{ + display:block + } + .wy-nav-side{ + left:-300px + } + .wy-nav-side.shift{ + width:85%; + left:0 + } + .wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{ + width:auto + } + .wy-nav-content-wrap{ + margin-left:0 + } + .wy-nav-content-wrap .wy-nav-content{ + padding:1.618em + } + .wy-nav-content-wrap.shift{ + position:fixed; + min-width:100%; + left:85%; + top:0; + height:100%; + overflow:hidden + } +} +@media screen and (min-width:1100px){ + .wy-nav-content-wrap{ + /* background:rgba(0,0,0,.05) */ + } + .wy-nav-content{ + margin:0; + background:#fcfcfc + } +} +@media print{ + .rst-versions,.wy-nav-side,footer{ + display:none + } + .wy-nav-content-wrap{ + margin-left:0 + } +} +.rst-versions{ + position:fixed; + bottom:0; + left:0; + width:300px; + color:#fcfcfc; + background:#1f1d1d; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + z-index:400 +} +.rst-versions a{ + color:#2980b9; + text-decoration:none +} +.rst-versions .rst-badge-small{ + display:none +} +.rst-versions .rst-current-version{ + padding:12px; + background-color:#272525; + display:block; + text-align:right; + font-size:90%; + cursor:pointer; + color:#27ae60; + *zoom:1 +} +.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{ + display:table; + content:"" +} +.rst-versions .rst-current-version:after{ + clear:both +} +.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{ + color:#fcfcfc +} +.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{ + float:left +} +.rst-versions .rst-current-version.rst-out-of-date{ + background-color:#e74c3c; + color:#fff +} +.rst-versions .rst-current-version.rst-active-old-version{ + background-color:#f1c40f; + color:#000 +} +.rst-versions.shift-up{ + height:auto; + max-height:100%; + overflow-y:scroll +} +.rst-versions.shift-up .rst-other-versions{ + display:block +} +.rst-versions .rst-other-versions{ + font-size:90%; + padding:12px; + color:grey; + display:none +} +.rst-versions .rst-other-versions hr{ + display:block; + height:1px; + border:0; + margin:20px 0; + padding:0; + border-top:1px solid #413d3d +} +.rst-versions .rst-other-versions dd{ + display:inline-block; + margin:0 +} +.rst-versions .rst-other-versions dd a{ + display:inline-block; + padding:6px; + color:#fcfcfc +} +.rst-versions.rst-badge{ + width:auto; + bottom:20px; + right:20px; + left:auto; + border:none; + max-width:300px; + max-height:90% +} +.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{ + float:none; + line-height:30px +} +.rst-versions.rst-badge.shift-up .rst-current-version{ + text-align:right +} +.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{ + float:left +} +.rst-versions.rst-badge>.rst-current-version{ + width:auto; + height:30px; + line-height:30px; + padding:0 6px; + display:block; + text-align:center +} +@media screen and (max-width:768px){ + .rst-versions{ + width:85%; + display:none + } + .rst-versions.shift{ + display:block + } +} +.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{ + margin-bottom:24px +} +.rst-content img{ + max-width:100%; + height:auto +} +.rst-content div.figure,.rst-content figure{ + margin-bottom:24px +} +.rst-content div.figure .caption-text,.rst-content figure .caption-text{ + font-style:italic +} +.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{ + margin-bottom:0 +} +.rst-content div.figure.align-center,.rst-content figure.align-center{ + text-align:center +} +.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{ + margin-bottom:24px +} +.rst-content abbr[title]{ + text-decoration:none +} +.rst-content.style-external-links a.reference.external:after{ + font-family:FontAwesome; + content:"\f08e"; + color:#b3b3b3; + vertical-align:super; + font-size:60%; + margin:0 .2em +} +.rst-content blockquote{ + margin-left:24px; + line-height:24px; + margin-bottom:24px +} +.rst-content pre.literal-block{ + white-space:pre; + margin:0; + padding:12px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + display:block; + overflow:auto +} +.rst-content div[class^=highlight],.rst-content pre.literal-block{ + border:1px solid #e1e4e5; + overflow-x:auto; + margin:1px 0 24px +} +.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{ + padding:0; + border:none; + margin:0 +} +.rst-content div[class^=highlight] td.code{ + width:100% +} +.rst-content .linenodiv pre{ + border-right:1px solid #e6e9ea; + margin:0; + padding:12px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + user-select:none; + pointer-events:none +} +.rst-content div[class^=highlight] pre{ + white-space:pre; + margin:0; + padding:12px; + display:block; + overflow:auto +} +.rst-content div[class^=highlight] pre .hll{ + display:block; + margin:0 -12px; + padding:0 12px +} +.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + font-size:12px; + line-height:1.4 +} +.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{ + user-select:none; + pointer-events:none +} +.rst-content div.highlight span.linenos{ + display:inline-block; + padding-left:0; + padding-right:12px; + margin-right:12px; + border-right:1px solid #e6e9ea +} +.rst-content .code-block-caption{ + font-style:italic; + font-size:85%; + line-height:1; + padding:1em 0; + text-align:center +} +@media print{ + .rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{ + white-space:pre-wrap + } +} +.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{ + clear:both +} +.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{ + margin-bottom:0 +} +.rst-content .admonition-title:before{ + margin-right:4px +} +.rst-content .admonition table{ + border-color:rgba(0,0,0,.1) +} +.rst-content .admonition table td,.rst-content .admonition table th{ + background:transparent!important; + border-color:rgba(0,0,0,.1)!important +} +.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{ + list-style:lower-alpha +} +.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{ + list-style:upper-alpha +} +.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{ + margin-top:12px; + margin-bottom:12px +} +.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{ + margin-top:0 +} +.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{ + margin-bottom:12px +} +.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{ + margin-bottom:0 +} +.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{ + margin-bottom:12px +} +.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{ + margin-top:0; + margin-bottom:0 +} +.rst-content .line-block{ + margin-left:0; + margin-bottom:24px; + line-height:24px +} +.rst-content .line-block .line-block{ + margin-left:24px; + margin-bottom:0 +} +.rst-content .topic-title{ + font-weight:700; + margin-bottom:12px +} +.rst-content .toc-backref{ + color:#404040 +} +.rst-content .align-right{ + float:right; + margin:0 0 24px 24px +} +.rst-content .align-left{ + float:left; + margin:0 24px 24px 0 +} +.rst-content .align-center{ + margin:auto +} +.rst-content .align-center:not(table){ + display:block +} +.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{ + opacity:0; + font-size:14px; + font-family:FontAwesome; + margin-left:.5em +} +.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{ + opacity:1 +} +.rst-content .btn:focus{ + outline:2px solid +} +.rst-content table>caption .headerlink:after{ + font-size:12px +} +.rst-content .centered{ + text-align:center +} +.rst-content .sidebar{ + float:right; + width:40%; + display:block; + margin:0 0 24px 24px; + padding:24px; + background:#f3f6f6; + border:1px solid #e1e4e5 +} +.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{ + font-size:90% +} +.rst-content .sidebar .last,.rst-content .sidebar>:last-child{ + margin-bottom:0 +} +.rst-content .sidebar .sidebar-title{ + display:block; + font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif; + font-weight:700; + background:#e1e4e5; + padding:6px 12px; + margin:-24px -24px 24px; + font-size:100% +} +.rst-content .highlighted{ + background:#f1c40f; + box-shadow:0 0 0 2px #f1c40f; + display:inline; + font-weight:700 +} +.rst-content .citation-reference,.rst-content .footnote-reference{ + vertical-align:baseline; + position:relative; + top:-.4em; + line-height:0; + font-size:90% +} +.rst-content .hlist{ + width:100% +} +.rst-content dl dt span.classifier:before{ + content:" : " +} +.rst-content dl dt span.classifier-delimiter{ + display:none!important +} +html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{ + background:none; + border:none +} +html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{ + border:none; + background-color:transparent!important; + white-space:normal +} +html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{ + padding-left:0; + padding-right:0; + vertical-align:top +} +html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{ + display:grid; + grid-template-columns:max-content auto +} +html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{ + padding-left:1rem +} +html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{ + content:":" +} +html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{ + margin-bottom:0 +} +html.writer-html5 .rst-content dl.footnote{ + font-size:.9rem +} +html.writer-html5 .rst-content dl.footnote>dt{ + margin:0 .5rem .5rem 0; + line-height:1.2rem; + word-break:break-all; + font-weight:400 +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets{ + margin-right:.5rem +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{ + content:"[" +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{ + content:"]" +} +html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{ + font-style:italic +} +html.writer-html5 .rst-content dl.footnote>dd{ + margin:0 0 .5rem; + line-height:1.2rem +} +html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{ + font-size:.9rem +} +.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{ + color:grey +} +.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{ + color:#555 +} +.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{ + margin-bottom:0 +} +.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){ + margin-top:24px +} +.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{ + margin-bottom:24px +} +.rst-content table.docutils th{ + border-color:#e1e4e5 +} +html.writer-html5 .rst-content table.docutils th{ + border:1px solid #e1e4e5 +} +html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{ + line-height:1rem; + margin-bottom:0; + font-size:.9rem +} +.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{ + margin-bottom:0 +} +.rst-content table.field-list,.rst-content table.field-list td{ + border:none +} +.rst-content table.field-list td p{ + font-size:inherit; + line-height:inherit +} +.rst-content table.field-list td>strong{ + display:inline-block +} +.rst-content table.field-list .field-name{ + padding-right:10px; + text-align:left; + white-space:nowrap +} +.rst-content table.field-list .field-body{ + text-align:left +} +.rst-content code,.rst-content tt{ + color:#000; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + padding:2px 5px +} +.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{ + font-size:100%!important; + line-height:normal +} +.rst-content code.literal,.rst-content tt.literal{ + color:#e74c3c; + white-space:normal +} +.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{ + font-weight:700; + color:#404040 +} +.rst-content kbd,.rst-content pre,.rst-content samp{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace +} +.rst-content a code,.rst-content a tt{ + color:#2980b9 +} +.rst-content dl{ + margin-bottom:24px +} +.rst-content dl dt{ + font-weight:700; + margin-bottom:12px +} +.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{ + margin-bottom:12px +} +.rst-content dl dd{ + margin:0 0 12px 24px; + line-height:24px +} +html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){ + margin-bottom:24px +} +html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{ + display:table; + margin:6px 0; + font-size:90%; + line-height:normal; + background:#e7f2fa; + color:#2980b9; + border-top:3px solid #6ab0de; + padding:6px; + position:relative +} +html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{ + color:#6ab0de +} +html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{ + color:#404040; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{ + margin-bottom:6px; + border:none; + border-left:3px solid #ccc; + background:#f0f0f0; + color:#555 +} +html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{ + color:#404040; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{ + margin-top:0 +} +html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{ + background-color:transparent; + border:none; + padding:0; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{ + font-weight:700 +} +html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{ + display:inline-block; + padding:0 4px; + color:#000; + font-weight:700 +} +html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{ + display:inline-block; + padding-right:8px; + max-width:100% +} +html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{ + font-style:italic +} +html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + color:#000 +} +.rst-content .viewcode-back,.rst-content .viewcode-link{ + display:inline-block; + color:#27ae60; + font-size:80%; + padding-left:24px +} +.rst-content .viewcode-back{ + display:block; + float:right +} +.rst-content p.rubric{ + margin-bottom:12px; + font-weight:700 +} +.rst-content code.download,.rst-content tt.download{ + background:inherit; + padding:inherit; + font-weight:400; + font-family:inherit; + font-size:inherit; + color:inherit; + border:inherit; + white-space:inherit +} +.rst-content code.download span:first-child,.rst-content tt.download span:first-child{ + -webkit-font-smoothing:subpixel-antialiased +} +.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{ + margin-right:4px +} +.rst-content .guilabel{ + border:1px solid #7fbbe3; + background:#e7f2fa; + font-size:80%; + font-weight:700; + border-radius:4px; + padding:2.4px 6px; + margin:auto 2px +} +.rst-content .versionmodified{ + font-style:italic +} +@media screen and (max-width:480px){ + .rst-content .sidebar{ + width:100% + } +} +span[id*=MathJax-Span]{ + color:#404040 +} +.math{ + text-align:center +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff"); + font-weight:400; + font-style:normal; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff"); + font-weight:700; + font-style:normal; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff"); + font-weight:700; + font-style:italic; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff"); + font-weight:400; + font-style:italic; + font-display:block +} +@font-face{ + font-family:Roboto Slab; + font-style:normal; + font-weight:400; + src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff"); + font-display:block +} +@font-face{ + font-family:Roboto Slab; + font-style:normal; + font-weight:700; + src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff"); + font-display:block +} diff --git a/v1.1.2/_static/custom.css b/v1.1.2/_static/custom.css new file mode 100644 index 00000000..1cadbe76 --- /dev/null +++ b/v1.1.2/_static/custom.css @@ -0,0 +1,24 @@ +/* + * custom.css + * ~~~~~~~~~ + * + * Custom stylesheet. + * + * :copyright: Copyright 2022 by Xilinx, Inc. + * + */ + +/* -- main layout ----------------------------------------------------------- */ +@media screen and (max-width: 950px){ + .wy-body-for-nav{background:#000000} + .wy-nav-top{display:block} + .wy-nav-side{left:300px} + .wy-nav-side.shift{width:85%;left:0} + .wy-side-scroll{width:auto} + .wy-side-nav-search{width:auto} + .wy-menu.wy-menu-vertical{width:auto} + .wy-nav-content-wrap{margin-left:0} + .wy-nav-content-wrap + .wy-nav-content{padding:1.618em} + .wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden} +} \ No newline at end of file diff --git a/v1.1.2/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css b/v1.1.2/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css new file mode 100644 index 00000000..eb19f698 --- /dev/null +++ b/v1.1.2/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/v1.1.2/_static/design-tabs.js b/v1.1.2/_static/design-tabs.js new file mode 100644 index 00000000..36b38cf0 --- /dev/null +++ b/v1.1.2/_static/design-tabs.js @@ -0,0 +1,27 @@ +var sd_labels_by_text = {}; + +function ready() { + const li = document.getElementsByClassName("sd-tab-label"); + for (const label of li) { + syncId = label.getAttribute("data-sync-id"); + if (syncId) { + label.onclick = onLabelClick; + if (!sd_labels_by_text[syncId]) { + sd_labels_by_text[syncId] = []; + } + sd_labels_by_text[syncId].push(label); + } + } +} + +function onLabelClick() { + // Activate other inputs with the same sync id. + syncId = this.getAttribute("data-sync-id"); + for (label of sd_labels_by_text[syncId]) { + if (label === this) continue; + label.previousElementSibling.checked = true; + } + window.localStorage.setItem("sphinx-design-last-tab", syncId); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/v1.1.2/_static/doctools.js b/v1.1.2/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/v1.1.2/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/v1.1.2/_static/documentation_options.js b/v1.1.2/_static/documentation_options.js new file mode 100644 index 00000000..82efa2c3 --- /dev/null +++ b/v1.1.2/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.1.2', + LANGUAGE: 'English', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/v1.1.2/_static/file.png b/v1.1.2/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/v1.1.2/_static/file.png differ diff --git a/v1.1.2/_static/jquery.js b/v1.1.2/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/v1.1.2/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v1.1.2/_static/js/html5shiv.min.js b/v1.1.2/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/v1.1.2/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v1.1.2/_static/js/theme.js b/v1.1.2/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/v1.1.2/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/v1.1.2/_static/layout.html b/v1.1.2/_static/layout.html new file mode 100644 index 00000000..81ae0134 --- /dev/null +++ b/v1.1.2/_static/layout.html @@ -0,0 +1,14 @@ +{% extends "!layout.html" %} + {% block footer %} {{ super() }} + + +{% endblock %} \ No newline at end of file diff --git a/v1.1.2/_static/minus.png b/v1.1.2/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/v1.1.2/_static/minus.png differ diff --git a/v1.1.2/_static/plus.png b/v1.1.2/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/v1.1.2/_static/plus.png differ diff --git a/v1.1.2/_static/pygments.css b/v1.1.2/_static/pygments.css new file mode 100644 index 00000000..84ab3030 --- /dev/null +++ b/v1.1.2/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/v1.1.2/_static/searchtools.js b/v1.1.2/_static/searchtools.js new file mode 100644 index 00000000..7918c3fa --- /dev/null +++ b/v1.1.2/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/v1.1.2/_static/sphinx_highlight.js b/v1.1.2/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/v1.1.2/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/v1.1.2/_static/xilinx-header-logo.png b/v1.1.2/_static/xilinx-header-logo.png new file mode 100644 index 00000000..00372830 Binary files /dev/null and b/v1.1.2/_static/xilinx-header-logo.png differ diff --git a/v1.1.2/_static/xilinx-header-logo.svg b/v1.1.2/_static/xilinx-header-logo.svg new file mode 100644 index 00000000..6b15297d --- /dev/null +++ b/v1.1.2/_static/xilinx-header-logo.svg @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + Page-1 + + + Sheet.1 + + + + + + diff --git a/v1.1.2/announcements.html b/v1.1.2/announcements.html new file mode 100644 index 00000000..8266d840 --- /dev/null +++ b/v1.1.2/announcements.html @@ -0,0 +1,293 @@ + + + + + + + + + + + + + + + Announcements — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Announcements
  • +
  • +
  • +
+
+
+
+
+ +
+

Announcements

+ +

This section of the documentation provides early notification for upcoming features, obsoleted options and other forthcoming changes.

+
+

Upcoming Features

+

The following table lists features that will be available in upcoming release, along with a brief explanation, where applicable:

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Features

Notes

8Kp30 AV1 Type-1 Encode

This feature is now available for all valid ranges of lookahead depth.

Double Density Decoding

This update doubles the decoding densities for AVC, HEVC and AV1 Type-2.

Downscaling in Decoder

This will be a new option in decoder's plugin.

Still Image Encoding

Targeted formats are JPEG lossy and lossless, along with AVIF.

Still Image Decoding

Targeted formats are JPEG lossy and lossless.

New 2D Engine Capabilities

These include a high throughput, feature rich, and interactive compositor, along with new 2D capabilities such as alpha-blending.

New and Improved ML Encoding

These include a new ML based rate controller and improved high density ROI encoder.

Gstreamer PCIe Peer to Peer

This new capability allows for high bandwidth traffic between peer devices, e.g. a discrete GPU and MA35D, without involving the host CPU.

PCIe Passthrough

With this feature, any host OS can utilize MA35D cards, without requiring host specific drivers.

Data and Meta Passthrough

This update preserves SEI messages, user-data closed captions, and color space through out the pipeline.

Multi-device Pipelines

This enhancements allows for inclusion of more than one device in a video pipeline.

Improved DMA

New APIs and plugins that improve transfers to and from the host, will be included in upcoming release.

Fedora Support

Upcoming release will support Fedora 40.

FFmpeg Support

Upcoming release will support Ffmpeg 6.1.1.

+
+
+

Obsoleted Features

+

The following table lists features that will be deprecated in upcoming release, along with a brief explanation, where applicable:

+ ++++ + + + + + + + + + + + + + + + + +

Features

Notes

2D Engine Interface

A new streamlined APIs and plugin parameter set will replace the current ones. Changes to plugin parameters and APIs are to be expected.

Card Managements Utilities

This updates will merge all administrative tasks into mamgmt, including maflash, with mautil focusing on user domain activities. Changes to plugin parameters and APIs are to be expected.

FFmpeg

The upcoming release will drop support for FFmpeg 5.1.2

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/c_apis.html b/v1.1.2/c_apis.html new file mode 100644 index 00000000..3527c367 --- /dev/null +++ b/v1.1.2/c_apis.html @@ -0,0 +1,1512 @@ + + + + + + + + + + + + + + + C API Programming Guide — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • C API Programming Guide
  • +
  • +
  • +
+
+
+
+
+ +
+

C API Programming Guide

+ +
+

Overview

+

The AMD AMA Video SDK provides a C-based application programming interface (API) which facilitates the integration of AMD transcoding capabilities in proprietary frameworks. This API is provided in the form of plugins leveraging the Xilinx Media Accelerator (XMA) library and the Xilinx Resource Manager (XRM) library.

+

The XMA Library

+

The XMA library (libxma) is meant to simplify the development of applications managing and controlling video accelerators such as decoders, scalers, filters, and encoders.

+

The XRM Library

+

The XRM library is used to manage the hardware accelerators available in the system. XRM keeps track of total system capacity for each of the compute units such as the decoder, scaler, and encoder. The XRM library makes it possible to perform actions such as reserving, allocating and releasing resources; calculating resource load and max capacity.

+

The AMD AMA Video SDK Plugins

+

The AMD AMA Video SDK provides 4 different plugins, each corresponding to a specific hardware accelerated feature of the card:

+
    +
  • The decoder plugin

  • +
  • The encoder plugin

  • +
  • The filter plugin

  • +
  • The scaler plugin

  • +
+

Any combination of plugins can be used when integrating with a proprietary framework.

+
+

+
+
+
+

General Application Development Guide

+

Integration layers for applications using the AMD AMA Video SDK are organized around the following steps:

+
    +
  1. Initialization

  2. +
  3. Resource Reservation

  4. +
  5. Session Creation

  6. +
  7. Runtime Processing

  8. +
  9. Cleanup

  10. +
+
+

Resource Initialization and Allocation

+

Applications using the plugins must first create a XRM plugin using the xrm_PLUGIN_reserve(), where PLUGIN is one of dec, enc, or scale. This is done using the XRM APIs, as described in detail in the XRM API Reference Guide below.

+
+
+

Session Creation

+

Once the resources have been allocated, the application must create dedicated plugin sessions for each of the hardware accelerators that need to be used (decoder, scaler, encoder, filter).

+

To create a session, the application must first initialize all the required properties and parameters of the particular plugin. It must then call the corresponding session creation function. A complete reference for all the plugins is provided below.

+
+
+

Runtime Processing

+

The plugins provide functions to send data from the host and receive data from the device. The data is in the form of video frames (XmaFrame). It is also possible to do zero-copy operations where frames are passed from one hardware accelerator to the next without being copied back to the host. The send and receive functions are specific to each plugin and the return code should be used to determine the next suitable action. A complete reference for all the plugins is provided below.

+
+
+

Cleanup

+

When the application finishes, it should destroy each plugin session using the corresponding destroy function. Doing so will free the resources on the AMD devices for other jobs and ensure that everything is released and cleaned-up properly.

+

The application should also use the xrm_PLUGIN_release(), where PLUGIN is one of dec, enc, or scale to release allocated resources. This is done using the XRM APIs, as described in detail in the XRM API Reference Guide below.

+
+

+
+
+
+
+

Compiling and Linking with the AMD AMA Video SDK Plugins

+

The plugins can be dynamically linked to the application. The required package to build applications is XRM. This package is provided as part of the AMD AMA Video SDK.

+

To provide the necessary declarations in your application, include the following header in your source code:

+
#include <xrm.h>
+
+
+

To compile and link your application with the plugins, add the following lines to your CMakeList.txt file:

+
target_link_libraries (${PROJECT_NAME} PUBLIC xma PUBLIC xrm_interface)
+target_include_directories (${PROJECT_NAME}
+  PUBLIC "${PROJECT_SOURCE_DIR}/include"
+  PUBLIC "$<TARGET_PROPERTY:xrm,INTERFACE_INCLUDE_DIRECTORIES>")
+
+
+
+

+
+
+
+

Common XMA Data Structures

+
+
+struct XmaParameter
+
+ +

Type-Length-Value data structure used for passing custom arguments to a plugin. The declaration of XmaParameter can be found in the /opt/amd/ama/ma35/include/xma/xmaparam.h file.

+
+
+struct XmaFrameProperties
+
+ +

Data structure describing the frame dimensions for XmaFrame. The declaration of XmaFrameProperties can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+struct XmaFrame
+
+ +

Data structure describing a raw video frame and its buffers. XmaFrame structures can be received from the decoder or sent to the encoder. They are also used as input and outputs for the scaler and the look-ahead. The declaration of XmaFrame can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+

The AMD AMA Video SDK plugins supports 3 types of frames:

+
    +
  • XMA_HOST_BUFFER_TYPE frames must be copied to the device using the upload filter before they can be used by the device..

  • +
  • XMA_DEVICE_ONLY_BUFFER_TYPE frames must be copied to the host using the download filter before they can be used by the host application.

  • +
  • NO_BUFFER frames do not contain buffer data and are used as place holders to be filled in by XMA plugins..

  • +
+

The upload filter plugin send function only supports XMA_HOST_BUFFER_TYPE frames, while all other send frame functions only support XMA_DEVICE_BUFFER_TYPE frames. All frames used in receive functions must contain "dummy" data. All parameters in those frames will be filled in by the respective receive functions. All frames must be allocated using the provided XMA functions.

+
+
+struct XmaDataBuffer
+
+ +

Data structure describing a buffer containing encoded video data. XmaDataBuffer structures can be sent to the decoder or received from the encoder. The declaration of XmaDataBuffer can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+

All XmaDataBuffer structures must be allocated using one of the provided functions. XmaDataBuffer structures used in the encoder receive function must be allocated with "dummy" data and will be filled in by the encoder.

+
+

Note

+

Xma[Scaler|Encoder|Filter]Properties.sw_format

+
+

sw_format, which is a member of XmaScalerProperties, XmaEncoderProperties, and XmaFilterProperties structures, represents the pixel format of a frame on the device. Therefore, its assigned value is determined by the direction of data flow. Specifically:

+
+
+
XMA_NV12_FMT_TYPE and XMA_P010LE_FMT_TYPE, with flags = XMA_FRAME_PROPERTY_FLAG_TILE_4x4, are internal formats that can only be generated by decoder/scaler and not by the upload filter.
+
XMA_PACKED10_FMT_TYPE is an internal format that can only be generated by decoder/scaler and not the upload filter.
+
XMA_RGB24_FMT_TYPE is reserved for future use.
+
XMA_YUV420P_FMT_TYPE and XMA_YUV420P10LE_FMT_TYPE are external formats that can be used by the upload filter
+
+
+
+
+
+

+
+
+
+

Common XMA Data Reference

+

This section describes the commonly used calls and APIs that are required in most applications.

+
+

XMA Log Interface

+

The external interface to the xma logging consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmalogger.h file.

+
+
+int32_t xma_log_init(XmaLogLevelType log_level, XmaLogType log_type, XmaLogHandle *handle, ...)
+
+ +

This function creates a log session and must be called prior to logging. (See /opt/amd/ama/ma35/include/xma/xmalogger.h for details on variadic usage.)

+
+
+void xma_logmsg(XmaLogHandle handle, XmaLogLevelType level, const char *name, const char *msg, ...)
+
+ +

This function logs a message.

+
+
+void xma_log_release(XmaLogHandle handle)
+
+ +

This function releases a log session that was previously created with the xma_log_init() function.

+
+
+

XMA Session Interface

+

The external interface to the xma session consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xma.h file.

+
+
+int32_t xma_initialize(XmaLogHandle log, XmaInitParameter *init_params, XmaHandle *handle)
+
+ +

This function creates a XMA session and must be called prior to creating any plugins.

+
+
+void xma_release(XmaHandle handle)
+
+ +

This function releases a XMA session that was previously created with the xma_initialize() function.

+
+
+

XMA Data Buffer Interface

+

The external interface to the xma data buffer consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+XmaDataBuffer *xma_data_buffer_alloc(XmaHandle handle, size_t size, bool dummy)
+
+ +

This function creates a XmaDataBuffer of the given size.

+
+
+XmaDataBuffer *xma_data_from_buffer_clone(XmaHandle handle, uint8_t *data, size_t size, xma_data_buffer_clone_free_callback_function free_callback, void *opaque)
+
+ +

This function creates a XmaDataBuffer that points to the provided buffer. xma_data_buffer_clone_free_callback_function will be called, when the buffer is no longer needed.

+
+
+void xma_data_buffer_free(XmaDataBuffer *data)
+
+ +

This function releases a previously created XmaDataBuffer.

+
+
+

XMA Frame Interface

+

The external interface to the xma Frame consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+int32_t xma_frame_planes_get(XmaHandle handle, XmaFrameProperties *frame_props)
+
+ +

This returns the number of planes for a given pixel format.

+
+
+int32_t xma_frame_get_plane_height(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the height of the plane based on the frame height, pixel format, and plane.

+
+
+int32_t xma_frame_get_plane_stride(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the stride of the plane based on the frame width, pixel format, and plane.

+
+
+int32_t xma_frame_get_plane_size(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the size of the plane based on the frame width, height, pixel format, and plane.

+
+
+XmaFrame *xma_frame_alloc(XmaHandle handle, XmaFrameProperties *frame_props, bool dummy)
+
+ +

This function creates a XmaFrame with the given properties.

+
+
+XmaFrame *xma_frame_from_buffers_clone(XmaHandle handle, XmaFrameProperties *frame_props, XmaFrameData *frame_data, xma_frame_clone_free_callback_function free_callback, void *opaque)
+
+ +

This function creates a XmaFrame that points to the provided data and with the given properties. xma_frame_clone_free_callback_function will be called when the data is no longer needed.

+
+
+XmaFrame *xma_frame_clone(XmaHandle handle, XmaFrame *xma_frame)
+
+ +

This function creates a XmaFrame that uses the same buffers as the provided XmaFrame, but can have side data added or removed without affecting the original XmaFrame.

+
+
+int32_t xma_frame_inc_ref(XmaFrame *frame)
+
+ +

This function increases the reference count of the given XmaFrame.

+
+
+int32_t xma_frame_dec_ref(XmaFrame *frame)
+
+ +

This function decreases the reference count of the given XmaFrame.

+
+
+void xma_frame_free(XmaFrame *frame)
+
+ +

This function releases a XmaFrame that was created with the previous functions.

+
+
+int32_t xma_frame_add_side_data(XmaFrame *frame, XmaFrameSideData *side_data)
+
+ +

This function adds the side data to the frame. If there is already side data of the same type associated with the frame, it is removed and the new side data is set. The reference count of the side_data buffer is incremented by 1 on successful execution.

+
+
+XmaFrameSideData *xma_frame_get_first_side_data(XmaFrame *frame)
+
+ +

This function returns the handle to the first side data of any type. Added in v1.1.

+
+
+XmaFrameSideData *xma_frame_get_side_data(XmaFrame *frame, enum XmaFrameSideDataType type)
+
+ +

This function returns the handle to the first side data of the given type.

+
+
+XmaFrameSideData *xma_frame_get_next_side_data(XmaFrame *frame, XmaFrameSideData *side_data)
+
+ +

This function returns the handle to the next side data of any type. Added in v1.1.

+
+
+XmaFrameSideData *xma_frame_get_next_side_data_of_type(XmaFrame *frame, XmaFrameSideData *side_data)
+
+ +

This function returns the handle to the next side data of the given type. Added in v1.1.

+
+
+int32_t xma_frame_remove_side_data(XmaFrame *frame, XmaFrameSideData *side_data)
+
+ +

This function removes the side data from the frame. The side data buffer reference count is decremented by 1. If it results in a reference count of zero, then the side data is freed.

+
+
+int32_t xma_frame_remove_side_data_type(XmaFrame *frame, enum XmaFrameSideDataType type)
+
+ +

This function removes all side data of the given type. Any side data buffer that is removed has it's reference count decremented by 1. If it results in a reference count of zero, then the side data buffer is freed.

+
+
+void xma_frame_clear_all_side_data(XmaFrame *frame)
+
+ +

This function removes all side data from the frame. The reference count of each side data buffer associated with the frame is decremented by 1. If it results in a reference count of zero, then the side data is freed.

+
+
+

XMA Side Band Data

+

Passing side band data through xma consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+XmaFrameSideData *xma_side_data_alloc(XmaHandle handle, enum XmaFrameSideDataType type, XmaBufferType buffer_type, uint64_t size)
+
+ +

This function allocates side data handle, with reference count 1.

+
+
+void xma_side_data_free(XmaFrameSideData *side_data)
+
+ +

This function decrements the reference count of the side_data by 1.

+
+
+int32_t xma_side_data_inc_ref(XmaFrameSideData *side_data)
+
+ +

This function increments the reference count of the side_data by 1

+
+
+int32_t xma_side_data_dec_ref(XmaFrameSideData *side_data)
+
+ +

This function decrements the reference count of the side_data by 1.

+
+
+int32_t xma_side_data_get_refcount(XmaFrameSideData *side_data)
+
+ +

This function returns the reference count of the side_data.

+
+
+int32_t xma_side_data_read(XmaFrameSideData *side_data)
+
+ +

This function copies data from device to host. Deprecated in v1.1 and above.

+
+
+int32_t xma_side_data_write(XmaFrameSideData *side_data)
+
+ +

This function copies data from host to device. Only use this function if you created the side data and it has not yet been sent to any sessions, otherwise risk of a race condition can occur.

+
+
+int32_t xma_side_data_get_metadata(XmaFrameSideData *side_data, XmaParameter *metadata)
+
+ +

This function gets the value of specified metadata. Added in v1.1.

+
+
+int32_t xma_side_data_set_metadata(XmaFrameSideData *side_data, XmaParameter *metadata)
+
+ +

This function replaces or creates the specified metadata, depending on whether it exists on not. Added in v1.1.

+
+
+
+

1.0 SDK API

+

The following subsections describe APIs applicable to 1.0 SDK. Note that these APIs serve as bases for future versions. In order to allow forwards and backwards ABI compatibility, the application can now set which version of the API to use. If no version is set, version 1.0 is assumed. When a version is set, only features available in that version are allowed. This means if a feature was deprecated in an earlier version, or was added in a later version, it cannot be used and will either be ignored or returned as an error.

+

To set the API version, use the following code snippet:

+
XmaParameter params[1];
+uint32_t api_version = XMA_API_VERSION_M_ m;
+
+params[0].name = (char*)XMA_API_VERSION;
+params[0].type = XMA_UINT32;
+params[0].length = sizeof(uint32_t);
+params[0].value = &api_version;
+
+xma_init_param.params        = params;
+xma_init_param.param_cnt     = 1;
+xma_initialize(logger, &xma_init_param, handle);
+
+
+

, where M and m are major and minor versions of the SDK, e.g., for SDK 1.0 the macro becomes XMA_API_VERSION_1_0.

+
+

Decoder Plugin Reference

+
+

Decoder Interface

+

The external interface to the decoder plugin consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmadecoder.h file.

+
+
+XmaDecoderSession *xma_dec_session_create(XmaDecoderProperties *dec_props)
+
+ +

This function creates a decoder session and must be called prior to decoding data. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_dec_session_set_log(XmaDecoderSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_dec_session_send_data(XmaDecoderSession *session, XmaDataBuffer *data, int32_t *data_used)
+
+ +

This function sends input frame data to the hardware decoder by way of the plugin. The application needs to parse the input encoded stream and send one frame of data at a time in a XmaDataBuffer data structure.

+

The data_used value indicates the amount of input data consumed by the decoder.

+

If the function returns XMA_SUCCESS, then the decoder was able to consume the entirety of the available data and data_used will be set accordingly. In this case, the application can proceed with fetching decoded data using the xma_dec_session_recv_frame() API.

+

If the function returns XMA_TRY_AGAIN, then the decoder was did not consume any of the input data and data_used will be reported as 0. In this case, the application can proceed with fetching previously decoded data with the xma_dec_session_recv_frame() function but must send the same input again using using xma_dec_session_send_data() until the function returns XMA_SUCCESS.

+

If the function returns XMA_SEND_MORE_DATA, then the data sent is being processed, but more is required before any frames will be available.

+

Once the application has sent all the input frames to the decoder, it must notify the decoder by sending a null buffer. The application should then continue sending null buffers in order to flush out all the output YUV frames.

+
+
+int32_t xma_dec_session_get_properties(XmaDecoderSession *dec_session, XmaFrameProperties *fprops);
+
+ +

This function returns the decoder properties such as width, height, output format, and frame rate.

+
+
+int32_t xma_dec_session_recv_frame(XmaDecoderSession *session, XmaFrame *frame)
+
+ +

This function tries to fetch a decoded YUV frame from the hardware accelerator.

+

If the function returns XMA_SUCCESS, a valid YUV frame pointer is available in the buffer pointer of the XmaFrame argument.

+

If the function returns XMA_TRY_AGAIN, then the decoder still needs some input data to produce a complete YUV output frame.

+

If the function returns XMA_EOS, then the decoder has flushed out all the frames.

+
+
+int32_t xma_dec_session_destroy(XmaDecoderSession *session)
+
+ +

This function destroys a decoder session that was previously created with the xma_dec_session_create() function.

+
+
+

Decoder Properties

+

The AMD AMA Video SDK decoder is configured using a combination of standard XMA decoder properties and custom decoder parameters, both of which are specified using a XmaDecoderProperties data structure. The declaration of XmaDecoderProperties can be found in the /opt/amd/ama/ma35/include/xma/xmadecoder.h file.

+
+

+
+
+
+struct XmaDecoderProperties
+
+ +

This data structure is used to configure the AMD AMA Video SDK decoder.

+
+

+
+

Standard XMA Decoder Properties

+

When using the decoder plugin, the following members of the XmaDecoderProperties data structure must be set by the application:

+
+
hwdecoder_type

Specifying type of decoder to reserve.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the decoder plugin.

+
+
param_cnt

Count of custom parameters.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840. +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
bits_per_pixel

Bits per pixel for primary plane of output video. +Must be set to 8 or 10 bits per pixel.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS.

+
+
handle

handle to XMA device.

+
+
+

Custom Decoder Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the decoder plugin:

+
+
"out_fmt"

XMA pixel format. See -out_fmt for available options.

+
+
“low_latency”

Set to 1 to enable low latency mode.

+
+
"latency_logging"

Set to 1 to enable logging of latency information to the xma log.

+
+
+
+

+
+
+
+
+

Scaler Plugin Reference

+
+

Scaler Interface

+

The external interface to the scaler plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+
+XmaScalerSession *xma_scaler_session_create(XmaScalerProperties *props)
+
+ +

This function creates scaler session and must be called prior to sending input frames. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_scaler_session_send_frame(XmaScalerSession *session, XmaFrame *frame)
+
+ +

This function sends a YUV frame to the underlying XMA plugin( and eventually to hardware to scale the input frame to one or multiple resolutions.

+

The application can take further action depending upon the return value from this API.

+

If the function returns XMA_SUCCESS, then the application can proceed to fetch scaled output frames.

+

If the function returns XMA_SEND_MORE_DATA, then the application should proceed with sending next YUV frame.

+

If the function returns XMA_FLUSH_AGAIN it means that the application should keep flushing the scaler.

+

Once the application has sent all the input frames to the scaler, it must notify the scaler by sending a null frame to flush the scaler.

+
+
+int32_t xma_scaler_session_recv_frame_list(XmaScalerSession *session, XmaFrame **frame_list)
+
+ +

This function is called after calling the xma_scaler_session_send_frame(). This function returns a list of output frames with every call until it reaches end of scaling. Return codes can only be XMA_SUCCESS and XMA_ERROR.

+
+
+int32_t xma_scaler_session_destroy(XmaScalerSession *session)
+
+ +

This function destroys scaler session that was previously created with the xma_scaler_session_create() function.

+
+

+
+
+
+

Scaler Properties

+

The AMD AMA Video SDK scaler is configured using a combination of standard XMA scaler properties, standard XMA scaler input and output properties and custom scaler parameters, all of which are specified using XmaScalerProperties and XmaScalerInOutProperties data structures.

+
+

+
+
+
+struct XmaScalerProperties
+
+ +

This data structure is used to configure the video scaler. The declaration of XmaScalerProperties can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+
+struct XmaScalerInOutProperties
+
+ +

This data structure is used to configure the input and outputs of the video scaler. The XmaScalerFilterProperties data structure contains one XmaScalerInOutProperties for the scaler input and an array of 16 XmaScalerInOutProperties for the scaler outputs. The declaration of XmaScalerInOutProperties can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+

+
+

Standard XMA Scaler Properties

+

When using the scaler plugin, the following members of the XmaScalerProperties data structure must be set by the application:

+
+
hwscaler_type

Type of scaler. Must be set to XMA_ABR_SCALER_TYPE.

+
+
num_outputs

Number of scaler outputs.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the scaler plugin.

+
+
param_cnt

Count of custom parameters.

+
+
input

Input property of type XmaScalerInOutProperties

+
+
output

Output properties an array of type XmaScalerInOutProperties of size num_outputs

+
+
+

XMA Scaler Input and Output Properties

+

When configuring the scaler input and outputs, the following members of the XmaScalerInOutProperties data structure must be set by the application:

+
+
format

Host side input video format. +Must be set to XMA_VPE_FMT_TYPE

+
+
sw_format

Device side video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of video stream/data. +Valid values are integers between 128 and 3840, in multiples of 4. +Portrait mode is supported.

+
+
height

Height in pixels of video stream/data. +Valid values are even integers between 128 and 2160, in multiples of 4.

+
+
framerate

Framerate data structure specifying frame rate per second.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
+

Other members of XmaScalerInOutProperties are not applicable to the scaler plugin and should not be used.

+

Custom Scaler Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the scaler plugin:

+
+
"mix_rate"

This parameter is used to configure mix-rate sessions where some scaler outputs are configured at the input frame rate and some other outputs will be configured at half the rate.

+
+
“top”

Cropping the top of the video before scaling.

+
+
“width”

Cropping the width of the video before scaling.

+
+
“height”

Cropping the height of the video before scaling.

+
+
"latency_logging"

Set to 1 to enable logging of latency information to XMA logs. Set to 0 to disable logging.

+
+
+
+

+
+
+
+
+

Encoder Plugin Reference

+
+

Encoder Interface

+

The external interface to the encoder plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmaencoder.h file.

+
+
+XmaEncoderSession *xma_enc_session_create(XmaEncoderProperties *enc_props)
+
+ +

This function creates an encoder session and must be called prior to encoding input YUV. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_enc_session_set_log(XmaEncoderSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_enc_session_send_frame(XmaEncoderSession *session, XmaFrame *frame)
+
+ +

This function sends a YUV frame to the hardware encoder by way of the plugin.

+

Each time the application calls this function, it must provide a XmaFrame containing YUV data and information about this frame (XmaFrameProperties).

+

If the function returns XMA_SUCCESS, then the application can proceed to fetch the encoded data using the xma_enc_session_recv_data() API.

+

If the function returns XMA_SEND_MORE_DATA, then the application must send the next YUV frame before calling xma_enc_session_recv_data().

+

Once the application has sent all the input frames to the encoder, it should notify the hardware by sending a null frame. If the API returns XMA_SUCCESS after a null frame is sent, then the application can call xma_enc_session_recv_data() but must send a null frame again.

+
+
+int32_t xma_enc_session_recv_data(XmaEncoderSession *session, XmaDataBuffer *data, int32_t *data_size)
+
+ +

This function is called after calling the function xma_enc_session_send_frame(). The application is responsible for allocating the "dummy" XmaDataBuffer using one of the provided functions. It is also responsible for releasing it when done.

+

If the function returns XMA_SUCCESS, then valid output data is available.

+

If the function returns XMA_RESEND_AND_RECV, a data buffer is not ready to be returned and the length of the data buffer is set to 0. The XmaDataBuffer is untouched and can either be reused or released.

+

If the function returns XMA_EOS, the encoder has flushed all the output frames. The XmaDataBuffer is untouched and must be released.

+
+
+int32_t xma_enc_session_destroy(XmaEncoderSession *session)
+
+ +

This function destroys an encoder session that was previously created with the xma_enc_session_create() function.

+
+
+

Encoder Properties

+

The AMD AMA Video SDK encoder is configured using a combination of standard XMA encoder properties and custom encoder parameters, both of which are specified using a XmaEncoderProperties data structure.

+
+

+
+
+
+struct XmaEncoderProperties
+
+ +

This data structure is used to configure the video encoder. The declaration of XmaEncoderProperties can be found in the /opt/amd/ama/ma35/include/xma/xmaencoder.h file.

+

Standard XMA Encoder Properties

+

When using the encoder plugin, the following members of the XmaEncoderProperties data structure must be set by the application:

+
+
hwencoder_type

Specify type of encoder to reserve.

+
+
format

Host side input video format. +Must be set to XMA_VPE_FMT_TYPE

+
+
sw_format

Device side input video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840. +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
framerate

Framerate data structure specifying frame rate per second

+
+
lookahead_depth

The lookahead module depth to give start giving lookahead data. +Supported values are 0 to 40.

+
+
rc_mode

Rate control mode for custom rate control +Supported values are 0 (constant QP), 1 (CBR), 2 (VBR), and 3 (CVBR).

+
+
bitrate

Bitrate of output data (in kbps).

+
+
qp

Fixed quantization value. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
gop_size

Maximum group of pictures size in frames.

+
+
temp_aq_gain

Temporal AQ Gain. Valid values are 0-255.

+
+
spat_aq_gain

Spatial AQ Gain. Valid values are 0-255.

+
+
minQP

Minimum QP. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
maxQP

Maximum QP. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
profile

Encoding profile. Valid values are 0 (Baseline), 1 (Main), 2 (High), 3 (High 10), or 4 (High 10 Intra) for H.264, 100 (Main), 101 (Main Intra), 102 (Main 10), or 103 (Main 10 Intra) for HEVC, or 200 (Main) for AV1, or -1 (Auto) for any codec.

+
+
level

Encoding level.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the encoder plugin.

+
+
param_cnt

Count of custom parameters.

+
+
+

Custom Encoder Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the encoder plugin:

+
+
"slice"

Slice to perform the encode.

+
+
"latency_logging"

When enabled, it logs latency information to XMA log.

+
+
"spatial_aq"

Enables or disables adaptive spatial qp.

+
+
"temporal_aq"

Enables or disables adaptive temporal qp.

+
+
"qp_mode"

Sets qp mode to auto, relative load or uniform.

+
+
"tune_metrics"

Sets the tuning metric to none, VQ, PSNR, SSIM or VMAF.

+
+
"forced_idr"

Forces insertion of an IDR.

+
+
"crf"

Enables or disables CRF.

+
+
"expert_options"

sets encoder's expert option.

+
+
"device_type"

For AV1 encoder selects between Type 1 and Type 2.

+
+
+
+
+

Encoder Dynamic Parameters

+

Dynamic parameters allow for per frame updates to encoding parameters. These parameters are specified by either XmaDynamicEncParams or XmaDynamicEncParams_v2 structure. To insert dynamic data parameters to encoder, proceed as follows:

+
+
    +
  1. Allocate side band data through xma_side_data_alloc()

  2. +
  3. Set returned structure members, from Step 1, of XmaDynamicEncParams or XmaDynamicEncParams_v2

  4. +
  5. Clone frame using xma_frame_clone()

  6. +
  7. Attach XmaDynamicEncParams or XmaDynamicEncParams_v2 structure using xma_frame_add_side_data()

  8. +
  9. Check return values for status checking

  10. +
  11. Remove dynamic parameters from frame using xma_frame_dec_ref()

  12. +
+
+
+

Note

+

Use XmaDynamicEncParams structure for XMA_API_VERSION_1_1 and below. For XMA_API_VERSION_1_1_2 and above, use XmaDynamicEncParams_v2 structure.

+
+
+
+struct XmaDynamicEncParams
+
+ +

This data structure is used to configure the dynamic parameters of encoder. The declaration of XmaDynamicEncParams can be found in the /opt/amd/ama/ma35/include/xma/xmasidedata.h file. +See Video Encoding for details.

+

Dynamic Encoder Parameters

+
+
is_spatial_aq_gain_changed

Change indicator flag for spatial_aq_gain

+
+
spatial_aq_gain

Spatial adaptive quantizer gain factor

+
+
is_temporal_aq_gain_change

Change indicator flag for temporal_aq_gain

+
+
temporal_aq_gain

Temporal adaptive quantizer gain factor

+
+
is_temporal_mode_changed

Change indicator flag for temporal_aq_mode

+
+
temporal_aq_mode

Enable/disable temporal quantizer

+
+
is_spatial_mode_changed

Change indicator flag for spatial_aq_mode

+
+
spatial_aq_mode

Enable/disable spatial quantizer

+
+
is_bit_rate_changed

Change indicator flag for bit_rate_kbps

+
+
bit_rate_kbps

Bit rate in kbps

+
+
is_b_frames_changed

Change indicator flag for num_b_frames

+
+
num_b_frames

Number of B frames

+
+
is_min_qp_changed

Change indicator flag for min_qp

+
+
min_qp

Minimum QP value

+
+
is_max_qp_changed

Change indicator flag for min_qp

+
+
max_qp

Maximum QP value

+
+
+
+
+struct XmaDynamicEncParams_v2
+
+ +

This data structure is used to configure extra dynamic parameters for encoding. The declaration of XmaDynamicEncParams_v2 can be found in the /opt/amd/ama/ma35/include/xma/xmasidedata.h file. +See Video Encoding for details.

+

Dynamic Encoder Parameters Version 2

+
+
v1

XmaDynamicEncParams memeber

+
+
is_qp_changed

Change indicator flag for qp

+
+
qp

QP value

+
+
is_qp_i_offset_changed

Change indicator flag for qp_i_offset

+
+
qp_i_offset

QP offset for I frames

+
+
is_qp_b_offset_changed

Change indicator flag for qp_b_offset

+
+
qp_b_offset

QP offset for B frames

+
+
is_min_bit_rate_changed

Change indicator flag for min_bit_rate_kbps

+
+
min_bit_rate_kbps

Minimum bit rate in kbps

+
+
is_max_bit_rate_changed

Change indicator flag for max_bit_rate_kbps

+
+
max_bit_rate_kbps

Maximum bit rate in kbps

+
+
is_bit_rate_changed

Change indicator flag for bit_rate_kbps

+
+
reserved

For future use

+
+
+
+

+
+
+
+
+

Filter Plugin Reference

+
+

Filter Interface

+

The filter plugin is based on the Filter XMA plugin type. The external interface to the filter plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+
+
+XmaFilterSession *xma_filter_session_create(XmaFilterProperties *props)
+
+ +

This function creates a filter session and must be called prior to sending YUV frames to the filter. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_filter_session_set_log(XmaFilterSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_filter_session_send_frame(XmaFilterSession *session, XmaFrame *frame)
+
+ +

This function sends YUV frames to the filter module in hardware. After sending a frame, the application can take further action depending upon the return value from this API.

+

If this function returns XMA_SUCCESS, then the application can proceed to recieve a frame from this filter.

+

If this function returns XMA_TRY_AGAIN, it means the input frame has not been consumed and needs to re-send the same input frame after calling receive frame.

+

Once the application sends all input frames to the filter module, it should continue sending null frames until all the frames have been flushed out from the filter.

+
+
+int32_t xma_filter_session_recv_frame(XmaFilterSession *session, XmaFrame *frame)
+
+ +

This function is called after calling the function xma_filter_session_send_frame().

+

If this function returns XMA_SUCCESS, then the "dummy" frame provided by the application has been filled in and can be sent to the next plugin.

+

If this function returns XMA_RESEND_AND_RECV, then no frames have been sent to the filter for processing. The XmaFrame is untouched and may be reused or released. +If this function returns XMA_TRY_AGAIN, then frames have been sent and are currently being processed, but are not yet ready. The c:struct:XmaFrame is untouched and may be reused or released. +If this function returns XMA_EOS, then all frames have been processed. The c:struct:XmaFrame is untouched and must be released.

+
+
+int32_t xma_filter_session_destroy(XmaFilterSession *session)
+
+ +

This function destroys the filter session that was previously created with the xma_filter_session_create() function.

+
+
+

Filter Properties

+

The AMD AMA Video SDK filter is configured using a combination of standard XMA filter properties, standard XMA filter input and output properties and custom filter parameters, all of which are specified using XmaFilterProperties and XmaFilterPortProperties data structures.

+
+
+struct XmaFilterProperties
+
+ +

This data structure is used to configure the filter function. The declaration of XmaFilterProperties can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+
+
+struct XmaFilterPortProperties
+
+ +

This data structure is used to configure the input and output of the filter. The XmaFilterProperties data structure contains one XmaFilterPortProperties for the filter input and one XmaFilterPortProperties for the output output. The declaration of XmaFilterPortProperties can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+

Standard XMA Filter Properties

+

When using the filter plugin, the following members of the XmaFilterPortProperties data structure must be set by the application:

+
+
hwfilter_type

Sets the direction of stream entry to XMA_UPLOAD_FILTER_TYPE or XMA_DOWNLOAD_FILTER_TYPE.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the filter plugin.

+
+
param_cnt

Count of custom parameters.

+
+
input

Input property of type XmaFilterPortProperties

+
+
output

Output property of type XmaFilterPortProperties

+
+
+

Standard XMA Filter Port Properties

+

When configuring the filter input or output, the following members of the XmaFilterPortProperties data structure must be set by the application:

+
+
format

Input video format. +Must be set to XMA_VPE_FMT_TYPE.

+
+
sw_format

Device side input video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840 +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
framerate

Framerate data structure specifying frames per second.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
framerate

Framerate data structure specifying frame rate per second.

+
+
+

Custom Filter Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the filter plugin:

+
+
"latency_logging"

When enabled, it logs latency information to XMA log.

+
+
+
+

+
+
+
+
+

Ultra Low Latency Considerations

+
+

Decoder Low Latency Mode

+

To enable low latency in the decoder, add a XmaParameter with the name low_latency, of type XMA_INT32, and value of 1. After each frame is sent to the decoder, the decoder will return XMA_SUCCESS. The application can immediately call xma_dec_session_recv_frame(). It will return either XMA_SUCCESS (indicating a frame has been returned), XMA_EOS (indicating the end of stream has been reached), or XMA_RESEND_AND_RECV (indicating the frame is still being processed and xma_dec_session_recv_frame() must keep being called until it is ready).

+
+
+

Encoder Ultra Low Latency Mode

+

To enable Ultra Low Latency in the encoder, set XmaEncoderProperties.lookahead_depth = 0. After each frame is sent to the encoder, the encoder will return XMA_SUCCESS. The application can immediately call xma_enc_session_recv_data(). It will return either XMA_SUCCESS (indicating a frame has been returned), XMA_EOS (indicating the end of stream has been reached), or XMA_RESEND_AND_RECV (indicating the frame is still being processed and xma_enc_session_recv_data() must keep being called until it is ready).

+
+
+
+
+

1.1 SDK API

+

The following subsections delineate 1.1 API improvements over 1.0. To use 1.1 APIs, set XMA_API_VERSION parameter to XMA_API_VERSION_1_1. (See here for how to do this.)

+
+

Note

+

SDK 1.1.1 is not backward ABI compatible with SDK 1.0. This implies that 1.0 applications need to be migrated to 1.1.1 SDK, manually.

+
+
+

Sideband Data

+

The main difference between SDK 1.1 and 1.0 are:

+
    +
  1. v1.0 only allowed 1 sideband data of each type, adding another would replace the first. v1.1 allows multiple of each type. New functions are added to access/modify the sideband data.

  2. +
  3. HDR10 sideband data type are deprecated and replaced with several different SEI sideband data types

  4. +
  5. Applications can define their own sideband data types and add the sideband data to frames. Filters will pass this sideband data downstream. Currently, only frames can have sideband data.

  6. +
  7. All sideband data (both predefined and user defined) can have metadata. Metadata is XmaParameters attached to sideband data used for adding additional information about a sideband data buffer to a sideband data. Each sideband data can have only one sideband metadata with a given name. If an application tries to add new metadata to a sidedata and a metadata with the same name already exists, the original metadata will be deleted and replaced by the new metadata. Metadata exists solely on the host.

  8. +
  9. Added sidedata functions are:

    +
    - xma_side_data_get_metadata(): Gets the value of sideband metadata.
    +- xma_side_data_set_metadata(): Adds/replaces sideband metadata to sideband data.
    +- xma_frame_get_first_side_data(): Get the first sidedata of any type that is attached to a given frame.
    +- xma_frame_get_next_side_data(): Get the next sidedata of any type that is attached to a given frame.
    +- xma_frame_get_next_side_data_of_type(): Get the next sidedata of a given type that is attached to a given frame.
    +
    +
    +
  10. +
  11. Modified sidedata functions are:

    +
    - xma_frame_get_side_data(): In v1.0 it will continue to get the sidedata of a given type from a given frame. In v1.1 it will get the first sidedata of a given type from a given frame.
    +- xma_frame_remove_side_data_type(): In v1.0 it will continue to remove the sidedata of a given type. In v1.1 it will remove all sidedata of a given type.
    +
    +
    +
  12. +
  13. Deprecated sidedata functions are:

    +
    - xma_side_data_read(): In v1.0 it copies the contents of the sidedata buffer from the device to the host.
    +
    +
    +
  14. +
+
+
+

Multithreading

+
    +
  1. In the decoder, 2 XmaParameter parameters are added:XMA_DEC_PARAM_THREADS and XMA_DEC_PARAM_WAIT. If XMA_DEC_PARAM_THREADS is set to 1, a background thread is deployed to improve performance. Note that XMA_DEC_PARAM_THREADS is 0 by default. If the application is using different threads to send and receive data from the decoder, the parameter XMA_DEC_PARAM_WAIT will improve CPU utilization on the host. XMA_DEC_PARAM_WAIT is only available if XMA_DEC_PARAM_THREADS is 1. XMA_DEC_PARAM_WAIT is 0 by default.

  2. +
  3. Similarly, in the encoder, 2 XmaParameter parameters are added: XMA_ENC_PARAM_THREADS and XMA_ENC_PARAM_WAIT. These behave the same as in the decoder.

  4. +
  5. The encoder calling order of send and receive has changed to be more in line with the decoder and scaler.

    +
    +
      +
    • +
      xma_enc_session_send_frame() return values and expected application behavior:
        +
      • XMA_SUCCESS: A frame is successfully sent to the encoder, regardless of if any data can be pulled from the encoder. The application should try calling xma_enc_session_recv_data() and proceed depending on the return value from xma_enc_session_recv_data().

      • +
      • XMA_TRY_AGAIN: The encoder's internal buffers are currently full. The application should try calling xma_enc_session_recv_data() and proceed according to it's return code. The next time xma_enc_session_send_frame() is called, send the same frame as was last sent, as it has not yet been processed. XMA_TRY_AGAIN will only be returned if XMA_ENC_PARAM_WAIT is 0.

      • +
      +
      +
      +
    • +
    • +
      xma_enc_session_recv_data() return values and expected application behavior:
        +
      • XMA_SUCCESS: Compressed data was returned and xma_enc_session_send_frame() can be called.

      • +
      • XMA_RESEND_AND_RECV: No compressed data is ready and the application should call xma_enc_session_send_frame(). Multiple loops of xma_enc_session_send_frame() returning XMA_TRY_AGAIN and xma_enc_session_recv_data() returning XMA_RESEND_AND_RECV may occur if internal buffers are full but no compressed data is ready. Continue looping until one of the functions returns a different value. XMA_RESEND_AND_RECV will only be returned if XMA_ENC_PARAM_WAIT is 0.

      • +
      • XMA_EOS: The end of the stream has been reached.

      • +
      +
      +
      +
    • +
    +
    +
  6. +
  7. XMA_SCALER_PARAM_THREADS is enabled by default in the scaler. To disable threading and pipelining, set this parameter to 0.

  8. +
+
+
+

Logging

+

XMA logging has been extended to be able to optionally output AMA logging. To use it, in the call to xma_log_init(), set the log type to XMA_LOG_TYPE_AMA.

+
+
+

Upgrading

+
    +
  1. If any frame returned by a session needs to have sideband data added/removed, e.g. adding XMA_FRAME_SIDE_DATA_DYN_ENC_PARAMS, then:

    +
      +
    • Original frame will need to be cloned, using xma_frame_clone()

    • +
    • Original frame itself, not its clone, has to have it's reference count decremented, using xma_frame_dec_ref()

    • +
    • Clone frame can have its sideband data added or removed using xma_frame_add_side_data(), xma_frame_remove_side_data(), or xma_frame_remove_side_data_type().

    • +
    +

    Following the above, the clone can then be passed on downstream, same as the original frame.

    +
  2. +
  3. xma_frame_add_side_data() does not remove existing sideband data from a frame, prior to adding a new sideband data. Instead it will add the new sideband data in addition to the old sideband data. To remove existing sideband data, call xma_frame_remove_side_data_type() first.

  4. +
+
+
+
+

XRM API Reference

+

The Xilinx® FPGA Resource Manager (XRM) library is used to manage the hardware accelerators available in the system. XRM keeps track of total system capacity for each of the compute units such as the decoder, scaler, and encoder.

+

The XRM library includes a daemon, a command line tool and a C application programming interface (API). Using the library API, external applications can communicate with the XRM daemon and perform actions such as reserving, allocating and releasing resources.

+

More details on the XRM command line tool (xrmadm) and the XRM daemon (xrmd) can be found in the XRM Reference Guide section of the documentation.

+

The XRM C APIs are defined in /opt/amd/ama/ma35/include/xrm/xrm.h.

+
+

Decoder Resource Reservation with XRM

+

The decoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file.

+
+
+int xrm_dec_reserve(XrmDecodeContext *xrm_dec_ctx, int dev_index, XrmInterfaceProperties *xrm_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant decoder parameters

+
+
+void xrm_dec_release(XrmDecodeContext *xrm_dec_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmDecodeContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file.

+
+
+

Encoder Resource Reservation with XRM

+

The encoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+int32_t xrm_enc_reserve(XrmEncodeContext *xrm_enc_ctx, int dev_index, int slice_id, bool is_xav1, bool is_ull, XrmInterfaceProperties *xrm_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_enc_release(XrmEncodeContext *xrm_enc_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmEncodeContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+

Scaler Resource Reservation with XRM

+

The scaler plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+
+int32_t xrm_scale_reserve(XrmScaleContext *scaler_xrm_ctx, int dev_index, XrmInterfaceProperties *input_props, XrmInterfaceProperties *output_props, int num_outputs)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_scale_release(XrmScaleContext *scaler_xrm_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmScaleContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+
+

Building Sample Examples

+

To build the included sample applications, follow the steps below:

+
cd /opt/amd/ama/ma35/examples/xma/
+chmod -R 777 .
+mkdir build && cd build
+cmake ..
+make -j
+
+
+
+

+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/card_management.html b/v1.1.2/card_management.html new file mode 100644 index 00000000..448c579d --- /dev/null +++ b/v1.1.2/card_management.html @@ -0,0 +1,624 @@ + + + + + + + + + + + + + + + Card Management — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Card Management
  • +
  • +
  • +
+
+
+
+
+ +
+

Card Management

+ +
+

Overview

+

The AMD AMA Video SDK builds on the Xilinx Resource Manager (XRM) to interface with AMD video acceleration cards. The AMD AMA Video SDK includes the mautil, mamgmt , maflash and xrmadm command line tools for card installation, upgrade, and management.

+
+

mautil, maflash, mamgmt and print_ma35_load

+

The AMD Board Utility (mautil), the AMD Flash Utility, (maflash) and the AMD Board Management Utility (mamgmt) are standalone command line tools used to query, flash and administer AMD acceleration cards. print_ma35_load prints load status of the card in a readable manner.

+
    +
  • mautil is used to examine and identify the installed accelerator card(s). This option is meant for use by unprivileged users to get status information on AMD AMA devices. mautil is available on both the bare-metal host and guest VM.

  • +
  • maflash is used to flash card(s) firmware.

  • +
  • mamgmt is used to examine devices, reset and administer the installed accelerator card(s). This option is meant for use by privileged users to get status information of AMD AMA devices, create VFs, and reset target evices. mamgmt is only available on the bare-metal host.

  • +
+

The mautil, maflash and mamgmt commands target one device at a time using a PCIe DBDF (Domain:Bus:Device.Function) identifier. The DBDF notation works as follows:

+
    +
  • PCI Domain number, often padded using leading zeros to four digits

  • +
  • A colon (:)

  • +
  • PCI Bus number in hexadecimal, often padded using a leading zeros to two or four digits

  • +
  • A colon (:)

  • +
  • PCI Device number in hexadecimal, often padded using a leading zero to two digits . Sometimes this is also referred to as the slot number.

  • +
  • A decimal point (.)

  • +
  • PCI Function number in hexadecimal.

  • +
+
+
+

xrmadm and xrmd

+

XRM is the software which manages the hardware accelerators available in the system. The XRM daemon (xrmd) is a background process supporting reservation, allocation, and release of hardware acceleration resources. The XRM xrmadm command line tool is used to interact with the XRM daemon (xrmd) in order to check status and generate resource utilization reports.

+

For more details about the XRM commands specific to the AMD AMA Video SDK refer to the XRM Command Reference Guide.

+
+
+
+

Card and Device Identifiers

+
+

Device DBDF (mautil)

+

The list of all installed AMD AMA Video SDK compatible devices, including their DBDF is obtained with the mautil examine command.

+

For example, the command below detected 2 devices and lists their BDFs:

+
$ mautil examine
+List of available devices:
+0000:01:00.0
+0000:02:00.0
+Info: No action taken, no reports given.
+Info: Use --help to check cmd options to use for reports
+
+
+

The last device listed has DBDF of 0000:02:00.0, which describes Domain 0, Bus 02, Device 00, Function 0.

+
+
+

Device DBDF (mamgmt)

+

The list of all installed AMD AMA Video SDK compatible devices, including their DBDF can also be obtained with the mamgmt examine command.

+

For example, the command below detected 2 devices and lists their DBDF designations:

+
$ mamgmt examine
+
+
+  List of available devices:
+  0000:01:00.0
+  0000:02:00.0
+  Info: No action taken, no reports given.
+  Info: Use --help to check cmd options to use for reports
+
+
+

The last device listed has DBDF of 0000:02:00.0, which describes Domain 0, Bus 2, Device 00, Function 0.

+
+
+

Bus ID

+

You can look-up the PCIe bus ID of a device through the following command:

+
cat /sys/class/misc/ama_transcoder{x}/bus_id
+
+
+

, where x is a number between 0 to total number of devices minus 1.

+

Example

+
    +
  • Bus id of /sys/class/misc/ama_transcoder0 is:

    +
    $ cat /sys/class/misc/ama_transcoder0/bus_id
    +  0000:01:00.0
    +
    +
    +
  • +
  • This can be verified by mautil examine command.

  • +
+
+
+

Firmware Version Number

+

To look-up the version number of each installed firmware, proceed as follows:

+
+
cat /sys/class/misc/ama_transcoder0/version_information
+
+
+

It should return:

+
+
+
ZSP Version = 2.0.4
+SC Version = 9.7.39
+eSecure Version = 1.0.0
+PCIe FW Version = 2.1.0
+PCIe CTRL Patch Version = 1.0.3
+PCIe PHY Patch A Version = 1.0.0
+
+
+
+
+
+
+

Checking System Status - mautil

+

The mautil commands provides useful details about your environment and can be used to ensure that your cards and devices are properly detected.:

+
mautil -d [<DBDF> | all] command, where "command" is one of the following: ("all" refers to every card in the chassis.)
+   examine    - Status of the system and device.
+   validate   - Validates the basic shell acceleration functionality
+
+
+
+

Note

+
    +
  • Running validate sub-command on a device running a video pipeline will impact the performance of the pipeline.

  • +
+
+

The list of applicable devices, for mautil sub-commands, can be obtained via mautil examine.

+

For more details on examine command, see Checking Device Status.

+
+
+

Checking Device Status

+

The mautil examine -d <DBDF> --report <type> commands provides additional details about the status of each AMD AMA Video SDK compatible device installed.

+

The --report (or -r) switch is used to view specific report(s) of interest:

+
    +
  • electrical: Reports Electrical and power sensors present on the device

  • +
  • device-hw: Provides information on the device's hardware

  • +
  • error-cnt: Reports on device's error counter

  • +
  • host: Prints host information

  • +
  • memory: Reports memory topology of the device

  • +
  • pcie-info: PCIe information of the device

  • +
  • thermal: Reports thermal sensors present on the device

  • +
  • utilization: Reports on accelerators resource utilization

  • +
  • all: Prints all the known status

  • +
+

These reports can also be generated in a JSON file, by adding --format JSON -o <filename> to the mautil examine command.

+

An example usage for thermal and electrical reports, for the device with DBDF 0000:01:00.0 is:

+
mautil examine -r thermal electrical -d 0000:01:00.0
+
+...
+-----------------------------
+[0000:01:00.0] : MA35 Device
+-----------------------------
+Thermal Info
+------------
+  Device Temperature     :  62 C
+  Board Temperature      :  58 C
+
+--------------------------------------------------
+Electrical Info
+---------------
+Device:
+  aux                    :    736 mV
+  ddr0                   :    865 mV
+  ml_engine              :    751 mV
+  enc                    :    749 mV
+
+Board:
+  12V PEX Current        :    787 mA
+  3V AUX Current         :     80 mA
+  3V PEX Current         :    360 mA
+  12V PEX Voltage        :  12200 mV
+  3V AUX Voltage         :   3296 mV
+  3V PEX Voltage         :   3296 mV
+  board_power            :  11051 mW
+
+--------------------------------------------------
+
+
+
+
+

Checking Device Configuration - mamgmt

+

The mamgmt provides administrative commands for managing the installed devices. In addition to commands that are provided by mautil, mamgmt also allows for managing Virtual Functions (VF) on a device:

+
mamgmt -d [<DBDF> | all] command, where "command" is one of the following: ("all" refers to every card in the chassis.)
+  examine      - Status of the system and device
+  numvfs       - Create a VF or destroys the active VF
+  reset        - Resets the given device
+
+
+

An example usage for all available reports on 0000:01:00.0 is:

+
mamgmt examine -d 0000:01:00.0 -r all
+
+Memory Bandwidths:
+         Tag                 Current (MBps)
+  s2_dfi_w_MBps             : 0
+  s2_dfi_r_MBps             : 0
+  s2_axi_w_MBps             : 0
+  s2_axi_r_MBps             : 0
+  s1_dfi_w_MBps             : 0
+  s1_dfi_r_MBps             : 474
+  s1_axi_w_MBps             : 0
+  s1_axi_r_MBps             : 236
+
+  total_dfi_MBps            : 474
+       s1_dfi_bw(total)     : 474
+       s2_dfi_bw(total)     : 0
+  total_axi_MBps            : 236
+       s1_axi_bw(total)     : 236
+       s2_axi_bw(total)     : 0
+
+Pcie Info:
+  Vendor                 : 0x10ee
+  Device                 : 0x5070
+  PCIe                   : 16GT/s, Width 4
+
+MA35 Thermal Info:
+Device Temperature:
+  id: Device Temp [57 C]
+Board Temperature:
+  id: board_temp [53 C]
+
+MA35 Electrical Info:
+Device Electrical Info:
+  id: aux [736 mV]
+  id: ddr0 [864 mV]
+  id: ml_engine [752 mV]
+  id: enc [750 mV]
+Board Electrical Info:
+  id: 3V PEX Voltage [3304 mV]
+  id: 3V AUX Voltage [3296 mV]
+  id: 12V PEX Voltage [12208 mV]
+  id: 3V PEX Current [266 mA]
+  id: 3V AUX Current [80 mA]
+  id: 12V PEX Current [653 mA]
+  id: board_power [9114 mW]
+
+Device Hardware Info:
+Device uptime (sec):328344
+Device Firmware Info:
+  PciePhyPatch:  1.0.0
+  PcieCtlPatch:  1.0.3
+  PCIe:  2.1.0
+  eSecure:  1.0.0
+  SC:  9.7.32
+  ZSP:  2.0.4
+Device Threshold Info:
+  shutdown_temp_C:  110
+  max_operating_temp_C:  105
+  threshold_temp_C:  85
+Device Hardware Info:
+  oem_id:  0xe78
+  sku_number:  02
+  part_number:  05105-02
+  Product_Name:  ALVEO MA35D PQ
+  Product_Revision:  1
+  Product_SN:  XFL1AT3KLCY5
+  Processor_Type:  VPU (Video Processing Unit)
+
+MA35 Error Counter Info:
+         Tag                 Uncorrectable       Correctable
+    THS2_axi_sram            0                   0
+    THS1_axi_sram            0                   0
+    ddr_ch7                  0                   0
+    ddr_ch6                  0                   0
+    ddr_ch3                  0                   0
+    ddr_ch2                  0                   0
+    ddr_ch1                  0                   0
+    ddr_ch5                  0                   0
+    ddr_ch0                  0                   0
+    ddr_ch4                  0                   0
+    pcie                     0                   0
+
+
+

An example usage to reset device 0000:01:00.0 is:

+
mamgmt reset -d 0000:01:00.0
+Are you sure you wish to proceed? [Y/n]: y
+****************************************************
+Reset command completed
+****************************************************
+
+
+

To create and destroy a VF device, issue the following commands, respectively:

+
$ sudo mamgmt -d <DBDF> numvfs -v 1 # Create VF device
+$ sudo mamgmt -d <DBDF> numvfs -v 0 # Destroy VF device
+
+
+
+
+

Programming a Device - maflash

+

The maflash utility provides means of programming and verifying flash images from a target device or for getting meta-data from a binary image file.

+

To flash program or verify a flashing process, specify the <DBDF> of a target device or all for all devices in a chassis:

+
sudo maflash <sub-command> [-d [<DBDF> | all] | -p | -s | -b] <path_to_flash_image>
+    -d | --device         a comma separated list of PCIe DBDFs *or* the keyword "all" which will use all detected ma35 devices
+    -p | --parallel       perform the program or verify operation simultaneous across all specified devices
+    -s | --stop-on-error  for non-parallel operations, stop at the first error detected.  The default is to continue on error
+    -b | --backup         specify that the program or verify operation should use the backup regions (where appropriate)
+
+
+

, where sub-command is one of:

+
program             - To flash an image
+verify              - To verify proper image flashing
+
+
+

For example, the following command flashes all relevant subsystems for 0000:01:00.0 device using ma35_firmware.bin image.:

+
sudo /opt/amd/ama/ma35/bin/maflash program -d 0000:01:00.0 ma35_firmware.bin
+
+Using flash image: zsp_firmware_packed_pq.bin [type: ZSP, version: 2.0.4, package_timestamp: 2024-01-30_02:16:39+00:00, keyset: AMD, md5sum: a0c16839e94e1cba0a8c54e2e4f720ec, schema: 1]
+  Device: 0000:01:00.0
+EraseFlash Started..
+9%  19%  29%  38%  48%  58%  67%  77%  87%  96%  100%
+
+WriteFlash Started, please Wait..
+flash_progress:
+10%  20%  30%  40%  50%  60%  70%  80%  90%  100%
+
+    Operation completed successfully
+Using flash image: BMC-MSP432.bin [type: SC, version: BMC-MSP432-9.7.32, package_timestamp: 2024-01-30_02:16:31+00:00, md5sum: f92a87bb92749276d4ecd12dc4f9887b, schema: 1]
+  Device: 0000:01:00.0
+EraseFlash Started..
+9%  18%  28%  37%  46%  56%  65%  75%  84%  93%  100%
+
+WriteFlash Started, please Wait..
+flash_progress:
+10%  20%  30%  40%  50%  60%  70%  80% 100%
+
+
+

To verify proper programming of the primary ZSP flash, issue the following command:

+
sudo /opt/amd/ama/ma35/bin/maflash verify -d 0000:01:00.0  ma35_firmware.bin
+
+Using flash image: zsp_firmware_packed_pq.bin [type: ZSP, version: 2.0.4, package_timestamp: 2024-03-19_01:18:40+00:00, keyset: AMD, md5sum: 90418d91f5ea7c37ef5b020ba41fc3e5, schema: 1]
+Device: 0000:01:00.0
+ Operation completed successfully
+Using flash image: BMC-MSP432.bin [type: SC, version: BMC-MSP432-9.7.35, package_timestamp: 2024-03-19_01:18:31+00:00, md5sum: 01ef067b5aac9a82556b262b67b59a17, schema: 1]
+Device: 0000:01:00.0
+ Operation completed successfully
+
+
+

To get meta-data from a binary file, use the info sub-command:

+
 sudo /opt/amd/ama/ma35/bin/maflash info ma35_firmware.bin
+
+zsp_firmware_packed_pq.bin: type: ZSP, version: 2.0.4, package_timestamp: 2024-01-30_02:16:39+00:00, keyset: AMD, md5sum: a0c16839e94e1cba0a8c54e2e4f720ec, schema: 1
+BMC-MSP432.bin: type: SC, version: BMC-MSP432-9.7.32, package_timestamp: 2024-01-30_02:16:31+00:00, md5sum: f92a87bb92749276d4ecd12dc4f9887b, schema: 1
+
+
+
+
+

Checking Resource Utilization

+

Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

+
source /opt/amd/ama/ma35/scripts/setup.sh
+
+
+

Note that this command should be run only once per boot.

+

To check the current loading of all the devices in your system, use the following command:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

This will generate a report in JSON format containing the load information for all the compute unit (CU) resources. The report contains a section for each device in the system. The device sections contain sub-sections for each of the CUs (decoder, scaler, lookahead, encoder) in that device. For example, the load information for the encoder on device 0 may look as follows:

+
"device_0": {
+  ...
+  "cu_2": {
+       "cuId         ": "2",
+       "cuType       ": "IP Kernel",
+       "kernelName   ": "encoder",
+       "kernelAlias  ": "ENCODER_TYPE1_AMA",
+       "instanceName ": "encoder_1",
+       "cuName       ": "encoder:encoder_1",
+       "kernelPlugin ": "",
+       "maxCapacity  ": "497664000",
+       "numChanInuse ": "0",
+       "usedLoad     ": "0 of 1000000",
+       "reservedLoad ": "0 of 1000000",
+       "resrvUsedLoad": "0 of 1000000"
+   },
+
+
+

The usedLoad value indicates how much of that resource is currently being used. The value will range from 0 (nothing running) to 1000000 (fully loaded). The reservedLoad value indicates how much of that resource is being reserved using XRM. The resrvUsedLoad value indicates how much of the reserved load is actually being used.

+ +
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/encoder_comp_matrix.html b/v1.1.2/encoder_comp_matrix.html new file mode 100644 index 00000000..acd3b6ae --- /dev/null +++ b/v1.1.2/encoder_comp_matrix.html @@ -0,0 +1,2031 @@ + + + + + + + + + + + + + + + Encoding Compatibility Matrix — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Encoding Compatibility Matrix
  • +
  • +
  • +
+
+
+
+
+ +
+

Encoding Compatibility Matrix

+ +

Given the many adjustable parameters of an AMD AMA Video encoder, not all combinations of such parameters are permissible. The following tables describe the compatibility matrix for each encoder type.

+
+

AVC and HEVC Encoders

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LA Depth

Latency Mode

Cores

Slow Preset

Medium Preset

Fast Preset

No B Frames

CQP

CBR

VBR

cVBR

CRF

CABR

Spatial AQ

Temporal AQ

ROI QP Map

7-49

+
Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-3
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

6

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-2
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

5

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

4

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

3

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

2

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

1

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
Y
+
+

0

+
ULL
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
+
+

AV1 Type 1 Encoder

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LA Depth

Latency Mode

Cores

Slow Preset

Medium Preset

Fast Preset

No B Frames

CQP

CBR

VBR

cVBR

CRF

CABR

Spatial AQ

Temporal AQ

ROI QP Map

11-53

+
Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-7
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

10

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-6
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

9

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-5
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

8

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-4
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

7

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-3
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

6

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-2
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

5

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

4

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

3

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

2

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

1

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

0

+
ULL
+
+
+
1 or 2
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
+

Note

+
    +
  1. When using 2 cores, the minimum resolution should have width >= 720 and height >= 720

  2. +
  3. The Slow preset only has an impact for 10-bit content. For 8-bit content it is identical to the medium preset. This statement applies to all values of lookahead depth.

  4. +
+
+
+
+

AV1 Type 2 Encoder

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LA Depth

Latency Mode

Cores

Slow Preset

Medium Preset

Fast Preset

No B Frames

CQP

CBR

VBR

cVBR

CRF

CABR

Spatial AQ

Temporal AQ

ROI QP Map

7-49

+
Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-3
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

6

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-2
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

5

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

4

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

3

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+

2

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+

1

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+

0

+
ULL
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/examples.html b/v1.1.2/examples.html new file mode 100644 index 00000000..07558b23 --- /dev/null +++ b/v1.1.2/examples.html @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + Tutorials and Examples — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tutorials and Examples
  • +
  • +
  • +
+
+
+ + + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/examples/amf/amf_encoder.html b/v1.1.2/examples/amf/amf_encoder.html new file mode 100644 index 00000000..07ea036e --- /dev/null +++ b/v1.1.2/examples/amf/amf_encoder.html @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + AMF Encoder Tutorial — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMF Encoder Tutorial
  • +
  • +
  • +
+
+
+
+
+ +

Under Construction

+
+

AMF Encoder Tutorial

+

The examples in the /opt/amd/ama/ma35/bin folder illustrate how C-based applications can perform encoding in AMD AMA Video SDK devices, using the AMF (Advanced Media Framework) APIs.

+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/examples/ffmpeg/filters.html b/v1.1.2/examples/ffmpeg/filters.html new file mode 100644 index 00000000..3173e774 --- /dev/null +++ b/v1.1.2/examples/ffmpeg/filters.html @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + FFmpeg Examples using Software Filters — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

FFmpeg Examples using Software Filters

+ +

Examples shown in this section describe how to use FFmpeg combining both AMD accelerated functions and software filters. In all these examples, an AMA compatible device, e.g., MA35D, is used to decode the input stream, the decoded frames are transfered back to the host using the hwdownload filter, one or more software filters are applied to the decoded frames and the filtered frames are transfered back to the device using hwupload for encoding. It should be noted that, when possible, zero-copy filters such as split and fps should be used, to minimize the traffic between the host CPU and target device.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Video Rotation

+

The following example demonstrates how to generate multiple flip-over operations on the host CPU and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "split=2[a][b]; \
+  [a]hwdownload,transpose=dir=1:passthrough=none,hwupload[a1]; \
+  [b]hwdownload,transpose=dir=2:passthrough=none,hwupload[b1]" \
+ -map "[a1]" -c:v h264_ama  -f mp4 <OUT DIR>/90_flip.mp4 \
+ -map "[b1]" -c:v h264_ama  -f mp4 <OUT DIR>/270_flip.mp4
+
+
+

, where INPUT is the path to the input AVC clip and OUT DIR is the name of the output directory. See FFmpeg's filters for details on passthrough and split filters.

+
+
+

Logo Overlay

+

The following example demonstrates how to overlay a yuv420p image on a decoded video, through host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -i <y4M LOGO> -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "[1]hwdownload[vid],[vid][0]overlay=x=0:y=0[l],[l]format=yuv420p[lay],[lay]hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/overlay.mp4
+
+
+

Note that input to accelerated encoder, h264_ama, is in yuv420p format. See FFmpeg's overlay filter for detail usage.

+
+
+

Crop and Shift

+

The following example demonstrates how to crop a decoded video, at a given x and y offsets, through host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "hwdownload,crop=640:480:(in_w-800):(in_h-out_h)/2,hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/crop.mp4
+
+
+
+
+

Video Composition

+

The following example demonstrates how to compose a tiled video on the host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -out_fmt yuv420p -i <INPUT_1> -c:v h264_ama -out_fmt yuv420p -i <INPUT_2> \
+ -c:v h264_ama -out_fmt yuv420p -i <INPUT_3> -c:v h264_ama -out_fmt yuv420p -i <INPUT_4> \
+ -filter_complex "[0]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[00];[1]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[11];\
+  [2]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[22];[3]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[33]; [00][11]hstack[top];\
+  [22][33]hstack[bot]; [top][bot] vstack,hwupload" \
+ -c:v h264_ama -b:v 15M -vframes 600 -f mp4 <OUT DIR>/compose.mp4
+
+
+
+

Note

+

For 10-bit support, the following changes are required to the provided examples:

+
    +
  1. Replace -out_fmt yuv420p with -out_fmt yuv420p10le

  2. +
  3. Add format=yuv420p10le to the filter graph.

  4. +
+

As an example, the following command shows 10-bit crop and shift:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p10le -i <INPUT> \
+ -filter_complex "hwdownload,format=yuv420p10le,crop=640:480:(in_w-800):(in_h-out_h)/2,hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/crop_10b.mp4
+
+
+
+
+
+

Chroma Subsampling

+

The following example demonstrates how to perform 4:2:2 to 4:2:0 chroma subsampling on the host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -i <INPUT>  -vf "format=yuv420p,hwupload" -c:v h264_ama -b:v 1M -f mp4 <OUTPUT>
+
+
+

, where <INPUT> is path of the 442 input raw file and <OUTPUT> is the encoded video file.

+
+
+

Decoding and De-interlacing

+

Given that AMD AMA SDK neither accepts interlaced contents nor performs de-interlacing, such operations need to be performed on the host CPU. The following example demonstrates how to perform interlaced to progressive transcoding:

+
ffmpeg -hwaccel ama -i <INPUT>  -filter_complex  "yadif=0,hwupload" -c:v h264_ama -f mp4 <OUTPUT>
+
+
+

, where <INPUT> is path of the interlaced content and <OUTPUT> is the encoded video file.

+
+
+

Text Insertion

+

The following example demonstrates how to insert a text into encode stream:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -re \
+-f lavfi -i testsrc=duration=60:size=1920x1080:rate=60,format=yuv420p -f rawvideo \
+-filter_complex "drawtext=text='Hello:y=10:fontcolor=yellow:fontsize=36',format=yuv420p, hwupload" \
+-c:v h264_ama -f mp4 <OUTPUT>
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/examples/ffmpeg/quality_analysis.html b/v1.1.2/examples/ffmpeg/quality_analysis.html new file mode 100644 index 00000000..3bd36e4b --- /dev/null +++ b/v1.1.2/examples/ffmpeg/quality_analysis.html @@ -0,0 +1,360 @@ + + + + + + + + + + + + + + + Video Quality Examples — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Video Quality Examples

+

This page is dedicated to explaining some of the details behind Video Quality (VQ), how it is measured, and how you can optimize your FFmpeg commands with the AMD AMA Video SDK to maximize its performance.

+

Further documentation on this topic can be found in the Tuning Video Quality section of the AMD AMA Video SDK user guide.

+ +
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Introduction to Video Quality

+

There has been a longstanding goal for video engineers to quantitatively determine the output quality of an encoder without having to watch and inspect every individual frame. This has led to an evolution of algorithmic solutions, the most common of which are:

+ +

Many people will argue which metric is best (although PSNR is commonly considered the least accurate). Jan Ozer from the Streaming Media Center posted his experimental correlation of MOS vs the above metrics. You can review the findings here.

+

Furthermore, due to the industry standard of tracking encoder "performance" to quantitative metrics like the ones listed above, many encoders have "taught to the test"; that is, they provide different command-line arguments that will give higher scores but may look worse to the human eye. For example, common CPU encoders x264 and x265 have a tune parameter which optimizes to objective metrics.

+

This page discusses the AMD AMA Video SDK command line flags used to optimize for objective quality (scores) and subjective quality (visual appeal) and provides additional details as to what is happening behind the scenes and why.

+
+
+

Optimized Settings for the AMD AMA Video SDK

+

It is highly recommended to perform encoding on raw video clips; that is, clips that have not undergone a transform/compression/encoding in the past. This ensures that the clips are in a universally known state in order to fairly compare encoders.

+

Alternatively, you can add the flags to decode before encoding, and the results will remain accurate as long as the same pre-encoded file is used as the source across all encoders under test. Information on this process can be found on the FFmpeg tutorial page.

+

Flags not illustrated in this page are covered in the Using FFmpeg chapter of the AMD AMA Video SDK user guide.

+

The following table demonstrates various encoder parameters that effect VQ and latency.

+ + ++++++ + + + + + + + + + + + + + + +
Video Tuning Parameters

Tune Mode

Latency Setting

Preset Type

Encoder

VMAF

+

VQ

+

SSIM

+

PSNR

+

(See -tune_metrics)

+

Normal

+

Ultra Low Latency

+

(See -lookahead_depth)

+

Fast

+

Medium

+

Slow

+

(See -preset)

+

h264_ama

+

hevc_ama

+

av1_ama

+

(See -c:v)

+
+

Various permutations of Metrics, Latency and Preset are possible. The following sections provide demonstrative examples.

+
+

AV1 VMAF - Normal Latency - Medium Preset

+

In this mode, which is the default mode, the only adjustable parameter is the tuning mode. The following example, illustrates the VMAF tune mode, for AV1 encoder

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v av1_ama -tune_metrics 4 -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -tune_metrics 4 specifies VMAF optimization mode.

+
+
+

AVC VMAF - Normal Latency - Slow Preset

+

In this mode, real-time performance at capacity is not guaranteed; however, better results are obtained, with respect to the selected tune metric. Note that this mode is not applicable to either types of AV1.

+

The following example, illustrates the VMAF tune mode, for AVC encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v h264_ama -tune_metrics 4 -preset slow -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -preset slow optimizes the objective tuning modes.

+
+
+

AV1 VMAF - Ultra Low Latency - Medium Preset

+

Ultra Low Latency (ULL) is achieved by setting the -lookahead_depth to 0. The following example, illustrates the VMAF tune ULL mode, for AV1 encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v av1_ama -tune_metrics 4 -b:v 2000k -lookahead_depth 0 -f rawvideo <OUTPUT>
+
+
+
+
+

AVC VMAF - Ultra Low Latency - Slow Preset

+

This mode is the combination of ULL and metric optimized options. Note that this mode is not applicable to either types of AV1.

+

The following example, illustrates the VMAF tune ULL mode, for AVC encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v h264_ama -tune_metrics 4 -lookahead_depth 0 -preset slow -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -preset slow optimizes the objective tuning modes.

+
+
+
+

Running PSNR/SSIM/VMAF Scores

+

Due to licensing reasons, the FFmpeg binary delivered in this package does not include a comprehensive set of codecs or plugins required for scoring video quality. You have many options:

+
    +
  1. (Easiest) Download a static FFmpeg build from John Van Sickle which has VMAF (among other plugins) precompiled + installed

  2. +
  3. Recompile another version FFmpeg and include the VMAF library

  4. +
  5. Recompile the FFmpeg starting from the source code included in this repository and include the VMAF library. For instructions on how to customize and rebuild the FFmpeg provided with the AMD AMA Video SDK, see the Rebuilding FFmpeg section

  6. +
+

The following sample command line demonstrates a typical VMAF calculation, through FFmpeg:

+
<FFMPEG PATH>/ffmpeg -i <DISTORTED FILE> -framerate <FRAME RATE> -s <RESOLUTION> -pix_fmt yuv420p -i <ORIGINAL> \
+-lavfi libvmaf="log_fmt=json:ms_ssim=1:ssim=1:psnr=1:log_path=/<LOG FILE PATH>.vmaf.json:model_path=<PATH TO VMAF MODEL>" -f null -
+
+
+

, where FFMPEG PATH is the path to modified FFmpeg, DISTORTED FILE is the encoded file, RESOLUTION is WidthxHeigth resolution of the original clip, ORIGINAL is the original clip, LOG FILE PATH is the path of log file and PATH TO VMAF MODEL is the path to an appropriate VMAF model, which typically is vmaf_4k_v0.6.1.pkl for 4K resolution or vmaf_float_v0.6.1.pkl for lower resolutions. See Models for relevant details. The above command line calculates PSNR, SSIM and VMAF, in json format.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/examples/ffmpeg/tutorials.html b/v1.1.2/examples/ffmpeg/tutorials.html new file mode 100644 index 00000000..5dd6729c --- /dev/null +++ b/v1.1.2/examples/ffmpeg/tutorials.html @@ -0,0 +1,855 @@ + + + + + + + + + + + + + + + FFmpeg Tutorials — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

FFmpeg Tutorials

+

This page provides tutorials on how to use FFmpeg with the AMD AMA Video SDK. The complete reference guide for the FFmpeg version included in the AMD AMA Video SDK can be found here.

+

The tutorials break down the commands, starting with simple decode, scale and encode pipelines. The tutorials end with different varieties of full transcode pipelines.

+ +
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+

+
+
+
+

Simple FFmpeg Examples

+

Some of the examples read or write RAW files from disk (encode-only or decode-only pipelines). There is a chance that due to the massive bandwidth required for operating on these RAW files, you will notice a drop in FPS; this is not due to the AMD AMA Video SDK but the disk speeds. We recommend reading/writing from /dev/shm which is a RAM disk.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Decode Only

+

This example accepts a clip that is already encoded in H.264, and will decode the file into a RAW format and save it to disk.

+

Command Line:

+
ffmpeg -y -hwaccel ama -c:v h264_ama -out_fmt nv12 -i <INPUT> \
+ -vf hwdownload,format=nv12 -f rawvideo /tmp/dec_out.nv12
+
+
+

Explanation of the flags:

+
    +
  • ffmpeg

    +
      +
    • The ffmpeg application, which is provided by AMD, and moved to the top of the PATH when you sourced the setup.sh script

    • +
    +
  • +
  • hwaccel ama

    +
      +
    • Instructs FFmpeg to use accelerated plugins provided by AMD AMA Video SDK

    • +
    +
  • +
  • -out_fmt nv12

    +
      +
    • Specifies nv12 output format for the decoded video. Note that this option has to be specified twice: 1) To convert from the internal buffer format to nv12 in the decoder and 2) To convert when transferring to the host.

    • +
    +
  • +
  • -f rawvideo

    +
      +
    • This signifies that the video is in a raw format, without container or other metadata/information about the clip

    • +
    +
  • +
  • -c:v h264_ama

    +
      +
    • Declares the decoder's codec for video (as opposed to, e.g., audio -c:a ac3) is the hardware-accelerated H.264 decoder

    • +
    +
  • +
  • -i <INPUT>

    +
      +
    • The input file to be transcoded

    • +
    +
  • +
  • -vf hwdownload

    +
      +
    • Internally, the decoder operates on AMD AMA Video SDK type buffers to improve performance. To convert back to a host-buffer, you must execute this filter.

    • +
    +
  • +
  • -y

    +
      +
    • Enable overwrite without prompting the user if they're sure

    • +
    +
  • +
  • /tmp/dec_out.yuv

    +
      +
    • The decoder will save the file to the path above

    • +
    +
  • +
+
+
+

Encode Only

+

This example accepts a RAW 1080p60 clip in YUV420 format. It will pass the clip to the encoder to produce an AV1 encoded MP4 output with a target bitrate of 5Mbps and saves it to disk. The command uses the default VQ setting. See FFmpeg Video Quality for details.

+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -b:v 5M -f mp4 -y sn1_av1.mp4
+
+
+

Explanation of the flags:

+
    +
  • -re

    +
      +
    • Flag to maintain the target frame rate

    • +
    +
  • +
  • -s 1920x1080

    +
      +
    • Since there is no container or metadata in a RAW clip, the user must define the input clip's resolution/size. This example states the input is 1080p

    • +
    +
  • +
  • -framerate 60

    +
      +
    • Again, without metadata, the encoder requires the framerate of the incoming stream

    • +
    +
  • +
  • -pix_fmt yuv420p

    +
      +
    • The color space of the encoder is by default yuv420p. this example is defining the input clip as being this same color space

    • +
    +
  • +
  • -f mp4

    +
      +
    • Sets the output video container to MP4

    • +
    +
  • +
  • -b:v 5M

    +
      +
    • The target bitrate of the encoded stream. 8M signifies a target bitrate of 8 Megabits per second. You can also use 8000K or 8000000.

    • +
    +
  • +
  • -c:v av1_ama

    +
      +
    • Declares the encoder's codec for video (as opposed to audio -c:a ...) is the hardware-accelerated AV1 encoder

    • +
    +
  • +
  • /tmp/enc_out.mp4

    +
      +
    • Save the output in the above path.

    • +
    +
  • +
+
+

4:2:2 10 Bit Conversion

+

To encode YUV, 4:2:2, 10 bit pixel format to YUV, 4:2:0, 8 bit use the following command:

+

Command Line:

+
ffmpeg -hwaccel ama -i <INPUT>  -vf "format=yuv420p,hwupload" -c:v h264_ama -b:v 1M <OUTPUT>
+
+
+

Explanation of the flags:

+
    +
  • -vf "format=yuv420p,hwupload"

    +
      +
    • Instructs the pipeline to upload and convert the input video as yuv420p.

    • +
    +
  • +
+
+
+

Constant Rate Factor (CRF) Mode

+

The following examples demonstrate the usage of the -crf flag and impact of the -qp option on the quality of the encoded streams.

+
+
High Quality Encoding
+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -crf 1 -qp 0 -f mp4 sn1_crf_hq.mp4
+
+
+

Explanation of the flags:

+
    +
  • -crf 1

    +
      +
    • Enables the -crf mode

    • +
    +
  • +
  • -qp 0

    +
      +
    • Sets the encoded AV1 stream to highest CRF quality

    • +
    +
  • +
+
+
+
Low Quality Encoding
+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -crf 1 -qp 255 -f mp4 sn1_crf_lq.mp4
+
+
+

Explanation of the flags:

+
    +
  • -qp 255

    +
      +
    • Sets the encoded AV1 stream to lowest CRF quality

    • +
    +
  • +
+
+
+
+
+

Basic Transcode

+

This example takes an H.264 clip and transcodes it to HEVC at the bitrate of 8Mbps. The output is written into /tmp/h264_to_hevc.

+

Command Line:

+
ffmpeg -y -hwaccel ama -c:v h264_ama -i <INPUT> \
+ -c:v hevc_ama -b:v 8M  -f rawvideo  /tmp/h264_to_hevc.hevc
+
+
+
+
+

Decode Only Into Multiple-Resolution Outputs

+

This example decodes an existing H.264 file and then scales it into multiple resolutions as defined below. It will not re-encode them, but save the RAW outputs to disk under /tmp/_scale<resolution>.yuv

+

Command Line:

+
 ffmpeg -y -hwaccel ama \
+-c:v h264_ama  -out_fmt nv12 -i <INPUT>  \
+-filter_complex "scaler_ama=outputs=4:out_res=(1920x1080|full|nv12)(1280x720|full|nv12)(720x480|full|nv12)(360x240|full|nv12) [a][b][c][d]; \
+                 [a]hwdownload,format=nv12[a1];[b]hwdownload,format=nv12[b1];[c]hwdownload,format=nv12[c1];[d]hwdownload,format=nv12[d1]" \
+-map '[a1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_1080p.yuv \
+-map '[b1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_720p.yuv  \
+-map '[c1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_480p.yuv \
+-map '[d1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_240p.yuv
+
+
+

Explanation of the flags:

+
    +
  • -filter_complex

    +
      +
    • The FFmpeg -filter_complex flag allows combining multiple filters together using a graph-like syntax. This example uses the scaler_ama to create 4 output resolutions from the input stream.

    • +
    • The scaler_ama filter configures the hardware-accelerated scaler to produce 4 output resolutions (1920x1080, 1280x720, 720x480, and 360x240). For each output, the width, height, frame rate and pixel format are defined as arguments to out_res option as in (WidthxHeight|Rate|Format). The 4 outputs are transfered to the host as a1, b1, c1 and d1 respectively.

    • +
    +
  • +
  • -map "[ID]"

    +
      +
    • Selects an output of the filter graph. The flags that follow apply to the selected stream.

    • +
    +
  • +
  • /tmp/scale_<resolution>.yuv

    +
      +
    • Save the output files to the paths listed

    • +
    +
  • +
+
+
+

Encode Only Into Multiple-Resolution Outputs

+

This example takes a raw 1080p60 YUV file, scales it down to different resolutions and frame rates, encodes each of the scaled streams to different formats and saves them to disk under /tmp/<encode format>_<resolution>p<frame rate>.mp4

+

Command Line:

+
ffmpeg -y -hwaccel ama -f rawvideo -pix_fmt yuv420p -s:v 1920x1080 -framerate 60 -i <INPUT> \
+-filter_complex "hwupload,scaler_ama=outputs=4:out_res=(1920x1080|full)(1280x720|half)(720x480|half)(360x240|half) [a][b][c][d]" \
+-map '[a]' -c:v hevc_ama -b:v 6M -f mp4 -y /tmp/hevc_1080p60.mp4 \
+-map '[b]' -c:v av1_ama  -b:v 2M -f mp4 -y /tmp/av1_720p30.mp4 \
+-map '[c]' -c:v h264_ama -b:v 1M -f mp4 -y /tmp/h264_480p30.mp4 \
+-map '[d]' -c:v av1_ama  -b:v 1M -f mp4 -y /tmp/av1_240p30.mp4
+
+
+

Explanation of the flags:

+
    +
  • -filter_complex "hwupload...

    +
      +
    • Specifies that video clip gets upload to the device.

    • +
    +
  • +
  • -filter_complex "...scaler_ama=outputs=4:out_res=...(1280x720|half)...

    +
      +
    • Declares scaler output of given resolution and rate. See scaler_ama for more details.

    • +
    +
  • +
  • -c:v [hevc_ama | av1_ama | h264_ama]

    +
      +
    • Declares various encode types HEVC, AV1 and H.264, respectively.

    • +
    +
  • +
  • /tmp/encode-format_resoultion.encode-format

    +
      +
    • Saves the output clips to the location listed

    • +
    +
  • +
+
+
+

Transcode with Multiple-Resolution Outputs

+

This example implements a complete transcoding pipeline on an 1080p60 H.264 input. It decodes the input stream, scales it to 4 different resolutions and encodes scaler's outputs into various formats and saves them to disk under /tmp/<encoder format>_<resolution>.mp4

+

Command Line:

+
ffmpeg -y -hwaccel ama \
+-c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=4:out_res=(1920x1080)(1280x720)(720x480)(360x240) [a][b][c][d]" \
+-map '[a]' -c:v hevc_ama -b:v 6M -f mp4 -y /tmp/hevc_1080p.mp4 \
+-map '[b]' -c:v av1_ama  -b:v 2M -f mp4 -y /tmp/av1_720p.mp4 \
+-map '[c]' -c:v h264_ama -b:v 1M -f mp4 -y /tmp/h264_480p.mp4 \
+-map '[d]' -c:v av1_ama  -b:v 1M -f mp4 -y /tmp/av1_240p.mp4
+
+
+
+
+

Transcode in ULL Mode

+

This example implements an ultra low latency transcode pipeline. For more details refer Tuning Transcode Latency.

+

Command Line:

+
ffmpeg  -hide_banner -loglevel error -y -hwaccel ama -low_latency 1 -c:v h264_ama -i <INPUT> \
+-c:v hevc_ama -b:v 10M -lookahead_depth 0 -f rawvideo /tmp/h264_to_hevc.hevc
+
+
+

Explanation of the flags:

+
    +
  • -low_latency 1

    +
      +
    • Enables low latency decoding mode.

    • +
    +
  • +
  • -lookahead_depth 0

    +
      +
    • LA size of 0 triggers ultra low latency encoding mode.

    • +
    +
  • +
+
+
+

Double Density Example with xrmd

+

This example demonstrates an example on how to achieve 4x4kp60 density on a single device

+

Command Line:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -i <4Kp6 H.264 file> \
+ -filter_complex "split=4[a][b][c][d]" \
+ -map "[a]" -c:v av1_ama -f rawvideo -y /tmp/out_3840x2160_0.av1 \
+ -map "[b]" -c:v hevc_ama -f rawvideo -y /tmp/out_3840x2160_0.hevc \
+ -map "[c]" -c:v av1_ama -f rawvideo -y /tmp/out_3840x2160_1.av1 \
+ -map "[d]" -c:v hevc_ama -f rawvideo -y /tmp/out_3840x2160_1.hevc
+
+
+

Explanation of the flags:

+
    +
  • -split

    +
      +
    • Splits input into several identical outputs.

    • +
    +
  • +
+
+
+

Double Density Example without xrmd

+

This example demonstrates how to achieve 4x4kp60 density on a single device, by explicitly allocating tasks on slices 0 and 1. Note in this example xrmd service has to be stopped.

+

Command Line:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -i <4Kp6 H.264 file> \
+ -filter_complex "split=4[a][b][c][d]" \
+ -map "[a]" -c:v av1_ama -slice 0 -f rawvideo -y /tmp/out_3840x2160_0.av1 \
+ -map "[b]" -c:v hevc_ama -slice 0 -f rawvideo -y /tmp/out_3840x2160_0.hevc \
+ -map "[c]" -c:v av1_ama -slice 1 -f rawvideo -y /tmp/out_3840x2160_1.av1 \
+ -map "[d]" -c:v hevc_ama -slice 1 -f rawvideo -y /tmp/out_3840x2160_1.hevc
+
+
+
+
+

Full Double Density

+

This example demonstrates how to achieve full density, by distributing transcode pipelines, between 2 devices.

+

Command Line:

+
for i in `seq 1 16`; do
+ ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoderX -re -c:v h264_ama -i <30 FPS INPUT> -c:v <TYPE 2 ENCODER> -lookahead_depth 10 -f null /dev/null > out_T2_0_$i.log 2>&1 &
+ ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoderX -re -c:v h264_ama -i <30 FPS INPUT> -c:v av1_ama -lookahead_depth 10 -f null /dev/null > out_av1_0_$i.log 2>&1 &
+ ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoderY -re -c:v h264_ama -i <30 FPS INPUT> -c:v <TYPE 2 ENCODER> -lookahead_depth 10 -f null /dev/null > out_T2_1_$i.log 2>&1 &
+ ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoderY -re -c:v h264_ama -i <30 FPS INPUT> -c:v av1_ama -lookahead_depth 10 -f null /dev/null > out_av1_1_$i.log 2>&1 &
+done
+
+
+

, where X and Y represent 2 different devices. <30 FPS INPUT> is a 30 FPS encoded video input. (The above example assumes H264 encoded input.), and <TYPE 2 ENCODER> is any one of AV1 Type-2, H264 or HEVC encoder. Note that by default av1_ama uses Type-1 AV1 encoder.

+

The above example transcodes 64 simultaneous 1080p30 pipelines. Note that if XRMD is disabled, then -slice parameter must be set explicitly.

+
+
+

Cropping

+

The following example demonstrates a 256x256 crop at offset (1500,450). See crop for details.

+

Command Line:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -re -out_fmt yuv420p -c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=1:out_res=(256x256|yuv420p):crop=256|256|1500|450 [b]" -map "[b]" -c:v h264_ama -f mp4 <OUTPUT>
+
+
+
+
+
+

2D GPU

+

This section provides examples on usage of various 2D GPU utilities.

+ + +++++ + + + + + + + + + + + + + + + + +
Video Processing Accelerators

Accelerator Core

Functions/Supported Models

Notes

2D GPU

Video Rotation, Color Space Conversion, Chroma Subsampling, Picture In Picture and Tiling.

+
Picture In Picture and Tiling require the same frame rate on all inputs to the 2d_ama plugin.
+
To cascade multiple 2D GPU cores, pixel format yuv420p must be set, explicitly.
+
+

Machine Learning

ML Based Face ROI and ML Based Text ROI models

+
Supported ROI models are 1080p in landscape mode, 720p in both landscape and portrait modes.
+
Maximum supported instances of ml_ama plugin (ROI model) per card is 8x720p60.
+
+
+
+

Video Rotation

+

The following example demonstrates how to transcode a flip-over operation on an AMA AMD compatible card:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -i <INPUT> \
+-filter_complex "[0:v]2d_ama=inputs=1:processor=rotate:rotation=180[c]" \
+-map "[c]" -c:v hevc_ama -f mp4 <OUTPUT>
+
+
+

, where 2d_ama is graphic processor's plugin, set for rotation operation; INPUT and OUTPUT are any one of supported encoded files. Note that only rotations which are multiples of 90 degrees are supported.

+

The following example demonstrates flip-over and 720p scaling operations:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama  -i <INPUT> \
+-filter_complex "[0:v]2d_ama=inputs=1:processor=rotate:rotation=180:w=1280:h=720[c]" \
+-map "[c]" -c:v hevc_ama -f mp4 <OUTPUT>
+
+
+
+
+

Color Space Conversion

+

The following example demonstrates how to convert from RGB to YUV on an AMA AMD compatible card:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 \
+-pix_fmt bgra -i <INPUT> \
+-filter_complex "[0:v]hwupload[a];[a]2d_ama=inputs=1:processor=csc:csc=rgb2yuv[c];[c]hwdownload" \
+-pix_fmt yuv420p -f rawvideo <OUTPUT>
+
+
+

, where graphic processor is set for color conversion operation.

+

The following example demonstrates how to encode a RGBA video file on an AMA AMD compatible card:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -f rawvideo -s 1920x1080 \
+-pix_fmt bgra -i <INPUT> \
+-filter_complex "[0:v]hwupload[a];[a]2d_ama=inputs=1:processor=csc:csc=rgb2yuv[c]" \
+-map "[c]" -c:v hevc_ama -f mp4 <OUTPUT>
+
+
+

Similarly, the following example demonstrates YUV to planar RGB conversion:

+
ffmpeg -y  -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=1:out_res=(1920x1080|rgbp)[a];[a]hwdownload,format=rgbp[a1]" \
+-map '[a1]' -f rawvideo -y <RGBP OUTPUT>
+
+
+
+
+

Chroma Subsampling

+

The following example demonstrates how to convert from 4:2:2 pixel format to 4:2:0 on an AMA AMD compatible card:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 \
+-pix_fmt yuv422p -i <INPUT> \
+-filter_complex "[0:v]hwupload[a];[a]2d_ama=inputs=1:processor=subsample[c];[c]hwdownload" \
+-pix_fmt yuv420p -f rawvideo <OUTPUT>
+
+
+

, where graphic processor is set for pixel subsampling operation.

+

The following example demonstrates how to transcode a 4:2:2 pixel format video to 4:2:0 using both the host, for decoding, and an AMA AMD compatible card, for subsampling and encoding:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-i <INPUT> \
+-filter_complex "[0:v]hwupload[a];[a]2d_ama=inputs=1:processor=subsample[c]" \
+-map [c] -c:v h264_ama -b:v 5M -f mp4 <OUTPUT>
+
+
+

, where graphic processor is set for pixel subsampling operation.

+
+
+

Picture In Picture (PIP)

+

The following example demonstrates how to create a PIP video on an AMA AMD compatible card:

+
ffmpeg -y -hide_banner  -hwaccel ama -hwaccel_device /dev/ama_transcoder0  \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 1> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 2> \
+-filter_complex "[1:v]scaler_ama=outputs=1:out_res=(720x480|yuv420p)[p]; \
+                 [0:v][p]2d_ama=inputs=2:processor=overlay:core_id=0:x=0:y=0[x]" \
+-map "[x]" -c:v h264_ama -frames 1000 -b:v 15M -f mp4 -y <OUTPUT>
+
+
+

, where graphic processor is set for scaling and overlay operations, with INPUT 1 set as the background.

+
+
+

Tiling

+

The following example demonstrates how to create a tiling video on an AMA AMD compatible card:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 1> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 2> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 3> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 4> \
+-filter_complex "[0:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[0]; \
+                 [1:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[1]; \
+                 [2:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[2]; \
+                 [3:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[3]; \
+                 [0][1][2][3]2d_ama=layout=2x2:inputs=4:processor=tile[c]; \
+                 [c]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p)[r]" \
+-map "[r]" -c:v h264_ama -b:v 15M -f mp4 -y <OUTPUT>
+
+
+

, where graphic processor's is set for scaling and tiling operations, with INPUT 1 ... INPUT 4 set as tiles.

+
+
+
+

ML Processing

+

This section provides examples on usage of ROI for both face and text VQ enhancement.

+
+

ML Based Face ROI

+

The following example demonstrates how to perform ROI face encoding on an AMA AMD compatible card:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=3:out_res=(1280x720|yuv420p)(1280x720|yuv420p)(1280x720|rgbp)[def][ori][a]; \
+                 [a]ml_ama=model=roi:model_args=type=face[mlop];[ori][mlop]roi_scale_ama[res1]" \
+-map [res1] -c:v hevc_ama -b:v 300K -f mp4 <OUTPUT 1> \
+-map [def] -c:v hevc_ama -b:v 300K -f mp4 <OUTPUT 2>
+
+
+

, where ML engine is set for face ROI enhancement, and the resulting enhanced image, res1, is encoded.

+
+
+

ROI Gain Factor

+

The following example demonstrates the impact of probability-to-QP mapping gain factor:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i  <INPUT> \
+   -filter_complex "split=outputs=5 [plain][ml0][l][n][h]; \
+                             [ml0] scaler_ama=outputs=1:out_res=(1280x720|rgbp) [ml1]; \
+                             [ml1] ml_ama=model=roi:model_args=type=face [ml2]; \
+                             [ml2] split=outputs=3 [ml3_1][ml3_2][ml3_3]; \
+                             [l][ml3_1] roi_scale_ama=strength=low [ml_l]; \
+                             [n][ml3_2] roi_scale_ama=strength=normal [ml_n]; \
+                             [h][ml3_3] roi_scale_ama=strength=high [ml_h]" \
+     -map '[plain] ' -c:v h264_ama -b:v 300k -f mp4 <OUTPUT1> \
+     -map '[ml_l]' -c:v h264_ama -b:v 300k -f mp4 <OUTPUT2> \
+     -map '[ml_n]' -c:v h264_ama -b:v 300k -f mp4 <OUTPUT3> \
+     -map '[ml_h]' -c:v h264_ama -b:v 300k -f mp4 <OUTPUT4>
+
+
+

Here <OUTPUTx>, for x={1-4}, represent encode streams without ML, low, normal and high gain factors, respectively.

+
+
+

ROI Ladder Transcoding

+

The following example demonstrates how to perform ROI transcoding at different resolutions:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i <INPUT> \
+ -filter_complex "split=2[s_org][s_ml]; \
+                  [s_org]scaler_ama=outputs=4:out_res=(1920x1080)(1280x720)(720x480)(360x240) [sa][sb][sc][sd]; \
+                  [s_ml]scaler_ama=outputs=1:(1280x720|rgbp)[ml_in]; \
+                  [ml_in]ml_ama=model=roi:model_args=type=face[ml_out]; [ml_out]split=4[ml_out_sa][ml_out_sb][ml_out_sc][ml_out_sd]; \
+                  [sa][ml_out_sa]roi_scale_ama[roi_a]; \
+                  [sb][ml_out_sb]roi_scale_ama[roi_b]; \
+                  [sc][ml_out_sc]roi_scale_ama[roi_c]; \
+                  [sd][ml_out_sd]roi_scale_ama[roi_d]" \
+-map [roi_a] -c:v av1_ama -b:v 300K -f rawvideo <OUTPUT1> \
+-map [roi_b] -c:v av1_ama -b:v 300K -f rawvideo <OUTPUT2> \
+-map [roi_c] -c:v av1_ama -b:v 300K -f rawvideo <OUTPUT3> \
+-map [roi_d] -c:v av1_ama -b:v 300K -f rawvideo <OUTPUT4>
+
+
+

Note that scale engine is invoke twice. Once for scaling the outputs and second time to perform pixel conversion.

+
+
+

ROI Face Detection

+

The following example demonstrates inference engine's ability to detect faces:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -i <INPUT> \
+-filter_complex "scaler_ama=outputs=2:out_res=(1280x720|yuv420p)(1280x720|rgbp)[ori][mlip]; \
+                 [mlip]ml_ama=model=roi:model_args=type=face[mlop]; \
+                 [ori][mlop]roi_scale_ama=roi_map_type=roi[rso]; \
+                 [rso]hwdownload, roi_overlay_ama[res1]" \
+-map [res1] -f rawvideo -pix_fmt yuv420p -f rawvideo <OUTPUT>
+
+
+

, where software plugin roi_overlay_ama overlays transparent rectangular boxes around all detected faces.

+
+
+

ML Based Text ROI

+

The following example demonstrates how to perform ROI text encoding on an AMA AMD compatible card:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -i <INPUT> \
+-filter_complex "scaler_ama=outputs=3:out_res=(1280x720|yuv420p)(1280x720|yuv420p)(1280x720|rgbp)[def][ori][a]; \
+                 [a]ml_ama=model=roi:model_args=type=text[mlop];[ori][mlop]roi_scale_ama[res1]" \
+-map [res1] -c:v hevc_ama -b:v 200K -f mp4  <OUTPUT 1> \
+-map [def] -c:v hevc_ama -b:v 200K -f mp4  <OUTPUT 2>
+
+
+

, where ML engine is set for text ROI enhancement, and the resulting enhanced image, res1, is encoded.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/examples/gstreamer/filters.html b/v1.1.2/examples/gstreamer/filters.html new file mode 100644 index 00000000..f63a3cec --- /dev/null +++ b/v1.1.2/examples/gstreamer/filters.html @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + GStreamer Examples using Software Filters — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Examples using Software Filters

+ +

The /opt/amd/ama/ma35/examples/gstreamer/ama_pipeline_scripts/filters/ folder contains different examples showing how to use GStreamer combining both AMD accelerated functions and software filters. In all these examples, an AMA compatible device, e.g., MA35D, is used to decode the input stream, the decoded frames are transfered back to the host using the ama_download filter, one of more software filters are applied to the decoded frames and the filtered frames are transfered back to the device using ama_upload for encoding. It should be noted that, when possible, zero-copy filters such as split and fps should be used, to minimize the traffic between the host CPU and target device.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Video Rotation

+
    +
  • Example script: 01_rotate_video.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and will send the rotated, encoded h.264 output to /tmp/xil_rotate_<N>.mp4.

+
+
+

Logo Overlay

+
    +
  • Example script: 02_logo_overlay.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and an image file ("logo"). It will scale the logo to 500x100, place it 16 pixels right and 16 pixels down from the top-left corner of the output video file, which will be an encoded h.264 output saved to /tmp/xil_logo_overlay.mp4.

+
+
+

Crop and Zoom

+
    +
  • Example script: 03_crop_zoom.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and will crop a 300x200 sized section of the original video. The section's top left corner begins at 20 pixels to the right, and 10 pixels down from the top-left corner of the original video. The output video is h.264 encoded and is saved to /tmp/xil_crop_zoom.mp4

+
+
+

Video Composition

+
    +
  • Example script: 04_multi_comp.sh

  • +
+

This example accepts 4x 8-bit, YUV420, pre-encoded h264 files of equal dimensions, and will create an output 2x2 composite video which will be an encoded h.264 output saved to /tmp/xil_multi_comp.mp4. The output resolution will be equal to the original input.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/examples/gstreamer/tutorials.html b/v1.1.2/examples/gstreamer/tutorials.html new file mode 100644 index 00000000..6590ae74 --- /dev/null +++ b/v1.1.2/examples/gstreamer/tutorials.html @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + GStreamer Introductory Tutorials — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Introductory Tutorials

+

This page provides tutorials on how to use GStreamer with the AMD AMA Video SDK. The complete reference guide for the GStreamer version included in the AMD AMA Video SDK can be found here.

+ +
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Simple GStreamer Examples

+

By default, all the example scripts use the filesink plug-in and write the output files into the /tmp directory.

+

Some of the examples read or write RAW files from disk (encode-only or decode-only pipelines). There is a chance that due to the massive bandwidth required for operating on these RAW files, you will notice a drop in FPS; this is not due to the AMD AMA Video SDK but the disk speeds. We recommend reading/writing from /dev/shm which is a RAM disk.

+

Most of the scripts allow to use the fakesink plug-in which only displays performance numbers and will not write outputs to disk. This is done by setting the “fakesink” argument to 1.

+

Each script contains error checks before passing arguments to GStreamer pipeline command to help users avoid giving incorrect arguments.

+

Most of the example scripts included in this directory take H.264 input streams. To use H.265 input streams, update the scripts to use the h265parse GStreamer plug-in instead of h264parse.

+

For brevity purposes, explanations of the GStreamer element properties are not repeated after they have been explained once. The detailed explanation of the each GStreamer pipeline element property can be obtained by using gst-inspect-1.0 <element name> (e.g. gst-inspect-1.0 ama_av1enc).

+
+

Decode only

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! parsebin ! h264parse ! ama_h264dec ! capsfilter 'caps=video/x-raw(memory:AMAMemory),format=NV12' !  ama_download ! filesink location=/tmp/h264.nv12
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • gst-launch-1.0

    +
      +
    • The GStreamer application, which is provided by AMD, and moved to the top of the PATH when you sourced the setup.sh script

    • +
    +
  • +
  • filesrc location

    +
      +
    • Location of the file h.264 to read

    • +
    +
  • +
  • parsebin

    +
      +
    • Unpacks the container to elementary stream

    • +
    +
  • +
  • h264parse

    +
      +
    • Parses H.264 streams

    • +
    +
  • +
  • ama_h264dec

    +
      +
    • GStreamer plug-in that provides functionality to decode H.264 encoded streams. This plug-in accepts input encoded stream in byte-stream/NALU format only and produces NV12 frames.

    • +
    +
  • +
  • capsfilter

    +
      +
    • Specifies the capabilities of the streams. Note that keyword capsfilter is optional.

    • +
    +
  • +
+
+
+

Encode only

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! rawvideoparse width=1920 height=1080 format=i420 framerate=60/1 ! ama_upload ! ama_h264enc ! h264parse ! filesink location=/tmp/out.h264
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • ama_h264enc

    +
      +
    • GStreamer plug-in that provides functionality to encode raw bit streams into AVC byte-stream.

    • +
    +
  • +
  • rawvideoparse

    +
      +
    • This element converts unformatted data streams into timestamped raw video frames, with specified resolution, frame rate and pixel format.

    • +
    +
  • +
  • ama_upload

    +
      +
    • This plugin transfer raw video file content from host to the device

    • +
    +
  • +
+
+
+

Transcode with Multiple-Resolution outputs

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! parsebin ! \
+h264parse ! ama_h264dec ! identity eos-after=1200 ! ama_scaler name=s \
+s.src_0 ! 'video/x-raw(memory:AMAMemory),width=1920,height=1080' ! ama_h265enc bitrate=6000000 ! queue ! filesink location=/tmp/hevc_1080p.hevc \
+s.src_1 ! 'video/x-raw(memory:AMAMemory),width=1280,height=720' ! ama_av1enc bitrate=2000000 ! queue ! filesink location=/tmp/av1_720p.av1 \
+s.src_2 ! 'video/x-raw(memory:AMAMemory),width=720,height=480' ! ama_h264enc bitrate=1000000 ! queue ! filesink location=/tmp/h264_480p.h264 \
+s.src_3 ! 'video/x-raw(memory:AMAMemory),width=360,height=240' ! ama_av1enc bitrate=1000000 ! queue ! filesink location=/tmp/av1_240p.av1
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • queue

    +
    +
      +
    • The queue will create a new thread on the source pad to decouple the processing on sink and source pad.

    • +
    +
    +
  • +
  • identity

    +
    +
      +
    • In this usage, forces the insertion of EOS after 1200 buffers.

    • +
    +
    +
  • +
+

For more comprehensive sets of examples refer to /opt/amd/ama/ma35/examples/gstreamer/ama_pipeline_scripts/tutorials folder.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/examples/gstreamer/xabrladder.html b/v1.1.2/examples/gstreamer/xabrladder.html new file mode 100644 index 00000000..1b4407a0 --- /dev/null +++ b/v1.1.2/examples/gstreamer/xabrladder.html @@ -0,0 +1,391 @@ + + + + + + + + + + + + + + + GStreamer ABR Ladder Application — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer ABR Ladder Application

+ +
+

Introduction

+

The sample multi-scale program located at /opt/amd/ama/ma35/bin/gstreamer/ is a command line utility which implements the GStreamer video transcoding pipeline described in the diagram below. This application expects an input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams. The resolution of each output stream is configured using a JSON file (by default: /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder/abrladder.json). The output streams produced by this application are saved in the /tmp/ladder_outputs/ folder.

+

This application is installed through the amd-ama-gstreamer package. If this package is not present on your system, install it by following the steps described in the package feed page. The source code for this application is also available under, /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder.

+GStreamer pipeline of the ama_xabrladder application +
+

Note

+

This example supports input files of elementary stream NAL type or mp4 containers, with H.264/H.265 elementary stream in it. No other formats are supported

+
+
+
+

Host System Requirement

+
    +
  • AMD AMA Video SDK

  • +
  • amd-ama-gstreamer package

  • +
+
+
+

Usage

+

Below are the input parameters required to run the application.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Parameter

Short Form

Description

+
+--devidx
+
+ +
+
+-i
+
+ +
+
device index
+
Type: int
+
Range: 0 to 31
+
Default: NA
+
Option: Mandatory
+
+
+
+--json
+
+ +
+
+-j
+
+ +
+
JSON file used to describe the configuration of the ABR ladder
+
Type: string
+
Range: NA
+
Default: /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder
+
Option: Optional
+
+
+
+--codectype
+
+ +
+
+-c
+
+ +
+
Output codec type
+
Type: int
+
Range: 0 (H264), 1 (H265)
+
Default: NA
+
Option: Mandatory
+
+
+
+--file
+
+ +
+
+-f
+
+ +
+
Input file path name (mp4/elementary-stream)
+
Type: string
+
Range: NA
+
Default: NA
+
Option: Mandatory
+
+
+
+--forcekeyframe
+
+ +
+
+-k
+
+ +
+
Keyframe (IDR frame) insertion frequency in number of frames
+
Type: int
+
Range: NA
+
Default: 0
+
Option: Optional
+
+
+
+
+

Examples

+

Below are example commands for the ABR ladder use case. The output files are stored in /tmp/ladder_outputs/ folder. Ensure that enough space is available in this folder.

+
    +
  1. Running one ABR ladder on one device:

    +
    ama_xabrladder  --devidx 0 --codectype 0 --file <path to file>
    +
    +
    +
  2. +
+

The above command takes the input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams based on the codec type provided (0 for H.264 and 1 for H.265) with the following resolutions: 720p60, 720p30, 480p30, 360p30 and 160p30.

+
    +
  1. Running one ABR ladder on one device without lookahead:

    +
    ama_xabrladder  --devidx 0 --lookahead_enable 0 --codectype 0 --file <path to file>
    +
    +
    +
  2. +
+

The above command takes the input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams based on the codec type provided (0 for H.264 and 1 for H.265) with the following resolutions: 720p60, 720p30, 480p30, 360p30 and 160p30.

+
    +
  1. Running one ABR ladder on one device with lookahead enabled, and using the short-form options:

    +
    ama_xabrladder -i 0  -c 0 -f <path to file>
    +
    +
    +
  2. +
  3. Running two ABR ladders, mapping each ladder to a specific device using the devidx option:

    +
    ama_xabrladder --devidx 0  --codectype 1 --file <path to file>
    +ama_xabrladder --devidx 1  --codectype 1 --file <path to file>
    +
    +
    +
  4. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/examples/gstreamer/xcompositor.html b/v1.1.2/examples/gstreamer/xcompositor.html new file mode 100644 index 00000000..729f0b94 --- /dev/null +++ b/v1.1.2/examples/gstreamer/xcompositor.html @@ -0,0 +1,365 @@ + + + + + + + + + + + + + + + GStreamer Compositor Application — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Compositor Application

+ +
+

Introduction

+

The sample compositor program located at /opt/amd/ama/ma35/bin/gstreamer/ is a command line utility which implements the GStreamer video transcoding pipeline described in the diagram below. This application expects four input video files 60(mp4 with H.264/H.265 or H.264/H.265 elementary stream). The resolution of each input cannot exceed 1080p. The application creates an output stream by first composing the four inputs in a 2x2 grid, then by adding an optional logo and lastly by inserting a time stamp.

+

This application is installed through the amd-ama-gstreamer package. If this package is not present on your system, install it by following the steps described in the package feed page. The source code for this application is also available under, /opt/amd/ama/ma35/examples/gstreamer/ama_xcompositor.

+GStreamer pipeline of the ama_xcompositor application +
+

+
+
+
+

Host System Requirement

+
    +
  • AMD AMA Video SDK

  • +
  • amd-ama-gstreamer package

  • +
+
+
+

Usage

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Parameter

Description

-f

+
mp4/elementary-stream file path. Resolutions up to 1080p are supported.
+
Type: string
+
Range: NA
+
Default: NA
+
Option: Mandatory
+
+

-l

+
png/jpg logo file path. No logo will be overlayed if this option is not specified.
+
Type: string
+
Range: NA
+
Default: Null
+
Option: Optional
+
+

-b

+
Max bitrate for encoder in Kbps
+
Type: int
+
Range: 0 to 4294967295
+
Default: 5000
+
Option: Optional
+
+

-i

+
device index
+
Type: int
+
Range: 0 to 31
+
Default: 0
+
Option: Optional
+
+

-h

+
Horizontal offset of overlay logo in fractions of video image width, from top-left corner of video image (in relative positioning)
+
Type: double
+
Range: 0 to 1
+
Default: 0.9
+
Option: Optional
+
+

-v

+
Vertical offset of overlay logo in fractions of video image height, from top-left corner of video image (in relative positioning)
+
Type: double
+
Range: 0 to 1
+
Default: 0
+
Option: Optional
+
+

-n

+
Number of input buffers
+
Type: integer
+
Range: 20 to 2147483647
+
Default: 2000
+
Option: Optional
+
+

-o

+
Output file name and path
+
Type: String
+
Range: NA
+
Default: ./result.mp4
+
Option: Optional
+
+
+
+
+

Examples

+
    +
  1. Composition along with logo on top right of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png
    +
    +
    +
  2. +
  3. Composition with logo on top left of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png -h 0 -v 0
    +
    +
    +
  4. +
  5. Composition with logo on center of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png -h 0.5 -v 0.5
    +
    +
    +
  6. +
  7. Composition without logo layer:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265
    +
    +
    +
  8. +
  9. Composition on device with index 2:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -i 2
    +
    +
    +
  10. +
  11. Composition on decoder soft kernel start index at 8:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265
    +
    +
    +
  12. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/examples/xma/xma_apps.html b/v1.1.2/examples/xma/xma_apps.html new file mode 100644 index 00000000..66c5911a --- /dev/null +++ b/v1.1.2/examples/xma/xma_apps.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + + + XMA Examples for the AMD AMA Video SDK — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

XMA Examples for the AMD AMA Video SDK

+ +

The examples in the /opt/amd/ama/ma35/bin folder illustrate how C-based applications can natively interact with AMD AMA Video SDK devices using the XMA (Xilinx Media Accelerator) APIs. Source codes for decoder, encoder, scaler and transcoder can be found under /opt/amd/ama/ma35/examples/xma directory.

+

Detailed documentation on the AMD AMA Video SDK plugin interface and the XMA APIs can be found in the C API Programming Guide section of the documentation.

+

Requirements

+
    +
  • The XMA applications has been built for and verified on a supported OS.

  • +
  • The XMA applications only work with elementary streams. Container formats such as mp4 are not supported.

  • +
+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

XMA Decoder App

+
+

Decoder Test Instructions

+

The XMA decoder application supports most of the decode options supported by FFmpeg. The XMA decoder application supports only elementary H.264, HEVC and AV1 encoded bitstreams.

+
+

Decoder Usage

+

Running the decoder app with the --help option will print the complete list of options:

+
ma35_decoder_app --help
+encoded file and utilizes hardware acceleration to get the decoded
+output.
+
+Usage:
+        ma35_decoder_app [options] -i <input-file> -c:v <codec-type>
+        [codec_options] -o <output-file>
+
+Arguments:
+        --help                     Print this message and exit
+        -log_level <value>         Specify the log level
+        -log_location <value>      Log location. 0 for none,
+                                   1 console (default), 2 syslog, 3 file
+        -log_file <file>           Name and path of the log file. Default
+                                   ma35_decoder_app.log
+        -d <device_id>             Specify a device on which to run.
+                                   Default: 0
+
+Input Arguments:
+
+        -stream_loop <loop-count>  Number of times to loop the input
+                                   file
+        -i <input-file>            Input file to be used
+
+Codec Arguments:
+
+        -c:v <codec>               Specify H264 or H265 decoding.
+                                   (h264_ama, hevc_ama)
+        -latency_logging           Enable latency logging
+        -frames <frame-count>      Number of frames to be processed.
+        -pix_fmt fmt               The output format (nv12, yuv420p,
+                                   yuv420p10le, xv15) Default: nv12 8 bit,
+                                   yuv420p10le 10 bit
+        -o <file>                  File to which output is written.
+
+
+
+
+

Sample Decoder Command

+

Decode an hevc encoded file into raw N12 format:

+
ma35_decoder_app -c:v hevc_ama -i <INPUT> -frames 100 -pix_fmt nv12 -o out1.nv12
+
+
+
+

+
+
+
+
+
+

XMA Encoder App

+
+

Encoder Test Instructions

+

The encoder XMA application supports most of the encoder options supported by FFmpeg. The XMA application supports variety of input pixel formats, see -out_fmt, and can output H.264/HEVC/AV1 encoded elementary stream formats.

+
+

Encoder Usage

+

Running the encoder app with the --help option will print the complete list of options:

+
ma35_encoder_app --help
+XMA Encoder App Usage:
+     ./ma35_encoder_app [input options] -i input-file -c:v <codec-option>  [encoder options] -o <output-file>
+
+Arguments:
+
+     --help                     Print this message and exit.
+     -log_level <value>         Log level settings, supported are 0 or
+                                emergency, 1 or alert, 2 or critical, 3
+                                or error, 4 or warning, 5 or notice, 6
+                                or info, 7 or debug.
+                                Default is 3/error
+     -log_location <value>      Log location settings, supported are 0 or
+                                none, 1 or console, 2 or syslog, 3
+                                or file.
+                                Default is 1/console
+     -log_file <log-file>       Name and path of log file
+                                Default is ma35_encoder_app.log
+     -d <device-id>             Specify a device on which the
+                                encoder to run.
+                                Default is /dev/ama_transcoder0
+     -frames <frame-count>      Number of frames to be processed.
+
+Input options:
+
+     -stream_loop <loop-count>  Number of times to loop the input
+                                YUV file.
+     -w <width>                 Width of YUV input.
+     -h <height>                Height of YUV input.
+     -pix_fmt <pixel-format>    Pixel format of the input file. It must be yuv420p,
+
+     -i <input-file>            Name and path of input YUV file
+
+Codec option:
+
+     -c:v <codec>               Encoder codec to be used. Supported
+                                are h264_ama, hevc_ama, av1_ama
+     -device_type               When encoding to AV1, this sets which
+                                AV1 encoder will be used. Supported
+                                values are 1(Xilinx), 2(Vendor
+                                supplied), or any
+
+Encoder params:
+
+     -b:v <bitrate>             Bitrate can be given in Kbps or Mbps
+                                or bits i.e., 5000000, 5000K, 5M.
+                                Default is 5Mbps
+     -fps <fps>                 Input frame rate. Default is 30.
+     -g <intraperiod>           Intra period. Default is 15.
+     -qp <qp>                   QP. Supported are -1 to 51,
+                                default is -1
+     -min_qp <qp>               Minimum QP. Supported are 0 to 51,
+                                default is 0.
+     -max_qp <qp>               Maximum QP. Supported values are 0
+                                to 51, default is 51.
+     -spat_aq_gain <gain>       Spatial AQ gain. Supported values are
+                                0 to 100 or 255, default is 255.
+     -temp_aq_gain <gain>       Temporal AQ gain. Supported values are
+                                0 to 100 or 255, default is 255.
+     -temporal_aq <0/1>         Temporal AQ. Enable/Disable,
+                                default is -1.
+     -spatial_aq <0/1>          Spatial AQ. Enable/Disable,
+                                default is -1.
+     -qp_mode <qp>              QP Mode. Supported values 0, 1 and 2
+                                default is 0.
+     -control_rate <rc_mode>    Rate Control. Supported values -1, 0, 1, 2 and 3
+                                default is -1.
+     -bf <frames>               Number of B frames. Supported are -1
+                                to 3, default is -1.
+     -force_idr <0/1            Supported values are 0 and 1
+     -preset <value>            Encoder preset. Supported: slow, medium and fast
+                                are supported. Default: medium
+     -profile <value>           Encoder profile.
+                For AV1, supported -1 (auto) and 200 (main). Default: -1 (auto)
+                For HEVC, supported -1 (auto), 100 (main), 101 (main10_intra), 102
+                                (main10), 103 (main10_intra). Default: -1 (auto)
+                For H264, supported -1 (auto), 0 (baseline), 1 (main), 2 (high),
+                                3 (high10) 4 (high10_intra). Default: -1 (auto)
+     -level <value>             Encoder level.
+                For H264, supported are 0 (auto), 10, 11, 12, 13, 20, 21, 22, 30,
+                                31, 32, 40, 41, 42, 50, 51, 52, 60, 61, 62. Default:
+                                0 (auto)
+                For HEVC, supported are 0 (auto), 10, 20, 21, 30, 31, 40, 41, 50,
+                                51, 52, 60, 61, 62. Default: 0 (auto)
+                For AV1, supported are 0 (auto), 20, 21, 30, 31, 40, 41, 50, 51,
+                                52, 53, 60, 61, 62, 63. Default: 0 (auto)
+     -tier <value>              HEVC tier, supported are -1 (auto), 0 (main), 1 (high).
+                                Default: -1 (auto)
+                                Default is -1/auto
+     -crf <value>               Enable / disable CRF mode. Default: 0
+     -bufsize <value>           Size of VBV buffer (in bits). Default is -1. Strict
+                                ULL = 0, Relaxed ULL > 0
+     -dynamic_gop <value>       Dynamic GOP supported values are -1 (auto), 0 (disable)
+                                and 1 (enable). Default: -1
+     -tune_metrics <value>      Tunes encoder's video quality for objective metrics.
+                                Supported values are vq or 1, psnr or 2, ssim or
+                                3, vmaf or 4. Default: 1
+     -lookahead_depth <value>   Lookahead depth. Supported [-1, 53]. Default: -1
+     -latency_ms <value>        Lookahead depth specified in milliseconds. Supported
+                                [-1, 60000]. Default: -1
+     -no_bll <value>            No low latency b-frames. Supported [-1, 1]. Default:
+                                -1
+     -latency_logging <0/1>     Enable latency logging
+     -expert_options <string>   Expert options
+     -o <file>                  File to which output is written.
+     -stats <file>              File to which csv statistics output is written.
+
+
+
+
+

Sample Encoder Commands

+

H.265 encoding, ultra low latency (Consult the Tuning Latency of Transcode Pipeline section for more details):

+
ma35_encoder_app -w 1920 -h 1080 -pix_fmt yuv420p -i <INPUT> -c:v hevc_ama -b:v 5M -lookahead_depth 0 -g 30 -o out0.265
+
+
+
+

+
+
+
+
+
+

XMA Scaler App

+
+

Scaler Test Instructions

+

The scaler XMA application supports most of the scaler options supported by FFmpeg. The XMA application supports -out_fmt pixel formats.

+
+

Scaler Usage

+

Running the scaler app with the --help option will print the complete list of options:

+
ma35_scaler_app --help
+This program ingests an nv12, yuv420p, yuv420p10le, or xv15 input
+file and utilizes hardware acceleration to scale to various resolutions.
+
+Usage:
+        ma35_scaler_app [options] -w <input-width> -h <input-height> -i
+        <input-file> [scaler_options] -w <output-1-width> -h
+        <output-1-height> -o <output-1-file> -w ...
+
+Arguments:
+        --help                     Print this message and exit
+        -log <level>               Specify the log level
+        -log_location <value>      Log location. 0 for none,
+                                   1 console (default), 2 syslog, 3 file
+        -log_file <file>           Name and path of the log file. Default
+                                    ma35_scaler_app.log
+        -d <device-id>             Specify a device on which to run.
+                                   Default: 0
+
+Input Arguments:
+
+        -stream_loop <loop-count>  Number of times to loop the input
+                                   file
+        -w <width>                 Specify the input's width
+        -h <height>                Specify the input's height
+        -pix_fmt <pixel-format>    Pixel format of the input file (nv12,
+                                   xv15, yuv420p10le). Default : nv12.
+        -fps <frame-rate>          Frame rate. Used for scaler load
+                                   calculation.
+        -i <input-file>            Input file to be used
+
+Output Arguments:
+        -rate <half/full>          Set the rate to half. Half rate drops
+                                   frames to reduce resource usage.
+                                   Default: full.
+        -latency_logging           Enable latency logging
+        -w <width>                 Specify the output's width
+        -h <height>                Specify the output's height
+        -pix_fmt <pixel-format>    Pixel format of the output file (nv12,
+                                   xv15, yuv420p10le). Default: input fmt
+        -frames <frame-count>      Number of frames to be processed.
+        -o <file>                  File to which output is written.
+
+
+
+
+

Sample Scaler Command

+

Scale 1080p nv12 to 720p, 480p, 360p, and 240p nv12:

+
ma35_scaler_app -pix_fmt nv12 -w 1920 -h 1080 -i <INPUT> \
+-w 1280 -h 720  -pix_fmt nv12 -o out1.nv12 \
+-w 848  -h 480  -pix_fmt nv12 -o out2.nv12 \
+-w 640  -h 360  -pix_fmt nv12 -o out3.nv12 \
+-w 288  -h 160  -pix_fmt nv12 -o out4.nv12
+
+
+
+

+
+
+
+
+
+

XMA Transcoder App

+
+

Transcoder Test Instructions

+

The transcoder XMA application supports most of the options supported by ffmpeg. The XMA application supports only elementary H.264, HEVC and AV1 encoded stream input and outputs H.264/HEVC/AV1 encoded elementary stream.

+
+

Transcoder Usage

+

Running the transcoder app with the --help option will print the complete list of options:

+
 ma35_transcoder_app --help
+ XMA Transcoder App Usage:
+        ./program [generic options] -c:v <decoder codec> [decoder options]  -i input-file -scaler_ma -outputs [num] [Scaler options]  -c:v <encoder codec> [encoder options] -o <output-file>  -c:v <encoder codec> [encoder options] -o <output-file>  -c:v <encoder codec> [encoder options] -o <output-file>.....
+
+Arguments:
+
+        --help                     Print this message and exit.
+        -d <device-id>             Specify a device on which the
+                                   transcoder to run. Default: 0
+        -stream_loop <loop-count>  Number of times to loop the input file
+        -frames <frame-count>      Number of input frames to be processed
+
+Decoder options:
+
+        -c:v <codec>               Decoder codec to be used. Supported
+                                   are hevc_ama, h264_ama
+        -latency_logging <0/1>     Latency logging for decoder. Default
+                                   disabled
+        -push-model <0/1>          Decoder streaming model (pull or push). Default
+                                   is pull (can be faster than real-time)
+        -i <input-file>            Name and path of input H.264/HEVC file
+
+Scaler options:
+
+        -scaler_ma                 Name of the ABR scaler filter
+        -num-output <value>        Number of output files from scaler
+        -out_1_width <width>       Width of the scaler output channel 1
+        -out_1_height <height>     Height of the scaler output channel 1
+        -out_1_rate <full/half>    Full of Half rate for output channel 1
+        -out_2_width <width>       Width of the scaler output channel 2
+        -out_2_height <height>     Height of the scaler output channel 2
+        -out_2_rate <full/half>    Full of Half rate for output channel 2
+        -out_3_width <width>       Width of the scaler output channel 3
+        -out_3_height <height>     Height of the scaler output channel 3
+        -out_3_rate <full/half>    Full of Half rate for output channel 3
+        -out_4_width <width>       Width of the scaler output channel 4
+        -out_4_height <height>     Height of the scaler output channel 4
+        -out_4_rate <full/half>    Full of Half rate for output channel 4
+        -out_5_width <width>       Width of the scaler output channel 5
+        -out_5_height <height>     Height of the scaler output channel 5
+        -out_5_rate <full/half>    Full of Half rate for output channel 5
+        -out_6_width <width>       Width of the scaler output channel 6
+        -out_6_height <height>     Height of the scaler output channel 6
+        -out_6_rate <full/half>    Full of Half rate for output channel 6
+        -out_7_width <width>       Width of the scaler output channel 7
+        -out_7_height <height>     Height of the scaler output channel 7
+        -out_7_rate <full/half>    Full of Half rate for output channel 7
+        -out_8_width <width>       Width of the scaler output channel 8
+        -out_8_height <height>     Height of the scaler output channel 8
+        -out_8_rate <full/half>    Full of Half rate for output channel 8
+        -latency_logging <0/1>     Latency logging for scaler. Default
+                                   disabled
+Encoder options:
+
+        -c:v <codec>               Encoder codec to be used. Supported
+                                   are hevc_ama, h264_ama, and av1_ama
+        -device_type               When encoding to AV1, this sets which
+                                   AV1 encoder will be used. Supported
+                                   values are 1(Xilinx), 2(Vendor
+                                   supplied), or any
+        -b:v <bitrate>             Bitrate can be given in Kbps or Mbps
+                                   or bits i.e., 5000000, 5000K, 5M.
+                                   Default is 200kbps
+        -fps <fps>                 Input frame rate. Default is 30.
+        -g <intraperiod>           Intra period. Default is 12.
+        -max-bitrate <bitrate>     Maximum bit rate. Supported are -1 to
+                                   350000000, default is -1
+        -min_qp <qp>               Minimum QP. Supported are 0 to 51,
+                                   default is 0.
+        -max_qp <qp>               Maximum QP. Supported values are 0
+                                   to 51, default is 51.
+        -spatial_aq_gain <gain>    Spatial AQ gain. Supported values are
+                                   0 to 100 or 255, default is 255.
+        -temporal_aq_gain <gain>   Temporal AQ gain. Supported values are
+                                   0 to 100 or 255, default is 255.
+        -bf <frames>               Number of B frames. Supported are 0
+                                   to 7, default is 2.
+        -force_idr <0/1            Supported values are 0 and 1
+        -profile <value>           Encoder profile.
+                   For HEVC, supported are 100 or main, 101 or main10_intra,
+                                   102 or main10 , 103 or main10_intra
+                                   or still.
+                                   Default is 0/automatic
+                                   ENC_HEVC_MAIN - 100 or main
+                                   ENC_HEVC_MAIN_INTRA - 101 or main_intr
+                                   ENC_HEVC_MAIN_10 - 102 or main10
+                                   ENC_HEVC_MAIN10_INTRA - 103 or main10_intra             For H264, supported are auto or -1, 0 or baseline,
+                                   1 or main, 2 or high, 3 or high10
+                                   4 or high10_intra, Default is auto or -1
+                                   ENC_H264_BASELINE - 0 or baseline.
+                                   ENC_H264_MAIN - 1 or main.
+                                   ENC_H264_HIGH - 2 or high.
+                                   ENC_H264_HIGH_10 - 3 or high10.
+                                   ENC_H264_HIGH_10_INTRA - 4 or high10_intra   -level <value>             Encoder level.
+                                   For HEVC, supported are 10 to 52,
+                                   default is 50.
+                                   For H264, supported are 10 to 52,
+                                   default is 50.
+        -slices <value>            Number of slices per frame. Supported
+                                   are 1 to 68, default is 1.
+        -qp_mode <qp>              QP Mode. Supported values 0, 1 and 2
+                                   default is 0.
+        -control_rate <rc_mode>    Rate Control. Supported values -1 to 3
+                                   default is -1.
+        -aspect_ratio <value>      Aspect ratio. Supported values are 0
+                                   to 3, default is 0.
+        -lookahead_depth <value>   Lookahead depth. Supported are 0 to
+                                   20, default is 0.
+        -temporal_aq <0/1>         Temporal AQ. Enable/Disable,
+                                   default is -1.
+        -spatial_aq <0/1>          Spatial AQ. Enable/Disable,
+                                   default is -1.
+        -tune_metrics <value>      Tunes MPSoC H.264/HEVC encoder's video
+                                   quality for objective metrics, default 1.
+                                   Supported value from 1 to 4
+        -tier <value>              HEVC tier, supported are -1 or auto, 0 or main,
+                                   1 or high.
+                                   Default is -1/auto
+        -crf <value>               CRF supported values are 0 and 1 i.e. enable
+                                   and disable
+                                   Default is -1/auto
+        -latency_logging           Enable latency logging
+        -latency_mode <value>      0 normal latency (default), 1 low
+                                   latency, or 2 ultra low latency      -o <file>                  File to which output is written.
+
+
+
+
+

Sample Transcoder Commands

+

H.264 to AV1 Transcoder:

+
ma35_transcoder_app -streams 1 -frames 2000 -c:v h264_ama \
+-i <INPUT> \
+-c:v av1_ama -b:v 10M  -o h264_av1_transcode.av1
+
+
+

H.264 to H264 ABR Transcoder:

+
ma35_transcoder_app -streams 1 -c:v h264_ama \
+-i <INPUT> \
+-scaler_ma -num-output 4 \
+-out_1_width 1280 -out_1_height 720 -out_2_width 848 -out_2_height 480 \
+-out_3_width 640 -out_3_height 360 -out_4_width 288 -out_4_height 160 \
+-c:v h264_ama -b:v 4000K -o abr_ladder1.264 \
+-c:v h264_ama -b:v 3000K -o abr_ladder2.264 \
+-c:v h264_ama -b:v 2500K -o abr_ladder3.264 \
+-c:v h264_ama -b:v 1250K -o abr_ladder4.264
+
+
+

H.264 to AV1 ULL Transcode

+
ma35_transcoder_app -streams 1 -frames 2000 -c:v h264_ama \
+-i <INPUT>\
+-c:v av1_ama  -b:v 10M -lookahead_depth 0 -o h264_av1_transcode.av1
+
+
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/genindex.html b/v1.1.2/genindex.html new file mode 100644 index 00000000..a12f3b8c --- /dev/null +++ b/v1.1.2/genindex.html @@ -0,0 +1,1501 @@ + + + + + + + + + + + + + + Index — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Index
  • +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ Symbols + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | W + | X + +
+

Symbols

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + +
+ +

G

+ + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

Q

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

W

+ + +
+ +

X

+ + + +
+ + + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/v1.1.2/getting_started_on_prem.html b/v1.1.2/getting_started_on_prem.html new file mode 100644 index 00000000..9270a965 --- /dev/null +++ b/v1.1.2/getting_started_on_prem.html @@ -0,0 +1,406 @@ + + + + + + + + + + + + + + + Getting Started with AMD AMA Video SDK Cards on Premises — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Getting Started with AMD AMA Video SDK Cards on Premises
  • +
  • +
  • +
+
+
+
+
+ +
+

Getting Started with AMD AMA Video SDK Cards on Premises

+ +
+

Chassis Setup

+
    +
  1. BIOS setting:

    +
      +
    1. Ensure that chassis's BIOS is set to performance mode, e.g., sleep states, clock throttling, etc. are disabled.

    2. +
    3. 4x4 PCIe bifurcation must be enabled on each slot with a MA35 card.

    4. +
    5. Enable Single Root IO/Virtualization (SR-IOV).

    6. +
    7. Secure boot must be disabled.

    8. +
    9. Enable Above 4G Decoding.

    10. +
    11. Enable Access Control Services (ACS)

    12. +
    13. Enable virtualization.

    14. +
    +
  2. +
  3. Install a compatible kernel, e.g., see Linux VM Guest, Step 2, for details on how to install kernel 5.15 and other required packages. Note that if you are installing on kernel 6.5, gcc-12 is required.

  4. +
  5. Enable IOMMU by updating /etc/default/grub file to include

    +
      +
    • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on iommu=pt", for AMD based systems

    • +
    • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on iommu=pt", for Intel based chassis

    • +
    +
  6. +
  7. Update Grub

    +
    sudo update-grub
    +
    +
    +
  8. +
  9. Allocate at least 4GB of huge pages, per device, plus an extra 96 huge pages, e.g., a single card with 2 devices requires 2*2048+96=4192 huge pages

    +
    sudo sh -c "echo 'vm.nr_hugepages=4192' >> /etc/sysctl.conf"
    +
    +
    +

    Note that if a chassis is being configured to host VMs, then the total number of huge pages, on the host, needs to be the sum of allocated RAM of all VM instances plus 96. As an example, running 6 VMs, each with 12GB of RAM, requires 6*12GB/2MB+96=36960 huge pages. (See Virtualization for details.)

    +
  10. +
  11. Reboot

    +
    sudo reboot
    +
    +
    +
  12. +
  13. Verify settings

    +
    cat /proc/cmdline
    +BOOT_IMAGE=/vmlinuz-5.15.0-50-generic root=/dev/mapper/vg00-rootlv ro quiet splash amd_iommu=on iommu=pt
    +
    +
    +

    and

    +
    cat /proc/meminfo | grep -i huge
    +
    +
    +

    , should return:

    +
    HugePages_Total:    4192
    +HugePages_Free:     4192
    +HugePages_Rsvd:        0
    +Hugepagesize:       2048 kB
    +
    +
    +
  14. +
+
+
+

Check Cards

+

To establish whether deployed cards have proper firmware installed, proceed as follows:

+
    +
  1. List AMD AMA Video SDK PCIe devices

    +
    sudo lspci -vvvd 10ee:
    +
    +
    +

    If devices are not listed as Multimedia controller and/or Region 4 size is not 512MB, a flash update is required. Refer to Flash Firmware section, for instructions.

    +
  2. +
+
+
+

Install the AMD AMA Video SDK

+
    +
  • Ensure that you PPA feed is setup. See Package Feed Setup

  • +
  • Ubuntu

    +
    +
      +
    1. Install packages

      +
      sudo apt -y install libhugetlbfs0 libboost-all-dev
      +dpkg --get-selections '*ma35*' | awk '{system("sudo apt -y purge " $1)}'
      +sudo apt-mark unhold amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer
      +dpkg --get-selections 'amd-ama*' | awk '{system("sudo apt -y purge " $1)}'
      +sudo apt update
      +sudo apt install amd-ama-driver=1.1.2-* amd-ama-core=1.1.2-* amd-ama-xma=1.1.2-* amd-ama-ffmpeg=1.1.2-* amd-ama-gstreamer=1.1.2-*
      +sudo apt-mark hold amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer
      +
      +
      +
    2. +
    3. Verify packages

      +
      sudo dpkg -l amd-ama*
      +
      +
      +

      The expected output is:

      +
      Desired=Unknown/Install/Remove/Purge/Hold
      +| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
      +|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
      +||/ Name              Version          Architecture Description
      ++++-=================-================-============-=================================
      +ii  amd-ama-core      1.1.2-2403291822 amd64        Supernova
      +ii  amd-ama-driver    1.1.2-2403291822 amd64        Supernova
      +ii  amd-ama-ffmpeg    1.1.2-2403291822 amd64        Supernova
      +ii  amd-ama-gstreamer 1.1.2-2403291822 amd64        Supernova
      +ii  amd-ama-xma       1.1.2-2403291822 amd64        Supernova
      +
      +
      +
    4. +
    5. Insert kernel module

      +
      sudo modprobe ama_transcoder
      +
      +
      +
    6. +
    +
    +
  • +
+
+
+

Flash Firmware

+

Flashing is required for this release:

+
    +
  1. Flash the security patch firmware:

    +
    sudo /opt/amd/ama/ma35/bin/maflash program -d all  <patch firmware bin>
    +
    +
    +

    , where patch firmware bin is /opt/amd/ama/ma35/firmware/ma35d_security_patch.bin.

    +
  2. +
  3. Cold reboot:

    +
    sudo systemctl poweroff
    +
    +
    +

    , and power up.

    +
  4. +
  5. To flash all devices, in parallel, issue the following:

    +
    sudo /opt/amd/ama/ma35/bin/maflash program -d all -p <firmware bin>
    +
    +
    +

    , where firmware bin is /opt/amd/ama/ma35/firmware/ma35_firmware.bin.

    +

    Ignore warning messages that state:

    +
    ...
    +Warning: SC update is not supported from ASIC 1 (skipping)
    +...
    +
    +
    +
  6. +
  7. Cold reboot:

    +
    sudo systemctl poweroff
    +
    +
    +

    , and power up.

    +
  8. +
+

For more details on flashing, refer to Programing a Device.

+
+
+

Installation Verification

+

After each reboot or SDK update execute the following command:

+
    +
  1. Confirm driver's successful installation by:

    +
    cat /sys/class/misc/ama_transcoder0/version_information
    +
    +
    +

    It should return:

    +
  2. +
+
+
ZSP Version = 2.0.4
+SC Version = 9.7.39
+eSecure Version = 1.0.0
+PCIe FW Version = 2.1.0
+PCIe CTRL Patch Version = 1.0.3
+PCIe PHY Patch A Version = 1.0.0
+
+
+
+

If the observed version numbers are older than the above, flashing is required. Refer to Flash Firmware section, for instructions.

+
+
+

Set Up the Runtime Environment

+
    +
  1. Run setup script

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  2. +
+

Note that this script requires Bash shell to run.

+
+
+

Run Your First Examples

+

See the tutorials and examples page to learn how to run jobs on your system.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/git_hub.html b/v1.1.2/git_hub.html new file mode 100644 index 00000000..3046d2bc --- /dev/null +++ b/v1.1.2/git_hub.html @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) Repository — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA) Repository
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA) Repository

+

AMD AMA Video SDK code repository contains source codes for various elements of the SDK along with sample codes, 3rd party integrations, convenience utilities and much more. It is located at ma35d sdk v1.1.2

+
+

Note

+

It is noted that sample codes, 3rd party integrations and convenience utilities are meant for demonstrative purposes and, as such, no guarantees are made regarding their usage in a production setting.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/index.html b/v1.1.2/index.html new file mode 100644 index 00000000..237d7c72 --- /dev/null +++ b/v1.1.2/index.html @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA)
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA)

+

The AMD AMA Video SDK is a complete software stack allowing users to seamlessly leverage the hardware accelerated features of AMD video codec units and enable high-density real-time transcoding for live streaming video service providers, OEMs, and Content Delivery Network (CDNs), on compatible cards. Included in the AMD AMA Video SDK is a pre-compiled version of FFmpeg which integrates video transcoding plug-ins for AMD devices, enabling simple hardware acceleration of video decoding, scaling and encoding. The AMD AMA Video SDK also provides a C-based application programming interface (API) which facilitates the integration of AMD video codec units transcoding capabilities in proprietary frameworks.

+

Cards compatible with AMA SDK offer low power usage, high visual quality at high density. Specifically, MA35D video transcoding card, which is made of 2 Video Processing Units (VPU), is capable of transcoding to and from HEVC, AVC and AV1 formats, at an aggregate rate of up to two 4Kp60, for AVC and HEVC formats, and four 4Kp60 for AV1 format, per VPU.

+ +
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/managing_compute_resources.html b/v1.1.2/managing_compute_resources.html new file mode 100644 index 00000000..fcf6677a --- /dev/null +++ b/v1.1.2/managing_compute_resources.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + + + Managing Video Acceleration Compute Resources — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Managing Video Acceleration Compute Resources
  • +
  • +
  • +
+
+
+
+
+ +
+

Managing Video Acceleration Compute Resources

+ +
+

Introduction

+

The notion of compute units (CUs) and CU pool is central to resource management. A typical video transcode pipeline is made of multiple CUs such as decoder, scaler, lookahead, and encoder. These together form a CU pool. Based on the input resolution, framerate and type of transcode, the load of CUs within a CU pool varies. The number of required resources determines how many parallel jobs can run in real-time. CUs and CU pool are managed by the Xilinx® resource manager (XRM). XRM is a software layer responsible for managing the video hardware accelerators available in the host system. AMD AMA Video SDK compilable cards have a set processing capacity, e.g., an MA35 device is capable of an aggregate processing equivalent of 2 4kp60 H264/HEVC in parallel to 2 4kp60 AV1 streams. XRM allows for running and managing multiple heterogeneous job, in parallel, on all devices hosted in a chassis. It is noted that XRM strictly adheres to the total capacity of the hosted accelerators, i.e., it does not allow for over-subscription of resources.

+

The rest of this guide explains how to:

+
    +
  1. Assign jobs to specific devices using explicit device identifiers

  2. +
  3. Measure device load and determine where to run jobs using either manual or automated resource management techniques

  4. +
+
+
+

Assigning Jobs to Specific Devices

+

By default, a job is submitted to device 0 and slice handling/assignment by XRMD. When running multiple jobs in parallel, device 0 is bound to run out of resources rapidly and additional jobs will error out due to insufficient resources. By using explicit device identifiers, new jobs can be individually submitted to a specific device. This makes it easy and straightforward to leverage the entire video acceleration capacity of your system, based on the number of cards and devices.

+

The FFmpeg -hwaccel option can be used to specify the device on which a specific job should be run. This makes it possible to assign multiple jobs across all available devices in the host. +Determining on which device(s) to run a job can be done using either the manual or automated methods described in the following sections.

+
+

Examples using Explicit Device IDs

+

FFmpeg example of two different jobs run on two different devices

+

In this example, two different FFmpeg jobs are run in parallel. The -hwaccel option is used to submit each job to a different device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0  -c:v h264_ama -i INPUT1.h264 -f mp4 -c:v hevc_ama -y /dev/null &
+ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder1  -c:v h264_ama -i INPUT2.h264 -f mp4 -c:v hevc_ama -y /dev/null &
+
+
+
+

+
+
+
+
+

Manual Resource Management

+

The card management tools included in the AMD AMA Video SDK provide ways to query the status and utilization of the video accelerator devices. Using these tools the user can determine which resources are available and thereby determine on which device to submit a job (using explicit device identifies, as explained in the previous section).

+

Given that each device has a set compute capacity, the user is responsible for only submitting jobs which will not exceed the capacity of the specified device. If a job is submitted on a device where there are not enough compute unit resources available to support the job, the job will error out with a message about resource allocation failure.

+

The XRM and card management tools provide methods to estimate CU requirements and check current device load.

+
+

Checking System Load

+

Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

+
source /opt/amd/ama/ma35/scripts/setup.sh
+
+
+

Note that this command should be run only once per boot.

+

To check the current loading of all the devices in your system, use the following command:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

This will generate a report in JSON format containing the load information for all the compute unit (CU) resources. The report contains a section for each device in the system. The device sections contain sub-sections for each of the CUs (decoder, scaler, lookahead, encoder) in that device. For example, the load information for the encoder on device 0 may look as follows:

+
"device_0": {
+  ...
+  "cu_2": {
+       "cuId         ": "2",
+       "cuType       ": "IP Kernel",
+       "kernelName   ": "encoder",
+       "kernelAlias  ": "ENCODER_TYPE1_AMA",
+       "instanceName ": "encoder_1",
+       "cuName       ": "encoder:encoder_1",
+       "kernelPlugin ": "",
+       "maxCapacity  ": "497664000",
+       "numChanInuse ": "0",
+       "usedLoad     ": "0 of 1000000",
+       "reservedLoad ": "0 of 1000000",
+       "resrvUsedLoad": "0 of 1000000"
+   },
+
+
+

The usedLoad value indicates how much of that resource is currently being used. The value will range from 0 (nothing running) to 1000000 (fully loaded). The reservedLoad value indicates how much of that resource is being reserved using XRM. The resrvUsedLoad value indicates how much of the reserved load is actually being used.

+
+ +
+

Insufficient Resources

+

If there are not enough compute unit resources available on the device to support a FFmpeg job, the job will error out with a message about resource allocation failure:

+
Insufficient resources available for allocation
+
+
+

In this case, you can check the system load (as described in the section below) and look for a device with enough free resources, or wait until another job finishes and releases enough resources to run the desired job.

+
+
+

Job Resource Requirements

+

The load of a given job can be estimated by taking the resolution of the job as a percentage of the total capacity of a device. For instance, on an MA35D device, a 1080p60 stream will require 12.5% of the resources available on the device. Resource loads are reported with a precision of 1/1000000.

+
+

+
+
+
+
+

Automated Resource Management

+

The AMD AMA Video SDK provides a mechanism to automatically determine how many instances of various jobs can be submitted to the system and on which device(s) to dispatch each job instance. This mechanism relies on Job Descriptions files and a Job Slot Reservation tool which calculates the resources required for each job, determines on which device each job should be run and reserves the resources accordingly. Note that there is no requirement for job descriptions to be homogeneous.

+
+

Note

+

To observe the various job management log messages use tail -F /var/log/syslog command.

+
+
+

Video Transcode Job Descriptions

+

A video transcode Job Description File (JDF) provides information to the resource manager about what resources are needed to run a particular job. With this information, the resource manager can calculate the CU load for the specified job as well as the maximum possible number of jobs that can be run real-time in parallel.

+

A video transcode job description is specified through a JSON file and the key-value pairs specify the functions, formats, and resolutions needed.

+
+
function

Which HW resource to use (DECODER, SCALER, ENCODER)

+
+
format

Input/output format (H264, HEVC, AV1, yuv420p, yuv420p10le)

+
+
resolution

Input/output height, width, and frame-rate as a numerator / denominator fraction

+
+
type

Optional entry to select between Type 1 and Type 2 AV1 encoder. Valid values are 1 and 2, with default equal 1

+
+
load_factor

Optional entry that instructs XRM to allocate a multiple factor of required resources. The multiplication factor is either the default 1.0, i.e., no addition allocation or explicitly defined by this entry. A typical usage of this entry is in cases where there is a need for headroom, while allocating resources.

+
+
num_job_slots

Optional entry that explicitly specifies the number of resources or job slots for a particular job. The absence of this entry allows for a given job to reserve all available resources on a given device, instead of what is required to complete the job.

+
+
resources

All the resources listed in this section of the job description will be allocated on the same device. If the job requires a single device, this is the section in which resources should be specified.

+
+
cores

Optional entry to enable 2-core encoding in order to achieve higher throughput. Valid values are 1 and 2, for single core and double cores encodings, respectively. Default value is 1. See /opt/amd/ama/ma35/scripts/describe_job/example_2_core_encode.json for usage example.

+
+
preset

Optional entry to select one of fast, medium or slow encoding presets. Default value is medium. See /opt/amd/ama/ma35/scripts/describe_job/example_fast_preset.json for usage example.

+
+
+

Several examples of JSON job slot descriptions can be found in the /opt/amd/ama/ma35/scripts/describe_job folder once the AMD AMA Video SDK has been installed.

+

Below is the /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale example. This JSON example describes an ABR transcode job which uses a decoder, scaler, and encoder to generate 12 output renditions.

+
{
+    "request": {
+        "name": "t10_transcode_multiscale",
+        "request_id": 1,
+        "parameters": {
+            "name": "testjob",
+            "resources": 
+            [
+                {
+                    "function": "DECODER",
+                    "format":   "H264",
+                    "resolution": { "input": { "width": 3840, "height": 2160, "frame-rate": { "num":60, "den":1} } }
+                },
+                        {
+                    "function": "SCALER",
+                    "format":   "yuv420p",
+                    "resolution":{                                                                                 
+                        "input": { "width": 3840, "height": 2160, "frame-rate": { "num":60, "den":1} },
+                        "output":
+                        [        
+                            { "width": 1920, "height": 1080, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1600, "height": 900, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1440, "height": 900, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1360, "height": 768, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1280, "height": 720, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1024, "height": 768, "frame-rate": { "num":60, "den":1}},
+                            { "width": 960, "height": 540, "frame-rate": { "num":60, "den":1}},
+                            { "width": 848, "height": 480, "frame-rate": { "num":60, "den":1}},
+                            { "width": 640, "height": 360, "frame-rate": { "num":60, "den":1}},
+                            { "width": 540, "height": 480, "frame-rate": { "num":60, "den":1}},
+                            { "width": 352, "height": 288, "frame-rate": { "num":60, "den":1}},
+                            { "width": 288, "height": 160, "frame-rate": { "num":60, "den":1}}
+                        ]
+                    }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1920, "height": 1080, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1600, "height": 900, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1440, "height": 900, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1360, "height": 768, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1280, "height": 720, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1024, "height": 768, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 960, "height": 540, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 848, "height": 480, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 640, "height": 360, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 540, "height": 480, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 352, "height": 288, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 288, "height": 160, "frame-rate": { "num":60, "den":1} } } 
+                }
+            ]
+        }
+    }
+}
+
+
+

The next sections document the two different ways of using job descriptions to run multiple jobs across one or more devices:

+ +
+
+

The Job Slot Reservation Tool

+

The job slot reservation application, jobslot_reservation, takes as input multiple JSON job description files. Each JSON JDF provides information to the resource manager about what kind of transcode is intended to run on a card. With this information, the resource manager calculates the CU load for the specified job as well as the maximum possible number of jobs that can be run real-time in parallel.

+

Once the maximum possible number of jobs is known, CUs and job slots are reserved, and corresponding reservation IDs are stored in a bash file at /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh, where TIMESTAMP refers to Linux epoch timestamp and JDF is the name of JSON JDF, without its extension. A reservation ID is a unique identifier which is valid while the job slot reservation application is running. After sourcing the respective /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh files, the reservation IDs are then passed to individual FFmpeg processes via the XRM_RESERVE_ID environment variable. The FFmpeg processes then use this reservation ID to retrieve and use the corresponding CUs reserved by the job slot reservation tool.

+

The reserved resources are released by ending the job reservation process. Reserved slots can be reused after an FFmpeg job finishes, as long as the job reservation process is still running.

+

Optionally, jobslot_reservation can take --dry_run argument to check how many job slots are possible for a given job, without actual reservation. Additionally, this application is process-safe.

+

Ill-formed JSON Job Descriptions

+

If you run the jobslot_reservation tool with a syntactically incorrect JSON description, you will see the following messages:

+
decoder plugin function=0 fail to run the function
+scaler plugin function=0 fail to run the function
+encoder plugin function=0 fail to run the function
+
+
+

This indicates that the job description is ill-formed and needs to be corrected.

+
+

Example requiring a single device per job

+

This example uses the /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json file describing a 1080p ABR ladder running on a single device.

+
    +
  1. Setup the environment:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  2. +
  3. Run the job slot reservation application with the desired JSON job description. For example

    +
    JobDescriptionFile: /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json
    +Requested Loads:
    +scaler [0]: 523634
    +
    +decoder [0]: 250000
    +
    +...
    +
    +lookahead [0]: 6111
    +
    +encoder [0]: 5555
    +
    +lookahead [0]: 2777
    +
    +===============================================================
    +Total Job Slots possible : 2
    +Dry run: Disabled
    +
    +Job Type: /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json
    +Job Slots Alloted: 2
    +XRM_RESERVE_ID file - "/var/tmp/amd/xrm_jobReservation_79533431_t10_transcode_multiscale.sh"
    +================================================================
    +
    +---------------------------------------------------------------
    +
    +The Job-slot reservations are alive as long as this Application is alive!
    +(press Enter to close this app)
    +
    +---------------------------------------------------------------
    +
    +
    +
  4. +
+

The job slot reservation application creates a /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh with XRM_RESERVE_ID_{n} set to unique IDs generated by XRM (with n ranging from 1 to the number of possible job slots for the given job). Here is an example of this generated file:

+
export XRM_RESERVE_ID_0=1
+export XRM_RESERVE_ID_1=2
+
+
+
    +
  1. Launch individual FFmpeg processes in distinct shells after sourcing the /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh file and setting XRM_RESERVE_ID environment to a unique XRM_RESERVE_ID_{n}.

    +

    For job 1, within a new terminal:

    +
    source /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh
    +export XRM_RESERVE_ID=${XRM_RESERVE_ID_1}
    +ffmpeg -c:v h264_ama ...
    +
    +
    +

    For job 2, within a new terminal:

    +
    source /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh
    +export XRM_RESERVE_ID=${XRM_RESERVE_ID_2}
    +ffmpeg -c:v h264_ama ...
    +
    +
    +

    And so forth for the other jobs.

    +
  2. +
  3. Press Enter in the job reservation app terminal to release the resources after the jobs are complete.

  4. +
+
+
+
+

Automated Job Launching

+

The Job Slot Reservation tool automatically reserves job slots, but actual jobs still need to be manually launched using the generated reservations IDs. It is possible to create custom orchestration layers to automatically handle the reservation of job slots and the launching of jobs.

+

The AMD AMA Video SDK includes an example launcher application for FFmpeg. Source code for the FFmpeg Launcher example and the Job Slot Reservation tool are included in the Github repository of AMD AMA Video SDK and can be used as a starting point for developing custom orchestration layers.

+
+

The FFmpeg Launcher Example

+

The FFmpeg launcher, launcher, is an example application which automates the dispatching of FFmpeg jobs across multiple devices. It simplifies the process of manually setting up XRM reservation IDs and launching FFmpeg for many video streams. The FFmpeg launcher takes tuples of source, Transcode Job Description (TJD) files, where each line of source file is a full path to the location of an input file and TJD has the following format:

+
+
job_description = JDF_PATH

JDF_PATH value refers to the full path of a JDF

+
+
cmdline = FFMPEG_CMD

FFMPEG_CMD refers to a complete FFmpeg pipeline command, without input source file after -i.

+
+
+

As an example, the source1.txt and job1.txt tuple describes a decode pipeline running on device 0:

+

source1.txt:

+
/path/to/4kp60.h264
+
+
+

job1.txt:

+
job_description = /path/to/JDF file
+
+cmdline = ffmpeg -y -hwaccel ama -c:v h264_ama -out_fmt nv12 -i -filter_hw_device dev0 -filter_complex "hwdownload,format=nv12[out]" -map "out]" -vframes 300 -f rawvideo -pix_fmt nv12 /dev/null
+
+
+
+

Note

+

The FFmpeg launcher is only an example application. It is provided as an illustration of how an orchestration layer can use Job Descriptions, but it is not an official feature of the AMD AMA Video SDK.

+
+

The following steps show how to use the FFmpeg launcher for an arbitrary number of jobs, assuming all are within the total compute capacity of the accelerator cards.

+
    +
  1. Environment setup

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  2. +
  3. To run the FFmpeg launcher, use the following command:

    +
    launcher <(source, TJD)> {(source, TJD)}
    +
    +
    +

    Here is an example of the command:

    +
    launcher source1.txt job1.txt source2.txt job2.txt
    +
    +
    +
  4. +
+
+

+
+
+
+
+
+

XRM Reference Guide

+

The Xilinx® resource manager (XRM) is the software which manages the hardware accelerators available in the system. XRM includes the following components:

+
    +
  • xrmd: the XRM daemon, a background process supporting reservation, allocation, and release of hardware acceleration resources.

  • +
  • xrmadm the command line tool is used to interact with the XRM daemon (xrmd).

  • +
  • a C Application Programming Interface (API)

  • +
+
+

Command Line Interface

+

The XRM xrmadm command line tool is used to interact with the XRM daemon (xrmd). It provides the following capabilities and uses a JSON file as input for each action:

+
    +
  • Generate status reports for each device

  • +
  • Load and unload the hardware accelerators

  • +
  • Load and unload the software plugins

  • +
+

The XRM related files are installed under /opt/amd/ama/ma35/scripts/.

+
+

Setup

+

When sourced, the /opt/amd/ama/ma35/scripts/setup.sh script takes care of setting up the enviroment for the AMD AMA Video SDK, including its XRM components:

+
    +
  • The XRM daemon (xrmd) is started

  • +
  • The hardware accelerators (xclbin) and software plugins are loaded on the Xilinx devices

  • +
+
+
+

Generating Status Reports

+

xrmadm can generate reports with the status of each device in the system. This capability is particularly useful to check the loading of each hardware accelerator.

+

To generate a report for all the devices in the system:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

To generate a more detailed report for a single device, which is specified in the json file:

+
xrmadm /opt/amd/ama/ma35/scripts/list_onedevice_cmd.json
+
+
+

A sample JSON file for generating a report for device 0 is shown below:

+
{
+    "request": {
+        "name": "list",
+        "requestId": 1,
+        "device": 0
+    }
+}
+
+
+
+
+

Loading/Unloading Software Plugins

+

xrmadm can be used to load or unload the software plugins required to manage the compute resources. The software plugins perform resource management functions such as calculating CU load and CU max capacity. Once a plugin is loaded, it becomes usable by a host application through the XRM APIs. The XRM plugins need to be loaded before executing an application (such as FFmpeg/GStreamer) which relies on the plugins.

+

To load the plugins:

+
xrmadm /opt/amd/ama/ma35/scripts/load_xrm_plugins_cmd.json
+ {
+     "response": {
+         "name": "loadXrmPlugins",
+         "requestId": "1",
+         "status": "ok"
+     }
+ }
+
+
+

To unload the plugins:

+
xrmadm /opt/amd/ama/ma35/scripts/unload_xrm_plugins_cmd.json
+ {
+     "response": {
+         "name": "unloadXrmPlugins",
+         "requestId": "1",
+         "status": "ok"
+     }
+ }
+
+
+
+
+
+

C Application Programming Interface

+

XRM provides a C Application Programming Interface (API) to reserve, allocate and release CUs from within a custom application. For complete details about this programming interface, refer to the XRM API Reference Guide section of the documentation.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/migration.html b/v1.1.2/migration.html new file mode 100644 index 00000000..df68642f --- /dev/null +++ b/v1.1.2/migration.html @@ -0,0 +1,649 @@ + + + + + + + + + + + + + + + Software Migration Considerations — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Software Migration Considerations
  • +
  • +
  • +
+
+
+
+
+ +
+

Software Migration Considerations

+ +

This section of documentation covers the notable API differences between the current release of SDK, 1.1.2, and previous versions.

+
+

API Changes from Alveo U30

+

This sub-section describes differences between U30 and MA35D

+
+
+

FFmpeg API Changes

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + +

Options General

MA35D

U30

-c:v:

+

Used for codec selection. Aside from naming convention changes, new AV1 codec and VP9 decoder are now available.

+

-c:v

-c:v

-filter_complex:

+

Used for frame filtering operation. Aside from naming convention changes, new 2D composition and ML operations are now available.

+

-filter_complex

-filter_complex

-hwaccel:

+

Used to select hardware accelerator engine. This option was previously referred to as xlnx_hwdev.

+

-hwaccel

-xlnx_hwdev

-vf:

+

Used to select the DMA transfer direction between host and accelerator.

+

-vf

xvbm_convert

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Encoder

Version 1.1.2

U30

-level:

+

Used to specify encoder's level. It now supports AV1's levels.

+

-level

-level

-profile:

+

Used to set encoder's profile. It now supports AV1's main.

+

-profile

-profile

-control_rate:

+

Used to set rate control mode. Options to this setting have changed.

+

-control_rate

-control-rate

-tune_metrics:

+

Used to tune VQ metrics. Options to this setting have changed.

+

-tune_metrics

-tune-metrics

-cores:

+

Used to explicitly specify the number of processing cores.

+

Deprecated

-cores

-periodicity-idr:

+

Used to determine IDR frame frequency.

+

Deprecated

-periodicity-idr

-force_key_frames:

+

Used to force IDR frame insertion, at specified frame numbers.

+

Deprecated

-force_key_frames

-disable-pipeline:

+

Used to enable/disable pipelining.

+

Deprecated

-disable-pipeline

-aspect-ratio:

+

Used to set video's aspect ratio.

+

Deprecated

-aspect-ratio

-expert-options:

+

Used to set encoder's expert option.

+

Deprecated

-expert-options

-avc-lowlat:

+

Used to enable/disable ULL for AVC.

+

Deprecated

-avc-lowlat

+ +++++ + + + + + + + + + + + + + + + + +

Options Decoder

Version 1.1.2

U30

-splitbuff_mode:

+

Used to configure decoder's buffer mode.

+

Deprecated

-splitbuff_mode

-entropy_buffers_count:

+

Used to set number of decoder's entropy buffers.

+

Deprecated

-entropy_buffers_count

+ +++++ + + + + + + + + + + + + + + + + + + + + +

Options Scaler

Version 1.1.2

U30

-out_{N}_width:

+

Used to configure width of an output rung.

+

Deprecated

-out_{N}_width

-out_{N}_height:

+

Used to configure height of an output rung.

+

Deprecated

-out_{N}_height

-out_{N}_rate:

+

Used to configure frame rate of an output rung.

+

Deprecated

-out_{N}_rate

+
+
+

Gstreamer API Changes

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Encoder

Version 1.1.2

U30

tune_metrics:

+

Used to tune VQ metrics. Options to this setting have changed.

+

tune-metrics

tune-metrics

ultra-low-latency:

+

Used to set ULL mode.

+

Set lookahead-depth to 0.

ultra-low-latency

target-bitrate:

+

Used to set target bit rate.

+

bitrate

target-bitrate

control_rate:

+

Used to set rate control mode. Options to this setting have changed.

+

rate-control

control-rate

dev-idx:

+

Used to specify the index of the device on which the encoder should be executed.

+

device

dev-idx

aspect-ratio:

+

Used to set video’s aspect ratio.

+

Deprecated

aspect-ratio

avc-lowlat:

+

Used to enable/disable ULL for AVC.

+

Deprecated

avc-lowlat

dependent-slice:

+

Used to specify slice dependency.

+

Deprecated

dependent-slice

enable-pipeline:

+

Used to enable/disable pipelining.

+

Deprecated

enable-pipeline

ip-delta:

+

Used to set IP delta.

+

Deprecated

ip-delta

loop-filter-beta-offset:

+

Used to set loop filter beta offset.

+

Deprecated

loop-filter-beta-offset

loop-filter-tc-offset:

+

Used to set loop filter tc offset..

+

Deprecated

loop-filter-tc-offset

slice-qp:

+

Used to set slice QP mode.

+

Deprecated

slice-qp

scaling-list:

+

Used to set lscaling list mode.

+

Deprecated

scaling-list

reservation-id:

+

Used to set resource pool reservation id.

+

Deprecated

reservation-id

rc-mode:

+

Used to enable custom rate control mode.

+

Deprecated

rc-mode

qp-mode:

+

Used to set QP control mode used by the encoder.

+

Deprecated

qp-mode

pb-delta:

+

Used to set PB delta.

+

Deprecated

pb-delta

periodicity-idr:

+

Used to set periodicity of IDR frames.

+

Deprecated

periodicity-idr

num-cores:

+

Used to set the number of encoder cores to be used for current stream.

+

Deprecated

num-cores

num-slices:

+

Used to set the number of slices produced for each frame.

+

Deprecated

num-slices

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Decoder

Version 1.1.2

U30

dev-idx:

+

Used to specify the index of the device on which the decoder should be executed.

+

device

dev-idx

avoid-dynamic-alloc:

+

Used to set a flag to avoid dynamic allocation of output buffers.

+

Deprecated

avoid-dynamic-alloc

avoid-output-copy:

+

Used to set a flag to avoid output frames copy.

+

Deprecated

avoid-output-copy

disable-hdr10-sei:

+

Used to configure whether to passthrough HDR10/10+ SEI messages or not.

+

Deprecated

disable-hdr10-sei

interpolate-timestamps:

+

Used to configure interpolation of output buffers PTS.

+

Deprecated

interpolate-timestamps

num-entropy-buf:

+

Used to specifie the number of decoder internal entropy buffers.

+

Deprecated

num-entropy-buf

reservation-id:

+

Used to set resource Pool Reservation id.

+

Deprecated

reservation-id

splitbuff-mode:

+

Used to configure decoder in split/unsplit input buffer mode.

+

Deprecated

splitbuff-mode

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Scaler

Version 1.1.2

U30

dev-idx:

+

Used to specify the index of the device on which the scaler should be executed.

+

device

dev-idx

avoid-output-copy:

+

Used to set a flag to avoid output frames copy on all source pads.

+

Deprecated

avoid-output-copy

coef-load-type:

+

Used to configure coefficients loading type for scaling.

+

Deprecated

coef-load-type

enable-pipeline:

+

Used to enable buffer pipelining to improve performance in non zero-copy use cases.

+

Deprecated

enable-pipeline

reservation-id:

+

Used to configure resource pool reservation id.

+

Deprecated

reservation-id

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/objects.inv b/v1.1.2/objects.inv new file mode 100644 index 00000000..1f482640 Binary files /dev/null and b/v1.1.2/objects.inv differ diff --git a/v1.1.2/package_feed.html b/v1.1.2/package_feed.html new file mode 100644 index 00000000..cbd2d968 --- /dev/null +++ b/v1.1.2/package_feed.html @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + Distribution Package Feed — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Distribution Package Feed
  • +
  • +
  • +
+
+
+
+
+ +
+

Distribution Package Feed

+ +
+

Package Descriptions

+ ++++ + + + + + + + + + + + + + + + + + + + + + + +

Name

Description

amd-ama-core

This package includes all the core elements that are required for running applications.

amd-ama-driver

This package includes all kernel driver and firmware elements.

amd-ama-ffmpeg

This package includes all the relevant software for running hardware-accelerated FFmpeg pipelines.

amd-ama-gstreamer

This package includes all the relevant software for running hardware-accelerated Gstreamer pipelines.

amd-ama-xma

This package includes various XMA based application programs and development header files.

+
+
+

Configuring the Package Feed

+

Distribution based package feeds allow for convenient and robust methods to update and upgrade relevant packages of the AMD AMA Video SDK. In order to be able to install the AMD AMA Video SDK packages from the package feed, point your package management client to the remote AMD AMA Video SDK package repository according to the instructions described below.

+
+

Ubuntu

+
    +
  1. Add Xilinx key:

    +
    wget -qO - https://www.xilinx.com/support/download/2018-2-1/xilinx-master-signing-key.asc | sudo tee /usr/share/keyrings/xilinx-master-signing-key.asc
    +
    +
    +
  2. +
  3. Add Xilinx PPA feed:

    +
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/xilinx-master-signing-key.asc] https://packages.xilinx.com/artifactory/debian-packages $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/xilinx.list
    +
    +
    +
  4. +
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/release_notes.html b/v1.1.2/release_notes.html new file mode 100644 index 00000000..e21c45ac --- /dev/null +++ b/v1.1.2/release_notes.html @@ -0,0 +1,344 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) Release Notes — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA) Release Notes
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA) Release Notes

+
+

Note

+

Version: 1.1.2

+
+ +
+

+
+
+

Overview

+

This section describes various requirements, limitations, known issues and their respective workarounds that are applicable to AMD AMA Video SDK.

+
+
+

Release Requirements

+
    +
  1. The following firmware versions are required:

    +
    +
    ZSP Version = 2.0.4
    +SC Version = 9.7.39
    +eSecure Version = 1.0.0
    +PCIe FW Version = 2.1.0
    +PCIe CTRL Patch Version = 1.0.3
    +PCIe PHY Patch A Version = 1.0.0
    +
    +
    +
    +
  2. +
  3. This documentation is applicable to 1.1.2 release.

  4. +
  5. Ensure that chassis's BIOS is set to performance mode, e.g., sleep states, clock throttling, etc. are disabled.

  6. +
+
+
+

New in This Release

+
    +
  1. VP9 decode

  2. +
  3. New -no_bll encoder parameter

  4. +
  5. New crop 2D scaler parameter

  6. +
  7. Production quality 2D GPU and ROI

  8. +
  9. New telemetry flag: mautil examine -d all -r utilization

  10. +
  11. Additional PCIe and memory info in mautil validate

  12. +
+
+
+

Features in This Release

+
    +
  1. Support for video transcode using either our supplied FFmpeg (n5.1.2), Gstreamer (v1.22), or custom Xilinx Media Acceleration (XMA) applications.

  2. +
  3. Support for up to 4 x 4Kp60 8-bit or 10-bit video decode VP9, AV1, AVC or HEVC per device.

  4. +
  5. Support for up to 160 Mbps encode throughput per device.

  6. +
  7. Support for up to 2 x 4Kp60 8-bit or 10-bit video transcode of AVC or HEVC per device.

  8. +
  9. Support for up to 4 x 4Kp60 8-bit or 10-bit video transcode of AV1 per device.

  10. +
  11. Support for up to 1 x 8Kp30 8-bit or 10-bit video transcode of AV1 per device

  12. +
  13. Support for integration with software-based video image filters using our hardware DMA support to/from device memory (FFmpeg or Gstreamer).

  14. +
  15. Optional use of our supplied resource management daemon (xrmd) for automated accelerator selection and load balancing.

  16. +
  17. Resource utilization reporting when using our supplied resource management daemon (xrmd).

  18. +
  19. Utility applications enabling collection of power, voltage, temperature and memory for each device as well as aggregate values for the MA35D accelerator card.

  20. +
  21. Support for virtualization using either Ubuntu 20.04 or 22.04 in KVM mode with a guest OS also running either Ubuntu 20.04 or 22.04.

  22. +
  23. The 2D GPU and ML, engines with ROI model, support are fully available features, using FFmpeg.

  24. +
  25. Face and text-based Machine Learning (ML) models for enhanced low bitrate video encoding for fine text and faces using the ML engine of the card, via FFmpeg plugin

  26. +
  27. Dual core AV1 encoding enabling 4kp120 and 8Kp30.

  28. +
  29. Low latency encoding support (lookahead depths of approximately 1-11 frames).

  30. +
  31. fast preset for AVC, HEVC and AV1 (type 2) encoding for enhanced throughput and/or density.

  32. +
  33. HDR10, HDR10+ and/or HLG metadata pass through transcode support.

  34. +
  35. New Content Adaptive Bit Rate (cabr) rate control mode for enhanced visual quality and bitrate efficiency.

  36. +
  37. Support for encoder levels >= 6.

  38. +
  39. Support for new encoder features in our resource management toolchain.

  40. +
  41. New latency_ms command-line parameter to, optionally, specify the encoder lookahead_depth in units of time instead of frames.

  42. +
  43. Support for color space conversion, input rotation, and color subsampling using the 2D GPU engine of the card, via FFmpeg plugin

  44. +
  45. Telemetry is available for all accelerators by using mautil examine -d all -r utilization

  46. +
  47. The mautil validate subcommand supports all encoder codecs and performs PCIe and MMIO tests

  48. +
+
+
+

Supported Kernels and Distributions

+

This release of AMD AMA Video SDK supports Ubuntu 22.04, 20.04, and Debian 12 with generic kernel 5.15.0, 5.19.0, 6.2.0 and 6.5.0. However, kernels 5.15.0, 6.2.0 and 6.5.0 are preferred.

+
+
+

Known Limitations

+
    +
  1. PF and VF must support PCIe memory regions BAR0 of 8 MB, BAR2 of 64 MB and BAR4 of 512 MB sizes.

  2. +
  3. PF and VF release versions must match.

  4. +
  5. A device that has been assigned to a VM cannot share its resources with its host.

  6. +
  7. Only a single VF may be assigned to a VM.

  8. +
  9. For maximum server scalability, ensure that a single VF is assigned to a VM.

  10. +
  11. Ensure that both the host and VMs are running the same SDK version.

  12. +
  13. MA35D only supports progressive content, i.e., interlaced contents are not supported in either the decoder or encoder.

  14. +
  15. For encoding, only resolutions that are divisible by 4 are supported, i.e., both height and width.

  16. +
  17. For decoding, only resolutions that are divisible by 2 are supported, i.e., both height and width.

  18. +
  19. This version of the SDK does not support splitting a video acceleration use case across multiple MA35D devices.

  20. +
  21. With the current version of FFmpeg, n5.1.2, it is not recommended to transport AV1 over MPEG TS.

  22. +
  23. XMA sample applications are not meant to be run at maximum density.

  24. +
  25. Encode rates up to maximum of 400 Mbps are supported.

  26. +
  27. 4Kp120 is only supported for AV1 (type 1) encoder, under ultra low latency mode, using both cores.

  28. +
  29. VBR and CVBR rate control modes are not supported for lookahead depth between 0 and 4.

  30. +
  31. Using an encoder lookahead_depth value of <11 may limit the number of b-frames or other encoder features such as rate control modes, aq modes and so forth. See Encoding Compatibility Matrix for details.

  32. +
  33. When using the encoder fast preset, lookahead_depth must be > 0.

  34. +
  35. Mixing 2-slice AV1 Type 1 encoding and 1-slice encoding is not supported on a single device

  36. +
  37. Encoder does not support dynamic QP maps in either AV1 Type 2 encoding or with lookahead_depth = 0.

  38. +
  39. 2D GPU only supports 8-bit video.

  40. +
  41. The 2D GPU and ML engines are not supported in Gstreamer or through XMA interface.

  42. +
  43. AV1 decoder does not support 8k resolution in portrait mode.

  44. +
+
+
+

Known Issues

+
    +
  1. A secondary bus reset (SBR) will cause the server to hang. A cold boot of the server will restore function. After installation of our driver package, our setup.sh script should be run prior to utilizing any of the features of the SDK. The setup.sh will disable secondary bus reset.

  2. +
  3. AV1 decoding using the included ama_av1dec Gstreamer plugin requires the use of an IVF packaged AV1 raw video stream and a corresponding ivfparse plugin to be utilized to demux the AV1 video stream.

  4. +
  5. If the kernel driver is not loaded, tools such as mautil may crash when invoked.

  6. +
  7. An AV1 HLS stream may playback at slower than real time speeds. Recommend explicitly setting of fps playback frame rate when using ffplay or use ffplay from ffmpeg 5.1.2 or 6.0

  8. +
  9. Recommend playback of raw video using more recent versions of ffplay (n5.1.2n6.0 or later) or more recent versions of media players such as VLC v3.0.17.4. Alternatively, muxing the raw video into an IVF container format is also permitted.

  10. +
  11. Using Gstreamer, 1080p30 transcodes and or lower resolutions cannot run at full density with default lookahead depth.

  12. +
  13. ROI Model currently doesn't support portrait mode in a specific resolution of 1080x1920.

  14. +
  15. A strict HDR10+ compliance checker may report some warnings in encoded HDR10+ bitstreams generated by this release.

  16. +
  17. Firmware downgrade to GA1.0 may not work on some desktop machines or low end servers. Warm boot the server to get to working state.

  18. +
  19. AV1 decoder accepts streams up to 40 Mbps.

  20. +
  21. Attempts to firmware updates before the 10-minute mark, of card uptime, with 9.7.35 satellite controller firmware will fail.

  22. +
+
+
+

Upgrading from Previous Versions

+
    +
  1. Remove any ma35 and amd-ama packages as per installation instructions.

  2. +
  3. Remove any manually created Boost library soft links that may have been created, previously.

  4. +
  5. Remove all entries from /etc/apt/sources.list.d/xilinx.list if this file exists.

  6. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/search.html b/v1.1.2/search.html new file mode 100644 index 00000000..d2d7cdac --- /dev/null +++ b/v1.1.2/search.html @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + Search — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Search
  • +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/v1.1.2/searchindex.js b/v1.1.2/searchindex.js new file mode 100644 index 00000000..15638e4c --- /dev/null +++ b/v1.1.2/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["announcements", "c_apis", "card_management", "encoder_comp_matrix", "examples", "examples/amf/amf_encoder", "examples/ffmpeg/filters", "examples/ffmpeg/quality_analysis", "examples/ffmpeg/tutorials", "examples/gstreamer/filters", "examples/gstreamer/tutorials", "examples/gstreamer/xabrladder", "examples/gstreamer/xcompositor", "examples/xma/xma_apps", "getting_started_on_prem", "git_hub", "index", "managing_compute_resources", "migration", "package_feed", "release_notes", "specs_and_features", "troubleshooting", "tuning_pipeline_latency", "tuning_video_quality", "unified_logging", "using_ffmpeg", "using_gstreamer", "virtualization"], "filenames": ["announcements.rst", "c_apis.rst", "card_management.rst", "encoder_comp_matrix.rst", "examples.rst", "examples/amf/amf_encoder.rst", "examples/ffmpeg/filters.rst", "examples/ffmpeg/quality_analysis.rst", "examples/ffmpeg/tutorials.rst", "examples/gstreamer/filters.rst", "examples/gstreamer/tutorials.rst", "examples/gstreamer/xabrladder.rst", "examples/gstreamer/xcompositor.rst", "examples/xma/xma_apps.rst", "getting_started_on_prem.rst", "git_hub.rst", "index.rst", "managing_compute_resources.rst", "migration.rst", "package_feed.rst", "release_notes.rst", "specs_and_features.rst", "troubleshooting.rst", "tuning_pipeline_latency.rst", "tuning_video_quality.rst", "unified_logging.rst", "using_ffmpeg.rst", "using_gstreamer.rst", "virtualization.rst"], "titles": ["Announcements", "C API Programming Guide", "Card Management", "Encoding Compatibility Matrix", "Tutorials and Examples", "AMF Encoder Tutorial", "FFmpeg Examples using Software Filters", "Video Quality Examples", "FFmpeg Tutorials", "GStreamer Examples using Software Filters", "GStreamer Introductory Tutorials", "GStreamer ABR Ladder Application", "GStreamer Compositor Application", "XMA Examples for the AMD AMA Video SDK", "Getting Started with AMD AMA Video SDK Cards on Premises", "AMD Advanced Media Acceleration (AMA) Repository", "AMD Advanced Media Acceleration (AMA)", "Managing Video Acceleration Compute Resources", "Software Migration Considerations", "Distribution Package Feed", "AMD Advanced Media Acceleration (AMA) Release Notes", "Specs and Features of the AMD AMA Video SDK", "AMD Advanced Media Acceleration (AMA) Troubleshooting", "Tuning Latency", "Tuning Video Quality", "Unified Logging", "Using FFmpeg", "Using GStreamer", "Virtualization"], "terms": {"amd": [0, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 17, 18, 19, 23, 24, 25, 26, 27, 28], "ama": [0, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 17, 18, 19, 23, 24, 25, 26, 27, 28], "video": [0, 2, 3, 4, 5, 10, 11, 12, 15, 16, 18, 19, 20, 22, 23, 25, 27, 28], "sdk": [0, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28], "amazon": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "ec2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "vt2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "2022": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "2024": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "ma35": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "opt": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "thi": [0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18, 19, 21, 22, 23, 24, 26, 27, 28], "section": [0, 1, 2, 6, 7, 8, 9, 13, 14, 17, 18, 20, 21, 22, 24, 25, 26, 27, 28], "document": [0, 1, 7, 13, 17, 18, 20, 24, 26, 27], "provid": [0, 1, 2, 6, 7, 8, 10, 11, 16, 17, 21, 24, 25, 26, 27, 28], "earli": 0, "notif": 0, "option": [0, 1, 2, 6, 7, 8, 9, 10, 11, 12, 13, 17, 18, 20, 23, 24, 27], "other": [0, 1, 7, 8, 11, 14, 17, 20, 21, 22, 24, 26], "forthcom": 0, "chang": [0, 1, 6, 21, 24], "The": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 20, 22, 23, 24, 25, 26, 27, 28], "follow": [0, 1, 2, 3, 6, 7, 8, 9, 11, 12, 14, 17, 20, 21, 22, 23, 24, 25, 26, 27, 28], "list": [0, 1, 2, 7, 8, 13, 14, 17, 18, 19, 20, 23, 24, 26], "avail": [0, 1, 2, 11, 12, 17, 18, 20, 21, 22, 26, 27, 28], "releas": [0, 1, 2, 14, 16, 17, 18, 24, 26], "along": [0, 12, 15, 21], "brief": 0, "explan": [0, 8, 10], "where": [0, 1, 2, 6, 7, 8, 14, 17, 21, 24, 25, 26, 28], "applic": [0, 2, 4, 5, 6, 7, 8, 9, 10, 13, 16, 19, 20, 21, 23, 24, 26, 27, 28], "note": [0, 1, 2, 6, 7, 8, 9, 10, 14, 15, 16, 17, 21, 23, 24, 26, 27, 28], "8kp30": [0, 20], "av1": [0, 1, 2, 8, 10, 13, 16, 17, 18, 20, 21, 26, 27], "type": [0, 1, 2, 7, 8, 11, 12, 13, 17, 18, 20, 21, 22, 25, 26, 27, 28], "1": [0, 2, 6, 7, 8, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "encod": [0, 2, 6, 7, 9, 12, 16, 17, 18, 20, 21, 25], "i": [0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 26, 27, 28], "now": [0, 1, 18], "all": [0, 1, 2, 3, 6, 7, 8, 9, 10, 13, 14, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28], "valid": [0, 1, 2, 17, 20, 21, 24, 26, 27], "rang": [0, 2, 11, 12, 17, 21, 22, 23, 24, 26, 27], "lookahead": [0, 1, 2, 3, 11, 13, 17, 18, 20, 22, 26, 27], "depth": [0, 1, 3, 13, 18, 20, 21, 22, 24, 26, 27], "doubl": [0, 12, 17, 21], "densiti": [0, 16, 20, 21, 24, 26, 27], "decod": [0, 2, 7, 9, 12, 14, 16, 17, 18, 20, 21, 25], "updat": [0, 1, 10, 14, 19, 20, 22], "avc": [0, 6, 10, 16, 18, 20, 21, 24, 27], "hevc": [0, 1, 8, 10, 13, 16, 17, 20, 21, 24, 26, 27], "2": [0, 1, 2, 6, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 26, 27, 28], "downscal": [0, 21], "new": [0, 1, 6, 7, 8, 9, 10, 13, 17, 18], "": [0, 1, 2, 6, 7, 8, 9, 10, 13, 14, 17, 18, 20, 23, 24, 26, 27, 28], "plugin": [0, 7, 8, 10, 13, 20, 21, 22, 25, 26], "still": [0, 1, 13, 17], "imag": [0, 2, 6, 8, 9, 12, 20, 21, 28], "target": [0, 2, 6, 8, 9, 18, 21, 22, 24, 25, 28], "format": [0, 1, 2, 6, 7, 8, 10, 11, 13, 16, 17, 20, 21, 22, 24, 26, 27], "ar": [0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "jpeg": 0, "lossi": 0, "lossless": 0, "avif": 0, "2d": [0, 2, 17, 18, 20], "engin": [0, 7, 8, 18, 20, 21, 24], "capabl": [0, 1, 10, 16, 17, 21, 24, 26], "These": [0, 1, 2, 17, 21, 24, 26], "includ": [0, 1, 2, 7, 8, 10, 14, 16, 17, 19, 20, 21, 25, 26, 27], "high": [0, 1, 13, 16, 21, 22, 24, 26, 27], "throughput": [0, 17, 20, 24, 26, 27], "rich": 0, "interact": [0, 2, 13, 17, 23, 25, 28], "compositor": [0, 4], "alpha": 0, "blend": 0, "improv": [0, 1, 8, 18, 21, 24, 26], "ml": [0, 18, 20, 21, 24, 26], "base": [0, 1, 4, 5, 11, 13, 14, 16, 17, 19, 20, 21, 23, 24, 26, 27], "rate": [0, 1, 6, 7, 10, 13, 16, 17, 18, 20, 21, 23, 24, 26, 27], "control": [0, 1, 13, 14, 18, 20, 21, 22, 24, 25, 26, 27, 28], "roi": [0, 3, 20], "gstreamer": [0, 4, 6, 7, 8, 13, 14, 17, 19, 20, 21, 24, 25], "pcie": [0, 2, 14, 20, 21, 22, 28], "peer": 0, "allow": [0, 1, 2, 8, 10, 16, 17, 19, 21, 23, 24, 26, 27, 28], "bandwidth": [0, 2, 8, 10, 21, 23], "traffic": [0, 6, 9], "between": [0, 1, 2, 6, 8, 9, 17, 18, 20, 21, 23, 26, 27, 28], "devic": [0, 1, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 21, 24, 26, 28], "e": [0, 1, 6, 8, 9, 10, 13, 14, 17, 20, 21, 22, 24, 26, 27, 28], "g": [0, 1, 6, 8, 9, 10, 13, 14, 17, 20, 21, 24, 26, 27], "discret": 0, "gpu": [0, 2, 17, 20, 21], "ma35d": [0, 2, 6, 9, 15, 16, 17, 18, 20, 22], "without": [0, 1, 7, 11, 12, 17, 21, 26, 27, 28], "involv": 0, "host": [0, 1, 2, 6, 8, 9, 10, 14, 17, 18, 20, 21, 22, 26, 27], "cpu": [0, 1, 6, 7, 9, 26, 28], "passthrough": [0, 6, 18], "With": [0, 17, 20], "ani": [0, 1, 8, 13, 20, 21, 22, 25, 26, 27], "o": [0, 2, 12, 13, 20, 28], "can": [0, 1, 2, 5, 6, 7, 8, 9, 10, 13, 17, 21, 22, 23, 24, 26, 27, 28], "util": [0, 1, 8, 11, 12, 13, 15, 17, 20, 21, 22, 23, 24, 25, 26, 28], "card": [0, 1, 8, 16, 17, 20, 27, 28], "requir": [0, 1, 6, 7, 8, 9, 10, 13, 14, 19, 21, 22, 23, 26, 28], "specif": [0, 1, 2, 11, 16, 20, 21, 24, 25, 27, 28], "driver": [0, 14, 19, 20, 21, 22, 28], "data": [0, 2, 10, 21, 22, 26], "meta": [0, 2], "preserv": 0, "sei": [0, 1, 18, 21], "messag": [0, 1, 13, 14, 17, 18, 22], "user": [0, 1, 2, 7, 8, 10, 16, 17, 21, 25, 27, 28], "close": [0, 17, 21], "caption": 0, "color": [0, 20, 26, 27], "space": [0, 11, 20, 25, 26, 27], "through": [0, 1, 2, 6, 7, 11, 12, 17, 20, 21, 24, 26, 28], "out": [0, 1, 6, 10, 17, 22, 27], "pipelin": [0, 1, 2, 8, 10, 11, 12, 13, 17, 18, 19, 21, 23, 24, 26], "multi": [0, 11, 21, 23, 26], "enhanc": [0, 8, 20, 24, 26, 27], "inclus": [0, 25], "more": [0, 1, 2, 6, 8, 9, 10, 13, 14, 15, 17, 20, 21, 22, 24, 26, 27], "than": [0, 13, 14, 20, 21, 22, 23, 24, 26, 27], "one": [0, 1, 2, 6, 8, 9, 11, 17, 21, 24, 26, 28], "dma": [0, 18, 20, 26], "api": [0, 5, 13, 16, 17, 21], "transfer": [0, 6, 8, 9, 10, 18, 21, 26, 27], "from": [0, 1, 2, 7, 8, 9, 10, 12, 13, 14, 16, 17, 19, 21, 22, 24, 25, 26, 27, 28], "fedora": 0, "support": [0, 1, 2, 6, 8, 11, 12, 13, 14, 17, 18, 19, 21, 22, 23, 24, 26, 27, 28], "40": [0, 1, 2, 13, 20, 21], "ffmpeg": [0, 4, 7, 9, 10, 13, 14, 16, 19, 20, 21, 22, 24, 25], "6": [0, 3, 7, 13, 14, 20, 22, 26], "deprec": [0, 1, 18], "interfac": [0, 2, 13, 16, 20, 21], "A": [0, 1, 2, 14, 17, 20, 21, 26], "streamlin": 0, "paramet": [0, 3, 8, 11, 12, 17, 20, 23, 25, 26, 28], "set": [0, 1, 8, 10, 13, 15, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28], "replac": [0, 1, 6], "current": [0, 1, 2, 17, 18, 20, 24, 27], "ones": [0, 7, 21, 24], "expect": [0, 1, 11, 12, 14, 21, 22, 26, 27], "manag": [0, 1, 19, 20, 21, 28], "merg": 0, "administr": [0, 2], "task": [0, 8], "mamgmt": [0, 22, 28], "maflash": [0, 14], "mautil": [0, 20], "focus": 0, "domain": [0, 2, 28], "activ": [0, 2, 26, 28], "drop": [0, 8, 10, 13], "5": [0, 2, 3, 8, 11, 12, 13, 14, 17, 20, 21, 22, 26, 28], "which": [1, 2, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 21, 23, 24, 25, 26, 27, 28], "facilit": [1, 16, 21], "integr": [1, 15, 16, 20, 21], "transcod": [1, 6, 11, 12, 16, 20, 22, 24, 26, 27], "proprietari": [1, 16, 21], "framework": [1, 5, 16, 21, 25, 27], "form": [1, 11, 17, 21, 24, 26], "leverag": [1, 16, 17, 21, 26, 27], "xilinx": [1, 2, 13, 17, 19, 20, 21, 28], "media": [1, 5, 7, 13, 21, 27], "acceler": [1, 2, 6, 9, 13, 18, 19, 21, 25, 26, 27, 28], "librari": [1, 7, 20, 25, 26], "libxma": 1, "meant": [1, 2, 15, 20, 28], "simplifi": [1, 17], "us": [1, 2, 3, 5, 7, 8, 10, 11, 13, 18, 20, 21, 22, 23, 24, 28], "hardwar": [1, 2, 8, 13, 16, 17, 18, 19, 20, 21, 25, 26], "system": [1, 6, 7, 8, 9, 10, 13, 14, 21, 22, 26, 27, 28], "keep": 1, "track": [1, 2, 7, 17, 23], "total": [1, 2, 14, 17, 26, 27], "capac": [1, 7, 17, 27], "each": [1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18, 20, 21, 22, 24, 25, 26, 28], "comput": [1, 2, 21], "unit": [1, 2, 16, 17, 20, 28], "make": [1, 17, 21, 26, 27, 28], "possibl": [1, 6, 7, 9, 17, 22], "perform": [1, 2, 5, 6, 7, 8, 9, 10, 13, 14, 17, 18, 20, 22, 23, 25, 26, 27], "action": [1, 2, 17, 21], "calcul": [1, 7, 13, 17, 21], "load": [1, 2, 13, 18, 20, 28], "max": [1, 12, 13, 17, 24, 25, 27], "4": [1, 2, 3, 6, 7, 13, 14, 20, 21, 22, 23, 24, 26, 27, 28], "differ": [1, 7, 8, 9, 11, 17, 18, 21, 24, 25, 27], "correspond": [1, 17, 20, 24], "featur": [1, 16, 17, 26, 28], "combin": [1, 3, 6, 7, 8, 9, 21, 23], "when": [1, 3, 6, 8, 9, 10, 13, 17, 20, 22, 24, 26, 27], "layer": [1, 12, 17, 25], "organ": 1, "around": [1, 8], "step": [1, 2, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 21, 22, 28], "must": [1, 8, 13, 14, 20, 21, 24, 26, 27], "first": [1, 2, 12, 26, 28], "creat": [1, 2, 8, 9, 10, 12, 17, 20, 21, 22, 27, 28], "xrm_plugin_reserv": 1, "dec": [1, 23, 25], "enc": [1, 2, 25], "scale": [1, 8, 9, 11, 13, 16, 18, 23, 27], "done": [1, 6, 8, 9, 10, 17, 21, 22], "describ": [1, 2, 3, 6, 8, 9, 11, 12, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28], "detail": [1, 2, 6, 7, 8, 10, 13, 14, 17, 20, 21, 22, 24, 26, 27], "below": [1, 2, 8, 11, 12, 17, 19, 21, 22, 24, 26, 27], "onc": [1, 2, 8, 10, 17], "have": [1, 3, 7, 10, 14, 17, 18, 20, 21, 23, 24, 26, 27, 28], "been": [1, 7, 10, 13, 17, 20, 21, 22, 28], "dedic": [1, 7, 21], "need": [1, 6, 14, 17, 21, 27, 28], "To": [1, 2, 8, 10, 14, 17, 21, 22, 23, 24, 28], "particular": [1, 17], "It": [1, 2, 6, 7, 8, 9, 13, 14, 15, 17, 18, 21, 22, 23, 24, 26, 27], "call": [1, 21], "function": [1, 2, 6, 8, 9, 10, 17, 20, 24, 27, 28], "complet": [1, 2, 8, 10, 13, 16, 17, 21, 26, 27], "send": [1, 9, 25], "receiv": 1, "xmafram": 1, "also": [1, 2, 8, 11, 12, 16, 20, 22, 23, 24, 28], "do": [1, 8, 22, 23, 24, 28], "zero": [1, 2, 6, 9, 18, 27], "copi": [1, 6, 9, 18, 27], "oper": [1, 2, 6, 8, 10, 18, 21, 22, 25, 26, 28], "pass": [1, 8, 10, 17, 20, 21, 22, 28], "next": [1, 17], "being": [1, 2, 8, 14, 17, 22], "back": [1, 6, 8, 9, 22], "return": [1, 2, 14, 22, 28], "code": [1, 7, 11, 12, 13, 15, 17, 21, 26, 27], "should": [1, 2, 3, 6, 7, 8, 9, 10, 13, 14, 17, 18, 20, 21, 24, 26], "determin": [1, 7, 17, 18, 23, 24, 25], "suitabl": 1, "finish": [1, 17], "destroi": [1, 2], "so": [1, 17, 20, 21, 23, 26], "free": [1, 17], "job": [1, 14, 26, 27], "ensur": [1, 2, 6, 7, 8, 9, 10, 11, 13, 14, 20, 22, 24, 26, 28], "everyth": 1, "clean": 1, "up": [1, 2, 12, 16, 17, 20, 21, 22, 26], "properli": [1, 2, 22, 28], "xrm_plugin_releas": 1, "packag": [1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 20, 27, 28], "part": [1, 21, 28], "necessari": 1, "declar": [1, 8], "your": [1, 2, 6, 7, 8, 9, 10, 11, 12, 13, 17, 19, 22, 26, 27], "header": [1, 19, 28], "sourc": [1, 2, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27], "h": [1, 8, 9, 10, 11, 12, 13, 21, 26], "add": [1, 6, 7, 19, 22, 23, 26, 27, 28], "line": [1, 2, 6, 7, 8, 9, 10, 11, 12, 20, 21, 24, 25, 26], "cmakelist": 1, "txt": [1, 17, 23, 24, 25], "file": [1, 2, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "target_link_librari": 1, "project_nam": 1, "public": 1, "xrm_interfac": [1, 26, 27], "target_include_directori": 1, "project_source_dir": 1, "target_properti": 1, "interface_include_directori": 1, "struct": 1, "xmaparamet": 1, "length": [1, 27], "valu": [1, 2, 3, 13, 17, 20, 22, 24, 25, 26, 27], "custom": [1, 7, 17, 18, 20, 21], "argument": [1, 7, 8, 10, 13, 17, 22, 26], "found": [1, 6, 7, 8, 9, 10, 13, 17, 23, 24, 26, 27], "xmaparam": 1, "xmaframeproperti": 1, "dimens": [1, 9, 26], "xmabuff": 1, "raw": [1, 6, 7, 8, 10, 13, 20, 22, 24], "its": [1, 7, 17, 20, 21, 22, 24, 26, 28], "sent": 1, "thei": [1, 7, 8, 10, 24, 26], "input": [1, 6, 7, 8, 9, 10, 11, 12, 13, 17, 18, 20, 21, 22, 26], "output": [1, 2, 6, 7, 9, 11, 12, 13, 14, 17, 18, 21, 22, 23, 24, 25, 26], "look": [1, 2, 7, 17, 21, 24, 26], "ahead": [1, 2, 17, 21, 24, 26], "3": [1, 2, 3, 6, 8, 13, 14, 20, 21, 22, 24, 26, 27], "xma_host_buffer_typ": 1, "upload": [1, 8, 27], "befor": [1, 7, 10, 17, 20, 22, 26, 27], "xma_device_only_buffer_typ": 1, "download": [1, 7, 19, 26, 27, 28], "no_buff": 1, "contain": [1, 2, 8, 9, 10, 11, 13, 15, 17, 20, 22, 24, 26, 27], "place": [1, 9], "holder": 1, "fill": 1, "onli": [1, 2, 3, 7, 13, 17, 20, 21, 22, 23, 24, 26, 27], "while": [1, 17, 22, 24], "xma_device_buffer_typ": 1, "dummi": 1, "those": 1, "respect": [1, 2, 7, 8, 17, 20, 21, 26, 27], "xmadatabuff": 1, "sw_format": 1, "member": 1, "xmascalerproperti": 1, "xmaencoderproperti": 1, "xmafilterproperti": 1, "repres": [1, 8, 26], "pixel": [1, 8, 9, 10, 13, 24, 26], "therefor": 1, "assign": [1, 20, 21, 26], "direct": [1, 18, 21, 26, 27], "flow": [1, 25], "xma_nv12_fmt_typ": 1, "xma_p010le_fmt_typ": 1, "flag": [1, 7, 8, 18, 20, 23], "xma_frame_property_flag_tile_4x4": 1, "intern": [1, 8, 18, 22], "xma_packed10_fmt_typ": 1, "an": [1, 2, 3, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28], "xma_rgb24_fmt_typ": 1, "futur": [1, 27], "xma_yuv420p_fmt_typ": 1, "xma_yuv420p10le_fmt_typ": 1, "extern": [1, 21], "commonli": [1, 7], "most": [1, 7, 10, 13, 21, 24], "consist": 1, "xma_log_init": 1, "xma_logmsg": 1, "xma_log_releas": 1, "xmalogg": 1, "int32_t": 1, "xmalogleveltyp": 1, "log_level": [1, 13, 23, 25], "xmalogtyp": 1, "log_typ": 1, "xmaloghandl": 1, "handl": [1, 17, 26], "prior": [1, 20, 24], "see": [1, 2, 6, 7, 8, 9, 10, 13, 14, 17, 20, 21, 22, 23, 24, 26], "variad": 1, "usag": [1, 2, 6, 8, 10, 15, 16, 17, 24, 26, 27], "void": 1, "level": [1, 13, 18, 20, 21, 23, 25, 26], "const": 1, "char": 1, "name": [1, 6, 10, 11, 12, 13, 14, 17, 18, 19, 25, 27, 28], "msg": 1, "wa": [1, 18, 25], "previous": [1, 6, 8, 9, 18, 20], "xma_initi": 1, "xma_releas": 1, "xmainitparamet": 1, "init_param": 1, "xmahandl": 1, "xma_data_buffer_alloc": 1, "xma_data_from_buffer_clon": 1, "xma_data_buffer_fre": 1, "size_t": 1, "size": [1, 6, 8, 9, 13, 14, 20, 22, 23, 24, 25, 26, 28], "bool": 1, "given": [1, 2, 3, 6, 8, 13, 17, 23, 24], "uint8_t": 1, "xma_data_buffer_clone_free_callback_funct": 1, "free_callback": 1, "opaqu": 1, "point": [1, 2, 17, 19, 22], "longer": 1, "xma_frame_planes_get": 1, "xma_frame_get_plane_height": 1, "xma_frame_get_plane_strid": 1, "xma_frame_get_plane_s": 1, "xma_frame_alloc": 1, "xma_frame_from_buffers_clon": 1, "xma_frame_clon": 1, "xma_frame_inc_ref": 1, "xma_frame_dec_ref": 1, "xma_frame_fre": 1, "xma_frame_add_side_data": 1, "xma_frame_get_first_side_data": 1, "xma_frame_get_side_data": 1, "xma_frame_get_next_side_data": 1, "xma_frame_get_next_side_data_of_typ": 1, "xma_frame_remove_side_data": 1, "xma_frame_remove_side_data_typ": 1, "xma_frame_clear_all_side_data": 1, "frame_prop": 1, "number": [1, 10, 11, 12, 13, 14, 17, 18, 20, 22, 23, 24, 25, 26, 27], "plane": 1, "height": [1, 3, 8, 10, 12, 13, 17, 18, 20, 24, 26, 27], "stride": 1, "width": [1, 2, 3, 8, 10, 12, 13, 17, 18, 20, 24, 26, 27], "xmaframedata": 1, "frame_data": 1, "xma_frame_clone_free_callback_funct": 1, "xma_fram": 1, "same": [1, 7, 8, 17, 20, 24, 26, 27], "ad": [1, 2, 12], "remov": [1, 14, 20, 22, 28], "affect": 1, "origin": [1, 7, 9], "increas": [1, 21, 23, 24, 26, 27], "count": [1, 13], "decreas": [1, 21, 22, 24], "previou": [1, 17, 18], "xmaframesidedata": 1, "side_data": 1, "If": [1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 20, 22, 23, 25, 26, 27, 28], "alreadi": [1, 8], "associ": [1, 22, 24, 26, 28], "increment": [1, 21], "success": [1, 14], "execut": [1, 6, 7, 8, 9, 10, 13, 14, 17, 18, 22, 26, 27, 28], "v1": [1, 15, 20], "enum": [1, 27], "xmaframesidedatatyp": 1, "decrement": [1, 22], "result": [1, 2, 6, 7, 8, 12, 17, 21, 23, 24], "freed": 1, "ha": [1, 2, 3, 7, 8, 13, 17, 20, 21, 22, 23, 24, 26, 27], "xma_side_data_alloc": 1, "xma_side_data_fre": 1, "xma_side_data_inc_ref": 1, "xma_side_data_dec_ref": 1, "xma_side_data_get_refcount": 1, "xma_side_data_read": 1, "xma_side_data_writ": 1, "xma_side_data_get_metadata": 1, "xma_side_data_set_metadata": 1, "xmabuffertyp": 1, "buffer_typ": 1, "uint64_t": 1, "abov": [1, 7, 8, 11, 14, 22, 23, 24, 25, 26, 28], "you": [1, 2, 6, 7, 8, 9, 10, 13, 14, 17, 26, 27, 28], "yet": 1, "otherwis": [1, 25, 26, 28], "risk": 1, "race": 1, "condit": [1, 21, 22, 26], "occur": 1, "metadata": [1, 8, 20, 26], "get": [1, 2, 8, 13, 16, 20, 22, 25, 27, 28], "specifi": [1, 2, 7, 8, 10, 12, 13, 17, 18, 20, 24, 26, 27], "depend": [1, 18, 21, 22, 23, 24], "whether": [1, 14, 18, 24, 27], "exist": [1, 8, 20, 28], "subsect": 1, "serv": [1, 27], "version": [1, 6, 7, 8, 9, 10, 13, 14, 16, 18, 21, 22, 26, 27, 28], "In": [1, 2, 6, 7, 9, 10, 17, 19, 21, 23, 26], "order": [1, 2, 7, 17, 19, 23, 28], "forward": 1, "backward": 1, "abi": 1, "compat": [1, 2, 6, 8, 9, 14, 16, 17, 20, 21, 23, 24, 27, 28], "assum": [1, 8, 17, 21, 25, 28], "mean": [1, 2, 7, 24, 26], "earlier": 1, "later": [1, 20, 22, 26], "cannot": [1, 12, 20], "either": [1, 7, 17, 20, 21], "ignor": [1, 14, 26, 28], "error": [1, 2, 8, 10, 13, 17, 22, 25, 27], "snippet": [1, 28], "param": [1, 13, 24, 27], "uint32_t": 1, "api_vers": 1, "xma_api_version_m_": 1, "m": [1, 23, 26, 27, 28], "xma_api_vers": 1, "xma_uint32": 1, "sizeof": 1, "xma_init_param": 1, "param_cnt": 1, "logger": 1, "major": [1, 24], "minor": 1, "macro": 1, "becom": [1, 17, 22], "xma_api_version_1_0": 1, "xma_dec_session_cr": 1, "xma_dec_set_log": 1, "xma_dec_session_send_data": 1, "xma_dec_session_get_properti": 1, "xma_dec_session_recv_fram": 1, "xma_dec_session_destroi": 1, "xmadecod": 1, "xmadecodersess": 1, "xmadecoderproperti": 1, "dec_prop": 1, "run": [1, 2, 11, 13, 17, 19, 20, 21, 22, 26, 27, 28], "until": [1, 17, 21], "after": [1, 10, 14, 17, 20, 22, 26, 28], "sever": [1, 8, 17, 21], "factor": [1, 17, 24, 26, 27], "resolut": [1, 3, 7, 9, 11, 12, 13, 17, 20, 21, 22, 24, 26, 27], "bit": [1, 3, 6, 9, 10, 13, 18, 20, 23, 24, 26, 27], "xma_dec_session_set_log": 1, "default": [1, 2, 7, 8, 10, 11, 12, 13, 14, 17, 20, 22, 23, 24, 25, 26, 27, 28], "some": [1, 7, 8, 10, 20, 22, 24], "data_us": 1, "wai": [1, 17, 21, 26], "pars": [1, 10], "stream": [1, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 20, 21, 22, 24, 26, 27], "time": [1, 2, 6, 7, 8, 9, 10, 12, 13, 16, 17, 20, 22, 23, 24], "indic": [1, 2, 17, 22, 28], "amount": [1, 24], "consum": [1, 2, 17], "xma_success": 1, "abl": [1, 19, 22, 28], "entireti": 1, "accordingli": [1, 17], "case": [1, 11, 17, 18, 20, 21, 22, 24, 26], "proce": [1, 2, 14], "fetch": 1, "xma_try_again": 1, "did": 1, "report": [1, 2, 20, 21, 22, 25], "again": [1, 8, 22], "xma_send_more_data": 1, "notifi": 1, "null": [1, 7, 8, 12, 17, 21, 23], "continu": [1, 2], "flush": 1, "yuv": [1, 8, 13], "dec_sess": 1, "fprop": 1, "tri": 1, "pointer": 1, "produc": [1, 8, 10, 11, 18, 21, 27], "xma_eo": 1, "configur": [1, 6, 7, 8, 9, 10, 11, 13, 14, 17, 18, 21, 22, 24, 25, 26, 27, 28], "standard": [1, 7, 21, 26], "both": [1, 2, 6, 8, 9, 20, 21, 23, 24, 26, 28], "hwdecoder_typ": 1, "arrai": 1, "incom": [1, 8, 24, 26], "even": [1, 21], "integ": [1, 12, 26, 27], "128": [1, 26, 28], "3840": [1, 17], "portrait": [1, 8, 20, 21, 26], "2160": [1, 17], "bits_per_pixel": 1, "per": [1, 2, 8, 13, 14, 16, 20, 24, 27, 28], "primari": [1, 2, 24], "8": [1, 3, 8, 9, 12, 13, 20, 23, 26, 27, 28], "10": [1, 2, 3, 6, 9, 13, 18, 20, 22, 23, 26, 27], "xma_frame_property_flag_compress": 1, "addit": [1, 2, 7, 17, 20, 24, 25, 27], "out_fmt": [1, 6, 8, 13, 17, 26], "low_lat": [1, 8, 23, 26], "enabl": [1, 8, 11, 13, 14, 16, 17, 18, 20, 21, 22, 23, 25, 26, 27, 28], "latency_log": [1, 13], "inform": [1, 2, 7, 8, 17, 23, 25], "xma_scaler_session_cr": 1, "xma_scaler_set_log": 1, "xma_scaler_session_send_fram": 1, "xma_scaler_session_recv_frame_list": 1, "xma_scaler_session_destroi": 1, "xmascal": 1, "xmascalersess": 1, "prop": 1, "underli": [1, 24], "eventu": 1, "multipl": [1, 6, 17, 20, 21, 24, 26], "take": [1, 8, 10, 11, 17, 26, 27], "further": [1, 6, 7, 8, 9, 23, 24], "upon": [1, 22], "xma_flush_again": 1, "frame_list": 1, "everi": [1, 2, 7, 23], "reach": [1, 21], "end": [1, 8, 17, 20, 22, 23, 24], "xma_error": 1, "xmascalerinoutproperti": 1, "xmascalerfilterproperti": 1, "16": [1, 2, 8, 9, 21, 26], "hwscaler_typ": 1, "xma_abr_scaler_typ": 1, "num_output": 1, "xma_vpe_fmt_typ": 1, "framer": [1, 7, 8, 10, 17, 24], "second": [1, 8, 24, 27, 28], "mix_rat": 1, "mix": [1, 20], "half": [1, 8, 13, 14, 22, 26], "top": [1, 6, 8, 9, 10, 12, 26, 27], "crop": [1, 20, 26, 27], "disabl": [1, 8, 13, 14, 17, 18, 20, 23, 25, 26, 27], "xma_enc_session_cr": 1, "xma_enc_session_set_log": 1, "xma_enc_session_send_fram": 1, "xma_enc_session_recv_data": 1, "xma_enc_session_destroi": 1, "xmaencod": 1, "xmaencodersess": 1, "enc_prop": 1, "about": [1, 2, 8, 17, 24], "data_s": 1, "respons": [1, 17], "xma_resend_and_recv": 1, "readi": 1, "untouch": 1, "reus": [1, 17], "hwencoder_typ": 1, "lookahead_depth": [1, 7, 8, 13, 20, 22, 23, 24, 26], "modul": [1, 14, 26, 28], "give": [1, 7, 10], "start": [1, 2, 7, 8, 12, 16, 17, 22, 23, 24, 28], "rc_mode": [1, 13], "constant": [1, 21, 23, 26, 27], "qp": [1, 3, 8, 13, 18, 20, 21, 24, 26, 27], "cbr": [1, 3, 21, 23, 26, 27], "vbr": [1, 3, 20, 21, 26, 27], "cvbr": [1, 3, 20, 21, 26, 27], "bitrat": [1, 8, 10, 12, 13, 18, 20, 22, 24, 26, 27], "kbp": [1, 12, 13], "fix": [1, 22, 24, 27], "quantiz": [1, 21, 23, 24, 26, 27], "51": [1, 13, 24, 26, 27], "264": [1, 8, 9, 10, 11, 12, 13, 21, 26], "255": [1, 8, 13, 24, 26, 27], "gop_siz": 1, "maximum": [1, 8, 13, 17, 20, 21, 24, 26, 27], "group": [1, 22, 28], "pictur": 1, "temp_aq_gain": [1, 13], "tempor": [1, 3, 13, 21, 24, 26, 27], "aq": [1, 3, 13, 20, 24, 26, 27], "gain": [1, 13, 24, 26, 27], "spat_aq_gain": [1, 13], "spatial": [1, 3, 13, 21, 24, 26, 27], "minqp": [1, 24], "minimum": [1, 3, 13, 26, 27], "maxqp": [1, 24], "profil": [1, 13, 18, 21, 26], "baselin": [1, 13, 21, 26], "main": [1, 13, 18, 19, 21, 26, 27], "intra": [1, 13, 21, 26, 27], "100": [1, 2, 13, 22, 26], "101": [1, 13], "102": [1, 13], "103": [1, 13], "200": [1, 13], "auto": [1, 13, 26, 27], "codec": [1, 7, 8, 11, 13, 16, 18, 20, 26], "slice": [1, 8, 13, 17, 18, 20, 21, 26, 27], "spatial_aq": [1, 13, 26], "adapt": [1, 20, 26, 27], "temporal_aq": [1, 13, 26], "qp_mode": [1, 13, 26], "rel": [1, 12, 27], "uniform": [1, 26, 27], "tune_metr": [1, 7, 13, 18, 24, 26], "tune": [1, 8, 13, 18, 21, 26, 27], "metric": [1, 7, 13, 18, 26, 27], "none": [1, 6, 13, 14, 26, 28], "vq": [1, 7, 8, 13, 18, 21, 23, 24, 26, 27], "psnr": [1, 13, 24, 26, 27], "ssim": [1, 13, 24, 26, 27], "vmaf": [1, 13, 24, 26, 27], "forced_idr": [1, 26], "forc": [1, 10, 18, 25, 26, 27, 28], "insert": [1, 10, 11, 12, 14, 18, 23, 26, 27, 28], "idr": [1, 11, 18, 21, 26, 27], "crf": [1, 3, 13, 26, 27], "expert_opt": [1, 13], "expert": [1, 13, 18], "device_typ": [1, 13], "For": [1, 2, 3, 6, 7, 8, 10, 13, 14, 17, 20, 21, 23, 24, 26, 27, 28], "select": [1, 7, 8, 14, 17, 18, 20, 21, 23, 26, 27], "xmadynamicencparam": 1, "xmadynamicencparams_v2": 1, "clone": [1, 27], "attach": [1, 28], "check": [1, 10, 22, 28], "statu": [1, 14, 21, 22, 28], "xma_api_version_1_1": 1, "xma_api_version_1_1_2": 1, "xmasidedata": 1, "is_spatial_aq_gain_chang": 1, "spatial_aq_gain": [1, 13, 26], "is_temporal_aq_gain_chang": 1, "temporal_aq_gain": [1, 13, 26], "is_temporal_mode_chang": 1, "temporal_aq_mod": 1, "is_spatial_mode_chang": 1, "spatial_aq_mod": 1, "is_bit_rate_chang": 1, "bit_rate_kbp": 1, "is_b_frames_chang": 1, "num_b_fram": 1, "b": [1, 2, 3, 6, 7, 8, 12, 13, 20, 23, 24, 26, 27], "is_min_qp_chang": 1, "min_qp": [1, 13, 26], "is_max_qp_chang": 1, "max_qp": [1, 13, 26], "extra": [1, 14, 26, 28], "memeb": 1, "is_qp_chang": 1, "is_qp_i_offset_chang": 1, "qp_i_offset": [1, 26], "offset": [1, 6, 8, 12, 18, 24, 26, 27], "is_qp_b_offset_chang": 1, "qp_b_offset": [1, 26], "is_min_bit_rate_chang": 1, "min_bit_rate_kbp": 1, "is_max_bit_rate_chang": 1, "max_bit_rate_kbp": 1, "xma_filter_session_cr": 1, "xma_filter_session_set_log": 1, "xma_filter_session_send_fram": 1, "xma_filter_session_recv_fram": 1, "xma_filter_session_destroi": 1, "xmafilt": 1, "xmafiltersess": 1, "reciev": 1, "re": [1, 6, 8, 21, 23, 24], "mai": [1, 2, 7, 17, 20, 21, 22, 23, 24, 26, 28], "xmafilterportproperti": 1, "hwfilter_typ": 1, "entri": [1, 17, 20, 26], "xma_upload_filter_typ": 1, "xma_download_filter_typ": 1, "port": 1, "xma_int32": 1, "immedi": 1, "delin": [1, 23], "over": [1, 6, 8, 17, 20, 22], "here": [1, 7, 8, 10, 17, 24], "how": [1, 2, 5, 6, 7, 8, 9, 10, 13, 14, 17, 21, 23, 24, 26, 27], "impli": [1, 21, 24, 26], "migrat": 1, "manual": [1, 20, 28], "anoth": [1, 7, 17], "would": 1, "access": [1, 14, 21, 22, 27], "modifi": [1, 7, 24], "hdr10": [1, 18, 20, 21], "defin": [1, 8, 17, 21, 24, 25, 28], "own": [1, 22, 24, 28], "downstream": [1, 26, 27], "predefin": 1, "sidedata": 1, "delet": 1, "sole": 1, "xma_dec_param_thread": 1, "xma_dec_param_wait": 1, "background": [1, 2, 8, 17], "thread": [1, 10, 21, 25], "deploi": [1, 14, 21, 24], "similarli": [1, 8], "xma_enc_param_thread": 1, "xma_enc_param_wait": 1, "behav": 1, "behavior": [1, 21, 24], "successfulli": [1, 2], "regardless": [1, 27], "pull": [1, 13], "try": [1, 22], "full": [1, 13, 17, 20, 21, 22, 26, 27], "accord": [1, 19, 21], "last": [1, 2], "compress": [1, 7, 23, 24, 26], "No": [1, 2, 3, 11, 12, 13, 21, 26, 27], "loop": [1, 13, 18], "xma_scaler_param_thread": 1, "extend": [1, 26], "xma_log_type_ama": 1, "xma_frame_side_data_dyn_enc_param": 1, "itself": [1, 24], "doe": [1, 2, 7, 17, 20, 22, 26, 27], "instead": [1, 10, 17, 20, 24], "old": 1, "fpga": 1, "daemon": [1, 2, 17, 20, 28], "command": [1, 2, 6, 7, 8, 9, 10, 11, 12, 14, 20, 21, 22, 24, 28], "tool": [1, 2, 20, 21, 24], "commun": [1, 21, 26, 27], "xrmadm": [1, 17], "xrmd": [1, 17, 20, 26], "xrm_dec_reserv": 1, "xrm_dec_releas": 1, "xrm_dec_interfac": 1, "int": [1, 11, 12, 24], "xrmdecodecontext": 1, "xrm_dec_ctx": 1, "dev_index": 1, "xrminterfaceproperti": 1, "xrm_prop": 1, "relev": [1, 2, 7, 19, 23, 26], "were": 1, "xrm_enc_reserv": 1, "xrm_enc_releas": 1, "xrm_enc_interfac": 1, "xrmencodecontext": 1, "xrm_enc_ctx": 1, "slice_id": 1, "is_xav1": 1, "is_ul": 1, "xrm_scale_reserv": 1, "xrm_scale_releas": 1, "xrm_scale_interfac": 1, "xrmscalecontext": 1, "scaler_xrm_ctx": 1, "input_prop": 1, "output_prop": 1, "cd": [1, 27], "chmod": 1, "r": [1, 2, 8, 20, 26, 28], "777": 1, "mkdir": 1, "cmake": [1, 27], "j": [1, 11, 26], "build": [2, 7, 26, 27, 28], "xrm": [2, 21, 22, 25, 26, 27], "instal": [2, 6, 7, 8, 9, 10, 11, 12, 13, 17, 19, 20, 26, 27, 28], "upgrad": [2, 19], "board": 2, "flash": 2, "standalon": 2, "queri": [2, 17, 21], "administ": 2, "print": [2, 13, 26], "readabl": [2, 17, 23], "manner": [2, 6, 8, 9], "examin": [2, 20], "unprivileg": 2, "bare": 2, "metal": 2, "guest": [2, 14, 20], "vm": [2, 14, 20], "reset": [2, 20, 21, 22], "privileg": 2, "vf": [2, 6, 7, 8, 18, 20, 24, 26, 28], "evic": 2, "notat": 2, "work": [2, 13, 20, 22], "pci": [2, 21, 28], "often": 2, "pad": [2, 10, 18], "lead": 2, "four": [2, 12, 16], "digit": 2, "colon": 2, "hexadecim": 2, "two": [2, 11, 16, 17, 21, 24, 27], "sometim": [2, 22], "refer": [2, 8, 10, 14, 18, 21, 24, 25, 26, 27], "slot": [2, 14, 22], "decim": 2, "softwar": [2, 4, 8, 16, 19, 20, 21, 25, 26], "process": [2, 7, 10, 13, 16, 17, 18, 21, 23, 24, 25, 26, 27], "reserv": [2, 18], "alloc": [2, 8, 14, 17, 18, 21, 27, 28], "gener": [2, 6, 13, 14, 18, 20, 21, 23, 25, 28], "guid": [2, 7, 8, 10, 13, 26, 27], "obtain": [2, 7, 10, 23, 26, 27, 28], "exampl": [2, 5, 16, 21, 22, 23, 24, 28], "detect": [2, 22, 26], "bdf": 2, "0000": [2, 22, 28], "01": [2, 28], "00": [2, 6, 22, 28], "0": [2, 3, 6, 7, 8, 10, 11, 12, 13, 14, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28], "02": [2, 22, 28], "info": [2, 13, 20, 23, 25, 27, 28], "taken": 2, "help": [2, 10, 13, 26, 28], "cmd": 2, "design": [2, 27, 28], "cat": [2, 14, 28], "sy": [2, 14, 22, 28], "class": [2, 14, 24, 26], "misc": [2, 14], "ama_transcod": [2, 14, 22, 28], "x": [2, 6, 8, 10, 20, 24, 26], "bus_id": 2, "minu": 2, "ama_transcoder0": [2, 6, 7, 8, 13, 14, 17, 21, 22, 23, 26], "verifi": [2, 13, 14], "version_inform": [2, 14], "zsp": [2, 14, 20], "sc": [2, 8, 14, 19, 20, 22], "9": [2, 3, 12, 14, 20, 22], "7": [2, 3, 13, 14, 20, 22, 26, 27], "39": [2, 14, 20], "esecur": [2, 14, 20], "fw": [2, 14, 20, 22], "ctrl": [2, 14, 20, 22], "patch": [2, 14, 20, 26, 27], "phy": [2, 14, 20], "environ": [2, 17], "d": [2, 8, 13, 14, 19, 20, 22, 27, 28], "chassi": [2, 17, 20, 21], "basic": 2, "shell": [2, 14, 17], "sub": [2, 17, 18], "impact": [2, 3, 8, 23, 24, 26], "via": [2, 17, 20, 26, 28], "switch": [2, 22], "view": 2, "interest": 2, "electr": 2, "power": [2, 14, 16, 20, 21], "sensor": 2, "present": [2, 6, 7, 8, 9, 10, 11, 12, 13, 21], "hw": [2, 17], "cnt": 2, "counter": 2, "memori": [2, 10, 20, 27, 28], "topologi": [2, 23, 24], "thermal": 2, "known": [2, 7, 17, 22, 24, 27], "json": [2, 7, 11, 17], "filenam": 2, "temperatur": [2, 20], "62": [2, 13], "c": [2, 4, 5, 6, 7, 8, 11, 13, 14, 16, 18, 21, 22, 23, 24, 26, 28], "58": 2, "aux": 2, "736": 2, "mv": 2, "ddr0": 2, "865": 2, "ml_engin": 2, "751": 2, "749": 2, "12v": 2, "pex": 2, "787": 2, "ma": 2, "3v": 2, "80": [2, 26], "360": [2, 10, 13, 17], "voltag": [2, 20], "12200": 2, "3296": 2, "board_pow": 2, "11051": 2, "mw": 2, "virtual": [2, 14, 20, 22], "numvf": [2, 28], "tag": 2, "mbp": [2, 13, 20], "s2_dfi_w_mbp": 2, "s2_dfi_r_mbp": 2, "s2_axi_w_mbp": 2, "s2_axi_r_mbp": 2, "s1_dfi_w_mbp": 2, "s1_dfi_r_mbp": 2, "474": 2, "s1_axi_w_mbp": 2, "s1_axi_r_mbp": 2, "236": 2, "total_dfi_mbp": 2, "s1_dfi_bw": 2, "s2_dfi_bw": 2, "total_axi_mbp": 2, "s1_axi_bw": 2, "s2_axi_bw": 2, "vendor": [2, 13, 28], "0x10ee": 2, "0x5070": 2, "16gt": 2, "temp": 2, "57": 2, "board_temp": 2, "53": [2, 3, 13], "864": 2, "752": 2, "750": 2, "3304": 2, "12208": 2, "266": 2, "653": 2, "9114": 2, "uptim": [2, 20], "sec": 2, "328344": 2, "pciephypatch": 2, "pciectlpatch": 2, "32": [2, 13, 21, 26], "threshold": [2, 26], "shutdown_temp_c": 2, "110": 2, "max_operating_temp_c": 2, "105": 2, "threshold_temp_c": 2, "85": 2, "oem_id": 2, "0xe78": 2, "sku_numb": 2, "part_numb": 2, "05105": 2, "product_nam": 2, "alveo": 2, "pq": 2, "product_revis": 2, "product_sn": 2, "xfl1at3klcy5": 2, "processor_typ": 2, "vpu": [2, 16, 21], "uncorrect": 2, "correct": [2, 17], "ths2_axi_sram": 2, "ths1_axi_sram": 2, "ddr_ch7": 2, "ddr_ch6": 2, "ddr_ch3": 2, "ddr_ch2": 2, "ddr_ch1": 2, "ddr_ch5": 2, "ddr_ch0": 2, "ddr_ch4": 2, "sure": [2, 8, 26], "wish": 2, "y": [2, 3, 6, 7, 8, 14, 17, 21, 23, 24, 26, 28], "n": [2, 3, 8, 9, 12, 17, 18, 21, 26], "issu": [2, 14, 28], "sudo": [2, 14, 19, 22, 27, 28], "v": [2, 6, 7, 8, 12, 13, 17, 18, 21, 23, 24, 26, 28], "binari": [2, 7, 26], "p": [2, 8, 14, 26, 27], "path_to_flash_imag": 2, "comma": 2, "separ": 2, "keyword": [2, 10], "parallel": [2, 14, 17, 21, 27], "simultan": [2, 8, 21], "across": [2, 7, 17, 20, 21], "stop": [2, 8], "non": [2, 18, 21], "backup": 2, "region": [2, 14, 20, 24, 26], "appropri": [2, 7, 27], "proper": [2, 6, 7, 8, 9, 10, 13, 14], "subsystem": 2, "ma35_firmwar": [2, 14], "bin": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 22, 28], "zsp_firmware_packed_pq": 2, "package_timestamp": 2, "30_02": 2, "keyset": 2, "md5sum": 2, "a0c16839e94e1cba0a8c54e2e4f720ec": 2, "schema": 2, "eraseflash": 2, "19": [2, 20, 28], "29": 2, "38": 2, "48": 2, "67": [2, 26], "77": 2, "87": 2, "96": [2, 14, 28], "writeflash": 2, "pleas": 2, "wait": [2, 17, 22], "flash_progress": 2, "20": [2, 9, 12, 13, 20, 21, 24, 28], "30": [2, 8, 13, 21, 24], "50": [2, 13, 14, 24], "60": [2, 6, 7, 8, 10, 12, 13, 17, 22, 24, 26, 28], "70": 2, "90": [2, 8, 26], "bmc": [2, 22], "msp432": [2, 22], "31": [2, 11, 12, 13], "f92a87bb92749276d4ecd12dc4f9887b": 2, "18": 2, "28": 2, "37": 2, "46": [2, 22, 23], "56": 2, "65": 2, "75": 2, "84": [2, 21], "93": 2, "03": [2, 28], "19_01": 2, "90418d91f5ea7c37ef5b020ba41fc3e5": 2, "35": [2, 20, 22, 24], "01ef067b5aac9a82556b262b67b59a17": 2, "mandatori": [2, 6, 7, 8, 9, 10, 11, 12, 13, 17], "script": [2, 6, 7, 8, 9, 10, 13, 14, 17, 20, 23], "setup": [2, 20, 27, 28], "sh": [2, 6, 7, 8, 9, 10, 13, 14, 17, 20, 22, 28], "boot": [2, 14, 17, 20], "list_cmd": [2, 17], "cu": [2, 17], "scaler": [2, 8, 17, 18, 20], "device_0": [2, 17], "cu_2": [2, 17], "cuid": [2, 17], "cutyp": [2, 17], "ip": [2, 17, 18, 28], "kernel": [2, 12, 14, 17, 19, 22, 28], "kernelnam": [2, 17], "kernelalia": [2, 17], "encoder_type1_ama": [2, 17], "instancenam": [2, 17], "encoder_1": [2, 17], "cunam": [2, 17], "kernelplugin": [2, 17], "maxcapac": [2, 17], "497664000": [2, 17], "numchaninus": [2, 17], "usedload": [2, 17], "1000000": [2, 10, 17], "reservedload": [2, 17], "resrvusedload": [2, 17], "much": [2, 15, 17], "noth": [2, 17], "fulli": [2, 17, 20, 21], "actual": [2, 17, 21, 24], "snapshot": [2, 17], "1080p60": [2, 8, 17, 21], "singl": [2, 8, 14, 20, 21, 26, 28], "deviceid": [2, 17], "scaler_ama": [2, 6, 8, 17, 21, 26], "decoder_ama": [2, 17], "250000": [2, 17], "25": [2, 17, 24], "encoder_type2_ama": [2, 17], "lookahead_ama": [2, 17], "125000": [2, 17], "12": [2, 13, 14, 17, 20, 21], "ml_ama": [2, 8, 17, 26], "device_1": [2, 17], "Not": [2, 14, 17, 26, 27], "observ": [2, 14, 17, 22, 24], "quarter": [2, 17], "8th": [2, 17], "sinc": [2, 8, 17, 28], "2d_ama": [2, 8, 17, 26], "mani": [3, 7, 17, 21, 26, 27, 28], "adjust": [3, 7, 24, 26], "permiss": 3, "la": [3, 8, 21], "latenc": [3, 8, 13, 18, 20, 21, 26, 27], "mode": [3, 7, 13, 14, 18, 20, 24, 25, 27], "core": [3, 8, 14, 17, 18, 19, 20, 21, 26, 28], "slow": [3, 13, 17, 21, 24, 26, 27], "preset": [3, 13, 17, 20, 21, 26, 27, 28], "medium": [3, 13, 17, 21, 24, 26, 27], "fast": [3, 7, 13, 17, 20, 21, 24, 26, 27], "frame": [3, 6, 7, 8, 9, 10, 11, 13, 17, 18, 20, 23, 24, 26, 27], "cqp": [3, 23, 27], "cabr": [3, 20, 26, 27], "map": [3, 6, 8, 11, 17, 20, 21, 24, 26], "49": 3, "normal": [3, 8, 13, 21, 26], "low": [3, 13, 16, 18, 20, 21, 22, 24, 26, 27], "ull": [3, 7, 13, 18, 24, 26, 27], "11": [3, 6, 13, 20, 28], "720": [3, 8, 10, 13, 17], "ident": [3, 8, 10, 25, 26], "statement": 3, "appli": [3, 6, 8, 9, 26, 27], "qualiti": [4, 13, 16, 20, 22, 23, 26, 27], "filter": [4, 8, 13, 18, 20, 22, 25], "abr": [4, 13, 17, 24, 25, 26], "ladder": [4, 17, 24, 25, 26], "xma": [4, 6, 7, 8, 9, 10, 14, 19, 20, 21, 25, 27], "under": [5, 7, 8, 11, 12, 13, 17, 20, 26, 27], "construct": 5, "folder": [5, 6, 7, 8, 9, 10, 11, 13, 17, 26, 27], "illustr": [5, 7, 13, 17, 21, 24, 26, 27], "advanc": [5, 21], "shown": [6, 17], "hwdownload": [6, 8, 17, 26], "hwupload": [6, 7, 8, 24, 26], "split": [6, 8, 9, 18, 20, 21], "fp": [6, 8, 9, 10, 13, 20, 21, 26], "minim": [6, 9, 25], "descript": [6, 8, 9, 11, 12, 14, 25, 26, 27], "accumul": [6, 8, 9], "explain": [6, 7, 8, 9, 10, 17], "On": [6, 7, 8, 9, 10, 13, 28], "premis": [6, 7, 8, 9, 10, 13, 16, 28], "export": [6, 7, 8, 9, 10, 13, 17, 23, 25, 27], "import": [6, 7, 8, 9, 10, 13, 24], "variabl": [6, 7, 8, 9, 10, 13, 17, 25, 26, 27], "open": [6, 7, 8, 9, 10, 13, 26], "termin": [6, 7, 8, 9, 10, 13, 17, 25, 26], "correctli": [6, 7, 8, 9, 10, 13], "demonstr": [6, 7, 8, 15, 23], "flip": [6, 8], "hwaccel": [6, 7, 8, 17, 18, 21, 23, 24, 26], "hwaccel_devic": [6, 7, 8, 17, 21, 23, 26], "dev": [6, 7, 8, 10, 13, 14, 17, 18, 21, 23, 26, 27, 28], "h264_ama": [6, 7, 8, 13, 17, 21, 23, 26], "yuv420p": [6, 7, 8, 13, 17, 24, 26], "filter_complex": [6, 8, 17, 18, 21, 26], "transpos": 6, "dir": [6, 22], "a1": [6, 8], "b1": [6, 8], "f": [6, 7, 8, 11, 12, 17, 21, 23, 24, 26], "mp4": [6, 8, 9, 11, 12, 13, 17, 21, 23, 26], "90_flip": 6, "270_flip": 6, "path": [6, 7, 8, 10, 11, 12, 13, 17, 25, 26, 27, 28], "clip": [6, 7, 8, 24], "directori": [6, 10, 13], "y4m": 6, "vid": 6, "l": [6, 8, 12, 14, 22, 26], "lai": 6, "640": [6, 13, 17], "480": [6, 10, 13, 17], "in_w": 6, "800": [6, 23], "in_h": 6, "out_h": 6, "compos": [6, 12], "tile": [6, 26], "hide_bann": [6, 8], "input_1": 6, "input_2": 6, "input_3": 6, "input_4": 6, "out_r": [6, 8, 21, 26], "1920x1080": [6, 7, 8, 21, 24, 26], "22": [6, 13, 20], "33": [6, 23], "hstack": 6, "bot": 6, "vstack": 6, "15m": [6, 8], "vframe": [6, 17], "600": [6, 23, 24], "yuv420p10l": [6, 13, 17, 26], "graph": [6, 8, 26], "As": [6, 14, 17, 21, 22, 23, 24, 28], "show": [6, 9, 17, 21], "crop_10b": 6, "1m": [6, 8, 26], "442": [6, 23], "neither": 6, "accept": [6, 8, 9, 10, 20], "nor": 6, "progress": [6, 20, 21], "yadif": 6, "lavfi": [6, 7, 24], "testsrc": [6, 24], "durat": [6, 24, 26], "rawvideo": [6, 7, 8, 17, 24], "drawtext": 6, "hello": 6, "fontcolor": 6, "yellow": 6, "fontsiz": 6, "36": 6, "page": [7, 8, 10, 11, 12, 14, 26, 28], "behind": 7, "measur": [7, 17, 24, 25], "maxim": 7, "topic": 7, "There": [7, 8, 10, 26], "longstand": 7, "goal": 7, "quantit": 7, "watch": 7, "inspect": [7, 10], "individu": [7, 17, 27], "led": 7, "evolut": 7, "algorithm": 7, "solut": [7, 21], "common": [7, 25], "peak": 7, "signal": [7, 26], "nois": 7, "ratio": [7, 13, 18, 21], "structur": [7, 24, 26], "similar": [7, 21], "index": [7, 11, 12, 18], "multimethod": 7, "assess": 7, "fusion": 7, "opinion": 7, "mo": 7, "human": [7, 23], "visual": [7, 16, 20, 23, 24, 27], "screen": 7, "feedback": 7, "peopl": 7, "argu": 7, "best": [7, 21, 22, 23, 24, 26, 27], "although": 7, "consid": 7, "least": [7, 14, 28], "accur": 7, "jan": 7, "ozer": 7, "center": [7, 12], "post": 7, "hi": 7, "experiment": 7, "correl": [7, 21], "review": 7, "find": [7, 22, 28], "furthermor": [7, 21, 23], "due": [7, 8, 10, 17, 22, 26, 27], "industri": [7, 26], "like": [7, 8, 23, 26], "taught": 7, "test": [7, 20, 21, 28], "higher": [7, 17, 23, 24, 26, 27], "wors": 7, "ey": 7, "x264": [7, 21], "x265": [7, 21], "object": [7, 13, 21, 23, 24, 26, 27], "discuss": 7, "subject": [7, 24], "appeal": 7, "what": [7, 17], "happen": [7, 24], "scene": [7, 24], "why": 7, "highli": [7, 21], "recommend": [7, 8, 10, 20, 21, 22, 23, 24], "undergon": 7, "transform": 7, "past": 7, "univers": 7, "state": [7, 8, 14, 20, 21, 28], "fairli": 7, "compar": 7, "altern": [7, 20, 21, 22], "remain": 7, "long": [7, 17], "pre": [7, 9, 16, 21], "tutori": [7, 14, 16, 21, 26, 28], "cover": [7, 18], "chapter": [7, 26], "variou": [7, 8, 13, 15, 17, 19, 20, 22, 24, 26, 27], "effect": [7, 23, 24, 26, 27], "hevc_ama": [7, 8, 13, 17, 21, 24, 26], "av1_ama": [7, 8, 13, 23, 26], "permut": 7, "pix_fmt": [7, 8, 13, 17], "2000k": 7, "real": [7, 13, 16, 17, 20, 22], "guarante": [7, 15], "howev": [7, 20, 21, 23, 24], "better": [7, 23, 24], "achiev": [7, 8, 17, 21, 23, 24, 28], "licens": [7, 26], "reason": 7, "deliv": [7, 21], "comprehens": [7, 10, 26], "easiest": 7, "static": [7, 21, 24, 26], "john": 7, "van": 7, "sickl": 7, "among": [7, 21, 23, 24], "precompil": 7, "recompil": 7, "repositori": [7, 17, 19, 28], "instruct": [7, 8, 14, 17, 19, 20, 26, 27], "rebuild": 7, "sampl": [7, 11, 12, 15, 17, 20, 24, 26], "typic": [7, 17, 21, 24], "distort": [7, 24], "libvmaf": 7, "log_fmt": 7, "ms_ssim": 7, "log_path": 7, "log": [7, 8, 13, 17, 22, 23, 27], "model_path": 7, "TO": 7, "model": [7, 8, 13, 20, 24, 26, 28], "widthxheigth": 7, "vmaf_4k_v0": 7, "pkl": 7, "4k": [7, 21], "vmaf_float_v0": 7, "lower": [7, 20, 21, 22, 23, 24, 26, 27], "break": 8, "down": [8, 9, 21, 25], "varieti": [8, 13, 27], "read": [8, 10], "write": [8, 10, 25], "disk": [8, 10, 28], "chanc": [8, 10], "massiv": [8, 10], "notic": [8, 10, 13], "speed": [8, 10, 20, 21, 22, 24], "we": [8, 10, 25], "shm": [8, 10, 26], "ram": [8, 10, 14, 21, 28], "save": [8, 9, 11], "nv12": [8, 10, 13, 17, 26, 27], "tmp": [8, 9, 10, 11, 17, 25], "dec_out": 8, "move": [8, 10, 24], "twice": [8, 26], "convert": [8, 10], "buffer": [8, 10, 12, 13, 18, 22, 23, 24, 26, 27], "signifi": 8, "oppos": 8, "audio": [8, 26], "ac3": 8, "overwrit": 8, "prompt": 8, "yuv420": [8, 9], "5mbp": [8, 13], "5m": [8, 13, 24], "sn1_av1": 8, "maintain": 8, "1080p": [8, 12, 13, 17, 21, 26], "8m": 8, "megabit": 8, "8000k": 8, "8000000": 8, "enc_out": 8, "sn1_crf_hq": 8, "highest": 8, "sn1_crf_lq": 8, "lowest": [8, 23], "8mbp": 8, "written": [8, 13, 21], "h264_to_hevc": 8, "them": 8, "_scale": 8, "1280x720": 8, "720x480": 8, "360x240": 8, "c1": 8, "d1": 8, "scale_1080p": 8, "scale_720p": 8, "scale_480p": 8, "scale_240p": 8, "togeth": [8, 17, 27], "syntax": [8, 26], "widthxheight": [8, 26], "id": [8, 13, 18, 21, 25, 26, 27], "scale_": 8, "_": [8, 25], "6m": 8, "hevc_1080p60": 8, "2m": 8, "av1_720p30": 8, "h264_480p30": 8, "av1_240p30": 8, "format_resoult": 8, "locat": [8, 10, 11, 12, 13, 15, 17, 23, 25, 26, 27, 28], "implement": [8, 11, 12, 26], "hevc_1080p": [8, 10], "av1_720p": [8, 10], "h264_480p": [8, 10], "av1_240p": [8, 10], "ultra": [8, 13, 18, 20], "loglevel": 8, "10m": [8, 13], "trigger": 8, "4x4kp60": 8, "4kp6": 8, "out_3840x2160_0": 8, "out_3840x2160_1": 8, "explicitli": [8, 17, 18, 20, 21, 22, 23], "servic": [8, 14, 16, 21, 22, 28], "distribut": [8, 21], "seq": 8, "nostdin": [8, 23], "ama_transcoderx": 8, "out_t2_0_": 8, "out_av1_0_": 8, "ama_transcoderi": 8, "out_t2_1_": 8, "out_av1_1_": 8, "h264": [8, 9, 10, 11, 12, 13, 17, 26, 27], "64": [8, 20, 21, 26], "1080p30": [8, 20, 21], "256x256": 8, "1500": 8, "450": 8, "256": 8, "cascad": 8, "machin": [8, 20, 24, 28], "learn": [8, 14, 20], "landscap": [8, 21, 26], "720p": [8, 13, 21, 26], "instanc": [8, 14, 17, 23, 28], "8x720p60": 8, "processor": [8, 26], "180": [8, 26], "graphic": [8, 28], "degre": [8, 26], "w": [8, 13, 22, 26], "1280": [8, 10, 13, 17], "rgb": [8, 27], "bgra": [8, 27], "csc": [8, 26], "rgb2yuv": [8, 26], "rgba": [8, 27], "planar": 8, "rgbp": [8, 26, 27], "yuv422p": 8, "overlai": [8, 12], "core_id": [8, 26], "1000": 8, "layout": [8, 26], "2x2": [8, 9, 12], "def": 8, "ori": 8, "model_arg": [8, 26], "mlop": 8, "roi_scale_ama": [8, 26], "res1": 8, "300k": 8, "probabl": [8, 24, 26], "plain": 8, "ml0": 8, "ml1": 8, "ml2": 8, "ml3_1": 8, "ml3_2": 8, "ml3_3": 8, "strength": [8, 24, 26], "ml_l": 8, "ml_n": 8, "ml_h": 8, "output1": 8, "output2": 8, "output3": 8, "output4": 8, "outputx": 8, "s_org": 8, "s_ml": 8, "sa": 8, "sb": 8, "sd": 8, "ml_in": 8, "ml_out": 8, "ml_out_sa": 8, "ml_out_sb": 8, "ml_out_sc": 8, "ml_out_sd": 8, "roi_a": 8, "roi_b": 8, "roi_c": 8, "roi_d": 8, "invok": [8, 20], "infer": 8, "abil": [8, 24], "mlip": 8, "roi_map_typ": [8, 26], "rso": 8, "roi_overlay_ama": [8, 26], "transpar": 8, "rectangular": 8, "box": 8, "200k": 8, "ama_pipeline_script": [9, 10], "ama_download": [9, 10, 27], "ama_upload": [9, 10, 24, 27], "01_rotate_video": 9, "xil_rotate_": 9, "02_logo_overlai": 9, "500x100": 9, "right": [9, 12], "left": [9, 12, 26, 27], "corner": [9, 12], "xil_logo_overlai": 9, "03_crop_zoom": 9, "300x200": 9, "begin": 9, "xil_crop_zoom": 9, "04_multi_comp": 9, "4x": [9, 21], "equal": [9, 17, 25], "xil_multi_comp": 9, "By": [10, 17, 24, 27], "filesink": [10, 27], "plug": [10, 16, 21], "fakesink": [10, 24], "displai": [10, 21, 23], "avoid": [10, 18, 22], "incorrect": [10, 17], "265": [10, 11, 12, 13, 21], "h265pars": 10, "h264pars": 10, "breviti": 10, "purpos": [10, 15], "element": [10, 15, 19, 21, 22, 27], "properti": [10, 27], "repeat": [10, 28], "gst": [10, 24, 25], "ama_av1enc": [10, 27], "launch": [10, 24], "filesrc": 10, "parsebin": 10, "ama_h264dec": [10, 27], "capsfilt": [10, 24], "cap": [10, 22, 24, 26], "amamemori": 10, "unpack": [10, 14], "elementari": [10, 11, 12, 13], "byte": [10, 27], "nalu": 10, "rawvideopars": [10, 24], "1920": [10, 13, 17, 24], "1080": [10, 13, 17, 24], "i420": [10, 24, 27], "ama_h264enc": [10, 27], "unformat": 10, "timestamp": [10, 17, 18, 25], "eo": 10, "1200": [10, 24], "ama_scal": [10, 27], "src_0": 10, "ama_h265enc": [10, 24, 27], "6000000": 10, "queue": 10, "src_1": 10, "2000000": 10, "src_2": 10, "src_3": 10, "240": 10, "decoupl": 10, "sink": 10, "program": [11, 12, 13, 14, 16, 19, 21, 22, 24], "diagram": [11, 12], "ama_xabrladd": 11, "abrladd": 11, "ladder_output": 11, "feed": [11, 12, 14], "nal": 11, "short": 11, "devidx": 11, "na": [11, 12], "string": [11, 12, 13, 26], "codectyp": 11, "h265": [11, 12, 13, 24, 27], "forcekeyfram": 11, "k": 11, "keyfram": 11, "frequenc": [11, 18], "store": [11, 17], "enough": [11, 17], "720p60": [11, 21], "720p30": [11, 21], "480p30": [11, 21], "360p30": [11, 21], "160p30": [11, 21], "lookahead_en": 11, "exce": [12, 17], "grid": 12, "logo": 12, "lastli": 12, "stamp": 12, "ama_xcompositor": 12, "png": 12, "jpg": 12, "4294967295": [12, 27], "5000": [12, 24, 26], "horizont": [12, 21, 26], "fraction": [12, 17], "posit": [12, 26, 27], "vertic": [12, 21, 26], "2147483647": [12, 27], "2000": [12, 13], "composit": [12, 18, 23, 26], "video1": 12, "video2": 12, "video3": 12, "video4": 12, "soft": [12, 20], "nativ": 13, "built": [13, 26], "bitstream": [13, 20], "ma35_decoder_app": 13, "codec_opt": 13, "exit": [13, 26], "log_loc": 13, "consol": [13, 25, 28], "syslog": [13, 17, 25, 27], "log_fil": 13, "device_id": 13, "stream_loop": 13, "fmt": 13, "xv15": 13, "n12": 13, "out1": 13, "ma35_encoder_app": 13, "emerg": 13, "alert": 13, "critic": 13, "warn": [13, 14, 20, 22, 23, 25], "debug": [13, 25, 28], "suppli": [13, 20, 26], "5000000": [13, 27], "5000k": 13, "intraperiod": 13, "period": [13, 18, 23, 26, 27], "15": [13, 14, 20, 24, 28], "control_r": [13, 18, 23, 26], "bf": [13, 26], "force_idr": 13, "main10_intra": 13, "main10": [13, 21], "high10": 13, "high10_intra": 13, "13": 13, "21": 13, "41": 13, "42": 13, "52": 13, "61": 13, "63": 13, "tier": [13, 26, 27], "bufsiz": [13, 23, 26], "vbv": [13, 26], "strict": [13, 20, 23, 26], "relax": [13, 23, 26], "dynamic_gop": [13, 26], "dynam": [13, 18, 20, 26, 27], "gop": [13, 23, 26, 27], "latency_m": [13, 20, 26], "millisecond": [13, 26, 27], "60000": [13, 26, 27], "no_bll": [13, 20, 24, 26], "stat": [13, 24], "csv": 13, "statist": 13, "consult": [13, 26, 27], "out0": 13, "ma35_scaler_app": 13, "ingest": 13, "scaler_opt": 13, "reduc": [13, 21, 22, 23, 24, 26], "resourc": [13, 18, 20, 21, 26, 27], "480p": 13, "360p": 13, "240p": 13, "848": [13, 17], "out2": 13, "out3": 13, "288": [13, 17], "160": [13, 17, 20], "out4": 13, "ma35_transcoder_app": 13, "scaler_ma": 13, "num": [13, 17, 18, 24], "push": 13, "faster": [13, 21], "out_1_width": 13, "channel": [13, 21, 22, 24, 26, 27], "out_1_height": 13, "out_1_rat": 13, "out_2_width": 13, "out_2_height": 13, "out_2_rat": 13, "out_3_width": 13, "out_3_height": 13, "out_3_rat": 13, "out_4_width": 13, "out_4_height": 13, "out_4_rat": 13, "out_5_width": 13, "out_5_height": 13, "out_5_rat": 13, "out_6_width": 13, "out_6_height": 13, "out_6_rat": 13, "out_7_width": 13, "out_7_height": 13, "out_7_rat": 13, "out_8_width": 13, "out_8_height": 13, "out_8_rat": 13, "200kbp": 13, "350000000": 13, "automat": [13, 17, 21, 26], "enc_hevc_main": 13, "enc_hevc_main_intra": 13, "main_intr": 13, "enc_hevc_main_10": 13, "enc_hevc_main10_intra": 13, "enc_h264_baselin": 13, "enc_h264_main": 13, "enc_h264_high": 13, "enc_h264_high_10": 13, "enc_h264_high_10_intra": 13, "68": [13, 21], "aspect_ratio": 13, "aspect": [13, 18], "mpsoc": 13, "latency_mod": 13, "h264_av1_transcod": 13, "4000k": 13, "abr_ladder1": 13, "3000k": 13, "abr_ladder2": 13, "2500k": 13, "abr_ladder3": 13, "1250k": 13, "abr_ladder4": 13, "bio": [14, 20, 22], "sleep": [14, 20], "clock": [14, 20], "throttl": [14, 20], "etc": [14, 19, 20, 22, 23, 24, 26, 28], "4x4": [14, 22], "bifurc": [14, 22], "root": [14, 26, 28], "io": 14, "sr": [14, 28], "iov": [14, 28], "secur": 14, "4g": 14, "ac": [14, 22], "linux": [14, 17], "gcc": [14, 28], "iommu": [14, 22, 28], "grub": 14, "grub_cmdline_linux_default": 14, "quiet": 14, "splash": 14, "amd_iommu": 14, "pt": [14, 18], "intel_iommu": 14, "intel": [14, 28], "4gb": 14, "huge": [14, 28], "plu": [14, 28], "2048": [14, 28], "4192": 14, "echo": [14, 19, 28], "nr_hugepag": [14, 28], "sysctl": [14, 28], "conf": [14, 28], "sum": [14, 26], "12gb": [14, 21, 28], "2mb": 14, "36960": 14, "reboot": [14, 22, 28], "proc": 14, "cmdline": [14, 17], "boot_imag": 14, "vmlinuz": [14, 28], "mapper": 14, "vg00": 14, "rootlv": 14, "ro": 14, "meminfo": 14, "grep": [14, 28], "hugepages_tot": 14, "hugepages_fre": 14, "hugepages_rsvd": 14, "hugepages": 14, "kb": [14, 26], "establish": 14, "lspci": [14, 28], "vvvd": 14, "10ee": [14, 22, 28], "multimedia": [14, 27, 28], "512mb": 14, "ppa": [14, 19, 28], "ubuntu": [14, 20, 28], "apt": [14, 19, 20, 27, 28], "libhugetlbfs0": 14, "libboost": 14, "dpkg": 14, "awk": 14, "purg": 14, "mark": [14, 20], "unhold": 14, "hold": [14, 21], "desir": [14, 17, 22, 24, 26], "unknown": 14, "inst": 14, "trig": 14, "await": 14, "pend": 14, "err": 14, "reinst": 14, "uppercas": 14, "bad": 14, "architectur": 14, "ii": [14, 26], "2403291822": 14, "amd64": [14, 19], "supernova": 14, "modprob": [14, 22, 28], "ma35d_security_patch": 14, "cold": [14, 20], "systemctl": [14, 28], "poweroff": 14, "asic": 14, "skip": 14, "confirm": [14, 28], "older": 14, "bash": [14, 17], "3rd": 15, "parti": 15, "conveni": [15, 19], "made": [15, 16, 17, 21], "regard": 15, "product": [15, 20], "stack": [16, 21], "seamlessli": [16, 21], "live": [16, 21], "oem": [16, 21], "content": 16, "deliveri": [16, 21], "network": [16, 21, 23, 28], "cdn": [16, 21], "compil": [16, 17, 21, 26], "ins": [16, 21], "simpl": [16, 21, 26], "offer": [16, 24], "aggreg": [16, 17, 20, 21, 26], "4kp60": [16, 17, 20, 21, 26, 27], "notion": 17, "pool": [17, 18], "central": 17, "within": [17, 24, 26, 27], "vari": [17, 21], "equival": 17, "heterogen": 17, "strictli": 17, "adher": 17, "subscript": [17, 22], "rest": 17, "identifi": [17, 27], "techniqu": 17, "submit": [17, 27], "bound": [17, 27], "rapidli": [17, 27], "easi": [17, 27], "straightforward": [17, 27], "entir": [17, 26, 27], "method": [17, 19, 22], "input1": 17, "ama_transcoder1": 17, "input2": 17, "therebi": 17, "failur": 17, "estim": 17, "percentag": [17, 26], "precis": 17, "mechan": 17, "dispatch": 17, "reli": [17, 26, 28], "homogen": [17, 24, 26], "tail": 17, "var": 17, "jdf": 17, "well": [17, 20], "kei": [17, 19, 21, 24, 25], "pair": [17, 24], "numer": [17, 26, 27], "denomin": 17, "load_factor": 17, "headroom": 17, "num_job_slot": 17, "absenc": 17, "describe_job": 17, "example_2_core_encod": 17, "example_fast_preset": 17, "t10_transcode_multiscal": 17, "rendit": [17, 21], "request": 17, "request_id": 17, "testjob": 17, "den": 17, "1600": 17, "900": 17, "1440": 17, "1360": 17, "768": 17, "1024": 17, "960": 17, "540": [17, 21], "352": 17, "jobslot_reserv": 17, "kind": 17, "intend": 17, "xrm_jobreservation_timestamp_jdf": 17, "epoch": 17, "extens": 17, "uniqu": [17, 22], "xrm_reserve_id": 17, "retriev": 17, "dry_run": 17, "addition": [17, 25, 26], "safe": 17, "ill": [17, 24], "syntact": 17, "fail": [17, 20, 22], "jobdescriptionfil": 17, "523634": 17, "6111": 17, "5555": 17, "2777": 17, "dry": 17, "allot": 17, "xrm_jobreservation_79533431_t10_transcode_multiscal": 17, "aliv": 17, "press": 17, "enter": 17, "app": 17, "xrm_reserve_id_": 17, "xrm_reserve_id_0": 17, "xrm_reserve_id_1": 17, "distinct": [17, 28], "xrm_reserve_id_2": 17, "And": 17, "forth": [17, 20], "orchestr": 17, "github": [17, 26, 27], "develop": [17, 19], "tupl": [17, 26], "tjd": 17, "job_descript": 17, "jdf_path": 17, "ffmpeg_cmd": 17, "source1": 17, "job1": 17, "filter_hw_devic": 17, "dev0": 17, "300": [17, 24], "offici": 17, "arbitrari": 17, "source2": 17, "job2": 17, "compon": [17, 23, 26], "relat": [17, 25], "care": [17, 27], "enviro": 17, "xclbin": 17, "particularli": 17, "list_onedevice_cmd": 17, "requestid": 17, "usabl": 17, "load_xrm_plugins_cmd": 17, "loadxrmplugin": 17, "ok": [17, 28], "unload_xrm_plugins_cmd": 17, "unloadxrmplugin": 17, "notabl": 18, "asid": [18, 21], "convent": [18, 26], "vp9": [18, 20, 21, 26], "xlnx_hwdev": 18, "xvbm_convert": 18, "force_key_fram": 18, "lowlat": 18, "splitbuff_mod": 18, "entropy_buffers_count": 18, "entropi": 18, "out_": 18, "_width": 18, "rung": [18, 26], "_height": 18, "_rate": 18, "idx": 18, "delta": 18, "beta": 18, "tc": 18, "lscale": 18, "rc": 18, "pb": 18, "interpol": 18, "buf": 18, "splitbuff": 18, "unsplit": 18, "coef": 18, "coeffici": 18, "firmwar": [19, 20, 22], "robust": 19, "client": [19, 28], "remot": 19, "wget": 19, "qo": 19, "http": [19, 26, 27], "www": [19, 26], "com": [19, 27], "2018": 19, "master": [19, 21], "sign": 19, "asc": 19, "tee": [19, 28], "usr": [19, 26], "share": [19, 20, 26], "keyr": 19, "deb": 19, "arch": 19, "artifactori": 19, "debian": [19, 20], "lsb_releas": 19, "workaround": [20, 22], "telemetri": 20, "our": 20, "n5": [20, 22], "autom": 20, "balanc": 20, "collect": 20, "04": [20, 28], "kvm": 20, "face": [20, 24, 26], "text": [20, 24, 26], "fine": 20, "dual": 20, "4kp120": [20, 26], "approxim": 20, "hlg": 20, "effici": [20, 21, 27, 28], "toolchain": [20, 28], "convers": [20, 26, 27], "rotat": [20, 24, 26], "subsampl": [20, 26], "subcommand": 20, "mmio": 20, "prefer": 20, "pf": [20, 22, 28], "bar0": 20, "mb": [20, 26], "bar2": 20, "bar4": 20, "512": 20, "match": [20, 21], "server": [20, 26, 28], "scalabl": 20, "interlac": 20, "divis": 20, "transport": [20, 26], "mpeg": [20, 21], "t": [20, 28], "400": 20, "matrix": [20, 23], "8k": 20, "secondari": 20, "bu": [20, 28], "sbr": 20, "caus": 20, "hang": [20, 22], "restor": 20, "ama_av1dec": [20, 27], "ivf": [20, 22], "ivfpars": 20, "demux": 20, "crash": [20, 22], "hl": [20, 22], "playback": 20, "slower": [20, 22], "ffplai": [20, 22], "recent": [20, 22], "2n6": 20, "player": [20, 22, 27], "vlc": [20, 22], "v3": [20, 22], "17": [20, 22], "mux": [20, 22], "permit": [20, 22], "doesn": [20, 28], "1080x1920": 20, "complianc": 20, "checker": [20, 28], "downgrad": 20, "ga1": 20, "desktop": 20, "warm": 20, "attempt": [20, 22], "minut": [20, 22], "satellit": [20, 22], "boost": 20, "link": [20, 21, 27], "offload": 21, "intens": 21, "workload": 21, "popular": 21, "experi": 21, "suit": 21, "fed": 21, "turn": [21, 22, 24], "special": [21, 23], "vcu": 21, "ycbcr": 21, "iso": [21, 28], "itu": 21, "constrain": [21, 22, 26, 27], "aom": 21, "aomedia": 21, "128x128": 21, "3840x2160": [21, 26], "8x": 21, "driven": [21, 24], "flexibl": 21, "hdr": 21, "popul": 21, "volum": 21, "light": 21, "charaterist": 21, "st2094_10": 21, "dolbyvis": 21, "st2094_40": 21, "samsung": 21, "mdcv": 21, "cll": 21, "atc": 21, "sequenc": 21, "persist": 21, "constraint": [21, 23, 26], "ts_103572v010101p": 21, "pdf": 21, "whenev": 21, "a341s34": 21, "582r4": 21, "a341": 21, "amend": 21, "2094": 21, "smaller": 21, "pyramid": 21, "tap": 21, "stage": 21, "polyphas": 21, "phase": 21, "luma": 21, "chroma": 21, "2160p": 21, "larger": [21, 23, 24, 26], "intermediari": 21, "540p": 21, "initi": 21, "960x540": 21, "nomin": 21, "wherea": [21, 26], "har": 21, "few": 21, "definit": 21, "linearli": 21, "hyper": 21, "meet": [21, 26], "met": 21, "thing": 21, "4x1080p60": 21, "1x1080p240": 21, "latter": 21, "vod": 21, "asset": 21, "540p30": 21, "ftrt": 21, "explicit": [21, 26], "4kp75": [21, 26, 27], "4kp30": 21, "136": 21, "1440p60": 21, "1440p30": 21, "540p60": 21, "2160p60": 21, "240p30": 21, "144p30": 21, "2160p30": 21, "dmesg": 22, "could": 22, "date": 22, "isol": [22, 28], "bifur": 22, "xxxxx": 22, "devicealloc": 22, "pressur": 22, "obviou": 22, "resolv": 22, "plai": 22, "off": [22, 23, 24, 26, 27, 28], "videor": 22, "encount": 22, "bitdepth": 22, "30fp": 22, "26": 22, "60fp": 22, "greater": 22, "unavail": 22, "rmmod": 22, "reload": 22, "323": 22, "436842": 22, "05": 22, "hdma": 22, "hdma_link_rc2ep_xf": 22, "0x1": 22, "440802": 22, "rc2ep": 22, "element_cnt": 22, "link_table_pa": 22, "0x160000": 22, "443387": 22, "ctl": 22, "0x01": 22, "0x4": 22, "0x2": 22, "sl": 22, "0x97e00000": 22, "dh": 22, "0x0": 22, "dl": 22, "0x20831000": 22, "445538": 22, "0x06": 22, "rsv": 22, "llp_h": 22, "llp_l": 22, "447257": 22, "0x500": 22, "io_page_fault": 22, "mi": 22, "iommu_group": 22, "sort": 22, "34": 22, "appear": 22, "e2": 22, "pl": 22, "trade": 23, "delai": [23, 24], "understood": [23, 24], "come": [23, 24], "cost": 23, "enable_pipelin": [23, 26], "neg": 23, "optim": [23, 24, 26, 27], "compromis": 23, "let": 23, "unaccept": 23, "alwai": 23, "overal": 23, "transmiss": 23, "restrict": [23, 26], "variat": 23, "expens": [23, 24], "Such": [23, 24], "unifi": 23, "log_ama_config": 23, "destin": [23, 25], "max_siz": [23, 25], "1000mb": 23, "debug_file_lin": [23, 25], "debug_time_stamp": [23, 25], "debug_pid": [23, 25], "debug_thread": [23, 25], "perf_log": [23, 25], "log_ama_filter_perf": 23, "h264_1080p30": 23, "parse_log": 23, "py": 23, "0x564cbc07cc40": 23, "perfbeg": 23, "perfend": 23, "decsdk": 23, "dwlreservecmdbuf": 23, "rsv_osalsubmit": 23, "rsv_osalwait": 23, "dwldma_rc2ep": 23, "dwlenablecmdbuf": 23, "enc_0": 23, "431": 23, "0x560d0c196540": 23, "putfram": 23, "057": 23, "getpkt": 23, "009": 23, "postdecode_ch1": 23, "458": 23, "0x560d0c194980": 23, "end2end_ch1": 23, "168": 23, "958": 23, "985": 23, "primarili": 24, "pertain": 24, "concept": 24, "signific": 24, "analysi": 24, "score": 24, "necessarili": 24, "limit": [24, 26, 27], "spent": 24, "dure": [24, 28], "motion": 24, "vector": 24, "search": 24, "rdoq": 24, "term": 24, "bd": 24, "hierarch": 24, "unidirect": 24, "anchor": 24, "visibl": 24, "conferenc": 24, "occupi": 24, "area": [24, 26, 27], "5x5": 24, "amen": 24, "sensit": 24, "reflect": 24, "lear": 24, "therein": 24, "flavor": 24, "stai": 24, "emploi": 24, "independ": 24, "concern": 24, "runtim": 24, "segment": 24, "min": [24, 27], "int_max": [24, 26], "consider": 24, "game": 24, "camera": 24, "pan": 24, "talk": 24, "head": 24, "exact": 24, "config": [24, 27], "initil": 24, "compli": 24, "unexpect": 24, "dynamic_params_fil": [24, 26], "framenumbern1": 24, "key1": 24, "value1": 24, "framenumbern2": 24, "key2": 24, "value2": 24, "key3": 24, "value3": 24, "numb": 24, "minbrkbp": 24, "maxbrkbp": 24, "brkbp": 24, "taq": 24, "taqgain": 24, "saq": 24, "saqgain": 24, "qpoffseti": 24, "qpoffsetb": 24, "6000": 24, "1800": 24, "2400": 24, "10000": 24, "fakesrc": 24, "sizetyp": 24, "sizemax": 24, "4147200": 24, "4000": 24, "param1": 24, "ul": 25, "aim": 25, "three": 25, "environment": 25, "global": [25, 26], "narrow": 25, "release_preset": 25, "debug_preset": 25, "async": 25, "10mb": 25, "log_ama_": 25, "pid": 25, "localhost": 25, "facil": 25, "local0": 25, "shortcut": 25, "debug_file_nam": 25, "1gb": 25, "asynchron": 25, "fatal": 25, "trace": 25, "accel": 25, "vpi": 25, "gen": 25, "log_ama": 25, "100mb": 25, "want": [25, 26], "log_ama_perf": 25, "wide": [26, 27], "encapsul": 26, "extract": 26, "n4": 26, "scope": [26, 27], "exhaust": [26, 27], "onlin": [26, 27], "org": [26, 27], "html": 26, "howto": 26, "infil": 26, "1000k": 26, "uri": 26, "vp9_ama": 26, "hz": 26, "transact": [26, 27], "roman": 26, "p010le": 26, "packed10": 26, "max_bitr": 26, "5e": 26, "unspecifi": 26, "uint32_max": 26, "400m": 26, "unless": 26, "impos": 26, "control_mod": 26, "47": [26, 27], "treat": 26, "72": 26, "relative_load": 26, "const_qp": 26, "empti": [26, 27, 28], "176x144": 26, "144x176": 26, "720x720": 26, "complex": [26, 27], "wxh": 26, "chain": 26, "coordin": 26, "worth": [26, 27], "iii": 26, "iv": 26, "shortest": 26, "true": [26, 27], "fals": [26, 27], "7680": 26, "nxm": 26, "270": 26, "yuv2rgb": 26, "enforc": 26, "against": 26, "Its": 26, "nb_input": 26, "cutoff": 26, "100000": 26, "5670": 26, "shut": 26, "That": 26, "spend": 26, "block": 26, "dqp": 26, "dqp_and_roi": 26, "static_map_fil": 26, "ceil": 26, "divid": 26, "boundari": 26, "shade": 26, "rectangl": 26, "skip_fram": 26, "toggl": 26, "highlight_threshold": 26, "zip": [26, 27], "ma35d_sdk_v1": [26, 27], "2_ffmpeg": 26, "unzip": [26, 27], "ma35_ffmpeg": 26, "fork": 26, "wiki": 26, "libhugetlbf": 26, "nasm": 26, "yasm": 26, "navig": 26, "alsa": 26, "libxcb": 26, "xfix": 26, "shape": 26, "xlib": 26, "libmfx": 26, "vaapi": 26, "vulkan": 26, "prefix": 26, "pwd": 26, "strip": 26, "vpe": 26, "libxrm": 26, "lib": [26, 27, 28], "lvpi": 26, "lroi_scal": 26, "llog_ama": 26, "lxrm": 26, "lxrm_interfac": 26, "lhugetlbf": 26, "lpthread": 26, "lstdc": 26, "lm": 26, "ldl": 26, "lrt": 26, "cflag": 26, "dsupport_os": 26, "ldflag": 26, "wl": 26, "rpath": 26, "libavutil": 26, "libavfilt": 26, "libavcodec": 26, "libavformat": 26, "libavdevic": 26, "libswscal": 26, "libswresampl": 26, "libx264": 26, "gnu": 26, "81": 26, "workflow": 27, "editor": 27, "broadcast": 27, "freedesktop": 27, "ama_h265dec": 27, "ama_hevcdec": 27, "obu": 27, "One": 27, "nv12_4l4": 27, "nv12_10le32": 27, "p010_10e": 27, "i420_10l": 27, "nv12_10le_4l4": 27, "boolean": 27, "p010_10le": 27, "consecut": 27, "distanc": 27, "interv": 27, "analyz": 27, "account": 27, "35000000000": 27, "fquantiz": 27, "temporal": 27, "vma": 27, "bll": 27, "resiz": 27, "i420_10b": 27, "argb": 27, "abgr": 27, "bgr": 27, "unnecessari": 27, "upstream": 27, "larg": 27, "insuffici": 27, "2_gstreamer": 27, "ma35_gstream": 27, "prerequisit": 27, "ninja": 27, "flex": 27, "bison": 27, "python3": 27, "pip": 27, "pkg": 27, "libjansson": 27, "uuid": 27, "snap": 27, "classic": 27, "pip3": 27, "meson": 27, "git": 27, "checkout": 27, "f6e672f27fcac06af58d7ac995551893d36944c": 27, "cp": 27, "ama_gstream": 27, "ln": 27, "subproject": 27, "c_include_path": 27, "library_path": 27, "technologi": 28, "qemu": 28, "libvirt": 28, "bridg": 28, "virt": 28, "lscpu": 28, "sbin": 28, "dbdf": 28, "corpor": 28, "5070": 28, "lsmod": 28, "831488": 28, "sriov_numvf": 28, "5071": 28, "physic": 28, "creation": 28, "libvirtd": 28, "systemd": 28, "wed": 28, "2023": 28, "06": 28, "07": 28, "09": 28, "44": 28, "pdt": 28, "7h": 28, "ago": 28, "focal": 28, "fossa": 28, "instanti": 28, "12288": 28, "vcpu": 28, "q35": 28, "qcow2": 28, "variant": 28, "ubuntu20": 28, "pty": 28, "target_typ": 28, "serial": 28, "arg": 28, "ttys0": 28, "casper": 28, "initrd": 28, "apic": 28, "ioapic": 28, "intremap": 28, "eim": 28, "caching_mod": 28, "memoryback": 28, "hugepag": 28, "nosharepag": 28, "lock": 28, "hostdev": 28, "xx": 28, "vfio": 28, "storag": 28, "virsh": 28, "edit": 28, "kib": 28, "acpi": 28, "vmport": 28, "rng": 28, "ssh": 28, "connect": 28, "openssh": 28, "address": 28, "net": 28, "dhcp": 28, "leas": 28, "6gb": 28, "3072": 28, "3168": 28, "dkm": 28, "essenti": 28}, "objects": {"": [[1, 0, 1, "c.XmaDataBuffer", "XmaDataBuffer"], [1, 0, 1, "c.XmaDecoderProperties", "XmaDecoderProperties"], [1, 0, 1, "c.XmaDynamicEncParams", "XmaDynamicEncParams"], [1, 0, 1, "c.XmaDynamicEncParams_v2", "XmaDynamicEncParams_v2"], [1, 0, 1, "c.XmaEncoderProperties", "XmaEncoderProperties"], [1, 0, 1, "c.XmaFilterPortProperties", "XmaFilterPortProperties"], [1, 0, 1, "c.XmaFilterProperties", "XmaFilterProperties"], [1, 0, 1, "c.XmaFrame", "XmaFrame"], [1, 0, 1, "c.XmaFrameProperties", "XmaFrameProperties"], [1, 0, 1, "c.XmaParameter", "XmaParameter"], [1, 0, 1, "c.XmaScalerInOutProperties", "XmaScalerInOutProperties"], [1, 0, 1, "c.XmaScalerProperties", "XmaScalerProperties"], [1, 1, 1, "c.xma_data_buffer_alloc", "xma_data_buffer_alloc"], [1, 1, 1, "c.xma_data_buffer_free", "xma_data_buffer_free"], [1, 1, 1, "c.xma_data_from_buffer_clone", "xma_data_from_buffer_clone"], [1, 1, 1, "c.xma_dec_session_create", "xma_dec_session_create"], [1, 1, 1, "c.xma_dec_session_destroy", "xma_dec_session_destroy"], [1, 1, 1, "c.xma_dec_session_get_properties", "xma_dec_session_get_properties"], [1, 1, 1, "c.xma_dec_session_recv_frame", "xma_dec_session_recv_frame"], [1, 1, 1, "c.xma_dec_session_send_data", "xma_dec_session_send_data"], [1, 1, 1, "c.xma_dec_session_set_log", "xma_dec_session_set_log"], [1, 1, 1, "c.xma_enc_session_create", "xma_enc_session_create"], [1, 1, 1, "c.xma_enc_session_destroy", "xma_enc_session_destroy"], [1, 1, 1, "c.xma_enc_session_recv_data", "xma_enc_session_recv_data"], [1, 1, 1, "c.xma_enc_session_send_frame", "xma_enc_session_send_frame"], [1, 1, 1, "c.xma_enc_session_set_log", "xma_enc_session_set_log"], [1, 1, 1, "c.xma_filter_session_create", "xma_filter_session_create"], [1, 1, 1, "c.xma_filter_session_destroy", "xma_filter_session_destroy"], [1, 1, 1, "c.xma_filter_session_recv_frame", "xma_filter_session_recv_frame"], [1, 1, 1, "c.xma_filter_session_send_frame", "xma_filter_session_send_frame"], [1, 1, 1, "c.xma_filter_session_set_log", "xma_filter_session_set_log"], [1, 1, 1, "c.xma_frame_add_side_data", "xma_frame_add_side_data"], [1, 1, 1, "c.xma_frame_alloc", "xma_frame_alloc"], [1, 1, 1, "c.xma_frame_clear_all_side_data", "xma_frame_clear_all_side_data"], [1, 1, 1, "c.xma_frame_clone", "xma_frame_clone"], [1, 1, 1, "c.xma_frame_dec_ref", "xma_frame_dec_ref"], [1, 1, 1, "c.xma_frame_free", "xma_frame_free"], [1, 1, 1, "c.xma_frame_from_buffers_clone", "xma_frame_from_buffers_clone"], [1, 1, 1, "c.xma_frame_get_first_side_data", "xma_frame_get_first_side_data"], [1, 1, 1, "c.xma_frame_get_next_side_data", "xma_frame_get_next_side_data"], [1, 1, 1, "c.xma_frame_get_next_side_data_of_type", "xma_frame_get_next_side_data_of_type"], [1, 1, 1, "c.xma_frame_get_plane_height", "xma_frame_get_plane_height"], [1, 1, 1, "c.xma_frame_get_plane_size", "xma_frame_get_plane_size"], [1, 1, 1, "c.xma_frame_get_plane_stride", "xma_frame_get_plane_stride"], [1, 1, 1, "c.xma_frame_get_side_data", "xma_frame_get_side_data"], [1, 1, 1, "c.xma_frame_inc_ref", "xma_frame_inc_ref"], [1, 1, 1, "c.xma_frame_planes_get", "xma_frame_planes_get"], [1, 1, 1, "c.xma_frame_remove_side_data", "xma_frame_remove_side_data"], [1, 1, 1, "c.xma_frame_remove_side_data_type", "xma_frame_remove_side_data_type"], [1, 1, 1, "c.xma_initialize", "xma_initialize"], [1, 1, 1, "c.xma_log_init", "xma_log_init"], [1, 1, 1, "c.xma_log_release", "xma_log_release"], [1, 1, 1, "c.xma_logmsg", "xma_logmsg"], [1, 1, 1, "c.xma_release", "xma_release"], [1, 1, 1, "c.xma_scaler_session_create", "xma_scaler_session_create"], [1, 1, 1, "c.xma_scaler_session_destroy", "xma_scaler_session_destroy"], [1, 1, 1, "c.xma_scaler_session_recv_frame_list", "xma_scaler_session_recv_frame_list"], [1, 1, 1, "c.xma_scaler_session_send_frame", "xma_scaler_session_send_frame"], [1, 1, 1, "c.xma_side_data_alloc", "xma_side_data_alloc"], [1, 1, 1, "c.xma_side_data_dec_ref", "xma_side_data_dec_ref"], [1, 1, 1, "c.xma_side_data_free", "xma_side_data_free"], [1, 1, 1, "c.xma_side_data_get_metadata", "xma_side_data_get_metadata"], [1, 1, 1, "c.xma_side_data_get_refcount", "xma_side_data_get_refcount"], [1, 1, 1, "c.xma_side_data_inc_ref", "xma_side_data_inc_ref"], [1, 1, 1, "c.xma_side_data_read", "xma_side_data_read"], [1, 1, 1, "c.xma_side_data_set_metadata", "xma_side_data_set_metadata"], [1, 1, 1, "c.xma_side_data_write", "xma_side_data_write"], [1, 1, 1, "c.xrm_dec_release", "xrm_dec_release"], [1, 1, 1, "c.xrm_dec_reserve", "xrm_dec_reserve"], [1, 1, 1, "c.xrm_enc_release", "xrm_enc_release"], [1, 1, 1, "c.xrm_enc_reserve", "xrm_enc_reserve"], [1, 1, 1, "c.xrm_scale_release", "xrm_scale_release"], [1, 1, 1, "c.xrm_scale_reserve", "xrm_scale_reserve"], [11, 3, 1, "cmdoption-codectype", "--codectype"], [11, 3, 1, "cmdoption-devidx", "--devidx"], [11, 3, 1, "cmdoption-file", "--file"], [11, 3, 1, "cmdoption-forcekeyframe", "--forcekeyframe"], [11, 3, 1, "cmdoption-json", "--json"], [26, 3, 1, "cmdoption-b-v", "-b:v"], [26, 3, 1, "cmdoption-bf", "-bf"], [26, 3, 1, "cmdoption-bufsize", "-bufsize"], [11, 3, 1, "cmdoption-c", "-c"], [26, 3, 1, "cmdoption-c-v", "-c:v"], [26, 3, 1, "cmdoption-control_rate", "-control_rate"], [26, 3, 1, "cmdoption-cores", "-cores"], [26, 3, 1, "cmdoption-crf", "-crf"], [26, 3, 1, "cmdoption-dynamic_gop", "-dynamic_gop"], [26, 3, 1, "cmdoption-dynamic_params_file", "-dynamic_params_file"], [11, 3, 1, "cmdoption-f", "-f"], [26, 3, 1, "cmdoption-filter_complex", "-filter_complex"], [26, 3, 1, "cmdoption-forced_idr", "-forced_idr"], [26, 3, 1, "cmdoption-g", "-g"], [26, 3, 1, "cmdoption-hwaccel", "-hwaccel"], [11, 3, 1, "cmdoption-i", "-i"], [11, 3, 1, "cmdoption-j", "-j"], [11, 3, 1, "cmdoption-k", "-k"], [26, 3, 1, "cmdoption-latency_ms", "-latency_ms"], [26, 3, 1, "cmdoption-level", "-level"], [26, 3, 1, "cmdoption-lookahead_depth", "-lookahead_depth"], [26, 3, 1, "cmdoption-low_latency", "-low_latency"], [26, 3, 1, "cmdoption-max_bitrate", "-max_bitrate"], [26, 3, 1, "cmdoption-max_qp", "-max_qp"], [26, 3, 1, "cmdoption-min_qp", "-min_qp"], [26, 3, 1, "cmdoption-no_bll", "-no_bll"], [26, 3, 1, "cmdoption-out_fmt", "-out_fmt"], [26, 3, 1, "cmdoption-preset", "-preset"], [26, 3, 1, "cmdoption-profile", "-profile"], [26, 3, 1, "cmdoption-qp", "-qp"], [26, 3, 1, "cmdoption-qp_b_offset", "-qp_b_offset"], [26, 3, 1, "cmdoption-qp_i_offset", "-qp_i_offset"], [26, 3, 1, "cmdoption-qp_mode", "-qp_mode"], [26, 3, 1, "cmdoption-r", "-r"], [26, 3, 1, "cmdoption-s", "-s"], [26, 3, 1, "cmdoption-slice", "-slice"], [26, 3, 1, "cmdoption-spatial_aq", "-spatial_aq"], [26, 3, 1, "cmdoption-spatial_aq_gain", "-spatial_aq_gain"], [26, 3, 1, "cmdoption-temporal_aq", "-temporal_aq"], [26, 3, 1, "cmdoption-temporal_aq_gain", "-temporal_aq_gain"], [26, 3, 1, "cmdoption-tier", "-tier"], [26, 3, 1, "cmdoption-tune_metrics", "-tune_metrics"], [26, 3, 1, "cmdoption-type", "-type"], [26, 3, 1, "cmdoption-vf", "-vf"], [26, 3, 1, "cmdoption-arg-2d_ama", "2d_ama"], [27, 3, 1, "cmdoption-arg-b-frames", "b-frames"], [27, 3, 1, "cmdoption-arg-bitrate", "bitrate"], [26, 3, 1, "cmdoption-arg-core_id", "core_id"], [27, 3, 1, "cmdoption-arg-crf", "crf"], [26, 3, 1, "cmdoption-arg-crop", "crop"], [27, 3, 1, "cmdoption-arg-crop-height", "crop-height"], [27, 3, 1, "cmdoption-arg-crop-left", "crop-left"], [27, 3, 1, "cmdoption-arg-crop-top", "crop-top"], [27, 3, 1, "cmdoption-arg-crop-width", "crop-width"], [26, 3, 1, "cmdoption-arg-cutoff", "cutoff"], [27, 3, 1, "cmdoption-arg-device", "device"], [27, 3, 1, "cmdoption-arg-device-type", "device-type"], [27, 3, 1, "cmdoption-arg-dynamic-gop", "dynamic-gop"], [27, 3, 1, "cmdoption-arg-enable-pipeline", "enable-pipeline"], [26, 3, 1, "cmdoption-arg-enable_pipeline", "enable_pipeline"], [27, 3, 1, "cmdoption-arg-encoding-params-file", "encoding-params-file"], [27, 3, 1, "cmdoption-arg-forced-idr", "forced-idr"], [27, 3, 1, "cmdoption-arg-gop-length", "gop-length"], [26, 3, 1, "cmdoption-arg-h", "h"], [26, 3, 1, "cmdoption-arg-highlight_threshold", "highlight_threshold"], [27, 3, 1, "cmdoption-arg-idr-interval", "idr-interval"], [26, 3, 1, "cmdoption-arg-inputs", "inputs"], [27, 3, 1, "cmdoption-arg-latency-logging", "latency-logging"], [27, 3, 1, "cmdoption-arg-latency-ms", "latency-ms"], [27, 3, 1, "cmdoption-arg-lookahead-depth", "lookahead-depth"], [27, 3, 1, "cmdoption-arg-low-latency", "low-latency"], [27, 3, 1, "cmdoption-arg-max-bitrate", "max-bitrate"], [27, 3, 1, "cmdoption-arg-max-qp", "max-qp"], [27, 3, 1, "cmdoption-arg-min-qp", "min-qp"], [26, 3, 1, "cmdoption-arg-ml_ama", "ml_ama"], [26, 3, 1, "cmdoption-arg-model", "model"], [26, 3, 1, "cmdoption-arg-model_args", "model_args"], [26, 3, 1, "cmdoption-arg-nb_inputs", "nb_inputs"], [27, 3, 1, "cmdoption-arg-no-bll", "no-bll"], [26, 3, 1, "cmdoption-arg-out_res", "out_res"], [26, 3, 1, "cmdoption-arg-outputs", "outputs"], [27, 3, 1, "cmdoption-arg-preset", "preset"], [26, 3, 1, "cmdoption-arg-processor", "processor"], [27, 3, 1, "cmdoption-arg-qp", "qp"], [27, 3, 1, "cmdoption-arg-qp-b-offset", "qp-b-offset"], [27, 3, 1, "cmdoption-arg-qp-i-offset", "qp-i-offset"], [27, 3, 1, "cmdoption-arg-qp-mode", "qp-mode"], [27, 3, 1, "cmdoption-arg-rate-control", "rate-control"], [26, 3, 1, "cmdoption-arg-roi_map_type", "roi_map_type"], [26, 3, 1, "cmdoption-arg-roi_overlay_ama", "roi_overlay_ama"], [26, 3, 1, "cmdoption-arg-roi_scale_ama", "roi_scale_ama"], [26, 3, 1, "cmdoption-arg-scaler_ama", "scaler_ama"], [26, 3, 1, "cmdoption-arg-shortest", "shortest"], [26, 3, 1, "cmdoption-arg-skip_frames", "skip_frames"], [27, 3, 1, "cmdoption-arg-slice", "slice"], [27, 3, 1, "cmdoption-arg-spatial-aq", "spatial-aq"], [27, 3, 1, "cmdoption-arg-spatial-aq-gain", "spatial-aq-gain"], [26, 3, 1, "cmdoption-arg-static_map_file", "static_map_file"], [26, 3, 1, "cmdoption-arg-strength", "strength"], [27, 3, 1, "cmdoption-arg-temporal-aq-gain", "temporal-aq-gain"], [27, 3, 1, "cmdoption-arg-temporall-aq", "temporall-aq"], [27, 3, 1, "cmdoption-arg-tier", "tier"], [27, 3, 1, "cmdoption-arg-tune-metrics", "tune-metrics"], [26, 3, 1, "cmdoption-arg-w", "w"]], "xma_data_buffer_alloc": [[1, 2, 1, "c.xma_data_buffer_alloc", "dummy"], [1, 2, 1, "c.xma_data_buffer_alloc", "handle"], [1, 2, 1, "c.xma_data_buffer_alloc", "size"]], "xma_data_buffer_free": [[1, 2, 1, "c.xma_data_buffer_free", "data"]], "xma_data_from_buffer_clone": [[1, 2, 1, "c.xma_data_from_buffer_clone", "data"], [1, 2, 1, "c.xma_data_from_buffer_clone", "free_callback"], [1, 2, 1, "c.xma_data_from_buffer_clone", "handle"], [1, 2, 1, "c.xma_data_from_buffer_clone", "opaque"], [1, 2, 1, "c.xma_data_from_buffer_clone", "size"]], "xma_dec_session_create": [[1, 2, 1, "c.xma_dec_session_create", "dec_props"]], "xma_dec_session_destroy": [[1, 2, 1, "c.xma_dec_session_destroy", "session"]], "xma_dec_session_get_properties": [[1, 2, 1, "c.xma_dec_session_get_properties", "dec_session"], [1, 2, 1, "c.xma_dec_session_get_properties", "fprops"]], "xma_dec_session_recv_frame": [[1, 2, 1, "c.xma_dec_session_recv_frame", "frame"], [1, 2, 1, "c.xma_dec_session_recv_frame", "session"]], "xma_dec_session_send_data": [[1, 2, 1, "c.xma_dec_session_send_data", "data"], [1, 2, 1, "c.xma_dec_session_send_data", "data_used"], [1, 2, 1, "c.xma_dec_session_send_data", "session"]], "xma_dec_session_set_log": [[1, 2, 1, "c.xma_dec_session_set_log", "handle"], [1, 2, 1, "c.xma_dec_session_set_log", "session"]], "xma_enc_session_create": [[1, 2, 1, "c.xma_enc_session_create", "enc_props"]], "xma_enc_session_destroy": [[1, 2, 1, "c.xma_enc_session_destroy", "session"]], "xma_enc_session_recv_data": [[1, 2, 1, "c.xma_enc_session_recv_data", "data"], [1, 2, 1, "c.xma_enc_session_recv_data", "data_size"], [1, 2, 1, "c.xma_enc_session_recv_data", "session"]], "xma_enc_session_send_frame": [[1, 2, 1, "c.xma_enc_session_send_frame", "frame"], [1, 2, 1, "c.xma_enc_session_send_frame", "session"]], "xma_enc_session_set_log": [[1, 2, 1, "c.xma_enc_session_set_log", "handle"], [1, 2, 1, "c.xma_enc_session_set_log", "session"]], "xma_filter_session_create": [[1, 2, 1, "c.xma_filter_session_create", "props"]], "xma_filter_session_destroy": [[1, 2, 1, "c.xma_filter_session_destroy", "session"]], "xma_filter_session_recv_frame": [[1, 2, 1, "c.xma_filter_session_recv_frame", "frame"], [1, 2, 1, "c.xma_filter_session_recv_frame", "session"]], "xma_filter_session_send_frame": [[1, 2, 1, "c.xma_filter_session_send_frame", "frame"], [1, 2, 1, "c.xma_filter_session_send_frame", "session"]], "xma_filter_session_set_log": [[1, 2, 1, "c.xma_filter_session_set_log", "handle"], [1, 2, 1, "c.xma_filter_session_set_log", "session"]], "xma_frame_add_side_data": [[1, 2, 1, "c.xma_frame_add_side_data", "frame"], [1, 2, 1, "c.xma_frame_add_side_data", "side_data"]], "xma_frame_alloc": [[1, 2, 1, "c.xma_frame_alloc", "dummy"], [1, 2, 1, "c.xma_frame_alloc", "frame_props"], [1, 2, 1, "c.xma_frame_alloc", "handle"]], "xma_frame_clear_all_side_data": [[1, 2, 1, "c.xma_frame_clear_all_side_data", "frame"]], "xma_frame_clone": [[1, 2, 1, "c.xma_frame_clone", "handle"], [1, 2, 1, "c.xma_frame_clone", "xma_frame"]], "xma_frame_dec_ref": [[1, 2, 1, "c.xma_frame_dec_ref", "frame"]], "xma_frame_free": [[1, 2, 1, "c.xma_frame_free", "frame"]], "xma_frame_from_buffers_clone": [[1, 2, 1, "c.xma_frame_from_buffers_clone", "frame_data"], [1, 2, 1, "c.xma_frame_from_buffers_clone", "frame_props"], [1, 2, 1, "c.xma_frame_from_buffers_clone", "free_callback"], [1, 2, 1, "c.xma_frame_from_buffers_clone", "handle"], [1, 2, 1, "c.xma_frame_from_buffers_clone", "opaque"]], "xma_frame_get_first_side_data": [[1, 2, 1, "c.xma_frame_get_first_side_data", "frame"]], "xma_frame_get_next_side_data": [[1, 2, 1, "c.xma_frame_get_next_side_data", "frame"], [1, 2, 1, "c.xma_frame_get_next_side_data", "side_data"]], "xma_frame_get_next_side_data_of_type": [[1, 2, 1, "c.xma_frame_get_next_side_data_of_type", "frame"], [1, 2, 1, "c.xma_frame_get_next_side_data_of_type", "side_data"]], "xma_frame_get_plane_height": [[1, 2, 1, "c.xma_frame_get_plane_height", "frame_props"], [1, 2, 1, "c.xma_frame_get_plane_height", "handle"], [1, 2, 1, "c.xma_frame_get_plane_height", "plane"]], "xma_frame_get_plane_size": [[1, 2, 1, "c.xma_frame_get_plane_size", "frame_props"], [1, 2, 1, "c.xma_frame_get_plane_size", "handle"], [1, 2, 1, "c.xma_frame_get_plane_size", "plane"]], "xma_frame_get_plane_stride": [[1, 2, 1, "c.xma_frame_get_plane_stride", "frame_props"], [1, 2, 1, "c.xma_frame_get_plane_stride", "handle"], [1, 2, 1, "c.xma_frame_get_plane_stride", "plane"]], "xma_frame_get_side_data": [[1, 2, 1, "c.xma_frame_get_side_data", "frame"], [1, 2, 1, "c.xma_frame_get_side_data", "type"]], "xma_frame_inc_ref": [[1, 2, 1, "c.xma_frame_inc_ref", "frame"]], "xma_frame_planes_get": [[1, 2, 1, "c.xma_frame_planes_get", "frame_props"], [1, 2, 1, "c.xma_frame_planes_get", "handle"]], "xma_frame_remove_side_data": [[1, 2, 1, "c.xma_frame_remove_side_data", "frame"], [1, 2, 1, "c.xma_frame_remove_side_data", "side_data"]], "xma_frame_remove_side_data_type": [[1, 2, 1, "c.xma_frame_remove_side_data_type", "frame"], [1, 2, 1, "c.xma_frame_remove_side_data_type", "type"]], "xma_initialize": [[1, 2, 1, "c.xma_initialize", "handle"], [1, 2, 1, "c.xma_initialize", "init_params"], [1, 2, 1, "c.xma_initialize", "log"]], "xma_log_init": [[1, 2, 1, "c.xma_log_init", "handle"], [1, 2, 1, "c.xma_log_init", "log_level"], [1, 2, 1, "c.xma_log_init", "log_type"]], "xma_log_release": [[1, 2, 1, "c.xma_log_release", "handle"]], "xma_logmsg": [[1, 2, 1, "c.xma_logmsg", "handle"], [1, 2, 1, "c.xma_logmsg", "level"], [1, 2, 1, "c.xma_logmsg", "msg"], [1, 2, 1, "c.xma_logmsg", "name"]], "xma_release": [[1, 2, 1, "c.xma_release", "handle"]], "xma_scaler_session_create": [[1, 2, 1, "c.xma_scaler_session_create", "props"]], "xma_scaler_session_destroy": [[1, 2, 1, "c.xma_scaler_session_destroy", "session"]], "xma_scaler_session_recv_frame_list": [[1, 2, 1, "c.xma_scaler_session_recv_frame_list", "frame_list"], [1, 2, 1, "c.xma_scaler_session_recv_frame_list", "session"]], "xma_scaler_session_send_frame": [[1, 2, 1, "c.xma_scaler_session_send_frame", "frame"], [1, 2, 1, "c.xma_scaler_session_send_frame", "session"]], "xma_side_data_alloc": [[1, 2, 1, "c.xma_side_data_alloc", "buffer_type"], [1, 2, 1, "c.xma_side_data_alloc", "handle"], [1, 2, 1, "c.xma_side_data_alloc", "size"], [1, 2, 1, "c.xma_side_data_alloc", "type"]], "xma_side_data_dec_ref": [[1, 2, 1, "c.xma_side_data_dec_ref", "side_data"]], "xma_side_data_free": [[1, 2, 1, "c.xma_side_data_free", "side_data"]], "xma_side_data_get_metadata": [[1, 2, 1, "c.xma_side_data_get_metadata", "metadata"], [1, 2, 1, "c.xma_side_data_get_metadata", "side_data"]], "xma_side_data_get_refcount": [[1, 2, 1, "c.xma_side_data_get_refcount", "side_data"]], "xma_side_data_inc_ref": [[1, 2, 1, "c.xma_side_data_inc_ref", "side_data"]], "xma_side_data_read": [[1, 2, 1, "c.xma_side_data_read", "side_data"]], "xma_side_data_set_metadata": [[1, 2, 1, "c.xma_side_data_set_metadata", "metadata"], [1, 2, 1, "c.xma_side_data_set_metadata", "side_data"]], "xma_side_data_write": [[1, 2, 1, "c.xma_side_data_write", "side_data"]], "xrm_dec_release": [[1, 2, 1, "c.xrm_dec_release", "xrm_dec_ctx"]], "xrm_dec_reserve": [[1, 2, 1, "c.xrm_dec_reserve", "dev_index"], [1, 2, 1, "c.xrm_dec_reserve", "xrm_dec_ctx"], [1, 2, 1, "c.xrm_dec_reserve", "xrm_props"]], "xrm_enc_release": [[1, 2, 1, "c.xrm_enc_release", "xrm_enc_ctx"]], "xrm_enc_reserve": [[1, 2, 1, "c.xrm_enc_reserve", "dev_index"], [1, 2, 1, "c.xrm_enc_reserve", "is_ull"], [1, 2, 1, "c.xrm_enc_reserve", "is_xav1"], [1, 2, 1, "c.xrm_enc_reserve", "slice_id"], [1, 2, 1, "c.xrm_enc_reserve", "xrm_enc_ctx"], [1, 2, 1, "c.xrm_enc_reserve", "xrm_props"]], "xrm_scale_release": [[1, 2, 1, "c.xrm_scale_release", "scaler_xrm_ctx"]], "xrm_scale_reserve": [[1, 2, 1, "c.xrm_scale_reserve", "dev_index"], [1, 2, 1, "c.xrm_scale_reserve", "input_props"], [1, 2, 1, "c.xrm_scale_reserve", "num_outputs"], [1, 2, 1, "c.xrm_scale_reserve", "output_props"], [1, 2, 1, "c.xrm_scale_reserve", "scaler_xrm_ctx"]]}, "objtypes": {"0": "c:struct", "1": "c:function", "2": "c:functionParam", "3": "std:cmdoption"}, "objnames": {"0": ["c", "struct", "C struct"], "1": ["c", "function", "C function"], "2": ["c", "functionParam", "C function parameter"], "3": ["std", "cmdoption", "program option"]}, "titleterms": {"announc": 0, "tabl": [0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "content": [0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "upcom": 0, "featur": [0, 20, 21], "obsolet": 0, "c": [1, 17], "api": [1, 18], "program": [1, 2, 17], "guid": [1, 17], "overview": [1, 2, 20, 22, 27, 28], "gener": [1, 17, 26], "applic": [1, 11, 12, 17], "develop": 1, "resourc": [1, 2, 17], "initi": 1, "alloc": 1, "session": 1, "creation": 1, "runtim": [1, 14], "process": [1, 8], "cleanup": 1, "compil": 1, "link": [1, 16], "amd": [1, 7, 13, 14, 15, 16, 20, 21, 22], "ama": [1, 7, 13, 14, 15, 16, 20, 21, 22], "video": [1, 6, 7, 8, 9, 13, 14, 17, 21, 24, 26], "sdk": [1, 7, 13, 14, 21], "plugin": [1, 17, 27], "common": 1, "xma": [1, 13], "data": [1, 27], "structur": 1, "refer": [1, 17], "log": [1, 25], "interfac": [1, 17], "buffer": 1, "frame": [1, 22], "side": 1, "band": 1, "1": [1, 3], "0": 1, "decod": [1, 6, 8, 10, 13, 23, 26, 27], "properti": 1, "scaler": [1, 13, 21, 23, 26, 27], "encod": [1, 3, 5, 8, 10, 13, 22, 23, 24, 26, 27], "dynam": [1, 24], "paramet": [1, 7, 24, 27], "filter": [1, 6, 9, 26], "ultra": [1, 7, 23], "low": [1, 7, 8, 23], "latenc": [1, 7, 23, 24], "consider": [1, 18], "mode": [1, 8, 23, 26], "sideband": 1, "multithread": 1, "upgrad": [1, 20], "xrm": [1, 17], "reserv": [1, 17], "build": 1, "sampl": [1, 13], "exampl": [1, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 25, 26, 27], "card": [2, 14, 21, 22], "manag": [2, 17], "mautil": 2, "maflash": 2, "mamgmt": 2, "print_ma35_load": [2, 17], "xrmadm": 2, "xrmd": [2, 8], "devic": [2, 17, 22, 27], "identifi": 2, "dbdf": 2, "bu": 2, "id": [2, 17], "firmwar": [2, 14], "version": [2, 20], "number": [2, 21], "check": [2, 14, 17], "system": [2, 11, 12, 17], "statu": [2, 17], "configur": [2, 19, 23], "util": 2, "compat": 3, "matrix": 3, "avc": [3, 7], "hevc": 3, "av1": [3, 7, 22, 24], "type": [3, 24], "2": [3, 8], "tutori": [4, 5, 8, 10], "amf": 5, "ffmpeg": [6, 8, 17, 18, 23, 26], "us": [6, 9, 17, 26, 27], "softwar": [6, 9, 17, 18], "environ": [6, 7, 8, 9, 10, 13, 14], "setup": [6, 7, 8, 9, 10, 13, 14, 17], "rotat": [6, 8, 9], "logo": [6, 9], "overlai": [6, 9, 26], "crop": [6, 8, 9], "shift": 6, "composit": [6, 9, 24], "chroma": [6, 8], "subsampl": [6, 8], "de": 6, "interlac": 6, "text": [6, 8], "insert": 6, "qualiti": [7, 8, 21, 24], "introduct": [7, 11, 12, 17, 26, 27], "optim": 7, "set": [7, 14], "tune": [7, 23, 24], "vmaf": 7, "normal": 7, "medium": 7, "preset": [7, 24], "slow": [7, 22], "run": [7, 14], "psnr": 7, "ssim": 7, "score": 7, "simpl": [8, 10], "onli": [8, 10], "4": 8, "10": [8, 21], "bit": [8, 21, 22], "convers": 8, "constant": 8, "rate": [8, 22], "factor": 8, "crf": 8, "high": 8, "basic": 8, "transcod": [8, 10, 13, 17, 21], "Into": 8, "multipl": [8, 10, 27], "resolut": [8, 10], "output": [8, 10, 27], "ull": [8, 23], "doubl": 8, "densiti": [8, 22], "without": 8, "full": 8, "2d": [8, 26], "gpu": [8, 26], "acceler": [8, 15, 16, 17, 20, 22], "color": [8, 21], "space": 8, "pictur": 8, "In": 8, "pip": 8, "tile": 8, "ml": 8, "base": 8, "face": 8, "roi": [8, 24, 26], "gain": 8, "ladder": [8, 11, 21], "detect": 8, "gstreamer": [9, 10, 11, 12, 18, 22, 27], "zoom": 9, "introductori": 10, "abr": [11, 21], "host": [11, 12, 28], "requir": [11, 12, 17, 20], "usag": [11, 12, 13, 22], "compositor": 12, "app": 13, "test": 13, "instruct": 13, "command": [13, 17, 26], "get": 14, "start": 14, "premis": 14, "chassi": 14, "instal": 14, "flash": [14, 22], "verif": 14, "up": [14, 27], "your": 14, "first": 14, "advanc": [15, 16, 20, 22], "media": [15, 16, 20, 22], "repositori": 15, "quick": 16, "comput": 17, "assign": [17, 22], "job": [17, 21], "specif": [17, 26], "explicit": 17, "manual": 17, "load": [17, 27], "insuffici": 17, "autom": 17, "descript": [17, 19], "The": [17, 21], "slot": 17, "tool": 17, "singl": [17, 22], "per": [17, 21, 22], "launch": 17, "launcher": 17, "line": 17, "report": 17, "unload": 17, "migrat": 18, "chang": 18, "from": [18, 20], "alveo": 18, "u30": 18, "distribut": [19, 20], "packag": 19, "feed": 19, "ubuntu": 19, "releas": 20, "note": 20, "new": 20, "thi": 20, "support": 20, "kernel": 20, "known": 20, "limit": 20, "issu": [20, 22], "previou": 20, "spec": 21, "ma35d": 21, "codec": [21, 22], "unit": 21, "adapt": 21, "bitrat": 21, "perform": 21, "8": 21, "real": 21, "time": 21, "scale": [21, 26], "troubleshoot": 22, "No": 22, "show": 22, "lspci": 22, "memori": 22, "playback": 22, "mp4": 22, "30": 22, "fp": 22, "variabl": 22, "400": 22, "mbp": 22, "max": 22, "mani": 22, "parallel": 22, "hdr": 22, "spatialaqgain": 22, "nonrespons": 22, "vm": [22, 28], "cannot": 22, "vf": 22, "guidelin": 23, "automat": 23, "look": 23, "ahead": 23, "depth": 23, "calcul": 23, "adjust": 23, "measur": 23, "metric": 24, "gop": 24, "select": 24, "unifi": 25, "log_ama_config": 25, "log_ama_filt": 25, "log_ama_filter_perf": 25, "option": 26, "rc": 26, "multiscal": 26, "engin": 26, "machin": 26, "learn": 26, "infer": 26, "rebuild": [26, 27], "input": 27, "pipelin": 27, "hardwar": 27, "down": 27, "dma": 27, "move": 27, "through": 27, "work": 27, "virtual": 28, "linux": 28, "kvm": 28, "guest": 28}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"Announcements": [[0, "announcements"]], "Table of Contents": [[0, "table-of-contents"], [1, "table-of-contents"], [2, "table-of-contents"], [3, "table-of-contents"], [6, "table-of-contents"], [7, "table-of-contents"], [8, "table-of-contents"], [9, "table-of-contents"], [10, "table-of-contents"], [11, "table-of-contents"], [12, "table-of-contents"], [13, "table-of-contents"], [14, "table-of-contents"], [17, "table-of-contents"], [18, "table-of-contents"], [19, "table-of-contents"], [20, "table-of-contents"], [21, "table-of-contents"], [22, "table-of-contents"], [23, "table-of-contents"], [24, "table-of-contents"], [25, "table-of-contents"], [26, "table-of-contents"], [27, "table-of-contents"], [28, "table-of-contents"]], "Upcoming Features": [[0, "upcoming-features"]], "Obsoleted Features": [[0, "obsoleted-features"]], "C API Programming Guide": [[1, "c-api-programming-guide"]], "Overview": [[1, "overview"], [2, "overview"], [20, "overview"], [22, "overview"], [28, "overview"]], "General Application Development Guide": [[1, "general-application-development-guide"]], "Resource Initialization and Allocation": [[1, "resource-initialization-and-allocation"]], "Session Creation": [[1, "session-creation"]], "Runtime Processing": [[1, "runtime-processing"]], "Cleanup": [[1, "cleanup"]], "Compiling and Linking with the AMD AMA Video SDK Plugins": [[1, "compiling-and-linking-with-the-sdk-plugins"]], "Common XMA Data Structures": [[1, "common-xma-data-structures"]], "Common XMA Data Reference": [[1, "common-xma-data-reference"]], "XMA Log Interface": [[1, "xma-log-interface"]], "XMA Session Interface": [[1, "xma-session-interface"]], "XMA Data Buffer Interface": [[1, "xma-data-buffer-interface"]], "XMA Frame Interface": [[1, "xma-frame-interface"]], "XMA Side Band Data": [[1, "xma-side-band-data"]], "1.0 SDK API": [[1, "sdk-api"]], "Decoder Plugin Reference": [[1, "decoder-plugin-reference"]], "Decoder Interface": [[1, "decoder-interface"]], "Decoder Properties": [[1, "decoder-properties"]], "Scaler Plugin Reference": [[1, "scaler-plugin-reference"]], "Scaler Interface": [[1, "scaler-interface"]], "Scaler Properties": [[1, "scaler-properties"]], "Encoder Plugin Reference": [[1, "encoder-plugin-reference"]], "Encoder Interface": [[1, "encoder-interface"]], "Encoder Properties": [[1, "encoder-properties"]], "Encoder Dynamic Parameters": [[1, "encoder-dynamic-parameters"]], "Filter Plugin Reference": [[1, "filter-plugin-reference"]], "Filter Interface": [[1, "filter-interface"]], "Filter Properties": [[1, "filter-properties"]], "Ultra Low Latency Considerations": [[1, "ultra-low-latency-considerations"]], "Decoder Low Latency Mode": [[1, "decoder-low-latency-mode"]], "Encoder Ultra Low Latency Mode": [[1, "encoder-ultra-low-latency-mode"]], "1.1 SDK API": [[1, "id3"]], "Sideband Data": [[1, "sideband-data"]], "Multithreading": [[1, "multithreading"]], "Logging": [[1, "logging"]], "Upgrading": [[1, "upgrading"]], "XRM API Reference": [[1, "xrm-api-reference"]], "Decoder Resource Reservation with XRM": [[1, "decoder-resource-reservation-with-xrm"]], "Encoder Resource Reservation with XRM": [[1, "encoder-resource-reservation-with-xrm"]], "Scaler Resource Reservation with XRM": [[1, "scaler-resource-reservation-with-xrm"]], "Building Sample Examples": [[1, "building-sample-examples"]], "Card Management": [[2, "card-management"]], "mautil, maflash, mamgmt and print_ma35_load": [[2, "mautil-maflash-mamgmt-and-print-ma35-load"]], "xrmadm and xrmd": [[2, "xrmadm-and-xrmd"]], "Card and Device Identifiers": [[2, "card-and-device-identifiers"]], "Device DBDF (mautil)": [[2, "device-dbdf-mautil"]], "Device DBDF (mamgmt)": [[2, "device-dbdf-mamgmt"]], "Bus ID": [[2, "bus-id"]], "Firmware Version Number": [[2, "firmware-version-number"]], "Checking System Status - mautil": [[2, "checking-system-status-mautil"]], "Checking Device Status": [[2, "checking-device-status"]], "Checking Device Configuration - mamgmt": [[2, "checking-device-configuration-mamgmt"]], "Programming a Device - maflash": [[2, "programming-a-device-maflash"]], "Checking Resource Utilization": [[2, "checking-resource-utilization"]], "print_ma35_load": [[2, "print-ma35-load"], [17, "print-ma35-load"]], "Encoding Compatibility Matrix": [[3, "encoding-compatibility-matrix"]], "AVC and HEVC Encoders": [[3, "avc-and-hevc-encoders"]], "AV1 Type 1 Encoder": [[3, "av1-type-1-encoder"]], "AV1 Type 2 Encoder": [[3, "av1-type-2-encoder"]], "Tutorials and Examples": [[4, "tutorials-and-examples"]], "AMF Encoder Tutorial": [[5, "amf-encoder-tutorial"]], "FFmpeg Examples using Software Filters": [[6, "ffmpeg-examples-using-software-filters"]], "Environment Setup": [[6, "environment-setup"], [7, "environment-setup"], [8, "environment-setup"], [9, "environment-setup"], [10, "environment-setup"], [13, "environment-setup"]], "Video Rotation": [[6, "video-rotation"], [8, "video-rotation"], [9, "video-rotation"]], "Logo Overlay": [[6, "logo-overlay"], [9, "logo-overlay"]], "Crop and Shift": [[6, "crop-and-shift"]], "Video Composition": [[6, "video-composition"], [9, "video-composition"]], "Chroma Subsampling": [[6, "chroma-subsampling"], [8, "chroma-subsampling"]], "Decoding and De-interlacing": [[6, "decoding-and-de-interlacing"]], "Text Insertion": [[6, "text-insertion"]], "Video Quality Examples": [[7, "video-quality-examples"]], "Introduction to Video Quality": [[7, "introduction-to-video-quality"]], "Optimized Settings for the AMD AMA Video SDK": [[7, "optimized-settings-for-the-sdk"]], "Video Tuning Parameters": [[7, "id1"]], "AV1 VMAF - Normal Latency - Medium Preset": [[7, "av1-vmaf-normal-latency-medium-preset"]], "AVC VMAF - Normal Latency - Slow Preset": [[7, "avc-vmaf-normal-latency-slow-preset"]], "AV1 VMAF - Ultra Low Latency - Medium Preset": [[7, "av1-vmaf-ultra-low-latency-medium-preset"]], "AVC VMAF - Ultra Low Latency - Slow Preset": [[7, "avc-vmaf-ultra-low-latency-slow-preset"]], "Running PSNR/SSIM/VMAF Scores": [[7, "running-psnr-ssim-vmaf-scores"]], "FFmpeg Tutorials": [[8, "ffmpeg-tutorials"]], "Simple FFmpeg Examples": [[8, "simple-ffmpeg-examples"]], "Decode Only": [[8, "decode-only"]], "Encode Only": [[8, "encode-only"]], "4:2:2 10 Bit Conversion": [[8, "bit-conversion"]], "Constant Rate Factor (CRF) Mode": [[8, "constant-rate-factor-crf-mode"]], "High Quality Encoding": [[8, "high-quality-encoding"]], "Low Quality Encoding": [[8, "low-quality-encoding"]], "Basic Transcode": [[8, "basic-transcode"]], "Decode Only Into Multiple-Resolution Outputs": [[8, "decode-only-into-multiple-resolution-outputs"]], "Encode Only Into Multiple-Resolution Outputs": [[8, "encode-only-into-multiple-resolution-outputs"]], "Transcode with Multiple-Resolution Outputs": [[8, "transcode-with-multiple-resolution-outputs"]], "Transcode in ULL Mode": [[8, "transcode-in-ull-mode"]], "Double Density Example with xrmd": [[8, "double-density-example-with-xrmd"]], "Double Density Example without xrmd": [[8, "double-density-example-without-xrmd"]], "Full Double Density": [[8, "full-double-density"]], "Cropping": [[8, "cropping"]], "2D GPU": [[8, "d-gpu"]], "Video Processing Accelerators": [[8, "id7"]], "Color Space Conversion": [[8, "color-space-conversion"]], "Picture In Picture (PIP)": [[8, "picture-in-picture-pip"]], "Tiling": [[8, "tiling"]], "ML Processing": [[8, "ml-processing"]], "ML Based Face ROI": [[8, "ml-based-face-roi"]], "ROI Gain Factor": [[8, "roi-gain-factor"]], "ROI Ladder Transcoding": [[8, "roi-ladder-transcoding"]], "ROI Face Detection": [[8, "roi-face-detection"]], "ML Based Text ROI": [[8, "ml-based-text-roi"]], "GStreamer Examples using Software Filters": [[9, "gstreamer-examples-using-software-filters"]], "Crop and Zoom": [[9, "crop-and-zoom"]], "GStreamer Introductory Tutorials": [[10, "gstreamer-introductory-tutorials"]], "Simple GStreamer Examples": [[10, "simple-gstreamer-examples"]], "Decode only": [[10, "decode-only"]], "Encode only": [[10, "encode-only"]], "Transcode with Multiple-Resolution outputs": [[10, "transcode-with-multiple-resolution-outputs"]], "GStreamer ABR Ladder Application": [[11, "gstreamer-abr-ladder-application"]], "Introduction": [[11, "introduction"], [12, "introduction"], [17, "introduction"], [26, "introduction"], [27, "introduction"]], "Host System Requirement": [[11, "host-system-requirement"], [12, "host-system-requirement"]], "Usage": [[11, "usage"], [12, "usage"]], "Examples": [[11, "examples"], [12, "examples"], [25, "examples"]], "GStreamer Compositor Application": [[12, "gstreamer-compositor-application"]], "XMA Examples for the AMD AMA Video SDK": [[13, "xma-examples-for-the-sdk"]], "XMA Decoder App": [[13, "xma-decoder-app"]], "Decoder Test Instructions": [[13, "decoder-test-instructions"]], "Decoder Usage": [[13, "decoder-usage"]], "Sample Decoder Command": [[13, "sample-decoder-command"]], "XMA Encoder App": [[13, "xma-encoder-app"]], "Encoder Test Instructions": [[13, "encoder-test-instructions"]], "Encoder Usage": [[13, "encoder-usage"]], "Sample Encoder Commands": [[13, "sample-encoder-commands"]], "XMA Scaler App": [[13, "xma-scaler-app"]], "Scaler Test Instructions": [[13, "scaler-test-instructions"]], "Scaler Usage": [[13, "scaler-usage"]], "Sample Scaler Command": [[13, "sample-scaler-command"]], "XMA Transcoder App": [[13, "xma-transcoder-app"]], "Transcoder Test Instructions": [[13, "transcoder-test-instructions"]], "Transcoder Usage": [[13, "transcoder-usage"]], "Sample Transcoder Commands": [[13, "sample-transcoder-commands"]], "Getting Started with AMD AMA Video SDK Cards on Premises": [[14, "getting-started-with-sdk-cards-on-premises"]], "Chassis Setup": [[14, "chassis-setup"]], "Check Cards": [[14, "check-cards"]], "Install the AMD AMA Video SDK": [[14, "install-the-sdk"]], "Flash Firmware": [[14, "flash-firmware"]], "Installation Verification": [[14, "installation-verification"]], "Set Up the Runtime Environment": [[14, "set-up-the-runtime-environment"]], "Run Your First Examples": [[14, "run-your-first-examples"]], "AMD Advanced Media Acceleration (AMA) Repository": [[15, "amd-advanced-media-acceleration-ama-repository"]], "AMD Advanced Media Acceleration (AMA)": [[16, "amd-advanced-media-acceleration-ama"]], "Quick Links": [[16, "quick-links"]], "Managing Video Acceleration Compute Resources": [[17, "managing-video-acceleration-compute-resources"]], "Assigning Jobs to Specific Devices": [[17, "assigning-jobs-to-specific-devices"]], "Examples using Explicit Device IDs": [[17, "examples-using-explicit-device-ids"]], "Manual Resource Management": [[17, "manual-resource-management"]], "Checking System Load": [[17, "checking-system-load"]], "Insufficient Resources": [[17, "insufficient-resources"]], "Job Resource Requirements": [[17, "job-resource-requirements"]], "Automated Resource Management": [[17, "automated-resource-management"]], "Video Transcode Job Descriptions": [[17, "video-transcode-job-descriptions"]], "The Job Slot Reservation Tool": [[17, "the-job-slot-reservation-tool"]], "Example requiring a single device per job": [[17, "example-requiring-a-single-device-per-job"]], "Automated Job Launching": [[17, "automated-job-launching"]], "The FFmpeg Launcher Example": [[17, "the-ffmpeg-launcher-example"]], "XRM Reference Guide": [[17, "xrm-reference-guide"]], "Command Line Interface": [[17, "command-line-interface"]], "Setup": [[17, "setup"]], "Generating Status Reports": [[17, "generating-status-reports"]], "Loading/Unloading Software Plugins": [[17, "loading-unloading-software-plugins"]], "C Application Programming Interface": [[17, "c-application-programming-interface"]], "Software Migration Considerations": [[18, "software-migration-considerations"]], "API Changes from Alveo U30": [[18, "api-changes-from-alveo-u30"]], "FFmpeg API Changes": [[18, "ffmpeg-api-changes"]], "Gstreamer API Changes": [[18, "gstreamer-api-changes"]], "Distribution Package Feed": [[19, "distribution-package-feed"]], "Package Descriptions": [[19, "package-descriptions"]], "Configuring the Package Feed": [[19, "configuring-the-package-feed"]], "Ubuntu": [[19, "ubuntu"]], "AMD Advanced Media Acceleration (AMA) Release Notes": [[20, "amd-advanced-media-acceleration-ama-release-notes"]], "Release Requirements": [[20, "release-requirements"]], "New in This Release": [[20, "new-in-this-release"]], "Features in This Release": [[20, "features-in-this-release"]], "Supported Kernels and Distributions": [[20, "supported-kernels-and-distributions"]], "Known Limitations": [[20, "known-limitations"]], "Known Issues": [[20, "known-issues"]], "Upgrading from Previous Versions": [[20, "upgrading-from-previous-versions"]], "Specs and Features of the AMD AMA Video SDK": [[21, "specs-and-features-of-the-sdk"]], "The AMD AMA Video SDK": [[21, "the-sdk"]], "The AMD MA35D Card": [[21, "the-amd-ma35d-card"]], "Video Codec Unit": [[21, "video-codec-unit"]], "Adaptive Bitrate Scaler": [[21, "adaptive-bitrate-scaler"]], "Video Quality": [[21, "video-quality"]], "Performance Tables": [[21, "performance-tables"]], "Performance Tables for 8-bit Color": [[21, "performance-tables-for-8-bit-color"]], "Number of Real-Time Transcode Jobs per Card (8-bit)": [[21, "id3"]], "Number of Real-Time Transcode with Scale Jobs per Card (8-bit)": [[21, "id4"]], "Number of Real-Time ABR Ladders (8-bit)": [[21, "id5"]], "Performance Tables for 10-bit Color": [[21, "performance-tables-for-10-bit-color"]], "Number of Real-Time Transcode Jobs per Card (10-bit)": [[21, "id6"]], "Number of Real-Time Transcode with Scale Jobs per Card (10-bit)": [[21, "id7"]], "Number of Real-Time ABR Ladders (10-bit)": [[21, "id8"]], "AMD Advanced Media Acceleration (AMA) Troubleshooting": [[22, "amd-advanced-media-acceleration-ama-troubleshooting"]], "No Device Showing in lspci": [[22, "no-device-showing-in-lspci"]], "Single Device per Card": [[22, "single-device-per-card"]], "Memory Usage": [[22, "memory-usage"]], "AV1 Slow Playback": [[22, "av1-slow-playback"]], "AV1 MP4 Playback": [[22, "av1-mp4-playback"]], "30 FPS Density": [[22, "fps-density"]], "Gstreamer Variable Frame Rate": [[22, "gstreamer-variable-frame-rate"]], "400 Mbps Max Bit Rate": [[22, "mbps-max-bit-rate"]], "Many Parallel Encodes": [[22, "many-parallel-encodes"]], "HDR & spatialAqGain": [[22, "hdr-spatialaqgain"]], "Nonresponsive Devices": [[22, "nonresponsive-devices"]], "Codec Issues in VM": [[22, "codec-issues-in-vm"]], "Cannot Assign a VF to a VM": [[22, "cannot-assign-a-vf-to-a-vm"]], "Cannot Flash the Card": [[22, "cannot-flash-the-card"]], "Tuning Latency": [[23, "tuning-latency"]], "Decoder Latency": [[23, "decoder-latency"]], "Scaler Latency": [[23, "scaler-latency"]], "Encoder Latency": [[23, "encoder-latency"]], "Guidelines on Encoder Latency Configuration": [[23, "guidelines-on-encoder-latency-configuration"]], "Automatic Look Ahead Depth Calculation": [[23, "automatic-look-ahead-depth-calculation"]], "Ultra Low Latency (ULL) Mode": [[23, "ultra-low-latency-ull-mode"]], "Latency Adjustment": [[23, "latency-adjustment"]], "FFmpeg Latency Measurements": [[23, "ffmpeg-latency-measurements"]], "Tuning Video Quality": [[24, "tuning-video-quality"]], "Metrics": [[24, "metrics"]], "Latency": [[24, "latency"]], "Preset": [[24, "preset"]], "GOP Composition": [[24, "gop-composition"]], "ROI": [[24, "roi"]], "AV1 Type Selection": [[24, "av1-type-selection"]], "Dynamic Encoder Parameters": [[24, "dynamic-encoder-parameters"]], "Unified Logging": [[25, "unified-logging"]], "LOG_AMA_CONFIG": [[25, "log-ama-config"]], "LOG_AMA_FILTER": [[25, "log-ama-filter"]], "LOG_AMA_FILTER_PERF": [[25, "log-ama-filter-perf"]], "Using FFmpeg": [[26, "using-ffmpeg"]], "Example Commands": [[26, "example-commands"]], "General FFmpeg Options": [[26, "general-ffmpeg-options"], [26, "id4"]], "Video Decoding": [[26, "video-decoding"]], "Video Decoding Options": [[26, "id5"]], "Video Encoding": [[26, "video-encoding"]], "Video Encoding Options": [[26, "id6"]], "RC Mode Options": [[26, "id7"]], "Video Scaling": [[26, "video-scaling"]], "Multiscale Filter Options": [[26, "id8"]], "2D Engine GPU": [[26, "d-engine-gpu"]], "2D Engine GPU Options": [[26, "id9"]], "GPU Specific Options": [[26, "id10"]], "Video Machine Learning": [[26, "video-machine-learning"]], "Inference Engine": [[26, "inference-engine"]], "Inference Engine Options": [[26, "id11"]], "ROI Scaler": [[26, "roi-scaler"]], "Scaler Options": [[26, "id12"]], "ROI Overlay": [[26, "roi-overlay"]], "Overlay Options": [[26, "id13"]], "Rebuilding FFmpeg": [[26, "rebuilding-ffmpeg"]], "Using GStreamer": [[27, "using-gstreamer"]], "Overview of the GStreamer Plugins": [[27, "overview-of-the-gstreamer-plugins"]], "Decoder Plugin": [[27, "decoder-plugin"]], "Decoder Inputs and Outputs": [[27, "decoder-inputs-and-outputs"]], "Decoder Parameters": [[27, "decoder-parameters"]], "Decoder Example Pipelines": [[27, "decoder-example-pipelines"]], "Encoder Plugin": [[27, "encoder-plugin"]], "Encoder Inputs and Outputs": [[27, "encoder-inputs-and-outputs"]], "Encoder Parameters": [[27, "encoder-parameters"]], "Encoder Example Pipelines": [[27, "encoder-example-pipelines"]], "Scaler Plugin": [[27, "scaler-plugin"]], "Scaler Inputs and Outputs": [[27, "scaler-inputs-and-outputs"]], "Scaler Parameters": [[27, "scaler-parameters"]], "Scaler Example Pipelines": [[27, "scaler-example-pipelines"]], "Hardware Down and Up Loads": [[27, "hardware-down-and-up-loads"]], "Inputs and Outputs": [[27, "inputs-and-outputs"]], "DMA Parameters": [[27, "dma-parameters"]], "Moving Data through the Pipeline": [[27, "moving-data-through-the-pipeline"]], "Working with Multiple Devices": [[27, "working-with-multiple-devices"]], "Rebuilding GStreamer": [[27, "rebuilding-gstreamer"]], "Virtualization": [[28, "virtualization"]], "Linux KVM": [[28, "linux-kvm"]], "Linux Host": [[28, "linux-host"]], "Linux VM Guest": [[28, "linux-vm-guest"]]}, "indexentries": {"xmadatabuffer (c struct)": [[1, "c.XmaDataBuffer"]], "xmadecoderproperties (c struct)": [[1, "c.XmaDecoderProperties"]], "xmadynamicencparams (c struct)": [[1, "c.XmaDynamicEncParams"]], "xmadynamicencparams_v2 (c struct)": [[1, "c.XmaDynamicEncParams_v2"]], "xmaencoderproperties (c struct)": [[1, "c.XmaEncoderProperties"]], "xmafilterportproperties (c struct)": [[1, "c.XmaFilterPortProperties"]], "xmafilterproperties (c struct)": [[1, "c.XmaFilterProperties"]], "xmaframe (c struct)": [[1, "c.XmaFrame"]], "xmaframeproperties (c struct)": [[1, "c.XmaFrameProperties"]], "xmaparameter (c struct)": [[1, "c.XmaParameter"]], "xmascalerinoutproperties (c struct)": [[1, "c.XmaScalerInOutProperties"]], "xmascalerproperties (c struct)": [[1, "c.XmaScalerProperties"]], "xma_data_buffer_alloc (c function)": [[1, "c.xma_data_buffer_alloc"]], "xma_data_buffer_free (c function)": [[1, "c.xma_data_buffer_free"]], "xma_data_from_buffer_clone (c function)": [[1, "c.xma_data_from_buffer_clone"]], "xma_dec_session_create (c function)": [[1, "c.xma_dec_session_create"]], "xma_dec_session_destroy (c function)": [[1, "c.xma_dec_session_destroy"]], "xma_dec_session_get_properties (c function)": [[1, "c.xma_dec_session_get_properties"]], "xma_dec_session_recv_frame (c function)": [[1, "c.xma_dec_session_recv_frame"]], "xma_dec_session_send_data (c function)": [[1, "c.xma_dec_session_send_data"]], "xma_dec_session_set_log (c function)": [[1, "c.xma_dec_session_set_log"]], "xma_enc_session_create (c function)": [[1, "c.xma_enc_session_create"]], "xma_enc_session_destroy (c function)": [[1, "c.xma_enc_session_destroy"]], "xma_enc_session_recv_data (c function)": [[1, "c.xma_enc_session_recv_data"]], "xma_enc_session_send_frame (c function)": [[1, "c.xma_enc_session_send_frame"]], "xma_enc_session_set_log (c function)": [[1, "c.xma_enc_session_set_log"]], "xma_filter_session_create (c function)": [[1, "c.xma_filter_session_create"]], "xma_filter_session_destroy (c function)": [[1, "c.xma_filter_session_destroy"]], "xma_filter_session_recv_frame (c function)": [[1, "c.xma_filter_session_recv_frame"]], "xma_filter_session_send_frame (c function)": [[1, "c.xma_filter_session_send_frame"]], "xma_filter_session_set_log (c function)": [[1, "c.xma_filter_session_set_log"]], "xma_frame_add_side_data (c function)": [[1, "c.xma_frame_add_side_data"]], "xma_frame_alloc (c function)": [[1, "c.xma_frame_alloc"]], "xma_frame_clear_all_side_data (c function)": [[1, "c.xma_frame_clear_all_side_data"]], "xma_frame_clone (c function)": [[1, "c.xma_frame_clone"]], "xma_frame_dec_ref (c function)": [[1, "c.xma_frame_dec_ref"]], "xma_frame_free (c function)": [[1, "c.xma_frame_free"]], "xma_frame_from_buffers_clone (c function)": [[1, "c.xma_frame_from_buffers_clone"]], "xma_frame_get_first_side_data (c function)": [[1, "c.xma_frame_get_first_side_data"]], "xma_frame_get_next_side_data (c function)": [[1, "c.xma_frame_get_next_side_data"]], "xma_frame_get_next_side_data_of_type (c function)": [[1, "c.xma_frame_get_next_side_data_of_type"]], "xma_frame_get_plane_height (c function)": [[1, "c.xma_frame_get_plane_height"]], "xma_frame_get_plane_size (c function)": [[1, "c.xma_frame_get_plane_size"]], "xma_frame_get_plane_stride (c function)": [[1, "c.xma_frame_get_plane_stride"]], "xma_frame_get_side_data (c function)": [[1, "c.xma_frame_get_side_data"]], "xma_frame_inc_ref (c function)": [[1, "c.xma_frame_inc_ref"]], "xma_frame_planes_get (c function)": [[1, "c.xma_frame_planes_get"]], "xma_frame_remove_side_data (c function)": [[1, "c.xma_frame_remove_side_data"]], "xma_frame_remove_side_data_type (c function)": [[1, "c.xma_frame_remove_side_data_type"]], "xma_initialize (c function)": [[1, "c.xma_initialize"]], "xma_log_init (c function)": [[1, "c.xma_log_init"]], "xma_log_release (c function)": [[1, "c.xma_log_release"]], "xma_logmsg (c function)": [[1, "c.xma_logmsg"]], "xma_release (c function)": [[1, "c.xma_release"]], "xma_scaler_session_create (c function)": [[1, "c.xma_scaler_session_create"]], "xma_scaler_session_destroy (c function)": [[1, "c.xma_scaler_session_destroy"]], "xma_scaler_session_recv_frame_list (c function)": [[1, "c.xma_scaler_session_recv_frame_list"]], "xma_scaler_session_send_frame (c function)": [[1, "c.xma_scaler_session_send_frame"]], "xma_side_data_alloc (c function)": [[1, "c.xma_side_data_alloc"]], "xma_side_data_dec_ref (c function)": [[1, "c.xma_side_data_dec_ref"]], "xma_side_data_free (c function)": [[1, "c.xma_side_data_free"]], "xma_side_data_get_metadata (c function)": [[1, "c.xma_side_data_get_metadata"]], "xma_side_data_get_refcount (c function)": [[1, "c.xma_side_data_get_refcount"]], "xma_side_data_inc_ref (c function)": [[1, "c.xma_side_data_inc_ref"]], "xma_side_data_read (c function)": [[1, "c.xma_side_data_read"]], "xma_side_data_set_metadata (c function)": [[1, "c.xma_side_data_set_metadata"]], "xma_side_data_write (c function)": [[1, "c.xma_side_data_write"]], "xrm_dec_release (c function)": [[1, "c.xrm_dec_release"]], "xrm_dec_reserve (c function)": [[1, "c.xrm_dec_reserve"]], "xrm_enc_release (c function)": [[1, "c.xrm_enc_release"]], "xrm_enc_reserve (c function)": [[1, "c.xrm_enc_reserve"]], "xrm_scale_release (c function)": [[1, "c.xrm_scale_release"]], "xrm_scale_reserve (c function)": [[1, "c.xrm_scale_reserve"]], "--codectype": [[11, "cmdoption-codectype"]], "--devidx": [[11, "cmdoption-devidx"]], "--file": [[11, "cmdoption-file"]], "--forcekeyframe": [[11, "cmdoption-forcekeyframe"]], "--json": [[11, "cmdoption-json"]], "-c": [[11, "cmdoption-c"]], "-f": [[11, "cmdoption-f"], [26, "cmdoption-f"]], "-i": [[11, "cmdoption-i"], [26, "cmdoption-i"]], "-j": [[11, "cmdoption-j"]], "-k": [[11, "cmdoption-k"]], "command line option": [[11, "cmdoption-c"], [11, "cmdoption-codectype"], [11, "cmdoption-devidx"], [11, "cmdoption-f"], [11, "cmdoption-file"], [11, "cmdoption-forcekeyframe"], [11, "cmdoption-i"], [11, "cmdoption-j"], [11, "cmdoption-json"], [11, "cmdoption-k"], [26, "cmdoption-arg-0"], [26, "cmdoption-arg-1"], [26, "cmdoption-arg-2d_ama"], [26, "cmdoption-arg-core_id"], [26, "cmdoption-arg-crop"], [26, "cmdoption-arg-cutoff"], [26, "cmdoption-arg-enable_pipeline"], [26, "cmdoption-arg-h"], [26, "cmdoption-arg-highlight_threshold"], [26, "cmdoption-arg-inputs"], [26, "cmdoption-arg-ml_ama"], [26, "cmdoption-arg-model"], [26, "cmdoption-arg-model_args"], [26, "cmdoption-arg-nb_inputs"], [26, "cmdoption-arg-out_res"], [26, "cmdoption-arg-outputs"], [26, "cmdoption-arg-processor"], [26, "cmdoption-arg-roi_map_type"], [26, "cmdoption-arg-roi_overlay_ama"], [26, "cmdoption-arg-roi_scale_ama"], [26, "cmdoption-arg-scaler_ama"], [26, "cmdoption-arg-shortest"], [26, "cmdoption-arg-skip_frames"], [26, "cmdoption-arg-static_map_file"], [26, "cmdoption-arg-strength"], [26, "cmdoption-arg-w"], [26, "cmdoption-b-v"], [26, "cmdoption-bf"], [26, "cmdoption-bufsize"], [26, "cmdoption-c-v"], [26, "cmdoption-control_rate"], [26, "cmdoption-cores"], [26, "cmdoption-crf"], [26, "cmdoption-dynamic_gop"], [26, "cmdoption-dynamic_params_file"], [26, "cmdoption-f"], [26, "cmdoption-filter_complex"], [26, "cmdoption-forced_idr"], [26, "cmdoption-g"], [26, "cmdoption-hwaccel"], [26, "cmdoption-i"], [26, "cmdoption-latency_ms"], [26, "cmdoption-level"], [26, "cmdoption-lookahead_depth"], [26, "cmdoption-low_latency"], [26, "cmdoption-max_bitrate"], [26, "cmdoption-max_qp"], [26, "cmdoption-min_qp"], [26, "cmdoption-no_bll"], [26, "cmdoption-out_fmt"], [26, "cmdoption-preset"], [26, "cmdoption-profile"], [26, "cmdoption-qp"], [26, "cmdoption-qp_b_offset"], [26, "cmdoption-qp_i_offset"], [26, "cmdoption-qp_mode"], [26, "cmdoption-r"], [26, "cmdoption-s"], [26, "cmdoption-slice"], [26, "cmdoption-spatial_aq"], [26, "cmdoption-spatial_aq_gain"], [26, "cmdoption-temporal_aq"], [26, "cmdoption-temporal_aq_gain"], [26, "cmdoption-tier"], [26, "cmdoption-tune_metrics"], [26, "cmdoption-type"], [26, "cmdoption-vf"], [27, "cmdoption-arg-0"], [27, "cmdoption-arg-1"], [27, "cmdoption-arg-2"], [27, "cmdoption-arg-b-frames"], [27, "cmdoption-arg-bitrate"], [27, "cmdoption-arg-crf"], [27, "cmdoption-arg-crop"], [27, "cmdoption-arg-crop-height"], [27, "cmdoption-arg-crop-left"], [27, "cmdoption-arg-crop-top"], [27, "cmdoption-arg-crop-width"], [27, "cmdoption-arg-device"], [27, "cmdoption-arg-device-type"], [27, "cmdoption-arg-dynamic-gop"], [27, "cmdoption-arg-enable-pipeline"], [27, "cmdoption-arg-encoding-params-file"], [27, "cmdoption-arg-forced-idr"], [27, "cmdoption-arg-gop-length"], [27, "cmdoption-arg-idr-interval"], [27, "cmdoption-arg-latency-logging"], [27, "cmdoption-arg-latency-ms"], [27, "cmdoption-arg-lookahead-depth"], [27, "cmdoption-arg-low-latency"], [27, "cmdoption-arg-max-bitrate"], [27, "cmdoption-arg-max-qp"], [27, "cmdoption-arg-min-qp"], [27, "cmdoption-arg-no-bll"], [27, "cmdoption-arg-preset"], [27, "cmdoption-arg-qp"], [27, "cmdoption-arg-qp-b-offset"], [27, "cmdoption-arg-qp-i-offset"], [27, "cmdoption-arg-qp-mode"], [27, "cmdoption-arg-rate-control"], [27, "cmdoption-arg-slice"], [27, "cmdoption-arg-spatial-aq"], [27, "cmdoption-arg-spatial-aq-gain"], [27, "cmdoption-arg-temporal-aq-gain"], [27, "cmdoption-arg-temporall-aq"], [27, "cmdoption-arg-tier"], [27, "cmdoption-arg-tune-metrics"]], "xrm_reserve_id": [[17, "index-0"], [17, "index-2"]], "xrm_reserve_id_{n}": [[17, "index-1"], [17, "index-3"]], "environment variable": [[17, "index-0"], [17, "index-1"], [17, "index-2"], [17, "index-3"]], "-b:v": [[26, "cmdoption-b-v"]], "-bf": [[26, "cmdoption-bf"]], "-bufsize": [[26, "cmdoption-bufsize"]], "-c:v": [[26, "cmdoption-c-v"]], "-control_rate": [[26, "cmdoption-control_rate"]], "-cores": [[26, "cmdoption-cores"]], "-crf": [[26, "cmdoption-crf"]], "-dynamic_gop": [[26, "cmdoption-dynamic_gop"]], "-dynamic_params_file": [[26, "cmdoption-dynamic_params_file"]], "-filter_complex": [[26, "cmdoption-filter_complex"]], "-forced_idr": [[26, "cmdoption-forced_idr"]], "-g": [[26, "cmdoption-g"]], "-hwaccel": [[26, "cmdoption-hwaccel"]], "-latency_ms": [[26, "cmdoption-latency_ms"]], "-level": [[26, "cmdoption-level"]], "-lookahead_depth": [[26, "cmdoption-lookahead_depth"]], "-low_latency": [[26, "cmdoption-low_latency"]], "-max_bitrate": [[26, "cmdoption-max_bitrate"]], "-max_qp": [[26, "cmdoption-max_qp"]], "-min_qp": [[26, "cmdoption-min_qp"]], "-no_bll": [[26, "cmdoption-no_bll"]], "-out_fmt": [[26, "cmdoption-out_fmt"]], "-preset": [[26, "cmdoption-preset"]], "-profile": [[26, "cmdoption-profile"]], "-qp": [[26, "cmdoption-qp"]], "-qp_b_offset": [[26, "cmdoption-qp_b_offset"]], "-qp_i_offset": [[26, "cmdoption-qp_i_offset"]], "-qp_mode": [[26, "cmdoption-qp_mode"]], "-r": [[26, "cmdoption-r"]], "-s": [[26, "cmdoption-s"]], "-slice": [[26, "cmdoption-slice"]], "-spatial_aq": [[26, "cmdoption-spatial_aq"]], "-spatial_aq_gain": [[26, "cmdoption-spatial_aq_gain"]], "-temporal_aq": [[26, "cmdoption-temporal_aq"]], "-temporal_aq_gain": [[26, "cmdoption-temporal_aq_gain"]], "-tier": [[26, "cmdoption-tier"]], "-tune_metrics": [[26, "cmdoption-tune_metrics"]], "-type": [[26, "cmdoption-type"]], "-vf": [[26, "cmdoption-vf"]], "2d_ama": [[26, "cmdoption-arg-2d_ama"]], "core_id": [[26, "cmdoption-arg-0"], [26, "cmdoption-arg-core_id"]], "crop": [[26, "cmdoption-arg-crop"], [27, "cmdoption-arg-crop"]], "cutoff": [[26, "cmdoption-arg-cutoff"]], "enable_pipeline": [[26, "cmdoption-arg-enable_pipeline"]], "h": [[26, "cmdoption-arg-h"]], "highlight_threshold": [[26, "cmdoption-arg-highlight_threshold"]], "inputs": [[26, "cmdoption-arg-inputs"]], "ml_ama": [[26, "cmdoption-arg-ml_ama"]], "model": [[26, "cmdoption-arg-model"]], "model_args": [[26, "cmdoption-arg-model_args"]], "nb_inputs": [[26, "cmdoption-arg-1"], [26, "cmdoption-arg-nb_inputs"]], "out_res": [[26, "cmdoption-arg-out_res"]], "outputs": [[26, "cmdoption-arg-outputs"]], "processor": [[26, "cmdoption-arg-processor"]], "roi_map_type": [[26, "cmdoption-arg-roi_map_type"]], "roi_overlay_ama": [[26, "cmdoption-arg-roi_overlay_ama"]], "roi_scale_ama": [[26, "cmdoption-arg-roi_scale_ama"]], "scaler_ama": [[26, "cmdoption-arg-scaler_ama"]], "shortest": [[26, "cmdoption-arg-shortest"]], "skip_frames": [[26, "cmdoption-arg-skip_frames"]], "static_map_file": [[26, "cmdoption-arg-static_map_file"]], "strength": [[26, "cmdoption-arg-strength"]], "w": [[26, "cmdoption-arg-w"]], "b-frames": [[27, "cmdoption-arg-b-frames"]], "bitrate": [[27, "cmdoption-arg-bitrate"]], "crf": [[27, "cmdoption-arg-crf"]], "crop-height": [[27, "cmdoption-arg-crop-height"]], "crop-left": [[27, "cmdoption-arg-crop-left"]], "crop-top": [[27, "cmdoption-arg-crop-top"]], "crop-width": [[27, "cmdoption-arg-crop-width"]], "device": [[27, "cmdoption-arg-0"], [27, "cmdoption-arg-1"], [27, "cmdoption-arg-2"], [27, "cmdoption-arg-device"]], "device-type": [[27, "cmdoption-arg-device-type"]], "dynamic-gop": [[27, "cmdoption-arg-dynamic-gop"]], "enable-pipeline": [[27, "cmdoption-arg-enable-pipeline"]], "encoding-params-file": [[27, "cmdoption-arg-encoding-params-file"]], "forced-idr": [[27, "cmdoption-arg-forced-idr"]], "gop-length": [[27, "cmdoption-arg-gop-length"]], "idr-interval": [[27, "cmdoption-arg-idr-interval"]], "latency-logging": [[27, "cmdoption-arg-latency-logging"]], "latency-ms": [[27, "cmdoption-arg-latency-ms"]], "lookahead-depth": [[27, "cmdoption-arg-lookahead-depth"]], "low-latency": [[27, "cmdoption-arg-low-latency"]], "max-bitrate": [[27, "cmdoption-arg-max-bitrate"]], "max-qp": [[27, "cmdoption-arg-max-qp"]], "min-qp": [[27, "cmdoption-arg-min-qp"]], "no-bll": [[27, "cmdoption-arg-no-bll"]], "preset": [[27, "cmdoption-arg-preset"]], "qp": [[27, "cmdoption-arg-qp"]], "qp-b-offset": [[27, "cmdoption-arg-qp-b-offset"]], "qp-i-offset": [[27, "cmdoption-arg-qp-i-offset"]], "qp-mode": [[27, "cmdoption-arg-qp-mode"]], "rate-control": [[27, "cmdoption-arg-rate-control"]], "slice": [[27, "cmdoption-arg-slice"]], "spatial-aq": [[27, "cmdoption-arg-spatial-aq"]], "spatial-aq-gain": [[27, "cmdoption-arg-spatial-aq-gain"]], "temporal-aq-gain": [[27, "cmdoption-arg-temporal-aq-gain"]], "temporall-aq": [[27, "cmdoption-arg-temporall-aq"]], "tier": [[27, "cmdoption-arg-tier"]], "tune-metrics": [[27, "cmdoption-arg-tune-metrics"]]}}) \ No newline at end of file diff --git a/v1.1.2/specs_and_features.html b/v1.1.2/specs_and_features.html new file mode 100644 index 00000000..eba1df92 --- /dev/null +++ b/v1.1.2/specs_and_features.html @@ -0,0 +1,586 @@ + + + + + + + + + + + + + + + Specs and Features of the AMD AMA Video SDK — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Specs and Features of the AMD AMA Video SDK
  • +
  • +
  • +
+
+
+
+
+ +
+

Specs and Features of the AMD AMA Video SDK

+ +
+

The AMD AMA Video SDK

+

The AMD AMA Video SDK is a complete software stack allowing users to seamlessly leverage the features of AMD video acceleration units such as MA35D. It includes the following elements:

+
    +
  • Pre-compiled versions of FFmpeg and GStreamer which integrate key video transcoding plug-ins, enabling simple hardware offloading of compute-intensive workloads using these two popular frameworks. These custom versions of FFmpeg and GStreamer link to a host driver which communicates with the hardware on the PCIe card. No hardware experience is required to run FFmpeg or GStreamer commands with the AMD AMA Video SDK.

  • +
  • The Xilinx Resource Manager (XRM) which is the software used to manage and allocate all the hardware-accelerated features available in the system. XRM allows running multiple video processing jobs across multiple devices and multiple AMD video acceleration cards.

  • +
  • A C-based application programming interface (API) which facilitates the integration of AMD video transcoding capabilities in proprietary frameworks. This API is provided in the form plugins which can be called from external application using the Xilinx Media Accelerator (XMA) interface.

  • +
  • A suite of card management tools used to perform actions such as programming, resetting, or querying the status of AMD video acceleration cards.

  • +
  • Many examples and tutorials illustrating how to use and make the most of the AMD AMA Video SDK.

  • +
+MA35D Pipeline +
+
+

The AMD MA35D Card

+

The MA35D, which is compatible with AMD AMA Video SDK, is a low-profile, PCI™-based media accelerator card that delivers a high-density real-time transcoding solution for live streaming video service providers, OEMs, and Content Delivery Network (CDNs).

+

The MA35D card is targeted for both real-time and faster than real-time video workloads. It is expected that one or more sources of video input, either from files or from live video streams, are fed into the transcode pipeline. The encoder encodes one or more output streams from each scaled rendition of the input.

+
+

Video Codec Unit

+

The MA35D accelerator card has 2 VPUs, where each VPU is made of 2 video processing slices. These slices in turn are made of specialized decode, scale, GPU, ML, look ahead, and encode units.

+MA35D VPU +

Video Codec Unit (VCU) cores are capable of:

+
    +
  • Video format: YCbCr 4:2:0, 8 or 10-bit per color channel

  • +
  • Multi-standard encoding/decoding support, including:

    +
      +
    • ISO MPEG-4 Part 10: Advanced Video Coding (AVC)/ITU H.264 - Baseline, Constrained Baseline, High, High-10, High-10-Intra up to Level 5.2

    • +
    • ISO MPEG-H Part 2: High Efficiency Video Coding (HEVC)/ITU H.265 - Main, Main-Intra, Main10, Main-10-Intra, up to Level 5.2

    • +
    • AOM AV1: AOMedia Video 1 - Main, High up to Level 5.3

    • +
    +
  • +
  • Supports resolutions from 128x128 to 3840x2160 portrait and landscape

  • +
  • Simultaneous transcoding with a maximum aggregated bandwidth of 4x 4Kp60 per card for AVC or HEVC and 8x 4Kp60 for AV1

  • +
  • Look-ahead driven video quality improvements through temporal adaptive and spatial adaptive quantization

  • +
  • Low latency rate control

  • +
  • Flexible rate control: CBR, VBR, CVBR, and Constant QP

  • +
  • Progressive support for H.264, H.265 and AV1

  • +
  • HDR10/10+: HDR data is automatically populated by the decoder and passed to other accelerators in the transcode pipeline.

    +
      +
    • The following HDR10 SEI are supported:

      +
        +
      • Mastering Display Color Volume (SEI ITU)

      • +
      • Content Light Level (SEI ITU)

      • +
      • Alternative Transfer Charateristics (SEI ITU)

      • +
      +
    • +
    • The following HDR10+ SEI are supported:

      +
        +
      • ST2094_10 (DolbyVision, User defined SEI)

      • +
      • ST2094_40 (Samsung, User defined SEI)

      • +
      +
    • +
    • Behavior for HDR10/10+ SEI is as follows:

      +
        +
      • Static HDR SEI (MDCV, CLL & ATC) will not change in-between IDRs (and even in the video sequence according the HDR standards).

      • +
      • MDCV, CLL & ATC will be written only on IDRs, according to the persistency of MDCV, CLL & ATC SEIs.

      • +
      • ST2094_10 will be written on each access unit as per constraint of section A.2.1 ts_103572v010101p.pdf.

      • +
      • ST2094_40 will be written on IDRs, and whenever the user changes its content, according to the persistency specification in A341S34-1-582r4-A341-Amendment-2094-40.pdf

      • +
      +
    • +
    +
  • +
+
+
+

Adaptive Bitrate Scaler

+

For streaming applications, video is distributed in different resolutions and bit rates to adapt to varying network bandwidth conditions. All adaptive bitrate (ABR) transcoding systems require an ABR scaler that downscales an input video stream to several different smaller resolutions that are then re-encoded. These smaller resolutions are referred to as an image pyramid or an ABR ladder.

+

The MA35D ABR scaler is an accelerator capable of generating up to 16 lower resolution output images from a single input image. The ABR scaler supports the following features:

+
    +
  • Supports up to 12 taps in both horizontal and vertical direction per stage

  • +
  • High quality polyphase scaling with 64 phases and up to 12 taps in both horizontal and vertical direction per stage

  • +
  • Supports 8 and 10-bit 4:2:0

  • +
  • Luma and Chroma processed in parallel

  • +
  • Supports resolutions from 128x128 to 3840x2160, in multiples of 4

  • +
  • The scaler is tuned for downscaling and expects non-increasing resolutions in an ABR ladder. Increasing resolutions between outputs is supported but will reduce video quality.

  • +
+
+

Note

+

The MA35D ABR scaler is tuned for downscale ratios of up to 3, e.g., from 2160p to 1080p or 720p. For larger ratios, it is recommended to generate intermediary scales, of ratios below 3.

+

As an example, the following FFmpeg command downscales a HEVC 4k content to 540p, by creating an intermediary step, where input is initially scaled from 4k to 1080p:

+

ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v hevc_ama -i <4K INPUT> -filter_complex "[0:v]scaler_ama=outputs=2:out_res=(1920x1080|full)(960x540|full)[n][f]" -map '[f]' -c:v h264_ama -y -f mp4 <540 OUTPUT> -map '[n]' -f null /dev/null

+
+
+
+

Video Quality

+

The MA35D card nominally produces video quality (VQ) that is closely correlated to x264 medium, x265 medium and x265 slow presets, with respect to its accelerated AVC, HEVC and AV1 encoders. Furthermore, in case of AV1 encoders, -type-1 AV1 matches a similar VQ as x265 slow; whereas, -type-2 that of x265 medium. This video quality is highly dependent on video content so actual results may vary.

+
+
+

Performance Tables

+

The video processing power of the MA35D cards can be harnessed in many different ways, from running a few high-definition jobs to running many low-resolution ones, with or without scaling. The tables below show how many jobs can be run at real-time speed based on the use case and the number of cards available. All these configurations have been tested and validated by AMD and assume normal operating ranges.

+
+

Note

+
    +
  1. In the following tables, density numbers linearly scale to up to 16 devices.

  2. +
  3. It is assumed that per device, host chassis has set aside 8 hyper-threaded cores with 12GB of RAM.

  4. +
+
+
+

Note

+

To meet the following density numbers for 30 FPS pipelines or VP9 decoding, it is recommended to decrease LA depth incrementally, until target density objectives are met. Refer to Automatic Look Ahead Depth Calculation for valid range of LA depth.

+
+

The following tables present density numbers for typical video renditions. However, it should be noted that encode capability of each engine, 4 per device, is best described as aggregated 4kp60. This, among other things, implies that densities of 4x1080p60 or rate of 1x1080p240 can be achieved. The latter implies that a 1080p60 VOD asset can be encoded at 4 times the speed. Furthermore, speed up rate holds linearly for renditions down to 540p30. To encode two Faster Than Real Time (FTRT) jobs on a single device, each job must be assigned to a dedicated slice. See -slice for details.

+

In tables, below, Single Density refers to any combination of AVC, HEVC or AV1 Type-2 encoders, whereas, Double Density refers to any combination of AVC, HEVC or AV1 Type-2 encoders along with AV1 Type-1 encoder.

+

It is noted that with respect to Transcode with Scale Jobs Tables, below, the output of a decoder can be split and encoded with any combination of AMA encoders. This in turn implies that the expected density numbers can vary from reported Single Density to Double Density, depending on encoder selection, for each output of the scaler.

+

To fully utilize all devices on a card and reach the stated densities, device selection needs to be explicitly done in a command line. See -hwaccel and Using Explicit Device IDs for more details. Refer to Full Double Density for an example on how to deploy double density pipelines.

+
+

Performance Tables for 8-bit Color

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode Jobs per Card (8-bit)

Transcode Use Case

Single Density -preset fast

Single Density -preset [ medium | slow ]

Double Density

4kp75 (See -preset fast)

4

0

0

4kp60

4

4

8

4kp30

8

8

16

1080p60

20

16

32

1080p30

40

32

64

720p60

40

32

64

720p30

84

68

136

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode with Scale Jobs per Card (8-bit)

Transcode with Scale Use Case

Single Density

Double Density

4kp60 to 1440p60

4

8

4kp30 to 1440p30

8

16

1080p60 to 720p60

16

32

1080p30 to 720p30

32

64

720p60 to 540p60

32

64

720p30 to 540p30

68

136

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time ABR Ladders (8-bit)

ABR Ladders Use Case

1 Card

2160p60 to 1440p60, 1080p60, 720p30, 480p30, 360p30, 240p30, 144p30

4

2160p30 to 2160p30, 1440p30, 1080p30, 720p30, 480p30, 360p30, 240p30, 144p30

4

1080p60 to 1080p60, 720p60, 720p30, 480p30, 360p30, 160p30

8

1080p60 to 720p60, 720p30, 480p30, 360p30, 160p30

16

1080p30 to 1080p30, 720p30, 480p30, 240p30

16

720p30 to 720p30, 480p30, 240p30

40

+
+
+

Performance Tables for 10-bit Color

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode Jobs per Card (10-bit)

Transcode Use Case

Single Density -preset fast

Single Density -preset [ medium | slow ]

Double Density

4kp75 (See -preset fast)

4

0

0

4kp60

4

4

8

4kp30

8

8

16

1080p60

20

16

32

1080p30

40

32

64

720p60

40

32

64

720p30

84

68

136

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode with Scale Jobs per Card (10-bit)

Transcode with Scale Use Case

Single Density

Double Density

4kp60 to 1440p60

4

8

4kp30 to 1440p30

8

16

1080p60 to 720p60

16

32

1080p30 to 720p30

32

64

720p60 to 540p60

32

64

720p30 to 540p30

68

136

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time ABR Ladders (10-bit)

ABR Ladders Use Case

1 Card

2160p60 to 1440p60, 1080p60, 720p30, 480p30, 360p30, 240p30, 144p30

4

2160p30 to 2160p30, 1440p30, 1080p30, 720p30, 480p30, 360p30, 240p30, 144p30

4

1080p60 to 1080p60, 720p60, 720p30, 480p30, 360p30, 160p30

8

1080p60 to 720p60, 720p30, 480p30, 360p30, 160p30

16

1080p30 to 1080p30, 720p30, 480p30, 240p30

16

720p30 to 720p30, 480p30, 240p30

40

+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/troubleshooting.html b/v1.1.2/troubleshooting.html new file mode 100644 index 00000000..e14b8791 --- /dev/null +++ b/v1.1.2/troubleshooting.html @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) Troubleshooting — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA) Troubleshooting
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA) Troubleshooting

+ +
+

Overview

+

This section describes various troubleshooting methods and workarounds for some known issues such as out of memory errors, low frame-rate, etc.

+
+

No Device Showing in lspci

+

If lspci -d 10ee: does not show any of MA35D devices and dmesg has no indication of such devices being detected, then this could indicate issues with:

+
    +
  1. BIOS

  2. +
  3. PCIe slot

  4. +
+
+
Workaround:

Ensure that your BIOS is up to date and properly configured. See BIOS setting.

+

Switch to a known working PCIe slot, to isolate possible PCIe slot issues.

+
+
+
+
+

Single Device per Card

+

If SDK has access to only a single device on a card, i.e.,:

+
lspci -d 10ee:
+
+
+

returns half the expected devices, then bifurication has not been enabled in the BIOS.

+

Workaround: Check your BIOS and enable 4x4 PCIe bifurcation on each slot with a MA35 card.

+
+
+

Memory Usage

+

Messages such as:

+
    +
  • ERROR: from element xxxxx: Internal data stream error.

  • +
  • ERROR [Channel] Cannot create channel: DeviceAllocate failed

  • +
+

...

+

, indicate memory pressure on the accelerator card.

+

Workaround: Other than the obvious over-subscription use-cases, these issues can be resolved by decrementing the lookahead buffer size.

+
+
+

AV1 Slow Playback

+

An AV1 HLS stream may playback at slower than real time speeds.

+

Workaround: Recommend explicitly setting of FPS playback frame rate when using ffplay or use ffplay from FFmpeg 5.1.2 or 6.0.

+
+
+

AV1 MP4 Playback

+

AV1 muxed into an MP4 container may not play back properly.

+

Workaround: Recommend playback of raw video using more recent versions of ffplay (n5.1.2 or later) or more recent versions of media players such as VLC v3.0.17.4. Alternatively, muxing the raw video into an IVF container format is also permitted.

+
+
+

30 FPS Density

+

30 FPS transcodes and below can not run at full density with default lookahead depth.

+

Workaround: Decrease lookahead depth or density. Required decrease is dependent upon resolution/frame rate. See Performance Tables Section for details.

+
+
+

Gstreamer Variable Frame Rate

+

Variable frame rate files are not supported by the Gstreamer AMA plugins.

+

Workaround: Turn XRM off and add a videorate filter and caps filter before the encoder to set a fixed frame rate.

+
+
+

400 Mbps Max Bit Rate

+

Encoders do not support a target or max bitrate above 400 Mbps.

+

Workaround: This issue can be avoided by constraining the bitrate values below to 400 Mbps.

+
+
+

Many Parallel Encodes

+

Encountering Cannot create channel: DeviceAllocate failed error, when running high number of encoding operations in parallel.

+

Workaround: Reduce the memory requirements by lowering the lookahead depth of the encoding operation. This can be controlled with the -lookahead_depth argument. Default values depend on the FPS and bitdepth of the input source. The following are some starting points:

+
+

30fps: -lookahead_depth 26 (reduce by steps of 2)

+

60fps: -lookahead_depth 46 (reduce by steps of 4)

+
+
+
+

HDR & spatialAqGain

+

Encoding HDR content with a spatialAqGain of 1 or 2 is not supported.

+

Workaround: Using the default values of spatialAqGain is recommended for best video quality when possible. If it is desirable to reduce the spatialAqGain from the recommended range of 60 - 100, using a value of 3 or greater will avoid this issue.

+
+
+

Nonresponsive Devices

+

It is possible that codec services and utilities may become unavailable, due to crashed SDK driver and as such mamgmt reset will not be able to reset any of the available devices.

+

Workaround: Execute the following commands:

+
sudo rmmod ama_transcoder
+sudo modprobe ama_transcoder
+
+
+

If removal and reloading of the driver does not work, then system reboot is required.

+
+
+

Codec Issues in VM

+

If codec operations are hanging in a VM, while the following sudo dmesg -w output log is observed:

+
...
+[  323.436842] ama_transcoder0 0000:05:00.0 hdma: warning:hdma_link_rc2ep_xfer status is done, c:2,status=0x1,condition=0
+[  323.440802] ama_transcoder0 0000:05:00.0 hdma: dir:rc2ep element_cnt=1 channel:2 link_table_pa:0x160000
+[  323.443387] ama_transcoder0 0000:05:00.0 hdma: ctl:0x01 size:0x4 sh:0x2 sl:0x97e00000 dh:0x0 dl:0x20831000
+[  323.445538] ama_transcoder0 0000:05:00.0 hdma: end ctrl:0x06 rsv:0x0 llp_h:0x0 llp_l:0x160000
+[  323.447257] ama_transcoder0 0000:05:00.0 hdma: rc2ep PF c=2 0x500 = 0x1
+...
+
+
+

, with host reporting IO_PAGE_FAULT in its dmesg logs, then this is an indication of a mis-configured VM.

+

Workaround: Ensure that VM has been properly created as per Virtualization.

+
+
+

Cannot Assign a VF to a VM

+

If passing a VF to a VM fails, this could be due to VF not getting its own IOMMU group. To check this, run the following command:

+
for a in /sys/kernel/iommu_groups/*; do find $a -type l; done | sort --version-sort
+
+
+

, and ensure that VF is assign to a unique group. As an example, the following output shows that VF associated with device 0000:02:00.0 , i.e., 0000:02:00.1, has its own unique group 34:

+
...
+/sys/kernel/iommu_groups/34/devices/0000:02:00.1
+...
+
+
+

Workaround: Ensure that ACS has been enabled in the BIOS.

+
+
+

Cannot Flash the Card

+

While attempting to update the firmware with satellite controller version 9.7.35, the following message may appear:

+
...
+Device: 0000:e2:00.0
+**** ERROR Programming BMC-MSP432.bin of type [SC] SC is accessing flash, pls try FW update after sometime.
+...
+
+
+

Workaround: Wait for 10 minutes and try to flash again.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/tuning_pipeline_latency.html b/v1.1.2/tuning_pipeline_latency.html new file mode 100644 index 00000000..d6cc3dac --- /dev/null +++ b/v1.1.2/tuning_pipeline_latency.html @@ -0,0 +1,321 @@ + + + + + + + + + + + + + + + Tuning Latency — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tuning Latency
  • +
  • +
  • +
+
+
+
+
+ +
+

Tuning Latency

+ +

Latency tuning allows for trade off among end to end delay, video bit rate, GOP composition, etc. Interactive applications that require low latency, can do so by setting relevant parameters in the video pipeline. It is understood that lowering the latency comes at the cost of increased bit rate, for a given visual quality.

+
+

Decoder Latency

+

Decoding latency can be reduced by enabling the -low_latency option, in FFmpeg.

+
+
+

Scaler Latency

+

Scaling latency can be reduced by disabling the enable_pipeline option, in FFmpeg. However, note that this will have a negative impact on scaler's performance.

+
+
+

Encoder Latency

+

AMD AMA Video SDK encoder performs multi-objective optimization with set constraints on bit rate, GOP topology, visual quality measures, etc. As such, it may be tuned to achieve a compromise between latency and quality or be specialized to ultra low latency.

+
+

Guidelines on Encoder Latency Configuration

+

Encoding latency can also be reduced by trading off compression rate or visual quality. The following table lists the encoder options which can used to reduce to that effect.

+ ++++ + + + + + + + + + + + + + +

Encode Options

Notes

Look Ahead Depth

+
For best visual quality, it is recommend to let the buffer depth be determined automatically. If it is found that the selected depth adds unacceptable delay, then this option can be set explicitly. Supported range is 0 - 46+number of B frames.
+
+

Number of B frames

+
It is understood that for every inserted B frame there will be a frame period delay.
+
+
+

See Encoding Compatibility Matrix combination of allowable parameters.

+
+
+

Automatic Look Ahead Depth Calculation

+

The default VQ optimized look ahead buffer depths are:

+
+
    +
  1. 800 ms for 8 bit

  2. +
  3. 600 ms for 10 bit

  4. +
+
+
+
+

Ultra Low Latency (ULL) Mode

+

Ultra Low Latency (ULL) encoding is enabled by setting -lookahead_depth flag to 0.

+

Notes

+
    +
  • In ULL encoding mode, frames are always processed in display order. As such, this mode is not compatible with B frames. Furthermore, only Constant Quantization Parameter (CQP) and Constant Bit Rate (CBR) options are allowed. See -control_rate.

  • +
+
+

Latency Adjustment

+

The overall latency can be further tuned by adjusting the -bufsize parameter. This parameter allows for tuning strict and relaxed ULL modes. Both relaxed ULL and strict ULL modes have the lowest achievable encoding latency, in AMD AMA SDK. Strict ULL has lower transmission latency than relaxed ULL, by restricting frame size variations at the expense of lower VQ. Relaxed ULL has better VQ than strict ULL, by allowing larger frame size variations. Such variations may results in higher transmission latency, depending on network bandwidth.

+
+
+
+
+

FFmpeg Latency Measurements

+

Latency measurements can be obtained by configuring Unified Logging. The following example demonstrates how to measure decoder, encoder and end to end latencies:

+
export LOG_AMA_CONFIG="destination=file, location=log.txt, max_size=1000MB | log_level=WARN | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=1"
+export LOG_AMA_FILTER_PERF="*.*=INFO"
+ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoder0   -re -c:v h264_ama  -low_latency 1 -i h264_1080p30.mp4 -c:v av1_ama -lookahead_depth 0 -f null /dev/null
+
+
+

The log file tracks all timing info for all components of the pipeline. To generate a human readable output, use the parse_logs.py utility. This script will generate an output the looks like the following:

+
============================ INSTANCE INFO START ===============================
+
+DEC ::
+     0. h264_ama@0x564cbc07cc40
+             DECODER { PerfBeg, PerfEnd }
+             DECSDK::DWLReserveCmdBuf { PerfBeg, PerfEnd }
+             DECSDK::rsv_osalsubmit { PerfBeg, PerfEnd }
+             DECSDK::rsv_osalwait { PerfBeg, PerfEnd }
+             DECSDK::DWLDMA_RC2EP { PerfBeg, PerfEnd }
+             DECSDK::DWLEnableCmdBuf { PerfBeg, PerfEnd }
+             ...
+ENC_0.ENCODER latency = 33.431 ms (APPLICATION LEVEL)
+      (PerfBeg@av1_ama@0x560d0c196540-ENCODER --> PerfEnd@av1_ama@0x560d0c196540-ENCODER)
+ENC_0.ENCODER::PutFrame latency = 0.057 ms
+      (PerfBeg@av1_ama@0x560d0c196540-ENCODER::PutFrame --> PerfEnd@av1_ama@0x560d0c196540-ENCODER::PutFrame)
+ENC_0.Encoder::SDK latency = 4.442 ms
+      (PerfBeg@av1_ama@0x560d0c196540-Encoder::SDK --> PerfEnd@av1_ama@0x560d0c196540-Encoder::SDK)
+ENC_0.ENCODER::GetPkt latency = 0.009 ms
+     (PerfBeg@av1_ama@0x560d0c196540-ENCODER::GetPkt --> PerfEnd@av1_ama@0x560d0c196540-ENCODER::GetPkt)
+PostDecode_CH1 latency = 33.458 ms
+     (PerfEnd@h264_ama@0x560d0c194980-DECODER --> PerfEnd@av1_ama@0x560d0c196540-ENCODER)
+
+End2End_CH1 latency = 168.958 ms
+     (PerfBeg@h264_ama@0x560d0c194980-DECODER --> PerfEnd@av1_ama@0x560d0c196540-ENCODER))
+
+
+

The above delineates component based and end to end timing information. In this example, the end to end delay is 168.985 [ms] and the encoder delay of 33.431 [ms].

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/tuning_video_quality.html b/v1.1.2/tuning_video_quality.html new file mode 100644 index 00000000..eddc59e2 --- /dev/null +++ b/v1.1.2/tuning_video_quality.html @@ -0,0 +1,375 @@ + + + + + + + + + + + + + + + Tuning Video Quality — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tuning Video Quality
  • +
  • +
  • +
+
+
+
+
+ +
+

Tuning Video Quality

+ +

The quality of encoded video depends on various factors. It is primarily a function of the target bit rate and the type of video content. However, there are some encoder parameters which can be used to adjust the video quality. This document describes the major parameters impacting video quality, as they specifically pertain to AMA SDK compatible devices. These parameters and the underlying concepts are applicable whether using FFmpeg or the C example programs.

+

Currently, there are 3 significant parameters that effect the visual quality of the video:

+
    +
  1. Metric, which is specified by -tune_metrics

  2. +
  3. Latency, which is specified by -lookahead_depth

  4. +
  5. Preset, which is specified by -preset

  6. +
+

Sections below will describe each of these parameters in detail.

+

Various examples illustrating the effect of these settings can be found here:

+ +
+

Metrics

+

This parameters defines means of scoring the observed video quality, for both subjective and objective measures. To control this parameter, set -tune_metrics to its desired target value. It is important to note that the encode engine has specific optimizations per mode, e.g., while setting the -tune_metrics parameter to 1, will optimize the visual quality, it may not necessarily provide the best PSNR, SSIM or VMAF scores.

+
+
+

Latency

+

Through this parameter one has the ability to control the end to end delay, within a transcode pipeline. See Tuning Latency of Transcode Pipeline for more details. It is understood that typically allowing for more delay in a pipeline, results in a better visual quality, e.g., increasing the depth of the look ahead buffer, results in a higher score, for a given bit rate. This parameter is controlled -lookahead_depth. See FFmpeg Video Quality for example usage. Note that look ahead depth can be reduced to 15 frames with (limited) impact to video quality.

+
+
+

Preset

+

Speed preset determines the amount of time that is spent in encoding the incoming bit stream. This time in turn is determined by the number of encode optimization tools deployed, during the encoding process. Specifically, for this release, motion vector search range, Rate-Distortion Optimized Quantization (RDOQ) and other such tools are used to enhance the visual quality, at the expense of processing time. For example, -preset slow provides about 2% improvement, in terms of BD Rate, for AVC encoding, while decreasing the throughput by 20%. It should be noted that slow preset also increases the ULL mode latency, by 25%. See FFmpeg quality analysis examples for example usage. Note that the specific values noted in these example are the only ones that are recommended for usage.

+
+
+

GOP Composition

+

By default, the GOP structure of all AMD AMA encoders is configured to ensure optimal VQ. This implies that GOP topologies among different encoders may not be the same or the GOP itself may not have a homogeneous structure. As an example, while both AVC and HEVC encoders use hierarchical B frames, to further enhance AVC's VQ measure, unidirectional B frames that only reference prior anchor frames are also used. See -no_bll for how to turn this option off.

+
+
+

ROI

+

AMA SDK allows for further enhancement, in subjective VQ, by utilizing ML driven encoding. This is achieved by encoding regions with high probability of face and text classes, with lower QP values. Such improvements are most visible, when encoding high resolution video streams with low bit rates. As such, video conferencing applications, where faces do not occupy the majority of the frame area and are larger than 5x5 pixels, are most amenable to ROI based encoding. ROI model sensitivity, i.e., its probability mapping to QP gain, can be tuned by strength parameter. It should be noted, as with all subjective improvements, the resulting objective measures, e.g., SSIM, VMAF, etc. may not reflect such improvements. See Video Machine Learing and examples therein for sample usage.

+
+
+

AV1 Type Selection

+

AMD AMA Video SDK offers 2 flavors of AV1 encoding: the default type 1 and type 2. For most use-cases, it is recommended to stay with the default value, as it not only provides better visual quality, but also provides per frame objective stats. However, given that these 2 encoders employ 2 independent pipelines if the primary concern is to increase the number of encoded streams, then addition of type 2 AV1 will increase the channel density.

+
+
+

Dynamic Encoder Parameters

+

Dynamic parameters are parameters which can be changed during runtime. This is useful to optimize video quality and compression rate for different segments of the video. This capability is supported for FFmpeg and GStreamer.

+

The following encoder parameters can be dynamically modified:

+
    +
  • Number of B frames (0 to 4)

  • +
  • Min/Max bitrate (0 to INT_MAX)

  • +
  • Bitrate (0 to INT_MAX) (Should be in Min-Max bit rates range)

  • +
  • Temporal AQ mode (0 to 1)

  • +
  • Temporal AQ gain (0 to 255)

  • +
  • Spatial AQ mode (0 to 1)

  • +
  • Spatial AQ gain (0 to 255)

  • +
  • Min/Max QP (See QP Ranges)

  • +
  • QP (See QP Ranges) (Should be in Min and Max QP range)

  • +
  • QP I frame offset (See QP Ranges) (Should be in Min and Max QP range)

  • +
  • QP B frame offset (See QP Ranges) (Should be in Min and Max QP range)

  • +
+
+

Note

+

AVC and HEVC QP ranges are 0-51

+

AV1 QP range is 0-255

+
+

When using FFmpeg or GStreamer, the encoder parameters which should be changed are specified in a configuration file as key-value pairs. This means that these key-value pairs must be known ahead of time.

+

Dynamic Parameters Considerations

+
    +
  • Recommended settings for dynamic B frames are:

    +
      +
    • 0 for gaming clips with fast motion, camera pan/rotation scenes

    • +
    • 2 for static or slow moving scenes, talking heads, or video conferencing type of content

    • +
    • 1 for all medium motion and all other content

    • +
    +
  • +
  • B frames changes do not happen at the exact frame number specified. Instead, the change comes into effect one or two frames from the actual frame number specified in the config file.

  • +
  • The maximum value for the number of B frames is the value configured at initilization

  • +
  • The configuration files for dynamic parameters must comply with the format specified above. Ill-formed files may result in unexpected behavior.

  • +
+

FFmpeg

+

Encoder parameters which should be changed dynamically are specified as key-value pairs in a configuration file. This configuration file is provided to FFmpeg using the -dynamic_params_file encoder option.

+

The -dynamic_params_file option is specific to an encoded output. For use cases with multiple encoded outputs (such as ABR ladders), each output can have its own -dynamic_params_file option and associated configuration file.

+

The configuration file should contain one line for each frame where one or more parameters are changed. Each line should start with the frame number followed by a list of key-value pairs for all the modified parameters:

+
<frameNumberN1>:<key1>=<value1>
+<frameNumberN2>:<key2>=<value2>,<key3>=<value3>
+
+
+

Below is a table listing the parameters which can be changed at runtime, the corresponding key and valid values.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Dynamic Parameter

Key

Valid Values

Number of B frames

NumB=<int>

0 to 4

Min/Max bit rate

MinBRkbps=<int>

0 to INT_MAX

Max bit rate

MaxBRkbps=<int>

0 to INT_MAX

Bitrate (in bits per second)

BRkbps=<int>

0 to INT_MAX

Temporal AQ mode

tAQ=<int>

0 to 1

Temporal AQ gain

tAQGain=<int>

0 to 255

Spatial AQ mode

sAQ=<int>

0 to 1

Spatial AQ gain

sAQGain=<int>

0 to 255

Min/Max QP

MinQP=<int>,MaxQP=<int>

See QP Ranges

QP

QP=<int>

See QP Ranges

QP I frame offset

QPOffsetI

See QP Ranges

QP B frame offset

QPOffsetB

See QP Ranges

+

Sample FFmpeg encode command:

+
ffmpeg -hwaccel ama -re -f lavfi -i testsrc=duration=60:size=1920x1080:rate=60,format=yuv420p -f rawvideo  -vf "hwupload" -c:v hevc_ama -b:v 5M  -dynamic_params_file ./param.txt -y -f rawvideo  output.h265
+
+
+

Sample configuration file for dynamic parameters:

+
300:NumB=1
+600:BRkbps=6000
+1200:sAQ=1,sAQGain=50
+1800:tAQ=1,tAQGain=50
+2400:NumB=0,BRkbps=10000,sAQ=0,sAQGain=50,tAQ=0
+5000:MinQP=30,MaxQP=35
+
+
+

GStreamer

+

Gstreamer uses the same formated configuration file as FFmpeg:

+
gst-launch-1.0 fakesrc sizetype=fixed sizemax=4147200 num-buffers=4000 ! capsfilter caps='video/x-raw' ! rawvideoparse width=1920 height=1080 format=i420 framerate=60/1 ! ama_upload ! ama_h265enc encoding-params-file=./param1.txt ! fakesink
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/unified_logging.html b/v1.1.2/unified_logging.html new file mode 100644 index 00000000..7d1240cb --- /dev/null +++ b/v1.1.2/unified_logging.html @@ -0,0 +1,419 @@ + + + + + + + + + + + + + + + Unified Logging — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Unified Logging
  • +
  • +
  • +
+
+
+
+
+ +
+

Unified Logging

+ +

Unified Logging (UL) utility is aimed at providing an identical logging output, configuration and interaction for different video frameworks provided by AMD AMA Video SDK. Three environmental variables LOG_AMA_CONFIG, LOG_AMA_FILTER and LOG_AMA_FILTER_PERF control interactions with UL. LOG_AMA_CONFIG variable controls the global setting of logging, which includes log destination, max size, log source info, and log levels. LOG_AMA_FILTER variable filters the global configuration and narrows down the logging output to specific software layer, accelerator type or level. LOG_AMA_FILTER_PERF variable controls the flow of performance related logs. The following sections describe the configuration parameters of each variable.

+
+

LOG_AMA_CONFIG

+

LOG_AMA_CONFIG is utilized as follows:

+
export LOG_AMA_CONFIG="[key=value | ...]"
+
+
+

, where key and value are defined as:

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key

value

Description

destination

console, file, syslog, release_preset or debug_preset

Determines the target destination of output logs.

+

console: Terminal output

+

file: Defaults to "async=1, max_size=10MB, location=log_ama_<pid>_<timestamp>.txt"

+

syslog: Defaults to "async=1, location=localhost, facility=LOCAL0"

+

release_preset: Shortcut for "destination=syslog, async=1 | log_level = WARN| perf_log=0 | debug_file_name=0 | debug_thread = 0 | debug_pid=0 | debug_time_stamp=0"

+

debug_preset: Shortcut for "destination=file, max_size=1GB | log_level = DEBUG | async=1 | perf_log=1 | debug_file_name=1 | debug_thread = 1 | debug_pid=1 | debug_time_stamp=1"

+

async refers to asynchronous mode of write operation

+

location refers to output path of logs

+

log_level

FATAL, ERROR, WARN, INFO, DEBUG, TRACE or ALL

Determines the log level.

+

Defaults to WARN

+

perf_log

0 or 1

Enables or disables performance measurements. If enabled, minimal information log level is set. Otherwise, log level is set by log_level.

+

Defaults to 0

+

debug_file_name

0 or 1

Enables or disables addition of log file names.

+

Defaults to 0

+

debug_file_line

0 or 1

Enables or disables inclusion of log line numbers.

+

Defaults to 0

+

debug_time_stamp

0 or 1

Enables or disables addition of timestamps.

+

Defaults to 0

+

debug_pid

0 or 1

Enables or disables reporting of process id.

+

Defaults to 0

+

debug_thread

0 or 1

Enables or disables reporting of thread id.

+

Defaults to 0

+
+
+
+

LOG_AMA_FILTER

+

LOG_AMA_FILTER is utilized as follows:

+
export LOG_AMA_FILTER="[LAYER.ACCEL=log_level | ...]"
+
+
+

, where LAYER and ACCEL are defined as:

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LAYER

Description

SDK

Any user space library

VPI

Video processing plugins

XMA

XMA library

FFMPEG

FFmpeg plugins

GST

Gstreamer plugins

GEN

General and common layers

XRM

XRM library

+ ++++ + + + + + + + + + + + + + + + + + + + +

ACCEL

Description

ABR

ABR ladder

DEC

Decoder

ENC

Encoder

GEN

General hardware logs

+
+
+

LOG_AMA_FILTER_PERF

+

LOG_AMA_FILTER_PERF is utilized as follows:

+
export LOG_AMA_FILTER_PERF="[LAYER.ACCEL=log_level | ...]"
+
+
+

, where LAYER and ACCEL are defined as above.

+
+
+

Examples

+
    +
  1. Send output to log_ama_<pid>_<timestamp>.txt file, and set log_level to warning:

    +
    export LOG_AMA_CONFIG="destination=file | log_level=WARN | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  2. +
  3. Send output to /tmp/log_ama.txt file, and set log_level to info:

    +
    export LOG_AMA_CONFIG="destination=file, location=/tmp/log_ama.txt | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  4. +
  5. Send output to /tmp/log_ama.txt file, and set log_level to info, with max log file size equal to 100MB:

    +
    export LOG_AMA_CONFIG="destination=file, max_size=100MB, location=/tmp/log_ama.txt | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  6. +
  7. Get output on console, with log_level set to info:

    +
    export LOG_AMA_CONFIG="destination=console | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  8. +
  9. Assume log_level was WARN in LOG_AMA_CONFIG, the following filter will additionally enable TRACE log level of VPI layer for ABR plugins:

    +
    export LOG_AMA_FILTER=" VPI.ABR=TRACE"
    +
    +
    +
  10. +
  11. If we want all layers logs for ABR:

    +
    export LOG_AMA_FILTER=" *.ABR=TRACE"
    +
    +
    +
  12. +
  13. If we want all layers logs for ABR & ENC:

    +
    export LOG_AMA_FILTER=" *.ABR=TRACE | *.ENC=TRACE"
    +
    +
    +
  14. +
  15. Force all logs to ERROR, and generate debug logs from SDK for ABR type:

    +
    export LOG_AMA_FILTER=" *.*=ERROR | *.ABR=DEBUG"
    +
    +
    +
  16. +
  17. Set performance logs to info level:

    +
    export LOG_AMA_CONFIG="destination=file, location=log_ama_perf.txt | log_level=WARN | perf_log=1"
    +
    +
    +
  18. +
  19. Set performance log level to DEBUG for ABR at SDK layer:

    +
    export LOG_AMA_FILTER_PERF="SDK.ABR=DEBUG"
    +
    +
    +
  20. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/using_ffmpeg.html b/v1.1.2/using_ffmpeg.html new file mode 100644 index 00000000..ed085056 --- /dev/null +++ b/v1.1.2/using_ffmpeg.html @@ -0,0 +1,1536 @@ + + + + + + + + + + + + + + + Using FFmpeg — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Using FFmpeg
  • +
  • +
  • +
+
+
+
+
+ +
+

Using FFmpeg

+

This page documents how to use FFmpeg with the AMD AMA Video SDK.

+ +
+

+
+
+

Introduction

+

FFmpeg is an industry standard, open source, widely used utility for handling video. FFmpeg has many capabilities, including encoding and decoding of all video compression formats, encoding and decoding of audio, encapsulating, and extracting audio, and video from transport streams, and many more. The AMD AMA Video SDK includes an enhanced version of FFmpeg, version n4.4, which communicates with the hardware accelerated transcode pipeline.

+

It is not within the scope of this document to provide an exhaustive guide on the usage of FFmpeg. Various resources can be found online, for example:

+ +

The following sections describe the options used with FFmpeg to configure the various hardware accelerators available on an MA35 device.

+
+

+
+
+

Example Commands

+

A simple FFmpeg command for accelerated transcoding with the AMD AMA Video SDK will look like this one:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i infile.mp4 -c:v hevc_ama -b:v 1000K -r 60 -f mp4 -y transcoded.mp4
+
+
+

There are many other ways in which FFmpeg can be used to leverage the video transcoding features of an MA35 device. Examples illustrating how to run FFmpeg for encoding, decoding, and transcoding with or without ABR scaling, video composition and ML are included in FFmpeg tutorials.

+
+

+
+
+
+

General FFmpeg Options

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
General FFmpeg Options

Options

Descriptions

+
+-i
+
+ +
+
Input video URI.
+
+
+
+-c:v
+
+ +
+
Specify the video codec
+
This option must be set for any video stream processed on an MA35 device.
+
Valid decode values are vp9_ama, h264_ama, hevc_ama, and av1_ama for VP9, H.264, HEVC, and AV1, respectively.
+
Valid encode values are h264_ama, hevc_ama, and av1_ama for H.264, HEVC, and AV1, respectively.
+
+
+
+-s
+
+ +
+
The frame size (WidthxHeight). For example 1920x1080 or 3840x2160.
+
+
+
+-f
+
+ +
+
The container format.
+
+
+
+-r
+
+ +
+
The frame rate in fps (Hz).
+
+
+
+-filter_complex
+
+ +
+
Used for frame filtering operation.
+
+
+
+-hwaccel
+
+ +
+
Global option used to specify on which MA35 device the FFmpeg job should run. Consult Using Explicit Device IDs for more details on how to use this option. Valid values are positive integers in [0..N-1] range. Default is device 0.
+
+
+
+-vf
+
+ +
+
Specify DMA direction. Valid options are hwdownload and hwupload, for DMA transfer of data to and from the host, respectively. Note that transaction directions are with respect to the host.
+
+
+
+

Note

+

Detailed help for encoder, decoder and scaler is obtained through FFmpeg extended help, e.g. ffmpeg -h encoder=h264_ama, ffmpeg -h decoder=hevc_ama or ffmpeg -h filter=scaler_ama.

+
+

The following conventions are used in the following tables:

+
    +
  1. When parameters can be specified as both numerical and string values, they are noted as:

    +
    (<number>) <string>
    +
    +
    +

    Conversely, when this is not the case, options are noted with Roman numerals as:

    +
    <Roman numeral>) <option>
    +
    +
    +
  2. +
  3. auto or -1 note that values are selected by the SDK to optimally meet the specified constraints.

  4. +
+
+

+
+
+
+
+

Video Decoding

+

For the complete list of features and capabilities of the AMD AMA Video SDK decoder, refer to Release Notes chapter of the documentation.

+

The table below describes all the options for the AMD AMA Video SDK decoder.

+ + ++++ + + + + + + + + + + + + + +
Video Decoding Options

Options

Descriptions

+
+-out_fmt
+
+ +
+
Decoder output pixel format
+
Valid global values for pixel format: nv12, p010le, packed10, rgbp, yuv420p, and yuv420p10le.
+
Note that an identical pixel format must be specified as value to format option, within -vf. See Decode Only for an example.
+
+
+
+-low_latency
+
+ +
+
Enable/Disable single frame level decode
+
When enabled, the decoding latency of streams not containing any B frames is reduced. This option has no impact on streams that include B frames.
+
Valid values: 0 or 1. (default is 0)
+
+
(0) disable - default
+
(1) enable
+
+
+
+
+

+
+
+
+

Video Encoding

+

For the complete list of features and capabilities of the AMD AMA Video SDK encoder, refer to Release Notes chapter of the documentation.

+

The table below describes all the options for the AMD AMA Video SDK encoder.

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Video Encoding Options

Options

Descriptions

+
+-b:v
+
+ +
+
Specify the video bitrate
+
You can specify this in Mb or Kb. For example -b:v 1M or -b:v 1000K.
+
+
+
+-max_bitrate
+
+ +
+
Maximum bitrate
+
Valid values: 0 to 3.5e+10
+
You may want to use this to limit encoding bitrate if you have not specified a -b:v bitrate
+
Default value -1 implies unspecified.
+
+
+
+-g
+
+ +
+
GOP size
+
Valid values: 0 to UINT32_MAX
+
Default value is -1, implying 2[s] gop duration, i.e., twice the frame rate
+
+
+
+-level
+
+ +
+
Encoding level restriction
+
Valid values for H.264: 1, 1.1, 1.2, 1.3, 2, 2.1, 2.2, 3, 3.1, 3.2, 4, 4.1, 4.2, 5, 5.1, 5.2 6, 6.1, 6.2
+
Valid values for HEVC: 1, 2, 2.1, 3, 3.1, 4, 4.1, 5, 5.1,5.2, 6, 6.1, 6.2
+
Valid values for AV1: 2, 2.1, 3, 4, 4.1, 5, 5.1, 5.2, 5.3 6, 6.1, 6.2, 6.3
+
Default value is auto.
+
+
+
+-profile
+
+ +
+
Set the encoding profile
+
Valid values for H.264: baseline, main, high
+
Valid values for HEVC: main, main-intra, main-10 and main-10-intra
+
Valid values for AV1: main
+
Default value is auto.
+
+
+
+-tier
+
+ +
+
Set the encoding tier (AV1 and HEVC only)
+
Valid values: -1, 0, 1
+
+
(-1) auto
+
(0) main
+
(1) high
+
+
Default value is auto
+
+
+
+-bufsize
+
+ +
+
Rate control (VBV) buffer size
+
Valid values: -1, 400M [bits] (default is -1)
+
+
(-1) For auto selection
+
+
This option is ignored unless:
+
+
1) lookahead_depth is 0 (ULL)
+
2) control_rate is CBR
+
3) Encoder is set to one of h264_ama, hevc_ama or av1_ama Type 2
+
+
Value 0 implies strict ULL, whereas, larger values imply relaxed ULL. See Latency Adjustment.
+
+
+
+-crf
+
+ +
+
Constant Rate Factor
+
Valid values: 0, 1 (default is 0)
+
+
(0) disable - default
+
(1) enable
+
+
This option uses -qp for its quality assignment.
+
Note that this option ignores all other options that may impose restrictions on qp values. These include -min_qp, -max_qp, -b:v, and -control_mode.
+
+
+
+-qp
+
+ +
+
Quantization Parameter
+
Valid values for H.264 and HEVC 0-51
+
Valid values for AV1 0-255
+
Default value -1 implies not used. Note that if this option is used, it implies Constant QP for -control_rate option.
+
+
+
+-bf
+
+ +
+
Number of B frames
+
Valid values for H.264, HEVC and type-2 AV1: 0-3
+
Valid values for type-1 AV1: 0-7
+
Default auto selection value is -1.
+
+
+
+-lookahead_depth
+
+ +
+
Number of frames to lookahead for qp maps
+
Valid values: -1 to 47+Maximum number of B frames -bf
+
Lookahead depth of 0 implies ULL mode
+
Default auto selection value, based on frame rate, is -1.
+
+
+
+-spatial_aq
+
+ +
+
Enable spatial AQ
+
Valid values: auto, disable or enable
+
+
(-1) auto
+
(0) disable
+
(1) enable
+
+
Default value is auto.
+
When qp_mode is uniform, this parameter is ignored and treated as disable.
+
+
+
+-spatial_aq_gain
+
+ +
+
Scale for spatial AQ gain
+
Valid values: 0 to 255
+
+
(255) For auto selection
+
+
Default value for H264, HEVC and AV1 is 64
+
Default value for type-1 AV1 is 72
+
+
+
+-temporal_aq
+
+ +
+
Enable temporal AQ
+
Valid values: auto, disable or enable
+
+
(-1) auto
+
(0) disable
+
(1) enable
+
+
Default value is auto.
+
+
When qp_mode is uniform, this parameter is ignored and treated as disable.
+
+
+
+
+-temporal_aq_gain
+
+ +
+
Scale for temporal AQ gain
+
Valid values: 0 to 255
+
+
(255) For auto selection
+
+
Default value for H264, HEVC and AV1 is 80
+
Default value for type-1 AV1 is 0
+
+
+
+-qp_mode
+
+ +
+
QP control mode
+
Valid values: auto, relative_load and uniform.
+
+
(0) auto for best VQ
+
(1) relative_load implying both spatial and temporal AQ
+
(2) uniform meaning no AQ
+
+
Default value is auto.
+
+
+
+-control_rate
+
+ +
+
Set the rate control mode
+
Valid values: -1 to 4
+
+
(-1) auto
+
(0) const_qp for Constant QP
+
(1) cbr for Constant Bitrate
+
(2) vbr for Variable Bitrate
+
(3) cvbr for Capped Variable Bitrate
+
(4) cabr for content adaptive bit-rate
+
See RC Mode Table for details.
+
+
Default value is auto.
+
+
+
+-min_qp
+
+ +
+
Minimum QP value allowed for rate control
+
Valid values for H264 and HEVC: 0 to 51
+
Valid values for AV1: 0 to 255
+
Default auto selection value is -1.
+
This option has no effect when -control_rate is set to Constant QP (0).
+
+
+
+-max_qp
+
+ +
+
Maximum QP value allowed for rate control
+
Valid values for H264 and HEVC: 0 to 51
+
Valid values for AV1: 0 to 255
+
Default auto selection value is -1.
+
+
+
+-qp_i_offset
+
+ +
+
QP Offset for I Frames
+
Valid values: -51 to 51
+
Auto selection mode is -1.
+
Default 0.
+
+
+
+-qp_b_offset
+
+ +
+
QP Offset for B or P Frames
+
Valid values: -51 to 51
+
Auto selection mode is -1.
+
Default 0.
+
This option has no effect when -control_rate is set to Constant QP (0).
+
+
+
+-forced_idr
+
+ +
+
Force insertion of IDR frames
+
Valid values: 0, 1 (default is 1)
+
+
(0) disable
+
(1) enable - default
+
+
Encodes all the intra frames as IDR
+
+
+
+-slice
+
+ +
+
Select a slice to run an encode job
+
Valid values if xrmd is not used are: 0, 1 (default is 0). If xrmd is active and this option is not set, xrmd will make the slice selection.
+
+
+
+-tune_metrics
+
+ +
+
Enable tuning video quality for the best objective metrics
+
This option optimizes the encoder for the selected tuning metric. See Tuning Video Quality for details.
+
Valid values: 1 to 4 (default is 1)
+
+
(1) vq - default
+
(2) psnr
+
(3) ssim
+
(4) vmaf
+
+
+
+
+-type
+
+ +
+
Applicable to AV1 encoders only
+
Valid values: 1 or 2.
+
+
i) 1 - default
+
ii) 2
+
+
Default value is 1.
+
Consult the AV1 Selection section for more details on how to use this option.
+
+
+
+-preset
+
+ +
+
Encoder VQ-Density preset
+
Valid values: fast, medium or slow. (default is medium)
+
+
(fast) Allows for increase in total throughput from 4kp60 to 4kp75 , when 2 or more channels are used. Does not apply to AV1 -type 1 encoding. Not applicable under ULL setting. Note lower VQ than medium preset is to be expected.
+
(medium) Full density with medium VQ - default
+
(slow) High VQ at lower density. Applicable to 10 bit contents only.
+
+
Consult the Tuning Video Quality section for more details on how to use this option.
+
+
+
+-dynamic_gop
+
+ +
+
Enable dynamic GOP
+
Valid values: -1, 0 or 1.
+
+
(-1) auto
+
(0) disabled
+
(1) enable
+
+
Default value is auto.
+
+
+
+-dynamic_params_file
+
+ +
+
Dynamic configuration file
+
Path to dynamic file location (default is empty)
+
Consult the Dynamic Encoder Parameters section for more details on how to use this option.
+
+
+
+-cores
+
+ +
+
AV1 Type 1 Cores
+
Valid values: 1 or 2
+
+
i) 1 - default, with minimum resolution of 176x144 or 144x176, and aggregate rate of 4kp60
+
ii) 2 - minimum resolution of 720x720, with with aggregate rate of 4kp120, in ULL mode
+
+
+
+
+-latency_ms
+
+ +
+
Look ahead depth in milliseconds
+
Valid values: 0 to 60000
+
Default auto selection value, based on frame rate, is -1.
+
+
+
+-no_bll
+
+ +
+
Disable low latency B frames
+
Valid value: 1
+
Value 1 ensures that the generated GOP has a homogeneous structure. See GOP Composition.
+
+
+

The following table describes relevant parameters that are applicable to each RC mode

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
RC Mode Options

RC Mode

Allowed Options

const_qp

+
Constant QP
+
+
-qp <QP>
+
+
+

cbr

+
Constant Bit Rate
+
+
-b:v <Bit Rate> (ABR mode)
+
-b:v <Bit Rate> -max_bitrate <Bit Rate> (CBR mode)
+
-b:v <Bit Rate> -bufsize 0 ULL mode
+
+
+

vbr

+
Variable Bit Rate
+
+
-b:v <Bit Rate>
+
+
+

cvbr

+
Constrained Variable Bit Rate
+
+
-b:v <Bit Rate> [-min_qp <QP> | -max_qp <QP> | -max_bitrate <max_bitrate>]
+
+
+

crf

+
Constant Rate Factor
+
+
-crf 1 -qp <QP>
+
+
+

cabr

+
Content Adaptive Bit Rate
+
+
-b:v <Bit Rate>
+
+
+
+
+

+
+
+
+

Video Scaling

+

The AMD AMA Video SDK hardware scaler is leveraged in FFmpeg by using the scaler_ama complex filter and the FFmpeg filter graph syntax. This section describes the options of the scaler_ama complex filter.

+
+
+scaler_ama
+

Filter implementing the AMD AMA Video SDK ABR multiscaler. Takes one input and up to 16 output streams. The complete list of options is described below.

+
+ + + ++++ + + + + + + + + + + + + + + + + + + + +
Multiscale Filter Options

Options

Description

+
+outputs
+
+ +
+
Specify the number of scaler outputs
+
Valid values are integers between 1 and desired number of outputs.
+
+
+
+out_res
+
+ +
+
Specify ABR ladder rungs <1>*<16>(WxH|Rate|Format)
+
List of up to 16 tuples of form (Resolution|Rate|Pixel Format). Note that no spaces are allowed before or after |.
+
Valid values for resolution: 176x144 to 3840x2160 - default 1920x1080
+
Valid values for frame rate: half and full - default full, where full refers to the incoming frame rate and half to the half of the incoming frame rate. Note that the first entry in this option must be full rate.
+
Valid global values for pixel format: nv12, p010le, packed10, rgbp, yuv420p, and yuv420p10le
+
+
+
+crop
+
+ +
+
Specify the crop area
+
Filter chain of form out_res=(WXH|Rate|Pixel Format):crop(W|H|x|y), where x and y specify the coordinates of crop on 0,0 top-left coordinate system.
+
+
+
+enable_pipeline
+
+ +
+
Enable pipelining to improve performance
+
Valid values: 0 and 1 (default 1)
+
+
(0) disable
+
(1) enable - default
+
+
Note that enabling this option adds 2 frames worth of latency to the pipeline.
+
+
+
+

+
+
+
+

2D Engine GPU

+

The AMD AMA Video SDK 8-bit 2D GPU is leveraged in FFmpeg by using the 2d_ama complex filter and the FFmpeg filter graph syntax. This section describes the options of the 2d_ama complex filter.

+
+
+2d_ama
+

Filter implementing the AMD AMA Video SDK 2D GPU. Performs various 2D operations such as color space conversion, tiling, etc., via the accelerated engine without relying on the host CPU.

+
+ + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
2D Engine GPU Options

Options

Descriptions

+
+inputs
+
+ +
+
Specify number of inputs
+
Valid values 1 to INT_MAX
+
Default is 2
+
+
+
+processor
+
+ +
+
Specify 2D GPU
+
Valid values are:
+
+
i) rotate for multiples of 90 degree rotations
+
ii) csc for color space conversion
+
iii) subsample for pixel subsampling
+
iv) overlay for video overlay
+
v) tile for tiling operation
+
+
Default is none
+
+
+
+core_id
+
+ +
+
Specify execution core
+
Valid values 0 to 1
+
Default is 0
+
+
+
+shortest
+
+ +
+
Specify multi-video exit condition
+
Force termination when the shortest input terminates
+
Valid values true or false
+
Default false
+
+
+
+w
+
+ +
+
Specify the width of video
+
Valid values 0 to 7680
+
Default is sum of input widths
+
+
+
+h
+
+ +
+
Specify the height of video
+
Valid values 0 to 7680
+
Default is sum of input heights
+
+
+
Specify layout options
+
Specified as NxM, where N*M <=32
+
+
+

In the following table if default value is not specified, it implies none.

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + +
GPU Specific Options

Options

Descriptions

rotate

+
Specify rotation options
+
rotation valid values are 90, 180 and 270
+
+

csc

+
Specify color space conversion options
+
csc valid values are rgb2yuv and yuv2rgb
+
+

subsample

+
Specify 4:2:2 to 4:2:0 conversion
+
No options
+
+

overlay

+
Specify overlay options
+
x horizontal position 0 to 7680
+
y vertical position 0 to 7680
+
Note that inputs to this plugin must have the same frame rate. Use -r to enforce this.
+
+

tile

+
Specify tiling operation
+
No options
+
+
+
+

+
+
+
+

Video Machine Learning

+

This section describes various video ML complex filters of AMA SDK that are utilized using FFmpeg filter graph syntax. Note that supported ROI models are 1080p in landscape mode, 720p in both landscape and portrait modes.

+
+

Inference Engine

+

The AMD AMA Video SDK ML inference engine is leveraged in FFmpeg by using the ml_ama complex filter.

+
+
+ml_ama
+

Filter implementing the AMD AMA Video SDK ML inference engine that executes against a supplied rgbp input and detects face or text classes. Its output is used by downstream components in the pipeline.

+
+ + + ++++ + + + + + + + + + + + + + + + + + + + +
Inference Engine Options

Options

Descriptions

+
+model
+
+ +
+
Specify engine model
+
Valid value roi
+
+
+
+model_args
+
+ +
+
Model specific arguments
+
Valid values for roi: type=face and type=text
+
+
i) type=text - for text detection VQ improvements
+
ii) type=face - for face detection VQ improvements
+
+
+
+
+core_id
+
+ +
+
Specify engine number
+
Valid values: range -1 to 3 or none
+
i) If xrmd is enabled, this will be selected automatically
+
ii) If xrmd is disabled, and core_id is set to -1, then one of 0 to 3 cores will be selected
+
ii) Otherwise, value in 0-3 range will be selected
+
+
+
+nb_inputs
+
+ +
+
Specify number of inputs
+
Valid value: 1
+
Default 1
+
+
+
+
+

ROI Scaler

+

The AMD AMA Video SDK ROI scaler is leveraged in FFmpeg by using software plugin roi_scale_ama complex filter.

+
+
+roi_scale_ama
+

Filter implementing the AMD AMA Video SDK ROI scaler engine that executes against a supplied rgbp input and output of ml_ama. This engine generates metadata used by downstream encoder within the pipeline.

+
+ + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
Scaler Options

Options

Descriptions

+
+cutoff
+
+ +
+
Specify cutoff threshold
+
Valid value range 0-100000
+
Default 5000
+
0-100% range is mapped to 0-100000, e.g., 5.67% is represented as 5670, and is used as shut off threshold for detected ROI regions. That is, if the percentages of detected ROI regions is above cutoff, then ROI directed encoding is disabled..
+
+
+
+strength
+
+ +
+
Specify probability-to-QP conversion gain factor
+
Valid values are low, normal, and high
+
Default is normal
+
Providing high value generates higher QP modulation that signals to encoder to spend more bits on the associated block.
+
+
+
+nb_inputs
+
+ +
+
Specify number of inputs
+
Valid values: range 2 to 4
+
Default 2
+
+
+
+roi_map_type
+
+ +
+
Specify probability-to-QP mapping
+
Valid values are dqp, roi, dqp_and_roi
+
Default dqp
+
+
+
+static_map_file
+
+ +
+
Specify static map file
+
Valid value is the path to rgbp map file.
+
The size of this file is ceil of width and height of incoming video divided by 16, in each dimension.
+
This file contains values in 0-255 range, for each channel, and servers as the lower boundary of probability-to-QP mapping, i.e., maximum of values in this file and ml_ama is used for QP mapping
+
+
+
+
+

ROI Overlay

+

The AMD AMA Video SDK ROI overlay is leveraged in FFmpeg by using software plugin roi_overlay_ama complex filter.

+
+
+roi_overlay_ama
+

Filter implementing the AMD AMA Video SDK ROI overlay that overlays shaded probability rectangles on detected classes.

+
+ + + ++++ + + + + + + + + + + + + + +
Overlay Options

Options

Descriptions

+
+skip_frames
+
+ +
+
Specify overlay period
+
Valid value range 0-255
+
The value toggles overlay rectangles after the specified number of frames.
+
+
+
+highlight_threshold
+
+ +
+
Specify activation threshold
+
Valid value range 0-255
+
Default 128
+
+
+

See ML Based Face ROI and ML Based Text ROI for sample usage.

+
+

+
+
+
+
+

Rebuilding FFmpeg

+

Obtain the zipped version of SDK's FFmpeg source code, from ma35d_sdk_v1.1.2_ffmpeg.zip. Unzip this file into ma35_ffmpeg folder. This folder contains the entire source code for the FFmpeg executable, which is a fork of the main FFmpeg GitHub (release 5.1.2) with AMD plugins patches applied. Due to licensing restrictions, the FFmpeg executable included in the Video SDK is enabled with the AMD AMA Video SDK plugins only.

+

You can rebuild the FFmpeg executable with optional plugins by following the instructions below. Additionally, comprehensive instructions for compiling FFmpeg can be found on the FFmpeg wiki page.

+
    +
  1. Make sure libhugetlbfs-dev, nasm and yasm are installed on your machine.

  2. +
  3. Unzip the downloaded zip file:

    +
    unzip ma35d_sdk_v1.1.2_ffmpeg.zip
    +
    +
    +
  4. +
+
+

and navigate to root folder of the unzipped file.

+
+
    +
  1. Execute the following:

    +
    ./configure --disable-alsa --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --disable-libxcb-shape --disable-xlib --disable-libmfx --disable-vaapi --disable-vulkan --prefix=$PWD --disable-stripping --enable-shared --enable-vpe --enable-libxrm --extra-libs="-L/opt/amd/ama/ma35/lib -lvpi -lroi_scale -llog_ama -lxrm -lxrm_interface -lhugetlbfs -lpthread -lstdc++ -lm -ldl -lrt  /opt/amd/ama/ma35/lib/libxrm.so.1.6.0" --extra-cflags="-I/usr/include -I$PWD -I/opt/amd/ama/ma35/include/xrm_interface/ -I/opt/amd/ama/ma35/include/xrm/ -DSUPPORT_OSAL" --extra-ldflags="-Wl,-rpath=$PWD/libavutil:$PWD/libavfilter:$PWD/libavcodec:$PWD/libavformat:$PWD/libavdevice:$PWD/libswscale:$PWD/libswresample:$PWD:/opt/amd/ama/ma35/lib/"
    +
    +
    +
  2. +
  3. Add any other plugins such as libx264 to the above configure line. (See FFmpeg Compilation Guide for details.) A list of configure options is printed by running configure --help.

  4. +
  5. Type make -j to build FFmpeg. GNU Make 3.81 or later is required.

  6. +
  7. Type make install to install all binaries and libraries you built.

  8. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/using_gstreamer.html b/v1.1.2/using_gstreamer.html new file mode 100644 index 00000000..8079d7e5 --- /dev/null +++ b/v1.1.2/using_gstreamer.html @@ -0,0 +1,1036 @@ + + + + + + + + + + + + + + + Using GStreamer — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Using GStreamer
  • +
  • +
  • +
+
+
+
+
+ +
+

Using GStreamer

+ +
+

Introduction

+

GStreamer is a pipeline-based multimedia framework that links together a wide variety of media processing systems to complete complex workflows. The pipeline design serves as a base to create many types of multimedia applications such as video editors, transcoders, streaming media broadcasters and media players. The AMD AMA Video SDK includes an enhanced version of GStreamer which can communicate with the hardware accelerated transcode pipeline in AMD devices.

+

It is not within the scope of this document to provide an exhaustive guide on the usage of GStreamer. Various resources can be found online, for example:

+ +
+

Overview of the GStreamer Plugins

+

The AMD AMA Video SDK provides the following GStreamer plugins for building hardware-accelerated video pipelines using AMA compatible devices:

+
    +
  • ama_av1dec for av1 decoding

  • +
  • ama_av1enc for av1 encoding

  • +
  • ama_h264dec for h264 decoding

  • +
  • ama_h264enc for h264 encoding

  • +
  • ama_h265dec for h264 decoding

  • +
  • ama_h264enc for h265 encoding

  • +
  • ama_scaler for hardware accelerated scaling and color conversion

  • +
  • ama_download data download from device to host

  • +
  • ama_upload data upload from host to device

  • +
+

The following sections describe the options used with GStreamer to configure and use the various hardware accelerators available on AMA compatible devices.

+
+

+
+
+
+
+

Decoder Plugin

+

The ama_av1dec, ama_h264dec and ama_hevcdec plugins provide support for hardware-accelerated decoding using AMA compatible devices, for AV1, AVC and HEVC.

+
+

Decoder Inputs and Outputs

+
    +
  • Input: 8 or 10 bits AV1, AVC or HEVC encoded stream, in OBU format for AV1 or byte-stream format for AVC or HEVC

  • +
  • Output: One of NV12_4L4, NV12, I420, NV12_10LE32, P010_10E, I420_10LE, RGBP, or NV12_10LE_4L4 formats

  • +
+
+
+

Decoder Parameters

+ ++++ + + + + + + + + + + + + + + + + +

Property Name

Description

+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Default: -1 (auto)
+
Range -1 to 2147483647
+
+
+
+low-latency
+
+ +
+
Whether to enable low latency decoding
+
Type: Boolean
+
Default: false
+
+
+
+latency-logging
+
+ +
+
Log latency info to syslog
+
Type: Boolean
+
Default: false
+
+
+
+
+

Decoder Example Pipelines

+

Refer to the Decoder Pipeline example for an illustration of how to use this plugin.

+
+
+
+

Encoder Plugin

+

The ama_av1enc, ama_h264enc and ama_h265enc plugins provide support for hardware-accelerated encoding using AMA compatible devices, for AV1, AVC and HEVC.

+
+

Encoder Inputs and Outputs

+
    +
  • Input: NV12_4L4, I420, NV12_10LE32, P010_10LE, I420_10LE, or NV12_10LE_4L4

  • +
  • Output: One of AV1, AVC or HEVC 8-bit/10-bit encoded stream, in OBU format for AV1 and byte-stream for AVC and HEVC

  • +
+
+
+

Encoder Parameters

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Property Name

Description

+
+b-frames
+
+ +
+
Number of B-frames between two consecutive P-frames
+
Type: Integer
+
Range: -1 - 7, for AV1
+
Range: -1 - 3, for AVC and HEVC
+
Default: -1 (auto)
+
+
+
+bitrate
+
+ +
+
Fixed output bitrate in bits per second
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 5000000
+
+
+
+crf
+
+ +
+
If specified, enable CRF mode
+
Type: Boolean
+
Default: False
+
+
+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+dynamic-gop
+
+ +
+
Enable Dynamic B Frame Insertion
+
Type: Integer
+
Range: -1 - 1
+
Default: -1 (auto)
+
+
+
+device-type
+
+ +
+
AV1 device type to use
+
Type: Enum
+
+
(0): any
+
(1): Type 1
+
(2): Type 2
+
+
Default: 1
+
+
+
+forced-idr
+
+ +
+
Encode all intra frames as IDR
+
Type: Boolean
+
Default: True
+
+
+
+gop-length
+
+ +
+
Maximum distance between two consecutive I frames
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+idr-interval
+
+ +
+
The periodicity of IDR frames
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 4294967295
+
+
+
+lookahead-depth
+
+ +
+
Number of frames in the future of the currently encoded frame that the encoder will analyze and take into account
+
Type: Integer
+
Range: 0 - 47+Maximum number of B frames b-frames
+
Default: -1 (auto)
+
+
+
+max-bitrate
+
+ +
+
Use to limit encoding bitrate if you have not specified bitrate parameter
+
Type: Integer
+
Range: 0 - 35000000000
+
Default: -1 (auto)
+
+
+
+max-qp
+
+ +
+
Maximum QP value allowed for the rate control
+
Type: Integer
+
Range: 0 - 51, for AVC and HEVC
+
Range: 0 - 255, for AV1
+
Default: 51, for AVC and HEVC
+
Default: 255, for AV1
+
+
+
+min-qp
+
+ +
+
Minimum QP value allowed for the rate control
+
Type: Integer
+
Range: 0 - 51, for AVC and HEVC
+
Range: 0 - 255, for AV1
+
Default: 0
+
+
+
+qp
+
+ +
+
Fixed quantization value. When constant quality is enabled, bitrate must be set to 0
+
Type: Integer
+
Range: -1 - 255
+
Default: -1 (disable)
+
+
+
+qp-b-offset
+
+ +
+
FQuantization offset value - P/B
+
Type: Integer
+
Range: -51 - 51
+
Auto selection mode is -1.
+
Default: 0
+
+
+
+qp-i-offset
+
+ +
+
FQuantization offset value - I
+
Type: Integer
+
Range: -51 - 51
+
Auto selection mode is -1.
+
Default: 0
+
+
+
+qp-mode
+
+ +
+
QP control mode.
+
Type: Enum
+
+
(0): auto - Auto
+
(1): relative-load - Relative load (spatial AQ + temporal AQ)
+
(2): uniform - Uniform (AQ off)
+
+
+
+
+rate-control
+
+ +
+
Rate control mode to use for encoding
+
Type: Enum
+
+
(-1): auto - Auto
+
(0): cqp - Constant QP
+
(1): cbr - Constant bitrate
+
(2): vbr - Variable bitrate
+
(3): cvbr - Constrained variable bitrate
+
(4): cabr - Content adaptive bitrate
+
+
+
+
+slice
+
+ +
+
Which slice of the XMA device to use
+
Type: Integer
+
Range: -1 - 1
+
Default: -1
+
+
+
+spatial-aq
+
+ +
+
Enable spatial AQ
+
Type: Boolean
+
Default: True
+
+
+
+spatial-aq-gain
+
+ +
+
Spatial AQ gain scale factor
+
Type: Integer
+
Range: 0 -255
+
Default: 255
+
+
+
+temporall-aq
+
+ +
+
Enable temporal AQ
+
Type: Boolean
+
Default: True
+
+
+
+temporal-aq-gain
+
+ +
+
Temporal AQ gain scale factor
+
Type: Integer
+
Range: 0 -255
+
Default: 255
+
Default: 1
+
+
+
+tier
+
+ +
+
Tier
+
Type: Boolean
+
+
(-1): auto - Auto
+
(0): main - Main
+
(1): high - High
+
+
+
+
+preset
+
+ +
+
Encoder VQ-Density preset
+
Valid values: medium or slow. (default is medium)
+
+
(medium) Full density with medium VQ - default
+
(fast) Allows for increase in total throughput from 4kp60 to 4kp75 , when 2 or more channels are used. Does not apply to AV1 device-type 1 encoding. Not applicable under ULL setting. Note lower VQ than medium preset is to be expected.
+
(slow) High VQ at lower density
+
+
Consult the Tuning Video Quality section for more details on how to use this option.
+
Note that this option has no effects on AV1 device-type 1 encoding.
+
+
+
+tune-metrics
+
+ +
+
Tune VQ for objective metrics
+
Type: Enum
+
+
(1): vq - Best visual quality
+
(2): psnr - Best PSNR
+
(3): ssim - Best SSIM
+
(4): vmaf - Best VMA
+
+
+
+
+encoding-params-file
+
+ +
+
Dynamic Configuration File
+
Path to dynamic file location (default is empty)
+
Consult the Dynamic Encoder Parameters section for more details on how to use this option.
+
+
+
+latency-ms
+
+ +
+
Encoder latency in milliseconds that the encoder will analyze and take into account
+
Type: Integer
+
Range: -1 - 60000
+
Default: -1 (auto)
+
+
+
+no-bll
+
+ +
+
No low latency B Frames
+
Type: Integer
+
Range: -1 - 1
+
Default: -1 (auto)
+
+
+
+
+

Encoder Example Pipelines

+

Refer to the Encoder Pipeline example for an illustration of how to use this plugin.

+
+

+
+
+
+
+

Scaler Plugin

+

The ama_scaler plugin provides support for hardware-accelerated resizing and cropping.

+
+

Scaler Inputs and Outputs

+
    +
  • Input: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
  • Output: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
+
+
+

Scaler Parameters

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Property Name

Description

+
+crop
+
+ +
+
Crop the input frame before scaling.
+
Type: Boolean
+
Default: false
+
+
+
+crop-height
+
+ +
+
Height of crop area. Must be < input height - crop-top and a multiple of 2
+
Type: Integer
+
Range: 0 - 2147483647
+
Default: 0
+
+
+
+crop-left
+
+ +
+
Left position of crop area. Must be < input width and a multiple of 2
+
Type: Integer
+
Range: 0 - 2147483647
+
Default: 0
+
+
+
+crop-top
+
+ +
+
Top position of crop area. Must be < input height and a multiple of 2
+
Type: Integer
+
Range: 0 - 2147483647
+
Default: 0
+
+
+
+crop-width
+
+ +
+
** Width of crop area. Must be < input width - crop-left and a multiple of 2**
+
Type: Integer
+
Range: 0 - 2147483647
+
Default: 0
+
+
+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+enable-pipeline
+
+ +
+
Enable Pipelining for Higher Throughput
+
Type: Boolean
+
Default: true
+
Note that enabling this option adds 2 frames worth of latency to the pipeline.
+
+
+
+
+

Scaler Example Pipelines

+

Refer to the Transcode with Multiple-Resolution Outputs example for an illustration of how to use this plugin.

+
+
+
+

Hardware Down and Up Loads

+

The ama_download and ama_upload plugins provide support for DMA transfer of data to and from the host, respectively. Note that transaction directions are with respect to the host.

+
+

Inputs and Outputs

+
    +
  • Input: I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, BGR

  • +
  • Output: I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, BGR

  • +
+
+
+

DMA Parameters

+ ++++ + + + + + + + + + + +

Property Name

Description

+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+
+
+

Moving Data through the Pipeline

+

The GStreamer plugins included in the AMD AMA Video SDK take care of efficiently moving data through the video processing pipeline. For optimal performance, video buffers will be moved between the host and the appropriate device only if needed by plugins in the pipeline. This is known as "zero-copy".

+
    +
  • The decoder plugin will only copy the output buffer from the device to the host if a downstream element (e.g. filesink) running on the host needs to access the decoded frame. This allows downstream hardware-accelerated plugins (e.g. scaler, encoder) running on the same AMD device to process the decoded frames without unnecessary data transfers.

  • +
  • The encoder plugin will only copy the input buffer from host to the device if it is allocated in user-space memory on the host or in a different device. This allows the encoder to process frames produced by upstream hardware-accelerated plugins (e.g. decoder, scaler) running on the same AMD device without unnecessary data transfers.

  • +
+
+
+

Working with Multiple Devices

+

By default (if no device identifier is specified) a job is submitted to device 0. When running large jobs or multiple jobs in parallel, device 0 is bound to run out of resources rapidly and additional jobs will error out due to insufficient resources.

+

By using the device option of the GStreamer plugins included in the AMD AMA Video SDK, the different functions (decoder, scaler, encoder) of a pipeline can be individually submitted to a specific device. This makes it easy and straightforward to leverage the entire video acceleration capacity of your system, regardless of the number of cards and devices.

+
+
+

Rebuilding GStreamer

+

Obtain the zipped version of SDK's Gstreamer code from ma35d_sdk_v1.1.2_gstreamer.zip. Unzip this file into ma35_gstreamer folder. This folder will contain the source code for AMA SDK plugins and a patch for Gstreamer.

+

You can rebuild the Gstreamer executable with optional plugins by following the instructions below.

+
    +
  1. Install the prerequisite packages:

    +
    sudo apt install ninja-build flex bison python3-pip unzip pkg-config libjansson-dev uuid-dev
    +sudo snap install cmake --classic
    +sudo pip3 install meson ninja
    +
    +
    +
  2. +
  3. Unzip the downloaded zip file:

    +
    unzip ma35d_sdk_v1.1.2_gstreamer.zip -d ma35_gstreamer
    +
    +
    +
  4. +
  5. Get Gstreamer:

    +
    git clone https://github.com/GStreamer/gstreamer.git
    +cd gstreamer
    +git checkout f6e672f27fcac06af58d7ac995551893d36944ce
    +
    +
    +
  6. +
  7. Apply the patch to Gstreamer:

    +
    cp ../ma35_gstreamer/ama_gstreamer.patch .
    +git apply ama_gstreamer.patch
    +
    +
    +
  8. +
  9. Build Gstreamer and AMA SDK plugins:

    +
    cd ../ma35_gstreamer
    +ln -s ../gstreamer/subprojects ./
    +export C_INCLUDE_PATH=/opt/amd/ama/ma35/include/xma/:/opt/amd/ama/ma35/include/xrm/:/opt/amd/ama/ma35/include/xrm_interface/:$C_INCLUDE_PATH
    +export LIBRARY_PATH=/opt/amd/ama/ma35/lib/:$LIBRARY_PATH
    +meson setup build
    +cd build
    +ninja
    +
    +
    +
  10. +
  11. Install Gstreamer and plugins:

    +
    ninja install
    +
    +
    +
  12. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.1.2/virtualization.html b/v1.1.2/virtualization.html new file mode 100644 index 00000000..9165e6a3 --- /dev/null +++ b/v1.1.2/virtualization.html @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + Virtualization — AMD AMA 1.1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Virtualization
  • +
  • +
  • +
+
+
+
+
+ +
+

Virtualization

+ +
+

Overview

+

AMA virtualization support allows for isolated interaction of clients' operating systems with AMA compatible cards, in Linux. Specifically, isolation is achieved by relying on I/O Memory Management Unit (IOMMU) and Single Root I/O virtualization (SR-IOV) technologies. As such, AMA virtualization support provides an efficient interaction path between client applications and AMA compatible cards. This section describes Linux virtualization setup.

+
+
+

Linux KVM

+

The following 2 sections, Linux Host and Linux VM Guest, describe both the host and VM guest required configurations.

+
+

Linux Host

+
    +
  1. Ensure that host system is setup as per On Premises.

  2. +
  3. Install CPU checker and KVM packages on the host. For an Ubuntu host, do the following:

    +
    sudo apt install -y cpu-checker qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
    +
    +
    +
  4. +
  5. Ensure that virtualization is enabled on the host:

    +
    lscpu | grep Virtualization
    +Virtualization:                  AMD-V
    +$ kvm-ok
    +INFO: /dev/kvm exists
    +KVM acceleration can be used
    +
    +
    +
  6. +
  7. If /etc/modules-load.d/ama_transcoder.conf doesn't exists, execute the following:

    +
    echo ama_transcoder | sudo tee /etc/modules-load.d/ama_transcoder.conf
    +
    +
    +
  8. +
  9. If /etc/modprobe.d/ama_transcoder.conf doesn't exists, execute the following:

    +
    echo 'install ama_transcoder /sbin/modprobe --ignore-install ama_transcoder && /opt/amd/ama/ma35/bin/mamgmt --force -d <DBDF> numvfs -v 1 && <REPEAT>' | sudo tee /etc/modprobe.d/ama_transcoder.conf
    +echo 'remove ama_transcoder /sbin/modprobe -r --ignore-install ama_transcoder; /opt/amd/ama/ma35/bin/mamgmt --force -d <DBDF> numvfs -v 0; <REPEAT>' | sudo tee -a /etc/modprobe.d/ama_transcoder.conf
    +
    +
    +

    , where DBDF is PCIe Domain:Bus:Device.Function designation of the device(s) and REPEAT indicates that the /opt/amd/ama/ma35/bin/mamgmt commands are to be repeated for all devices that are meant to be passed to a VM.

    +

    As an example, in a system with 2 cards:

    +
    lspci -d 10ee:
    +01:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +02:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +03:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +04:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +
    +
    +

    , in order to make one device, of each card, available to 2 distinct VMs, /etc/modprobe.d/ama_transcoder.conf will have the following content:

    +
    install ama_transcoder /sbin/modprobe --ignore-install ama_transcoder && /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:02:00.0 numvfs -v 1 && /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:04:00.0 numvfs -v 1
    +remove  ama_transcoder /sbin/modprobe --ignore-install ama_transcoder;   /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:02:00.0 numvfs -v 0;   /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:04:00.0 numvfs -v 0
    +
    +
    +
  10. +
  11. Reboot the host. After reboot execute and confirm the following:

    +
    lsmod | grep ama_transcoder
    +  ama_transcoder        831488  0
    +
    +
    +

    If the above returns empty, then insert the module manually, by sudo modprobe ama_transcoder. Otherwise, confirm that driver is properly configured:

    +
    cat /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
    +1
    +
    +$ lspci -d 10ee:
    +01:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +01:00.1 Multimedia controller: Xilinx Corporation Device 5071
    +...
    +
    +
    +

    The first command confirms that VM guest's Virtual Function (VF) that is associated with host's Physical Function (PF) is enabled and the second one confirms its creation. Note that this snippet assumes target device is 01.00.0.

    +
  12. +
  13. Setup KVM on the host and confirm that it is running:

    +
    sudo systemctl enable libvirtd
    +sudo systemctl start libvirtd
    +systemctl status libvirtd
    +libvirtd.service - Virtualization daemon
    +   Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
    +   Active: active (running) since Wed 2023-06-07 09:19:44 PDT; 7h ago
    +   ...
    +
    +
    +
  14. +
  15. Obtain Ubuntu 20.04 server image, from Ubuntu Focal Fossa.

  16. +
  17. Instantiate the VM guest, by allocating it at least 8 CPU cores and 12GB of RAM.

    +

    Check virt-install version:

    +
    virt-install --version
    +
    +
    +

    If it is 4.0.0 or above, execute the following:

    +
    sudo virt-install --name <VM name> \
    +--ram 12288 --vcpu 8 --virt-type kvm --machine q35 \
    +--disk path=<Path to qcow2 disk file>,size=128 \
    +--os-type linux --os-variant ubuntu20.04 --network network:default --graphics none --console pty,target_type=serial --extra-args "console=ttyS0" \
    +--location <Path to Ubuntu 20.04 ISO file>,kernel=casper/vmlinuz,initrd=casper/initrd \
    +--force --debug --features  apic=on,ioapic.driver=qemu --iommu model=intel,driver.intremap=on,driver.eim=on,driver.caching_mode=on --memorybacking hugepages.page.size=2,hugepages.page.unit=M,nosharepages=1,locked=1 \
    +--hostdev 0<xx>:00.1,driver.name=vfio
    +
    +
    +

    , where VM name is the name of the VM image and Path to qcow2 disk file is the path to VM's disk storage, which will be created. Note that this file will be owned by libvirt-qemu user and kvm group. Also, Path to Ubuntu 20.04 ISO file is the path to the downloaded ISO image and xx is part of DBDF designation as described above. Repeat this step for as many VMs that have been defined in /etc/modprobe.d/ama_transcoder.conf.

    +

    Otherwise, first create the VM without ioapic.driver and --iommu parameters:

    +
    sudo virt-install --name <VM name> \
    +--ram 12288 --vcpu 8 --virt-type kvm --machine q35 \
    +--disk path=<Path to qcow2 disk file>,size=128 \
    +--os-type linux --os-variant ubuntu20.04 --network network:default --graphics none --console pty,target_type=serial --extra-args "console=ttyS0" \
    +--location <Path to Ubuntu 20.04 ISO file>,kernel=casper/vmlinuz,initrd=casper/initrd \
    +--force --debug --hostdev 0<xx>:00.1,driver.name=vfio
    +
    +
    +

    and after VM creation add ioapic.driver and --iommu parameters, via virsh edit:

    +
    virsh edit <VM name>
    +<domain type='kvm'>
    +   ...
    +   <memoryBacking>
    +    <hugepages>
    +      <page size='2048' unit='KiB'/>
    +    </hugepages>
    +    <nosharepages/>
    +    <locked/>
    +  </memoryBacking>
    +   ...
    +   <features>
    +     <acpi/>
    +     <apic/>
    +     <vmport state='off'/>
    +     <ioapic driver='qemu'/>
    +   </features>
    + ...
    +   </rng>
    +   <iommu model='intel'>
    +     <driver intremap='on' caching_mode='on'/>
    +   </iommu>
    + </devices>
    +</domain>
    +
    +
    +

    During or after creation of a VM, it is helpful to install ssh server on the guest VM, in order to be able to connect to the instance:

    +
    sudo apt-get install openssh-server
    +
    +
    +

    (To find the IP address of the running VM, run sudo virsh net-dhcp-leases default or attach to the instance virsh --connect qemu:///system console <VM name> and issue the ip a command)

    +
  18. +
+
+
+

Linux VM Guest

+

On the running VM instance execute the following:

+
+
    +
  1. Set the huge table pages to 6GB, plus an extra 96 pages, i.e. 3072+96:

    +
    sudo sh -c "echo 'vm.nr_hugepages=3168' >> /etc/sysctl.conf"
    +
    +
    +
  2. +
  3. Note that if you are running 20.04 Server edition, you may need to install generic kernel 5.15, dkms and gcc-11:

  4. +
+
+
+
+
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
+sudo apt install -y gcc-11 linux-image-5.15.0-60-generic dkms build-essential linux-headers-5.15.0-60-generic
+
+
+
+
    +
  1. Reboot the VM

  2. +
  3. Install the AMD AMA Video SDK and run through Tutorials and Examples

  4. +
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/.buildinfo b/v1.2/.buildinfo new file mode 100644 index 00000000..474250aa --- /dev/null +++ b/v1.2/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 2f2f525768b625478901c6933767b8f1 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/v1.2/.nojekyll b/v1.2/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/v1.2/_images/MA35D_ASIC1&2.png b/v1.2/_images/MA35D_ASIC1&2.png new file mode 100644 index 00000000..4f7d53b7 Binary files /dev/null and b/v1.2/_images/MA35D_ASIC1&2.png differ diff --git a/v1.2/_images/MA35D_VPU.png b/v1.2/_images/MA35D_VPU.png new file mode 100644 index 00000000..d55cabf6 Binary files /dev/null and b/v1.2/_images/MA35D_VPU.png differ diff --git a/v1.2/_images/MA35D_pipeline.png b/v1.2/_images/MA35D_pipeline.png new file mode 100644 index 00000000..fc17564b Binary files /dev/null and b/v1.2/_images/MA35D_pipeline.png differ diff --git a/v1.2/_images/gst_xabrladder.png b/v1.2/_images/gst_xabrladder.png new file mode 100644 index 00000000..75d9d2ba Binary files /dev/null and b/v1.2/_images/gst_xabrladder.png differ diff --git a/v1.2/_images/gst_xcompositor.png b/v1.2/_images/gst_xcompositor.png new file mode 100644 index 00000000..1848b6b3 Binary files /dev/null and b/v1.2/_images/gst_xcompositor.png differ diff --git a/v1.2/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css b/v1.2/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css new file mode 100644 index 00000000..eb19f698 --- /dev/null +++ b/v1.2/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/v1.2/_sphinx_design_static/design-tabs.js b/v1.2/_sphinx_design_static/design-tabs.js new file mode 100644 index 00000000..36b38cf0 --- /dev/null +++ b/v1.2/_sphinx_design_static/design-tabs.js @@ -0,0 +1,27 @@ +var sd_labels_by_text = {}; + +function ready() { + const li = document.getElementsByClassName("sd-tab-label"); + for (const label of li) { + syncId = label.getAttribute("data-sync-id"); + if (syncId) { + label.onclick = onLabelClick; + if (!sd_labels_by_text[syncId]) { + sd_labels_by_text[syncId] = []; + } + sd_labels_by_text[syncId].push(label); + } + } +} + +function onLabelClick() { + // Activate other inputs with the same sync id. + syncId = this.getAttribute("data-sync-id"); + for (label of sd_labels_by_text[syncId]) { + if (label === this) continue; + label.previousElementSibling.checked = true; + } + window.localStorage.setItem("sphinx-design-last-tab", syncId); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/v1.2/_static/_sphinx_javascript_frameworks_compat.js b/v1.2/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/v1.2/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/v1.2/_static/basic.css b/v1.2/_static/basic.css new file mode 100644 index 00000000..30fee9d0 --- /dev/null +++ b/v1.2/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/v1.2/_static/css/badge_only.css b/v1.2/_static/css/badge_only.css new file mode 100644 index 00000000..e380325b --- /dev/null +++ b/v1.2/_static/css/badge_only.css @@ -0,0 +1 @@ +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/v1.2/_static/css/fonts/Roboto-Slab-Bold.woff b/v1.2/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/v1.2/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/v1.2/_static/css/fonts/Roboto-Slab-Bold.woff2 b/v1.2/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/v1.2/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/v1.2/_static/css/fonts/Roboto-Slab-Regular.woff b/v1.2/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/v1.2/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/v1.2/_static/css/fonts/Roboto-Slab-Regular.woff2 b/v1.2/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/v1.2/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/v1.2/_static/css/fonts/fontawesome-webfont.eot b/v1.2/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/v1.2/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/v1.2/_static/css/fonts/fontawesome-webfont.svg b/v1.2/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/v1.2/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v1.2/_static/css/fonts/fontawesome-webfont.ttf b/v1.2/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/v1.2/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/v1.2/_static/css/fonts/fontawesome-webfont.woff b/v1.2/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/v1.2/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/v1.2/_static/css/fonts/fontawesome-webfont.woff2 b/v1.2/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/v1.2/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/v1.2/_static/css/fonts/lato-bold-italic.woff b/v1.2/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/v1.2/_static/css/fonts/lato-bold-italic.woff differ diff --git a/v1.2/_static/css/fonts/lato-bold-italic.woff2 b/v1.2/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/v1.2/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/v1.2/_static/css/fonts/lato-bold.woff b/v1.2/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/v1.2/_static/css/fonts/lato-bold.woff differ diff --git a/v1.2/_static/css/fonts/lato-bold.woff2 b/v1.2/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/v1.2/_static/css/fonts/lato-bold.woff2 differ diff --git a/v1.2/_static/css/fonts/lato-normal-italic.woff b/v1.2/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/v1.2/_static/css/fonts/lato-normal-italic.woff differ diff --git a/v1.2/_static/css/fonts/lato-normal-italic.woff2 b/v1.2/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/v1.2/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/v1.2/_static/css/fonts/lato-normal.woff b/v1.2/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/v1.2/_static/css/fonts/lato-normal.woff differ diff --git a/v1.2/_static/css/fonts/lato-normal.woff2 b/v1.2/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/v1.2/_static/css/fonts/lato-normal.woff2 differ diff --git a/v1.2/_static/css/theme.css b/v1.2/_static/css/theme.css new file mode 100644 index 00000000..2814741e --- /dev/null +++ b/v1.2/_static/css/theme.css @@ -0,0 +1,4771 @@ +html{ + box-sizing:border-box +} +*,:after,:before{ + box-sizing:inherit +} +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{ + display:block +} +audio,canvas,video{ + display:inline-block; + *display:inline; + *zoom:1 +} +[hidden],audio:not([controls]){ + display:none +} +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box +} +html{ + font-size:100%; + -webkit-text-size-adjust:100%; + -ms-text-size-adjust:100% +} +body{ + margin:0 +} +a:active,a:hover{ + outline:0 +} +abbr[title]{ + border-bottom:1px dotted +} +b,strong{ + font-weight:700 +} +blockquote{ + margin:0 +} +dfn{ + font-style:italic +} +ins{ + background:#ff9; + text-decoration:none +} +ins,mark{ + color:#000 +} +mark{ + background:#ff0; + font-style:italic; + font-weight:700 +} +.rst-content code,.rst-content tt,code,kbd,pre,samp{ + font-family:monospace,serif; + _font-family:courier new,monospace; + font-size:1em +} +pre{ + white-space:pre +} +q{ + quotes:none +} +q:after,q:before{ + content:""; + content:none +} +small{ + font-size:85% +} +sub,sup{ + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline +} +sup{ + top:-.5em +} +sub{ + bottom:-.25em +} +dl,ol,ul{ + margin:0; + padding:0; + list-style:none; + list-style-image:none +} +li{ + list-style:none +} +dd{ + margin:0 +} +img{ + border:0; + -ms-interpolation-mode:bicubic; + vertical-align:middle; + max-width:100% +} +svg:not(:root){ + overflow:hidden +} +figure,form{ + margin:0 +} +label{ + cursor:pointer +} +button,input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle +} +button,input{ + line-height:normal +} +button,input[type=button],input[type=reset],input[type=submit]{ + cursor:pointer; + -webkit-appearance:button; + *overflow:visible +} +button[disabled],input[disabled]{ + cursor:default +} +input[type=search]{ + -webkit-appearance:textfield; + -moz-box-sizing:content-box; + -webkit-box-sizing:content-box; + box-sizing:content-box +} +textarea{ + resize:vertical +} +table{ + border-collapse:collapse; + border-spacing:0 +} +td{ + vertical-align:top +} +.chromeframe{ + margin:.2em 0; + background:#ccc; + color:#000; + padding:.2em 0 +} +.ir{ + display:block; + border:0; + text-indent:-999em; + overflow:hidden; + background-color:transparent; + background-repeat:no-repeat; + text-align:left; + direction:ltr; + *line-height:0 +} +.ir br{ + display:none +} +.hidden{ + display:none!important; + visibility:hidden +} +.visuallyhidden{ + border:0; + clip:rect(0 0 0 0); + height:1px; + margin:-1px; + overflow:hidden; + padding:0; + position:absolute; + width:1px +} +.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{ + clip:auto; + height:auto; + margin:0; + overflow:visible; + position:static; + width:auto +} +.invisible{ + visibility:hidden +} +.relative{ + position:relative +} +big,small{ + font-size:100% +} +@media print{ + body,html,section{ + background:none!important + } + *{ + box-shadow:none!important; + text-shadow:none!important; + filter:none!important; + -ms-filter:none!important + } + a,a:visited{ + text-decoration:underline + } + .ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{ + content:"" + } + blockquote,pre{ + page-break-inside:avoid + } + thead{ + display:table-header-group + } + img,tr{ + page-break-inside:avoid + } + img{ + max-width:100%!important + } + @page{ + margin:.5cm + } + .rst-content .toctree-wrapper>p.caption,h2,h3,p{ + orphans:3; + widows:3 + } + .rst-content .toctree-wrapper>p.caption,h2,h3{ + page-break-after:avoid + } +} +.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{ + -webkit-font-smoothing:antialiased +} +/*! * Custome CSS styles for Xilinx GitHub Tutorials */ + p .footerinfo { + font-size:small; +} + footer .sphinxfooter{ + z-index:0; + background:#ffffff; +} + .sphinxhide { + display:none; +} + a:visited { + color: #9b59b6; +} + a:link { + color: blue; +} + .wy-nav-side a:hover { + color: white; +} + .headerlink { + padding-top: 60px; + margin-top: -50px; +} +/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ +@font-face{ + font-family:FontAwesome; + src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713); + src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg"); + font-weight:400; + font-style:normal +} +.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{ + display:inline-block; + font:normal normal normal 14px/1 FontAwesome; + font-size:inherit; + text-rendering:auto; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale +} +.fa-lg{ + font-size:1.33333em; + line-height:.75em; + vertical-align:-15% +} +.fa-2x{ + font-size:2em +} +.fa-3x{ + font-size:3em +} +.fa-4x{ + font-size:4em +} +.fa-5x{ + font-size:5em +} +.fa-fw{ + width:1.28571em; + text-align:center +} +.fa-ul{ + padding-left:0; + margin-left:2.14286em; + list-style-type:none +} +.fa-ul>li{ + position:relative +} +.fa-li{ + position:absolute; + left:-2.14286em; + width:2.14286em; + top:.14286em; + text-align:center +} +.fa-li.fa-lg{ + left:-1.85714em +} +.fa-border{ + padding:.2em .25em .15em; + border:.08em solid #eee; + border-radius:.1em +} +.fa-pull-left{ + float:left +} +.fa-pull-right{ + float:right +} +.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{ + margin-right:.3em +} +.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{ + margin-left:.3em +} +.pull-right{ + float:right +} +.pull-left{ + float:left +} +.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{ + margin-right:.3em +} +.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{ + margin-left:.3em +} +.fa-spin{ + -webkit-animation:fa-spin 2s linear infinite; + animation:fa-spin 2s linear infinite +} +.fa-pulse{ + -webkit-animation:fa-spin 1s steps(8) infinite; + animation:fa-spin 1s steps(8) infinite +} +@-webkit-keyframes fa-spin{ + 0%{ + -webkit-transform:rotate(0deg); + transform:rotate(0deg) + } + to{ + -webkit-transform:rotate(359deg); + transform:rotate(359deg) + } +} +@keyframes fa-spin{ + 0%{ + -webkit-transform:rotate(0deg); + transform:rotate(0deg) + } + to{ + -webkit-transform:rotate(359deg); + transform:rotate(359deg) + } +} +.fa-rotate-90{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform:rotate(90deg); + -ms-transform:rotate(90deg); + transform:rotate(90deg) +} +.fa-rotate-180{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform:rotate(180deg); + -ms-transform:rotate(180deg); + transform:rotate(180deg) +} +.fa-rotate-270{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform:rotate(270deg); + -ms-transform:rotate(270deg); + transform:rotate(270deg) +} +.fa-flip-horizontal{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform:scaleX(-1); + -ms-transform:scaleX(-1); + transform:scaleX(-1) +} +.fa-flip-vertical{ + -ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform:scaleY(-1); + -ms-transform:scaleY(-1); + transform:scaleY(-1) +} +:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{ + filter:none +} +.fa-stack{ + position:relative; + display:inline-block; + width:2em; + height:2em; + line-height:2em; + vertical-align:middle +} +.fa-stack-1x,.fa-stack-2x{ + position:absolute; + left:0; + width:100%; + text-align:center +} +.fa-stack-1x{ + line-height:inherit +} +.fa-stack-2x{ + font-size:2em +} +.fa-inverse{ + color:#fff +} +.fa-glass:before{ + content:"" +} +.fa-music:before{ + content:"" +} +.fa-search:before,.icon-search:before{ + content:"" +} +.fa-envelope-o:before{ + content:"" +} +.fa-heart:before{ + content:"" +} +.fa-star:before{ + content:"" +} +.fa-star-o:before{ + content:"" +} +.fa-user:before{ + content:"" +} +.fa-film:before{ + content:"" +} +.fa-th-large:before{ + content:"" +} +.fa-th:before{ + content:"" +} +.fa-th-list:before{ + content:"" +} +.fa-check:before{ + content:"" +} +.fa-close:before,.fa-remove:before,.fa-times:before{ + content:"" +} +.fa-search-plus:before{ + content:"" +} +.fa-search-minus:before{ + content:"" +} +.fa-power-off:before{ + content:"" +} +.fa-signal:before{ + content:"" +} +.fa-cog:before,.fa-gear:before{ + content:"" +} +.fa-trash-o:before{ + content:"" +} +.fa-home:before,.icon-home:before{ + content:"" +} +.fa-file-o:before{ + content:"" +} +.fa-clock-o:before{ + content:"" +} +.fa-road:before{ + content:"" +} +.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{ + content:"" +} +.fa-arrow-circle-o-down:before{ + content:"" +} +.fa-arrow-circle-o-up:before{ + content:"" +} +.fa-inbox:before{ + content:"" +} +.fa-play-circle-o:before{ + content:"" +} +.fa-repeat:before,.fa-rotate-right:before{ + content:"" +} +.fa-refresh:before{ + content:"" +} +.fa-list-alt:before{ + content:"" +} +.fa-lock:before{ + content:"" +} +.fa-flag:before{ + content:"" +} +.fa-headphones:before{ + content:"" +} +.fa-volume-off:before{ + content:"" +} +.fa-volume-down:before{ + content:"" +} +.fa-volume-up:before{ + content:"" +} +.fa-qrcode:before{ + content:"" +} +.fa-barcode:before{ + content:"" +} +.fa-tag:before{ + content:"" +} +.fa-tags:before{ + content:"" +} +.fa-book:before,.icon-book:before{ + content:"" +} +.fa-bookmark:before{ + content:"" +} +.fa-print:before{ + content:"" +} +.fa-camera:before{ + content:"" +} +.fa-font:before{ + content:"" +} +.fa-bold:before{ + content:"" +} +.fa-italic:before{ + content:"" +} +.fa-text-height:before{ + content:"" +} +.fa-text-width:before{ + content:"" +} +.fa-align-left:before{ + content:"" +} +.fa-align-center:before{ + content:"" +} +.fa-align-right:before{ + content:"" +} +.fa-align-justify:before{ + content:"" +} +.fa-list:before{ + content:"" +} +.fa-dedent:before,.fa-outdent:before{ + content:"" +} +.fa-indent:before{ + content:"" +} +.fa-video-camera:before{ + content:"" +} +.fa-image:before,.fa-photo:before,.fa-picture-o:before{ + content:"" +} +.fa-pencil:before{ + content:"" +} +.fa-map-marker:before{ + content:"" +} +.fa-adjust:before{ + content:"" +} +.fa-tint:before{ + content:"" +} +.fa-edit:before,.fa-pencil-square-o:before{ + content:"" +} +.fa-share-square-o:before{ + content:"" +} +.fa-check-square-o:before{ + content:"" +} +.fa-arrows:before{ + content:"" +} +.fa-step-backward:before{ + content:"" +} +.fa-fast-backward:before{ + content:"" +} +.fa-backward:before{ + content:"" +} +.fa-play:before{ + content:"" +} +.fa-pause:before{ + content:"" +} +.fa-stop:before{ + content:"" +} +.fa-forward:before{ + content:"" +} +.fa-fast-forward:before{ + content:"" +} +.fa-step-forward:before{ + content:"" +} +.fa-eject:before{ + content:"" +} +.fa-chevron-left:before{ + content:"" +} +.fa-chevron-right:before{ + content:"" +} +.fa-plus-circle:before{ + content:"" +} +.fa-minus-circle:before{ + content:"" +} +.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{ + content:"" +} +.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{ + content:"" +} +.fa-question-circle:before{ + content:"" +} +.fa-info-circle:before{ + content:"" +} +.fa-crosshairs:before{ + content:"" +} +.fa-times-circle-o:before{ + content:"" +} +.fa-check-circle-o:before{ + content:"" +} +.fa-ban:before{ + content:"" +} +.fa-arrow-left:before{ + content:"" +} +.fa-arrow-right:before{ + content:"" +} +.fa-arrow-up:before{ + content:"" +} +.fa-arrow-down:before{ + content:"" +} +.fa-mail-forward:before,.fa-share:before{ + content:"" +} +.fa-expand:before{ + content:"" +} +.fa-compress:before{ + content:"" +} +.fa-plus:before{ + content:"" +} +.fa-minus:before{ + content:"" +} +.fa-asterisk:before{ + content:"" +} +.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{ + content:"" +} +.fa-gift:before{ + content:"" +} +.fa-leaf:before{ + content:"" +} +.fa-fire:before,.icon-fire:before{ + content:"" +} +.fa-eye:before{ + content:"" +} +.fa-eye-slash:before{ + content:"" +} +.fa-exclamation-triangle:before,.fa-warning:before{ + content:"" +} +.fa-plane:before{ + content:"" +} +.fa-calendar:before{ + content:"" +} +.fa-random:before{ + content:"" +} +.fa-comment:before{ + content:"" +} +.fa-magnet:before{ + content:"" +} +.fa-chevron-up:before{ + content:"" +} +.fa-chevron-down:before{ + content:"" +} +.fa-retweet:before{ + content:"" +} +.fa-shopping-cart:before{ + content:"" +} +.fa-folder:before{ + content:"" +} +.fa-folder-open:before{ + content:"" +} +.fa-arrows-v:before{ + content:"" +} +.fa-arrows-h:before{ + content:"" +} +.fa-bar-chart-o:before,.fa-bar-chart:before{ + content:"" +} +.fa-twitter-square:before{ + content:"" +} +.fa-facebook-square:before{ + content:"" +} +.fa-camera-retro:before{ + content:"" +} +.fa-key:before{ + content:"" +} +.fa-cogs:before,.fa-gears:before{ + content:"" +} +.fa-comments:before{ + content:"" +} +.fa-thumbs-o-up:before{ + content:"" +} +.fa-thumbs-o-down:before{ + content:"" +} +.fa-star-half:before{ + content:"" +} +.fa-heart-o:before{ + content:"" +} +.fa-sign-out:before{ + content:"" +} +.fa-linkedin-square:before{ + content:"" +} +.fa-thumb-tack:before{ + content:"" +} +.fa-external-link:before{ + content:"" +} +.fa-sign-in:before{ + content:"" +} +.fa-trophy:before{ + content:"" +} +.fa-github-square:before{ + content:"" +} +.fa-upload:before{ + content:"" +} +.fa-lemon-o:before{ + content:"" +} +.fa-phone:before{ + content:"" +} +.fa-square-o:before{ + content:"" +} +.fa-bookmark-o:before{ + content:"" +} +.fa-phone-square:before{ + content:"" +} +.fa-twitter:before{ + content:"" +} +.fa-facebook-f:before,.fa-facebook:before{ + content:"" +} +.fa-github:before,.icon-github:before{ + content:"" +} +.fa-unlock:before{ + content:"" +} +.fa-credit-card:before{ + content:"" +} +.fa-feed:before,.fa-rss:before{ + content:"" +} +.fa-hdd-o:before{ + content:"" +} +.fa-bullhorn:before{ + content:"" +} +.fa-bell:before{ + content:"" +} +.fa-certificate:before{ + content:"" +} +.fa-hand-o-right:before{ + content:"" +} +.fa-hand-o-left:before{ + content:"" +} +.fa-hand-o-up:before{ + content:"" +} +.fa-hand-o-down:before{ + content:"" +} +.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{ + content:"" +} +.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{ + content:"" +} +.fa-arrow-circle-up:before{ + content:"" +} +.fa-arrow-circle-down:before{ + content:"" +} +.fa-globe:before{ + content:"" +} +.fa-wrench:before{ + content:"" +} +.fa-tasks:before{ + content:"" +} +.fa-filter:before{ + content:"" +} +.fa-briefcase:before{ + content:"" +} +.fa-arrows-alt:before{ + content:"" +} +.fa-group:before,.fa-users:before{ + content:"" +} +.fa-chain:before,.fa-link:before,.icon-link:before{ + content:"" +} +.fa-cloud:before{ + content:"" +} +.fa-flask:before{ + content:"" +} +.fa-cut:before,.fa-scissors:before{ + content:"" +} +.fa-copy:before,.fa-files-o:before{ + content:"" +} +.fa-paperclip:before{ + content:"" +} +.fa-floppy-o:before,.fa-save:before{ + content:"" +} +.fa-square:before{ + content:"" +} +.fa-bars:before,.fa-navicon:before,.fa-reorder:before{ + content:"" +} +.fa-list-ul:before{ + content:"" +} +.fa-list-ol:before{ + content:"" +} +.fa-strikethrough:before{ + content:"" +} +.fa-underline:before{ + content:"" +} +.fa-table:before{ + content:"" +} +.fa-magic:before{ + content:"" +} +.fa-truck:before{ + content:"" +} +.fa-pinterest:before{ + content:"" +} +.fa-pinterest-square:before{ + content:"" +} +.fa-google-plus-square:before{ + content:"" +} +.fa-google-plus:before{ + content:"" +} +.fa-money:before{ + content:"" +} +.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{ + content:"" +} +.fa-caret-up:before{ + content:"" +} +.fa-caret-left:before{ + content:"" +} +.fa-caret-right:before{ + content:"" +} +.fa-columns:before{ + content:"" +} +.fa-sort:before,.fa-unsorted:before{ + content:"" +} +.fa-sort-desc:before,.fa-sort-down:before{ + content:"" +} +.fa-sort-asc:before,.fa-sort-up:before{ + content:"" +} +.fa-envelope:before{ + content:"" +} +.fa-linkedin:before{ + content:"" +} +.fa-rotate-left:before,.fa-undo:before{ + content:"" +} +.fa-gavel:before,.fa-legal:before{ + content:"" +} +.fa-dashboard:before,.fa-tachometer:before{ + content:"" +} +.fa-comment-o:before{ + content:"" +} +.fa-comments-o:before{ + content:"" +} +.fa-bolt:before,.fa-flash:before{ + content:"" +} +.fa-sitemap:before{ + content:"" +} +.fa-umbrella:before{ + content:"" +} +.fa-clipboard:before,.fa-paste:before{ + content:"" +} +.fa-lightbulb-o:before{ + content:"" +} +.fa-exchange:before{ + content:"" +} +.fa-cloud-download:before{ + content:"" +} +.fa-cloud-upload:before{ + content:"" +} +.fa-user-md:before{ + content:"" +} +.fa-stethoscope:before{ + content:"" +} +.fa-suitcase:before{ + content:"" +} +.fa-bell-o:before{ + content:"" +} +.fa-coffee:before{ + content:"" +} +.fa-cutlery:before{ + content:"" +} +.fa-file-text-o:before{ + content:"" +} +.fa-building-o:before{ + content:"" +} +.fa-hospital-o:before{ + content:"" +} +.fa-ambulance:before{ + content:"" +} +.fa-medkit:before{ + content:"" +} +.fa-fighter-jet:before{ + content:"" +} +.fa-beer:before{ + content:"" +} +.fa-h-square:before{ + content:"" +} +.fa-plus-square:before{ + content:"" +} +.fa-angle-double-left:before{ + content:"" +} +.fa-angle-double-right:before{ + content:"" +} +.fa-angle-double-up:before{ + content:"" +} +.fa-angle-double-down:before{ + content:"" +} +.fa-angle-left:before{ + content:"" +} +.fa-angle-right:before{ + content:"" +} +.fa-angle-up:before{ + content:"" +} +.fa-angle-down:before{ + content:"" +} +.fa-desktop:before{ + content:"" +} +.fa-laptop:before{ + content:"" +} +.fa-tablet:before{ + content:"" +} +.fa-mobile-phone:before,.fa-mobile:before{ + content:"" +} +.fa-circle-o:before{ + content:"" +} +.fa-quote-left:before{ + content:"" +} +.fa-quote-right:before{ + content:"" +} +.fa-spinner:before{ + content:"" +} +.fa-circle:before{ + content:"" +} +.fa-mail-reply:before,.fa-reply:before{ + content:"" +} +.fa-github-alt:before{ + content:"" +} +.fa-folder-o:before{ + content:"" +} +.fa-folder-open-o:before{ + content:"" +} +.fa-smile-o:before{ + content:"" +} +.fa-frown-o:before{ + content:"" +} +.fa-meh-o:before{ + content:"" +} +.fa-gamepad:before{ + content:"" +} +.fa-keyboard-o:before{ + content:"" +} +.fa-flag-o:before{ + content:"" +} +.fa-flag-checkered:before{ + content:"" +} +.fa-terminal:before{ + content:"" +} +.fa-code:before{ + content:"" +} +.fa-mail-reply-all:before,.fa-reply-all:before{ + content:"" +} +.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{ + content:"" +} +.fa-location-arrow:before{ + content:"" +} +.fa-crop:before{ + content:"" +} +.fa-code-fork:before{ + content:"" +} +.fa-chain-broken:before,.fa-unlink:before{ + content:"" +} +.fa-question:before{ + content:"" +} +.fa-info:before{ + content:"" +} +.fa-exclamation:before{ + content:"" +} +.fa-superscript:before{ + content:"" +} +.fa-subscript:before{ + content:"" +} +.fa-eraser:before{ + content:"" +} +.fa-puzzle-piece:before{ + content:"" +} +.fa-microphone:before{ + content:"" +} +.fa-microphone-slash:before{ + content:"" +} +.fa-shield:before{ + content:"" +} +.fa-calendar-o:before{ + content:"" +} +.fa-fire-extinguisher:before{ + content:"" +} +.fa-rocket:before{ + content:"" +} +.fa-maxcdn:before{ + content:"" +} +.fa-chevron-circle-left:before{ + content:"" +} +.fa-chevron-circle-right:before{ + content:"" +} +.fa-chevron-circle-up:before{ + content:"" +} +.fa-chevron-circle-down:before{ + content:"" +} +.fa-html5:before{ + content:"" +} +.fa-css3:before{ + content:"" +} +.fa-anchor:before{ + content:"" +} +.fa-unlock-alt:before{ + content:"" +} +.fa-bullseye:before{ + content:"" +} +.fa-ellipsis-h:before{ + content:"" +} +.fa-ellipsis-v:before{ + content:"" +} +.fa-rss-square:before{ + content:"" +} +.fa-play-circle:before{ + content:"" +} +.fa-ticket:before{ + content:"" +} +.fa-minus-square:before{ + content:"" +} +.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{ + content:"" +} +.fa-level-up:before{ + content:"" +} +.fa-level-down:before{ + content:"" +} +.fa-check-square:before{ + content:"" +} +.fa-pencil-square:before{ + content:"" +} +.fa-external-link-square:before{ + content:"" +} +.fa-share-square:before{ + content:"" +} +.fa-compass:before{ + content:"" +} +.fa-caret-square-o-down:before,.fa-toggle-down:before{ + content:"" +} +.fa-caret-square-o-up:before,.fa-toggle-up:before{ + content:"" +} +.fa-caret-square-o-right:before,.fa-toggle-right:before{ + content:"" +} +.fa-eur:before,.fa-euro:before{ + content:"" +} +.fa-gbp:before{ + content:"" +} +.fa-dollar:before,.fa-usd:before{ + content:"" +} +.fa-inr:before,.fa-rupee:before{ + content:"" +} +.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{ + content:"" +} +.fa-rouble:before,.fa-rub:before,.fa-ruble:before{ + content:"" +} +.fa-krw:before,.fa-won:before{ + content:"" +} +.fa-bitcoin:before,.fa-btc:before{ + content:"" +} +.fa-file:before{ + content:"" +} +.fa-file-text:before{ + content:"" +} +.fa-sort-alpha-asc:before{ + content:"" +} +.fa-sort-alpha-desc:before{ + content:"" +} +.fa-sort-amount-asc:before{ + content:"" +} +.fa-sort-amount-desc:before{ + content:"" +} +.fa-sort-numeric-asc:before{ + content:"" +} +.fa-sort-numeric-desc:before{ + content:"" +} +.fa-thumbs-up:before{ + content:"" +} +.fa-thumbs-down:before{ + content:"" +} +.fa-youtube-square:before{ + content:"" +} +.fa-youtube:before{ + content:"" +} +.fa-xing:before{ + content:"" +} +.fa-xing-square:before{ + content:"" +} +.fa-youtube-play:before{ + content:"" +} +.fa-dropbox:before{ + content:"" +} +.fa-stack-overflow:before{ + content:"" +} +.fa-instagram:before{ + content:"" +} +.fa-flickr:before{ + content:"" +} +.fa-adn:before{ + content:"" +} +.fa-bitbucket:before,.icon-bitbucket:before{ + content:"" +} +.fa-bitbucket-square:before{ + content:"" +} +.fa-tumblr:before{ + content:"" +} +.fa-tumblr-square:before{ + content:"" +} +.fa-long-arrow-down:before{ + content:"" +} +.fa-long-arrow-up:before{ + content:"" +} +.fa-long-arrow-left:before{ + content:"" +} +.fa-long-arrow-right:before{ + content:"" +} +.fa-apple:before{ + content:"" +} +.fa-windows:before{ + content:"" +} +.fa-android:before{ + content:"" +} +.fa-linux:before{ + content:"" +} +.fa-dribbble:before{ + content:"" +} +.fa-skype:before{ + content:"" +} +.fa-foursquare:before{ + content:"" +} +.fa-trello:before{ + content:"" +} +.fa-female:before{ + content:"" +} +.fa-male:before{ + content:"" +} +.fa-gittip:before,.fa-gratipay:before{ + content:"" +} +.fa-sun-o:before{ + content:"" +} +.fa-moon-o:before{ + content:"" +} +.fa-archive:before{ + content:"" +} +.fa-bug:before{ + content:"" +} +.fa-vk:before{ + content:"" +} +.fa-weibo:before{ + content:"" +} +.fa-renren:before{ + content:"" +} +.fa-pagelines:before{ + content:"" +} +.fa-stack-exchange:before{ + content:"" +} +.fa-arrow-circle-o-right:before{ + content:"" +} +.fa-arrow-circle-o-left:before{ + content:"" +} +.fa-caret-square-o-left:before,.fa-toggle-left:before{ + content:"" +} +.fa-dot-circle-o:before{ + content:"" +} +.fa-wheelchair:before{ + content:"" +} +.fa-vimeo-square:before{ + content:"" +} +.fa-try:before,.fa-turkish-lira:before{ + content:"" +} +.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{ + content:"" +} +.fa-space-shuttle:before{ + content:"" +} +.fa-slack:before{ + content:"" +} +.fa-envelope-square:before{ + content:"" +} +.fa-wordpress:before{ + content:"" +} +.fa-openid:before{ + content:"" +} +.fa-bank:before,.fa-institution:before,.fa-university:before{ + content:"" +} +.fa-graduation-cap:before,.fa-mortar-board:before{ + content:"" +} +.fa-yahoo:before{ + content:"" +} +.fa-google:before{ + content:"" +} +.fa-reddit:before{ + content:"" +} +.fa-reddit-square:before{ + content:"" +} +.fa-stumbleupon-circle:before{ + content:"" +} +.fa-stumbleupon:before{ + content:"" +} +.fa-delicious:before{ + content:"" +} +.fa-digg:before{ + content:"" +} +.fa-pied-piper-pp:before{ + content:"" +} +.fa-pied-piper-alt:before{ + content:"" +} +.fa-drupal:before{ + content:"" +} +.fa-joomla:before{ + content:"" +} +.fa-language:before{ + content:"" +} +.fa-fax:before{ + content:"" +} +.fa-building:before{ + content:"" +} +.fa-child:before{ + content:"" +} +.fa-paw:before{ + content:"" +} +.fa-spoon:before{ + content:"" +} +.fa-cube:before{ + content:"" +} +.fa-cubes:before{ + content:"" +} +.fa-behance:before{ + content:"" +} +.fa-behance-square:before{ + content:"" +} +.fa-steam:before{ + content:"" +} +.fa-steam-square:before{ + content:"" +} +.fa-recycle:before{ + content:"" +} +.fa-automobile:before,.fa-car:before{ + content:"" +} +.fa-cab:before,.fa-taxi:before{ + content:"" +} +.fa-tree:before{ + content:"" +} +.fa-spotify:before{ + content:"" +} +.fa-deviantart:before{ + content:"" +} +.fa-soundcloud:before{ + content:"" +} +.fa-database:before{ + content:"" +} +.fa-file-pdf-o:before{ + content:"" +} +.fa-file-word-o:before{ + content:"" +} +.fa-file-excel-o:before{ + content:"" +} +.fa-file-powerpoint-o:before{ + content:"" +} +.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{ + content:"" +} +.fa-file-archive-o:before,.fa-file-zip-o:before{ + content:"" +} +.fa-file-audio-o:before,.fa-file-sound-o:before{ + content:"" +} +.fa-file-movie-o:before,.fa-file-video-o:before{ + content:"" +} +.fa-file-code-o:before{ + content:"" +} +.fa-vine:before{ + content:"" +} +.fa-codepen:before{ + content:"" +} +.fa-jsfiddle:before{ + content:"" +} +.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{ + content:"" +} +.fa-circle-o-notch:before{ + content:"" +} +.fa-ra:before,.fa-rebel:before,.fa-resistance:before{ + content:"" +} +.fa-empire:before,.fa-ge:before{ + content:"" +} +.fa-git-square:before{ + content:"" +} +.fa-git:before{ + content:"" +} +.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{ + content:"" +} +.fa-tencent-weibo:before{ + content:"" +} +.fa-qq:before{ + content:"" +} +.fa-wechat:before,.fa-weixin:before{ + content:"" +} +.fa-paper-plane:before,.fa-send:before{ + content:"" +} +.fa-paper-plane-o:before,.fa-send-o:before{ + content:"" +} +.fa-history:before{ + content:"" +} +.fa-circle-thin:before{ + content:"" +} +.fa-header:before{ + content:"" +} +.fa-paragraph:before{ + content:"" +} +.fa-sliders:before{ + content:"" +} +.fa-share-alt:before{ + content:"" +} +.fa-share-alt-square:before{ + content:"" +} +.fa-bomb:before{ + content:"" +} +.fa-futbol-o:before,.fa-soccer-ball-o:before{ + content:"" +} +.fa-tty:before{ + content:"" +} +.fa-binoculars:before{ + content:"" +} +.fa-plug:before{ + content:"" +} +.fa-slideshare:before{ + content:"" +} +.fa-twitch:before{ + content:"" +} +.fa-yelp:before{ + content:"" +} +.fa-newspaper-o:before{ + content:"" +} +.fa-wifi:before{ + content:"" +} +.fa-calculator:before{ + content:"" +} +.fa-paypal:before{ + content:"" +} +.fa-google-wallet:before{ + content:"" +} +.fa-cc-visa:before{ + content:"" +} +.fa-cc-mastercard:before{ + content:"" +} +.fa-cc-discover:before{ + content:"" +} +.fa-cc-amex:before{ + content:"" +} +.fa-cc-paypal:before{ + content:"" +} +.fa-cc-stripe:before{ + content:"" +} +.fa-bell-slash:before{ + content:"" +} +.fa-bell-slash-o:before{ + content:"" +} +.fa-trash:before{ + content:"" +} +.fa-copyright:before{ + content:"" +} +.fa-at:before{ + content:"" +} +.fa-eyedropper:before{ + content:"" +} +.fa-paint-brush:before{ + content:"" +} +.fa-birthday-cake:before{ + content:"" +} +.fa-area-chart:before{ + content:"" +} +.fa-pie-chart:before{ + content:"" +} +.fa-line-chart:before{ + content:"" +} +.fa-lastfm:before{ + content:"" +} +.fa-lastfm-square:before{ + content:"" +} +.fa-toggle-off:before{ + content:"" +} +.fa-toggle-on:before{ + content:"" +} +.fa-bicycle:before{ + content:"" +} +.fa-bus:before{ + content:"" +} +.fa-ioxhost:before{ + content:"" +} +.fa-angellist:before{ + content:"" +} +.fa-cc:before{ + content:"" +} +.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{ + content:"" +} +.fa-meanpath:before{ + content:"" +} +.fa-buysellads:before{ + content:"" +} +.fa-connectdevelop:before{ + content:"" +} +.fa-dashcube:before{ + content:"" +} +.fa-forumbee:before{ + content:"" +} +.fa-leanpub:before{ + content:"" +} +.fa-sellsy:before{ + content:"" +} +.fa-shirtsinbulk:before{ + content:"" +} +.fa-simplybuilt:before{ + content:"" +} +.fa-skyatlas:before{ + content:"" +} +.fa-cart-plus:before{ + content:"" +} +.fa-cart-arrow-down:before{ + content:"" +} +.fa-diamond:before{ + content:"" +} +.fa-ship:before{ + content:"" +} +.fa-user-secret:before{ + content:"" +} +.fa-motorcycle:before{ + content:"" +} +.fa-street-view:before{ + content:"" +} +.fa-heartbeat:before{ + content:"" +} +.fa-venus:before{ + content:"" +} +.fa-mars:before{ + content:"" +} +.fa-mercury:before{ + content:"" +} +.fa-intersex:before,.fa-transgender:before{ + content:"" +} +.fa-transgender-alt:before{ + content:"" +} +.fa-venus-double:before{ + content:"" +} +.fa-mars-double:before{ + content:"" +} +.fa-venus-mars:before{ + content:"" +} +.fa-mars-stroke:before{ + content:"" +} +.fa-mars-stroke-v:before{ + content:"" +} +.fa-mars-stroke-h:before{ + content:"" +} +.fa-neuter:before{ + content:"" +} +.fa-genderless:before{ + content:"" +} +.fa-facebook-official:before{ + content:"" +} +.fa-pinterest-p:before{ + content:"" +} +.fa-whatsapp:before{ + content:"" +} +.fa-server:before{ + content:"" +} +.fa-user-plus:before{ + content:"" +} +.fa-user-times:before{ + content:"" +} +.fa-bed:before,.fa-hotel:before{ + content:"" +} +.fa-viacoin:before{ + content:"" +} +.fa-train:before{ + content:"" +} +.fa-subway:before{ + content:"" +} +.fa-medium:before{ + content:"" +} +.fa-y-combinator:before,.fa-yc:before{ + content:"" +} +.fa-optin-monster:before{ + content:"" +} +.fa-opencart:before{ + content:"" +} +.fa-expeditedssl:before{ + content:"" +} +.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{ + content:"" +} +.fa-battery-3:before,.fa-battery-three-quarters:before{ + content:"" +} +.fa-battery-2:before,.fa-battery-half:before{ + content:"" +} +.fa-battery-1:before,.fa-battery-quarter:before{ + content:"" +} +.fa-battery-0:before,.fa-battery-empty:before{ + content:"" +} +.fa-mouse-pointer:before{ + content:"" +} +.fa-i-cursor:before{ + content:"" +} +.fa-object-group:before{ + content:"" +} +.fa-object-ungroup:before{ + content:"" +} +.fa-sticky-note:before{ + content:"" +} +.fa-sticky-note-o:before{ + content:"" +} +.fa-cc-jcb:before{ + content:"" +} +.fa-cc-diners-club:before{ + content:"" +} +.fa-clone:before{ + content:"" +} +.fa-balance-scale:before{ + content:"" +} +.fa-hourglass-o:before{ + content:"" +} +.fa-hourglass-1:before,.fa-hourglass-start:before{ + content:"" +} +.fa-hourglass-2:before,.fa-hourglass-half:before{ + content:"" +} +.fa-hourglass-3:before,.fa-hourglass-end:before{ + content:"" +} +.fa-hourglass:before{ + content:"" +} +.fa-hand-grab-o:before,.fa-hand-rock-o:before{ + content:"" +} +.fa-hand-paper-o:before,.fa-hand-stop-o:before{ + content:"" +} +.fa-hand-scissors-o:before{ + content:"" +} +.fa-hand-lizard-o:before{ + content:"" +} +.fa-hand-spock-o:before{ + content:"" +} +.fa-hand-pointer-o:before{ + content:"" +} +.fa-hand-peace-o:before{ + content:"" +} +.fa-trademark:before{ + content:"" +} +.fa-registered:before{ + content:"" +} +.fa-creative-commons:before{ + content:"" +} +.fa-gg:before{ + content:"" +} +.fa-gg-circle:before{ + content:"" +} +.fa-tripadvisor:before{ + content:"" +} +.fa-odnoklassniki:before{ + content:"" +} +.fa-odnoklassniki-square:before{ + content:"" +} +.fa-get-pocket:before{ + content:"" +} +.fa-wikipedia-w:before{ + content:"" +} +.fa-safari:before{ + content:"" +} +.fa-chrome:before{ + content:"" +} +.fa-firefox:before{ + content:"" +} +.fa-opera:before{ + content:"" +} +.fa-internet-explorer:before{ + content:"" +} +.fa-television:before,.fa-tv:before{ + content:"" +} +.fa-contao:before{ + content:"" +} +.fa-500px:before{ + content:"" +} +.fa-amazon:before{ + content:"" +} +.fa-calendar-plus-o:before{ + content:"" +} +.fa-calendar-minus-o:before{ + content:"" +} +.fa-calendar-times-o:before{ + content:"" +} +.fa-calendar-check-o:before{ + content:"" +} +.fa-industry:before{ + content:"" +} +.fa-map-pin:before{ + content:"" +} +.fa-map-signs:before{ + content:"" +} +.fa-map-o:before{ + content:"" +} +.fa-map:before{ + content:"" +} +.fa-commenting:before{ + content:"" +} +.fa-commenting-o:before{ + content:"" +} +.fa-houzz:before{ + content:"" +} +.fa-vimeo:before{ + content:"" +} +.fa-black-tie:before{ + content:"" +} +.fa-fonticons:before{ + content:"" +} +.fa-reddit-alien:before{ + content:"" +} +.fa-edge:before{ + content:"" +} +.fa-credit-card-alt:before{ + content:"" +} +.fa-codiepie:before{ + content:"" +} +.fa-modx:before{ + content:"" +} +.fa-fort-awesome:before{ + content:"" +} +.fa-usb:before{ + content:"" +} +.fa-product-hunt:before{ + content:"" +} +.fa-mixcloud:before{ + content:"" +} +.fa-scribd:before{ + content:"" +} +.fa-pause-circle:before{ + content:"" +} +.fa-pause-circle-o:before{ + content:"" +} +.fa-stop-circle:before{ + content:"" +} +.fa-stop-circle-o:before{ + content:"" +} +.fa-shopping-bag:before{ + content:"" +} +.fa-shopping-basket:before{ + content:"" +} +.fa-hashtag:before{ + content:"" +} +.fa-bluetooth:before{ + content:"" +} +.fa-bluetooth-b:before{ + content:"" +} +.fa-percent:before{ + content:"" +} +.fa-gitlab:before,.icon-gitlab:before{ + content:"" +} +.fa-wpbeginner:before{ + content:"" +} +.fa-wpforms:before{ + content:"" +} +.fa-envira:before{ + content:"" +} +.fa-universal-access:before{ + content:"" +} +.fa-wheelchair-alt:before{ + content:"" +} +.fa-question-circle-o:before{ + content:"" +} +.fa-blind:before{ + content:"" +} +.fa-audio-description:before{ + content:"" +} +.fa-volume-control-phone:before{ + content:"" +} +.fa-braille:before{ + content:"" +} +.fa-assistive-listening-systems:before{ + content:"" +} +.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{ + content:"" +} +.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{ + content:"" +} +.fa-glide:before{ + content:"" +} +.fa-glide-g:before{ + content:"" +} +.fa-sign-language:before,.fa-signing:before{ + content:"" +} +.fa-low-vision:before{ + content:"" +} +.fa-viadeo:before{ + content:"" +} +.fa-viadeo-square:before{ + content:"" +} +.fa-snapchat:before{ + content:"" +} +.fa-snapchat-ghost:before{ + content:"" +} +.fa-snapchat-square:before{ + content:"" +} +.fa-pied-piper:before{ + content:"" +} +.fa-first-order:before{ + content:"" +} +.fa-yoast:before{ + content:"" +} +.fa-themeisle:before{ + content:"" +} +.fa-google-plus-circle:before,.fa-google-plus-official:before{ + content:"" +} +.fa-fa:before,.fa-font-awesome:before{ + content:"" +} +.fa-handshake-o:before{ + content:"" +} +.fa-envelope-open:before{ + content:"" +} +.fa-envelope-open-o:before{ + content:"" +} +.fa-linode:before{ + content:"" +} +.fa-address-book:before{ + content:"" +} +.fa-address-book-o:before{ + content:"" +} +.fa-address-card:before,.fa-vcard:before{ + content:"" +} +.fa-address-card-o:before,.fa-vcard-o:before{ + content:"" +} +.fa-user-circle:before{ + content:"" +} +.fa-user-circle-o:before{ + content:"" +} +.fa-user-o:before{ + content:"" +} +.fa-id-badge:before{ + content:"" +} +.fa-drivers-license:before,.fa-id-card:before{ + content:"" +} +.fa-drivers-license-o:before,.fa-id-card-o:before{ + content:"" +} +.fa-quora:before{ + content:"" +} +.fa-free-code-camp:before{ + content:"" +} +.fa-telegram:before{ + content:"" +} +.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{ + content:"" +} +.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{ + content:"" +} +.fa-thermometer-2:before,.fa-thermometer-half:before{ + content:"" +} +.fa-thermometer-1:before,.fa-thermometer-quarter:before{ + content:"" +} +.fa-thermometer-0:before,.fa-thermometer-empty:before{ + content:"" +} +.fa-shower:before{ + content:"" +} +.fa-bath:before,.fa-bathtub:before,.fa-s15:before{ + content:"" +} +.fa-podcast:before{ + content:"" +} +.fa-window-maximize:before{ + content:"" +} +.fa-window-minimize:before{ + content:"" +} +.fa-window-restore:before{ + content:"" +} +.fa-times-rectangle:before,.fa-window-close:before{ + content:"" +} +.fa-times-rectangle-o:before,.fa-window-close-o:before{ + content:"" +} +.fa-bandcamp:before{ + content:"" +} +.fa-grav:before{ + content:"" +} +.fa-etsy:before{ + content:"" +} +.fa-imdb:before{ + content:"" +} +.fa-ravelry:before{ + content:"" +} +.fa-eercast:before{ + content:"" +} +.fa-microchip:before{ + content:"" +} +.fa-snowflake-o:before{ + content:"" +} +.fa-superpowers:before{ + content:"" +} +.fa-wpexplorer:before{ + content:"" +} +.fa-meetup:before{ + content:"" +} +.sr-only{ + position:absolute; + width:1px; + height:1px; + padding:0; + margin:-1px; + overflow:hidden; + clip:rect(0,0,0,0); + border:0 +} +.sr-only-focusable:active,.sr-only-focusable:focus{ + position:static; + width:auto; + height:auto; + margin:0; + overflow:visible; + clip:auto +} +.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{ + font-family:inherit +} +.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{ + font-family:FontAwesome; + display:inline-block; + font-style:normal; + font-weight:400; + line-height:1; + text-decoration:inherit +} +.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{ + display:inline-block; + text-decoration:inherit +} +.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{ + display:inline +} +.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{ + line-height:.9em +} +.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{ + display:inline-block +} +.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{ + opacity:.5; + -webkit-transition:opacity .05s ease-in; + -moz-transition:opacity .05s ease-in; + transition:opacity .05s ease-in +} +.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{ + opacity:1 +} +.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{ + font-size:14px; + vertical-align:-15% +} +.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{ + padding:12px; + line-height:24px; + margin-bottom:24px; + background:#e7f2fa +} +.rst-content .admonition-title,.wy-alert-title{ + font-weight:700; + display:block; + color:#fff; + background:#6ab0de; + padding:6px 12px; + margin:-12px -12px 12px +} +.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{ + background:#fdf3f2 +} +.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{ + background:#f29f97 +} +.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{ + background:#ffedcc +} +.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{ + background:#f0b37e +} +.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{ + background:#e7f2fa +} +.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{ + background:#6ab0de +} +.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{ + background:#dbfaf4 +} +.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{ + background:#1abc9c +} +.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{ + background:#f3f6f6 +} +.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{ + color:#404040; + background:#e1e4e5 +} +.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{ + color:#2980b9 +} +.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{ + margin-bottom:0 +} +.wy-tray-container{ + position:fixed; + bottom:0; + left:0; + z-index:600 +} +.wy-tray-container li{ + display:block; + width:300px; + background:transparent; + color:#fff; + text-align:center; + box-shadow:0 5px 5px 0 rgba(0,0,0,.1); + padding:0 24px; + min-width:20%; + opacity:0; + height:0; + line-height:56px; + overflow:hidden; + -webkit-transition:all .3s ease-in; + -moz-transition:all .3s ease-in; + transition:all .3s ease-in +} +.wy-tray-container li.wy-tray-item-success{ + background:#27ae60 +} +.wy-tray-container li.wy-tray-item-info{ + background:#2980b9 +} +.wy-tray-container li.wy-tray-item-warning{ + background:#e67e22 +} +.wy-tray-container li.wy-tray-item-danger{ + background:#e74c3c +} +.wy-tray-container li.on{ + opacity:1; + height:56px +} +@media screen and (max-width:768px){ + .wy-tray-container{ + bottom:auto; + top:0; + width:100% + } + .wy-tray-container li{ + width:100% + } +} +button{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle; + cursor:pointer; + line-height:normal; + -webkit-appearance:button; + *overflow:visible +} +button::-moz-focus-inner,input::-moz-focus-inner{ + border:0; + padding:0 +} +button[disabled]{ + cursor:default +} +.btn{ + display:inline-block; + border-radius:2px; + line-height:normal; + white-space:nowrap; + text-align:center; + cursor:pointer; + font-size:100%; + padding:6px 12px 8px; + color:#fff; + border:1px solid rgba(0,0,0,.1); + background-color:#27ae60; + text-decoration:none; + font-weight:400; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1); + outline-none:false; + vertical-align:middle; + *display:inline; + zoom:1; + -webkit-user-drag:none; + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; + -webkit-transition:all .1s linear; + -moz-transition:all .1s linear; + transition:all .1s linear +} +.btn-hover{ + background:#2e8ece; + color:#fff +} +.btn:hover{ + background:#2cc36b; + color:#fff +} +.btn:focus{ + background:#2cc36b; + outline:0 +} +.btn:active{ + box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1); + padding:8px 12px 6px +} +.btn:visited{ + color:#fff +} +.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:.4; + cursor:not-allowed; + box-shadow:none +} +.btn::-moz-focus-inner{ + padding:0; + border:0 +} +.btn-small{ + font-size:80% +} +.btn-info{ + background-color:#2980b9!important +} +.btn-info:hover{ + background-color:#2e8ece!important +} +.btn-neutral{ + background-color:#f3f6f6!important; + color:#404040!important +} +.btn-neutral:hover{ + background-color:#e5ebeb!important; + color:#404040 +} +.btn-neutral:visited{ + color:#404040!important +} +.btn-success{ + background-color:#27ae60!important +} +.btn-success:hover{ + background-color:#295!important +} +.btn-danger{ + background-color:#e74c3c!important +} +.btn-danger:hover{ + background-color:#ea6153!important +} +.btn-warning{ + background-color:#e67e22!important +} +.btn-warning:hover{ + background-color:#e98b39!important +} +.btn-invert{ + background-color:#222 +} +.btn-invert:hover{ + background-color:#2f2f2f!important +} +.btn-link{ + background-color:transparent!important; + color:#2980b9; + box-shadow:none; + border-color:transparent!important +} +.btn-link:active,.btn-link:hover{ + background-color:transparent!important; + color:#409ad5!important; + box-shadow:none +} +.btn-link:visited{ + color:#9b59b6 +} +.wy-btn-group .btn,.wy-control .btn{ + vertical-align:middle +} +.wy-btn-group{ + margin-bottom:24px; + *zoom:1 +} +.wy-btn-group:after,.wy-btn-group:before{ + display:table; + content:"" +} +.wy-btn-group:after{ + clear:both +} +.wy-dropdown{ + position:relative; + display:inline-block +} +.wy-dropdown-active .wy-dropdown-menu{ + display:block +} +.wy-dropdown-menu{ + position:absolute; + left:0; + display:none; + float:left; + top:100%; + min-width:100%; + background:#fcfcfc; + z-index:100; + border:1px solid #cfd7dd; + box-shadow:0 2px 2px 0 rgba(0,0,0,.1); + padding:12px +} +.wy-dropdown-menu>dd>a{ + display:block; + clear:both; + color:#404040; + white-space:nowrap; + font-size:90%; + padding:0 12px; + cursor:pointer +} +.wy-dropdown-menu>dd>a:hover{ + background:#2980b9; + color:#fff +} +.wy-dropdown-menu>dd.divider{ + border-top:1px solid #cfd7dd; + margin:6px 0 +} +.wy-dropdown-menu>dd.search{ + padding-bottom:12px +} +.wy-dropdown-menu>dd.search input[type=search]{ + width:100% +} +.wy-dropdown-menu>dd.call-to-action{ + background:#e3e3e3; + text-transform:uppercase; + font-weight:500; + font-size:80% +} +.wy-dropdown-menu>dd.call-to-action:hover{ + background:#e3e3e3 +} +.wy-dropdown-menu>dd.call-to-action .btn{ + color:#fff +} +.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{ + bottom:100%; + top:auto; + left:auto; + right:0 +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{ + background:#fcfcfc; + margin-top:2px +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{ + padding:6px 12px +} +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{ + background:#2980b9; + color:#fff +} +.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{ + right:0; + left:auto; + text-align:right +} +.wy-dropdown-arrow:before{ + content:" "; + border-bottom:5px solid #f5f5f5; + border-left:5px solid transparent; + border-right:5px solid transparent; + position:absolute; + display:block; + top:-4px; + left:50%; + margin-left:-3px +} +.wy-dropdown-arrow.wy-dropdown-arrow-left:before{ + left:11px +} +.wy-form-stacked select{ + display:block +} +.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle +} +.wy-form-aligned .wy-control-group>label{ + display:inline-block; + vertical-align:middle; + width:10em; + margin:6px 12px 0 0; + float:left +} +.wy-form-aligned .wy-control{ + float:left +} +.wy-form-aligned .wy-control label{ + display:block +} +.wy-form-aligned .wy-control select{ + margin-top:6px +} +fieldset{ + margin:0 +} +fieldset,legend{ + border:0; + padding:0 +} +legend{ + width:100%; + white-space:normal; + margin-bottom:24px; + font-size:150%; + *margin-left:-7px +} +label,legend{ + display:block +} +label{ + margin:0 0 .3125em; + color:#333; + font-size:90% +} +input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle +} +.wy-control-group{ + margin-bottom:24px; + max-width:1200px; + margin-left:auto; + margin-right:auto; + *zoom:1 +} +.wy-control-group:after,.wy-control-group:before{ + display:table; + content:"" +} +.wy-control-group:after{ + clear:both +} +.wy-control-group.wy-control-group-required>label:after{ + content:" *"; + color:#e74c3c +} +.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{ + padding-bottom:12px +} +.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{ + width:100% +} +.wy-control-group .wy-form-full{ + float:left; + display:block; + width:100%; + margin-right:0 +} +.wy-control-group .wy-form-full:last-child{ + margin-right:0 +} +.wy-control-group .wy-form-halves{ + float:left; + display:block; + margin-right:2.35765%; + width:48.82117% +} +.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){ + margin-right:0 +} +.wy-control-group .wy-form-halves:nth-of-type(odd){ + clear:left +} +.wy-control-group .wy-form-thirds{ + float:left; + display:block; + margin-right:2.35765%; + width:31.76157% +} +.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){ + margin-right:0 +} +.wy-control-group .wy-form-thirds:nth-of-type(3n+1){ + clear:left +} +.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{ + margin:6px 0 0; + font-size:90% +} +.wy-control-no-input{ + display:inline-block +} +.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{ + width:100% +} +.wy-form-message-inline{ + padding-left:.3em; + color:#666; + font-size:90% +} +.wy-form-message{ + display:block; + color:#999; + font-size:70%; + margin-top:.3125em; + font-style:italic +} +.wy-form-message p{ + font-size:inherit; + font-style:italic; + margin-bottom:6px +} +.wy-form-message p:last-child{ + margin-bottom:0 +} +input{ + line-height:normal +} +input[type=button],input[type=reset],input[type=submit]{ + -webkit-appearance:button; + cursor:pointer; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + *overflow:visible +} +input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{ + -webkit-appearance:none; + padding:6px; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + box-shadow:inset 0 1px 3px #ddd; + border-radius:0; + -webkit-transition:border .3s linear; + -moz-transition:border .3s linear; + transition:border .3s linear +} +input[type=datetime-local]{ + padding:.34375em .625em +} +input[disabled]{ + cursor:default +} +input[type=checkbox],input[type=radio]{ + padding:0; + margin-right:.3125em; + *height:13px; + *width:13px +} +input[type=checkbox],input[type=radio],input[type=search]{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box +} +input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{ + -webkit-appearance:none +} +input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{ + outline:0; + outline:thin dotted\9; + border-color:#333 +} +input.no-focus:focus{ + border-color:#ccc!important +} +input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{ + outline:thin dotted #333; + outline:1px auto #129fea +} +input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{ + cursor:not-allowed; + background-color:#fafafa +} +input:focus:invalid,select:focus:invalid,textarea:focus:invalid{ + color:#e74c3c; + border:1px solid #e74c3c +} +input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{ + border-color:#e74c3c +} +input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{ + outline-color:#e74c3c +} +input.wy-input-large{ + padding:12px; + font-size:100% +} +textarea{ + overflow:auto; + vertical-align:top; + width:100%; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif +} +select,textarea{ + padding:.5em .625em; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + box-shadow:inset 0 1px 3px #ddd; + -webkit-transition:border .3s linear; + -moz-transition:border .3s linear; + transition:border .3s linear +} +select{ + border:1px solid #ccc; + background-color:#fff +} +select[multiple]{ + height:auto +} +select:focus,textarea:focus{ + outline:0 +} +input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{ + cursor:not-allowed; + background-color:#fafafa +} +input[type=checkbox][disabled],input[type=radio][disabled]{ + cursor:not-allowed +} +.wy-checkbox,.wy-radio{ + margin:6px 0; + color:#404040; + display:block +} +.wy-checkbox input,.wy-radio input{ + vertical-align:baseline +} +.wy-form-message-inline{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle +} +.wy-input-prefix,.wy-input-suffix{ + white-space:nowrap; + padding:6px +} +.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{ + line-height:27px; + padding:0 8px; + display:inline-block; + font-size:80%; + background-color:#f3f6f6; + border:1px solid #ccc; + color:#999 +} +.wy-input-suffix .wy-input-context{ + border-left:0 +} +.wy-input-prefix .wy-input-context{ + border-right:0 +} +.wy-switch{ + position:relative; + display:block; + height:24px; + margin-top:12px; + cursor:pointer +} +.wy-switch:before{ + left:0; + top:0; + width:36px; + height:12px; + background:#ccc +} +.wy-switch:after,.wy-switch:before{ + position:absolute; + content:""; + display:block; + border-radius:4px; + -webkit-transition:all .2s ease-in-out; + -moz-transition:all .2s ease-in-out; + transition:all .2s ease-in-out +} +.wy-switch:after{ + width:18px; + height:18px; + background:#999; + left:-3px; + top:-3px +} +.wy-switch span{ + position:absolute; + left:48px; + display:block; + font-size:12px; + color:#ccc; + line-height:1 +} +.wy-switch.active:before{ + background:#1e8449 +} +.wy-switch.active:after{ + left:24px; + background:#27ae60 +} +.wy-switch.disabled{ + cursor:not-allowed; + opacity:.8 +} +.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{ + color:#e74c3c +} +.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{ + border:1px solid #e74c3c +} +.wy-inline-validate{ + white-space:nowrap +} +.wy-inline-validate .wy-input-context{ + padding:.5em .625em; + display:inline-block; + font-size:80% +} +.wy-inline-validate.wy-inline-validate-success .wy-input-context{ + color:#27ae60 +} +.wy-inline-validate.wy-inline-validate-danger .wy-input-context{ + color:#e74c3c +} +.wy-inline-validate.wy-inline-validate-warning .wy-input-context{ + color:#e67e22 +} +.wy-inline-validate.wy-inline-validate-info .wy-input-context{ + color:#2980b9 +} +.rotate-90{ + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -ms-transform:rotate(90deg); + -o-transform:rotate(90deg); + transform:rotate(90deg) +} +.rotate-180{ + -webkit-transform:rotate(180deg); + -moz-transform:rotate(180deg); + -ms-transform:rotate(180deg); + -o-transform:rotate(180deg); + transform:rotate(180deg) +} +.rotate-270{ + -webkit-transform:rotate(270deg); + -moz-transform:rotate(270deg); + -ms-transform:rotate(270deg); + -o-transform:rotate(270deg); + transform:rotate(270deg) +} +.mirror{ + -webkit-transform:scaleX(-1); + -moz-transform:scaleX(-1); + -ms-transform:scaleX(-1); + -o-transform:scaleX(-1); + transform:scaleX(-1) +} +.mirror.rotate-90{ + -webkit-transform:scaleX(-1) rotate(90deg); + -moz-transform:scaleX(-1) rotate(90deg); + -ms-transform:scaleX(-1) rotate(90deg); + -o-transform:scaleX(-1) rotate(90deg); + transform:scaleX(-1) rotate(90deg) +} +.mirror.rotate-180{ + -webkit-transform:scaleX(-1) rotate(180deg); + -moz-transform:scaleX(-1) rotate(180deg); + -ms-transform:scaleX(-1) rotate(180deg); + -o-transform:scaleX(-1) rotate(180deg); + transform:scaleX(-1) rotate(180deg) +} +.mirror.rotate-270{ + -webkit-transform:scaleX(-1) rotate(270deg); + -moz-transform:scaleX(-1) rotate(270deg); + -ms-transform:scaleX(-1) rotate(270deg); + -o-transform:scaleX(-1) rotate(270deg); + transform:scaleX(-1) rotate(270deg) +} +@media only screen and (max-width:480px){ + .wy-form button[type=submit]{ + margin:.7em 0 0 + } + .wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{ + margin-bottom:.3em; + display:block + } + .wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{ + margin-bottom:0 + } + .wy-form-aligned .wy-control-group label{ + margin-bottom:.3em; + text-align:left; + display:block; + width:100% + } + .wy-form-aligned .wy-control{ + margin:1.5em 0 0 + } + .wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{ + display:block; + font-size:80%; + padding:6px 0 + } +} +@media screen and (max-width:768px){ + .tablet-hide{ + display:none + } +} +@media screen and (max-width:480px){ + .mobile-hide{ + display:none + } +} +.float-left{ + float:left +} +.float-right{ + float:right +} +.full-width{ + width:100% +} +.rst-content table.docutils,.rst-content table.field-list,.wy-table{ + border-collapse:collapse; + border-spacing:0; + empty-cells:show; + margin-bottom:24px +} +.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; + text-align:center +} +.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{ + font-size:90%; + margin:0; + overflow:visible; + padding:8px 16px +} +.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{ + border-left-width:0 +} +.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{ + color:#000; + text-align:left; + vertical-align:bottom; + white-space:nowrap +} +.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{ + font-weight:700; + border-bottom:2px solid #e1e4e5 +} +.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{ + background-color:transparent; + vertical-align:middle +} +.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{ + line-height:18px +} +.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{ + margin-bottom:0 +} +.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{ + width:1%; + padding-right:0 +} +.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{ + margin:0 +} +.wy-table-secondary{ + color:grey; + font-size:90% +} +.wy-table-tertiary{ + color:grey; + font-size:80% +} +.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{ + background-color:#f3f6f6 +} +.rst-content table.docutils,.wy-table-bordered-all{ + border:1px solid #e1e4e5 +} +.rst-content table.docutils td,.wy-table-bordered-all td{ + border-bottom:1px solid #e1e4e5; + border-left:1px solid #e1e4e5 +} +.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-bordered{ + border:1px solid #e1e4e5 +} +.wy-table-bordered-rows td{ + border-bottom:1px solid #e1e4e5 +} +.wy-table-bordered-rows tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-horizontal td,.wy-table-horizontal th{ + border-width:0 0 1px; + border-bottom:1px solid #e1e4e5 +} +.wy-table-horizontal tbody>tr:last-child td{ + border-bottom-width:0 +} +.wy-table-responsive{ + margin-bottom:24px; + max-width:100%; + overflow:auto +} +.wy-table-responsive table{ + margin-bottom:0!important +} +.wy-table-responsive table td,.wy-table-responsive table th{ + white-space:auto +} +a{ + color:#2980b9; + text-decoration:none; + cursor:pointer +} +a:hover{ + color:#3091d1 +} +a:visited{ + color:#9b59b6 +} +html{ + height:100% +} +body,html{ + overflow-x:hidden +} +body{ + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + font-weight:400; + color:#404040; + min-height:100%; + background:#edf0f2 +} +.wy-text-left{ + text-align:left +} +.wy-text-center{ + text-align:center +} +.wy-text-right{ + text-align:right +} +.wy-text-large{ + font-size:120% +} +.wy-text-normal{ + font-size:100% +} +.wy-text-small,small{ + font-size:80% +} +.wy-text-strike{ + text-decoration:line-through +} +.wy-text-warning{ + color:#e67e22!important +} +a.wy-text-warning:hover{ + color:#eb9950!important +} +.wy-text-info{ + color:#2980b9!important +} +a.wy-text-info:hover{ + color:#409ad5!important +} +.wy-text-success{ + color:#27ae60!important +} +a.wy-text-success:hover{ + color:#36d278!important +} +.wy-text-danger{ + color:#e74c3c!important +} +a.wy-text-danger:hover{ + color:#ed7669!important +} +.wy-text-neutral{ + color:#404040!important +} +a.wy-text-neutral:hover{ + color:#595959!important +} +.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{ + margin-top:0; + font-weight:700; + font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif +} +p{ + line-height:24px; + font-size:16px; + margin:0 0 24px; +} +h1{ + font-size:175% +} +.rst-content .toctree-wrapper>p.caption,h2{ + font-size:150% +} +h3{ + font-size:125% +} +h4{ + font-size:115% +} +h5{ + font-size:110% +} +h6{ + font-size:100% +} +hr{ + display:block; + height:1px; + border:0; + border-top:1px solid #e1e4e5; + margin:24px 0; + padding:0 +} +.rst-content code,.rst-content tt,code{ + white-space:nowrap; + max-width:100%; + background:#fff; + border:1px solid #e1e4e5; + font-size:75%; + padding:0 5px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + color:#e74c3c; + overflow-x:auto +} +.rst-content tt.code-large,code.code-large{ + font-size:90% +} +.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{ + list-style:disc; + line-height:24px; + margin-bottom:24px +} +.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{ + list-style:disc; + margin-left:24px +} +.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{ + margin-bottom:0 +} +.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{ + list-style:circle +} +.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{ + list-style:square +} +.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{ + list-style:decimal +} +.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{ + list-style:decimal; + line-height:24px; + margin-bottom:24px +} +.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{ + list-style:decimal; + margin-left:24px +} +.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{ + margin-bottom:0 +} +.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{ + list-style:disc +} +.wy-breadcrumbs{ + *zoom:1 +} +.wy-breadcrumbs:after,.wy-breadcrumbs:before{ + display:table; + content:"" +} +.wy-breadcrumbs:after{ + clear:both +} +.wy-breadcrumbs li{ + display:inline-block +} +.wy-breadcrumbs li.wy-breadcrumbs-aside{ + float:right +} +.wy-breadcrumbs li a{ + display:inline-block; + padding:5px +} +.wy-breadcrumbs li a:first-child{ + padding-left:0 +} +.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{ + padding:5px; + border:none; + background:none +} +.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{ + color:#404040 +} +.wy-breadcrumbs-extra{ + margin-bottom:0; + color:#b3b3b3; + font-size:80%; + display:inline-block +} +@media screen and (max-width:480px){ + .wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none + } +} +@media print{ + .wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none + } +} +html{ + font-size:16px +} +.wy-affix{ + position:fixed; + top:1.618em +} +.wy-menu a:hover{ + text-decoration:none +} +.wy-menu-horiz{ + *zoom:1 +} +.wy-menu-horiz:after,.wy-menu-horiz:before{ + display:table; + content:"" +} +.wy-menu-horiz:after{ + clear:both +} +.wy-menu-horiz li,.wy-menu-horiz ul{ + display:inline-block +} +.wy-menu-horiz li:hover{ + background:hsla(0,0%,100%,.1) +} +.wy-menu-horiz li.divide-left{ + border-left:1px solid #404040 +} +.wy-menu-horiz li.divide-right{ + border-right:1px solid #404040 +} +.wy-menu-horiz a{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 16px +} +.wy-menu-vertical{ + width:300px + margin-bottom: 20px; +} +.wy-menu-vertical header,.wy-menu-vertical p.caption{ + color:#007C97; + height:32px; + line-height:32px; + padding:0 1.618em; + margin:12px 0 0; + display:block; + font-weight:700; + text-transform:uppercase; + font-size:100%; + white-space:nowrap; +} +.wy-menu-vertical ul{ + margin-bottom:0 +} +.wy-menu-vertical li.divide-top{ + border-top:1px solid #404040 +} +.wy-menu-vertical li.divide-bottom{ + border-bottom:1px solid #404040 +} +.wy-menu-vertical li.current{ + background:#e3e3e3 +} +.wy-menu-vertical li.current a{ + color:grey; + border-right:1px solid #c9c9c9; + padding:.4045em 2.427em +} +.wy-menu-vertical li.current a:hover{ + background:#d6d6d6 +} +.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{ + border:none; + background:inherit; + color:inherit; + padding-left:0; + padding-right:0 +} +.wy-menu-vertical li button.toctree-expand{ + display:block; + float:left; + margin-left:-1.2em; + line-height:18px; + color:#4d4d4d; + border:none; + background:none; + padding:0 +} +.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{ + color:#404040; + font-weight:700; + position:relative; + background:#fcfcfc; + border:none; + padding:.4045em 1.618em +} +.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{ + background:#fcfcfc +} +.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{ + color:grey +} +.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{ + display:block; + line-height:18px; + color:#333 +} +.wy-menu-vertical li.toctree-l1.current>a{ + border-bottom:1px solid #c9c9c9; + border-top:1px solid #c9c9c9 +} +.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{ + display:none +} +.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{ + display:block +} +.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{ + font-size:.9em +} +.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{ + color:#404040 +} +.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{ + color:grey +} +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{ + display:block +} +.wy-menu-vertical li.toctree-l2.current>a{ + padding:.4045em 2.427em +} +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{ + padding:.4045em 1.618em .4045em 4.045em +} +.wy-menu-vertical li.toctree-l3.current>a{ + padding:.4045em 4.045em +} +.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{ + padding:.4045em 1.618em .4045em 5.663em +} +.wy-menu-vertical li.toctree-l4.current>a{ + padding:.4045em 5.663em +} +.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{ + padding:.4045em 1.618em .4045em 7.281em +} +.wy-menu-vertical li.toctree-l5.current>a{ + padding:.4045em 7.281em +} +.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{ + padding:.4045em 1.618em .4045em 8.899em +} +.wy-menu-vertical li.toctree-l6.current>a{ + padding:.4045em 8.899em +} +.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{ + padding:.4045em 1.618em .4045em 10.517em +} +.wy-menu-vertical li.toctree-l7.current>a{ + padding:.4045em 10.517em +} +.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{ + padding:.4045em 1.618em .4045em 12.135em +} +.wy-menu-vertical li.toctree-l8.current>a{ + padding:.4045em 12.135em +} +.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{ + padding:.4045em 1.618em .4045em 13.753em +} +.wy-menu-vertical li.toctree-l9.current>a{ + padding:.4045em 13.753em +} +.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{ + padding:.4045em 1.618em .4045em 15.371em +} +.wy-menu-vertical li.toctree-l10.current>a{ + padding:.4045em 15.371em +} +.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{ + padding:.4045em 1.618em .4045em 16.989em +} +.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{ + background:#c9c9c9 +} +.wy-menu-vertical li.toctree-l2 button.toctree-expand{ + color:#a3a3a3 +} +.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{ + background:#bdbdbd +} +.wy-menu-vertical li.toctree-l3 button.toctree-expand{ + color:#969696 +} +.wy-menu-vertical li.current ul{ + display:block +} +.wy-menu-vertical li ul{ + margin-bottom:0; + display:none +} +.wy-menu-vertical li ul li a{ + margin-bottom:0; + color:#d9d9d9; + font-weight:400 +} +.wy-menu-vertical a{ + line-height:18px; + padding:.4045em 1.618em; + display:block; + position:relative; + font-size:90%; + color:#d9d9d9 +} +.wy-menu-vertical a:hover{ + background-color:#4e4a4a; + cursor:pointer +} +.wy-menu-vertical a:hover button.toctree-expand{ + color:#d9d9d9 +} +.wy-menu-vertical a:active{ + background-color:#2980b9; + cursor:pointer; + color:#fff +} +.wy-menu-vertical a:active button.toctree-expand{ + color:#fff +} +.wy-side-nav-search{ + display:block; + width:300px; + padding:.809em; + margin-bottom:.809em; + z-index:200; + background-color:#171c2d; + text-align:center; + color:#fcfcfc +} +.wy-side-nav-search input[type=text]{ + width:100%; + border-radius:50px; + padding:6px 12px; + border-color:#2472a4 +} +.wy-side-nav-search img{ + display:block; + margin:auto auto .809em; + height:45px; + width:45px; + background-color:#171c2d; + padding:5px; + border-radius:100% +} +.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{ + color:#fcfcfc; + font-size:100%; + font-weight:700; + display:inline-block; + padding:4px 6px; + margin-bottom:.809em; + max-width:100% +} +.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{ + background:hsla(0,0%,100%,.1) +} +.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{ + display:block; + margin:0 auto; + height:auto; + width:auto; + border-radius:0; + max-width:100%; + background:transparent +} +.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{ + margin-top:.85em +} +.wy-side-nav-search>div.version{ + margin-top:-.4045em; + margin-bottom:.809em; + font-weight:400; + color:hsla(0,0%,100%,.3) +} +.wy-nav .wy-menu-vertical header{ + color:#2980b9 +} +.wy-nav .wy-menu-vertical a{ + color:#b3b3b3 +} +.wy-nav .wy-menu-vertical a:hover{ + background-color:#2980b9; + color:#fff +} +[data-menu-wrap]{ + -webkit-transition:all .2s ease-in; + -moz-transition:all .2s ease-in; + transition:all .2s ease-in; + position:absolute; + opacity:1; + width:100%; + opacity:0 +} +[data-menu-wrap].move-center{ + left:0; + right:auto; + opacity:1 +} +[data-menu-wrap].move-left{ + right:auto; + left:-100%; + opacity:0 +} +[data-menu-wrap].move-right{ + right:-100%; + left:auto; + opacity:0 +} +.wy-body-for-nav{ + background:#fcfcfc +} +.wy-grid-for-nav{ + position:absolute; + width:100%; + height:100% +} +.wy-nav-side{ + position:fixed; + top:0; + bottom:0; + left:0; + padding-bottom:2em; + width:300px; + overflow-x:hidden; + overflow-y:hidden; + min-height:100%; + color:#9b9b9b; + background:#171c2d; + z-index:200 +} +.wy-side-scroll{ + width:320px; + position:relative; + overflow-x:hidden; + overflow-y:scroll; + height:100%; +} +.wy-nav-top{ + display:none; + background:#E9102B; + color:#fff; + padding:.4045em .809em; + position:relative; + line-height:50px; + text-align:center; + font-size:100%; + *zoom:1 +} +.wy-nav-top:after,.wy-nav-top:before{ + display:table; + content:"" +} +.wy-nav-top:after{ + clear:both +} +.wy-nav-top a{ + color:#fff; + font-weight:700 +} +.wy-nav-top img{ + margin-right:12px; + height:45px; + width:45px; + background-color:#2980b9; + padding:5px; + border-radius:100% +} +.wy-nav-top i{ + font-size:30px; + float:left; + cursor:pointer; + padding-top:inherit +} +.wy-nav-content-wrap{ + margin-left:300px; + background:#fcfcfc; + min-height:100% +} +.wy-nav-content{ + padding:1.618em 3.236em; + height:100%; + margin:auto +} +.wy-body-mask{ + position:fixed; + width:100%; + height:100%; + background:rgba(0,0,0,.2); + display:none; + z-index:499 +} +.wy-body-mask.on{ + display:block +} +footer{ + color:grey +} +footer p{ + margin-bottom:12px +} +.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{ + padding:0; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + font-size:1em; + background:none; + border:none; + color:grey +} +.rst-footer-buttons{ + *zoom:1 +} +.rst-footer-buttons:after,.rst-footer-buttons:before{ + width:100%; + display:table; + content:"" +} +.rst-footer-buttons:after{ + clear:both +} +.rst-breadcrumbs-buttons{ + margin-top:12px; + *zoom:1 +} +.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{ + display:table; + content:"" +} +.rst-breadcrumbs-buttons:after{ + clear:both +} +#search-results .search li{ + margin-bottom:24px; + border-bottom:1px solid #e1e4e5; + padding-bottom:24px +} +#search-results .search li:first-child{ + border-top:1px solid #e1e4e5; + padding-top:24px +} +#search-results .search li a{ + font-size:120%; + margin-bottom:12px; + display:inline-block +} +#search-results .context{ + color:grey; + font-size:90% +} +.genindextable li>ul{ + margin-left:24px +} +@media screen and (max-width:768px){ + .wy-body-for-nav{ + background:#fcfcfc + } + .wy-nav-top{ + display:block + } + .wy-nav-side{ + left:-300px + } + .wy-nav-side.shift{ + width:85%; + left:0 + } + .wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{ + width:auto + } + .wy-nav-content-wrap{ + margin-left:0 + } + .wy-nav-content-wrap .wy-nav-content{ + padding:1.618em + } + .wy-nav-content-wrap.shift{ + position:fixed; + min-width:100%; + left:85%; + top:0; + height:100%; + overflow:hidden + } +} +@media screen and (min-width:1100px){ + .wy-nav-content-wrap{ + /* background:rgba(0,0,0,.05) */ + } + .wy-nav-content{ + margin:0; + background:#fcfcfc + } +} +@media print{ + .rst-versions,.wy-nav-side,footer{ + display:none + } + .wy-nav-content-wrap{ + margin-left:0 + } +} +.rst-versions{ + position:fixed; + bottom:0; + left:0; + width:300px; + color:#fcfcfc; + background:#1f1d1d; + font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + z-index:400 +} +.rst-versions a{ + color:#2980b9; + text-decoration:none +} +.rst-versions .rst-badge-small{ + display:none +} +.rst-versions .rst-current-version{ + padding:12px; + background-color:#272525; + display:block; + text-align:right; + font-size:90%; + cursor:pointer; + color:#27ae60; + *zoom:1 +} +.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{ + display:table; + content:"" +} +.rst-versions .rst-current-version:after{ + clear:both +} +.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{ + color:#fcfcfc +} +.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{ + float:left +} +.rst-versions .rst-current-version.rst-out-of-date{ + background-color:#e74c3c; + color:#fff +} +.rst-versions .rst-current-version.rst-active-old-version{ + background-color:#f1c40f; + color:#000 +} +.rst-versions.shift-up{ + height:auto; + max-height:100%; + overflow-y:scroll +} +.rst-versions.shift-up .rst-other-versions{ + display:block +} +.rst-versions .rst-other-versions{ + font-size:90%; + padding:12px; + color:grey; + display:none +} +.rst-versions .rst-other-versions hr{ + display:block; + height:1px; + border:0; + margin:20px 0; + padding:0; + border-top:1px solid #413d3d +} +.rst-versions .rst-other-versions dd{ + display:inline-block; + margin:0 +} +.rst-versions .rst-other-versions dd a{ + display:inline-block; + padding:6px; + color:#fcfcfc +} +.rst-versions.rst-badge{ + width:auto; + bottom:20px; + right:20px; + left:auto; + border:none; + max-width:300px; + max-height:90% +} +.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{ + float:none; + line-height:30px +} +.rst-versions.rst-badge.shift-up .rst-current-version{ + text-align:right +} +.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{ + float:left +} +.rst-versions.rst-badge>.rst-current-version{ + width:auto; + height:30px; + line-height:30px; + padding:0 6px; + display:block; + text-align:center +} +@media screen and (max-width:768px){ + .rst-versions{ + width:85%; + display:none + } + .rst-versions.shift{ + display:block + } +} +.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{ + margin-bottom:24px +} +.rst-content img{ + max-width:100%; + height:auto +} +.rst-content div.figure,.rst-content figure{ + margin-bottom:24px +} +.rst-content div.figure .caption-text,.rst-content figure .caption-text{ + font-style:italic +} +.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{ + margin-bottom:0 +} +.rst-content div.figure.align-center,.rst-content figure.align-center{ + text-align:center +} +.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{ + margin-bottom:24px +} +.rst-content abbr[title]{ + text-decoration:none +} +.rst-content.style-external-links a.reference.external:after{ + font-family:FontAwesome; + content:"\f08e"; + color:#b3b3b3; + vertical-align:super; + font-size:60%; + margin:0 .2em +} +.rst-content blockquote{ + margin-left:24px; + line-height:24px; + margin-bottom:24px +} +.rst-content pre.literal-block{ + white-space:pre; + margin:0; + padding:12px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + display:block; + overflow:auto +} +.rst-content div[class^=highlight],.rst-content pre.literal-block{ + border:1px solid #e1e4e5; + overflow-x:auto; + margin:1px 0 24px +} +.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{ + padding:0; + border:none; + margin:0 +} +.rst-content div[class^=highlight] td.code{ + width:100% +} +.rst-content .linenodiv pre{ + border-right:1px solid #e6e9ea; + margin:0; + padding:12px; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + user-select:none; + pointer-events:none +} +.rst-content div[class^=highlight] pre{ + white-space:pre; + margin:0; + padding:12px; + display:block; + overflow:auto +} +.rst-content div[class^=highlight] pre .hll{ + display:block; + margin:0 -12px; + padding:0 12px +} +.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + font-size:12px; + line-height:1.4 +} +.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{ + user-select:none; + pointer-events:none +} +.rst-content div.highlight span.linenos{ + display:inline-block; + padding-left:0; + padding-right:12px; + margin-right:12px; + border-right:1px solid #e6e9ea +} +.rst-content .code-block-caption{ + font-style:italic; + font-size:85%; + line-height:1; + padding:1em 0; + text-align:center +} +@media print{ + .rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{ + white-space:pre-wrap + } +} +.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{ + clear:both +} +.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{ + margin-bottom:0 +} +.rst-content .admonition-title:before{ + margin-right:4px +} +.rst-content .admonition table{ + border-color:rgba(0,0,0,.1) +} +.rst-content .admonition table td,.rst-content .admonition table th{ + background:transparent!important; + border-color:rgba(0,0,0,.1)!important +} +.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{ + list-style:lower-alpha +} +.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{ + list-style:upper-alpha +} +.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{ + margin-top:12px; + margin-bottom:12px +} +.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{ + margin-top:0 +} +.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{ + margin-bottom:12px +} +.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{ + margin-bottom:0 +} +.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{ + margin-bottom:12px +} +.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{ + margin-top:0; + margin-bottom:0 +} +.rst-content .line-block{ + margin-left:0; + margin-bottom:24px; + line-height:24px +} +.rst-content .line-block .line-block{ + margin-left:24px; + margin-bottom:0 +} +.rst-content .topic-title{ + font-weight:700; + margin-bottom:12px +} +.rst-content .toc-backref{ + color:#404040 +} +.rst-content .align-right{ + float:right; + margin:0 0 24px 24px +} +.rst-content .align-left{ + float:left; + margin:0 24px 24px 0 +} +.rst-content .align-center{ + margin:auto +} +.rst-content .align-center:not(table){ + display:block +} +.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{ + opacity:0; + font-size:14px; + font-family:FontAwesome; + margin-left:.5em +} +.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{ + opacity:1 +} +.rst-content .btn:focus{ + outline:2px solid +} +.rst-content table>caption .headerlink:after{ + font-size:12px +} +.rst-content .centered{ + text-align:center +} +.rst-content .sidebar{ + float:right; + width:40%; + display:block; + margin:0 0 24px 24px; + padding:24px; + background:#f3f6f6; + border:1px solid #e1e4e5 +} +.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{ + font-size:90% +} +.rst-content .sidebar .last,.rst-content .sidebar>:last-child{ + margin-bottom:0 +} +.rst-content .sidebar .sidebar-title{ + display:block; + font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif; + font-weight:700; + background:#e1e4e5; + padding:6px 12px; + margin:-24px -24px 24px; + font-size:100% +} +.rst-content .highlighted{ + background:#f1c40f; + box-shadow:0 0 0 2px #f1c40f; + display:inline; + font-weight:700 +} +.rst-content .citation-reference,.rst-content .footnote-reference{ + vertical-align:baseline; + position:relative; + top:-.4em; + line-height:0; + font-size:90% +} +.rst-content .hlist{ + width:100% +} +.rst-content dl dt span.classifier:before{ + content:" : " +} +.rst-content dl dt span.classifier-delimiter{ + display:none!important +} +html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{ + background:none; + border:none +} +html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{ + border:none; + background-color:transparent!important; + white-space:normal +} +html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{ + padding-left:0; + padding-right:0; + vertical-align:top +} +html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{ + display:grid; + grid-template-columns:max-content auto +} +html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{ + padding-left:1rem +} +html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{ + content:":" +} +html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{ + margin-bottom:0 +} +html.writer-html5 .rst-content dl.footnote{ + font-size:.9rem +} +html.writer-html5 .rst-content dl.footnote>dt{ + margin:0 .5rem .5rem 0; + line-height:1.2rem; + word-break:break-all; + font-weight:400 +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets{ + margin-right:.5rem +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{ + content:"[" +} +html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{ + content:"]" +} +html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{ + font-style:italic +} +html.writer-html5 .rst-content dl.footnote>dd{ + margin:0 0 .5rem; + line-height:1.2rem +} +html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{ + font-size:.9rem +} +.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{ + color:grey +} +.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{ + color:#555 +} +.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{ + margin-bottom:0 +} +.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){ + margin-top:24px +} +.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{ + margin-bottom:24px +} +.rst-content table.docutils th{ + border-color:#e1e4e5 +} +html.writer-html5 .rst-content table.docutils th{ + border:1px solid #e1e4e5 +} +html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{ + line-height:1rem; + margin-bottom:0; + font-size:.9rem +} +.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{ + margin-bottom:0 +} +.rst-content table.field-list,.rst-content table.field-list td{ + border:none +} +.rst-content table.field-list td p{ + font-size:inherit; + line-height:inherit +} +.rst-content table.field-list td>strong{ + display:inline-block +} +.rst-content table.field-list .field-name{ + padding-right:10px; + text-align:left; + white-space:nowrap +} +.rst-content table.field-list .field-body{ + text-align:left +} +.rst-content code,.rst-content tt{ + color:#000; + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + padding:2px 5px +} +.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{ + font-size:100%!important; + line-height:normal +} +.rst-content code.literal,.rst-content tt.literal{ + color:#e74c3c; + white-space:normal +} +.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{ + font-weight:700; + color:#404040 +} +.rst-content kbd,.rst-content pre,.rst-content samp{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace +} +.rst-content a code,.rst-content a tt{ + color:#2980b9 +} +.rst-content dl{ + margin-bottom:24px +} +.rst-content dl dt{ + font-weight:700; + margin-bottom:12px +} +.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{ + margin-bottom:12px +} +.rst-content dl dd{ + margin:0 0 12px 24px; + line-height:24px +} +html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){ + margin-bottom:24px +} +html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{ + display:table; + margin:6px 0; + font-size:90%; + line-height:normal; + background:#e7f2fa; + color:#2980b9; + border-top:3px solid #6ab0de; + padding:6px; + position:relative +} +html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{ + color:#6ab0de +} +html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{ + color:#404040; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{ + margin-bottom:6px; + border:none; + border-left:3px solid #ccc; + background:#f0f0f0; + color:#555 +} +html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{ + color:#404040; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{ + margin-top:0 +} +html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{ + background-color:transparent; + border:none; + padding:0; + font-size:100%!important +} +html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{ + font-weight:700 +} +html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{ + display:inline-block; + padding:0 4px; + color:#000; + font-weight:700 +} +html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{ + display:inline-block; + padding-right:8px; + max-width:100% +} +html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{ + font-style:italic +} +html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{ + font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace; + color:#000 +} +.rst-content .viewcode-back,.rst-content .viewcode-link{ + display:inline-block; + color:#27ae60; + font-size:80%; + padding-left:24px +} +.rst-content .viewcode-back{ + display:block; + float:right +} +.rst-content p.rubric{ + margin-bottom:12px; + font-weight:700 +} +.rst-content code.download,.rst-content tt.download{ + background:inherit; + padding:inherit; + font-weight:400; + font-family:inherit; + font-size:inherit; + color:inherit; + border:inherit; + white-space:inherit +} +.rst-content code.download span:first-child,.rst-content tt.download span:first-child{ + -webkit-font-smoothing:subpixel-antialiased +} +.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{ + margin-right:4px +} +.rst-content .guilabel{ + border:1px solid #7fbbe3; + background:#e7f2fa; + font-size:80%; + font-weight:700; + border-radius:4px; + padding:2.4px 6px; + margin:auto 2px +} +.rst-content .versionmodified{ + font-style:italic +} +@media screen and (max-width:480px){ + .rst-content .sidebar{ + width:100% + } +} +span[id*=MathJax-Span]{ + color:#404040 +} +.math{ + text-align:center +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff"); + font-weight:400; + font-style:normal; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff"); + font-weight:700; + font-style:normal; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff"); + font-weight:700; + font-style:italic; + font-display:block +} +@font-face{ + font-family:Lato; + src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff"); + font-weight:400; + font-style:italic; + font-display:block +} +@font-face{ + font-family:Roboto Slab; + font-style:normal; + font-weight:400; + src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff"); + font-display:block +} +@font-face{ + font-family:Roboto Slab; + font-style:normal; + font-weight:700; + src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff"); + font-display:block +} diff --git a/v1.2/_static/custom.css b/v1.2/_static/custom.css new file mode 100644 index 00000000..1cadbe76 --- /dev/null +++ b/v1.2/_static/custom.css @@ -0,0 +1,24 @@ +/* + * custom.css + * ~~~~~~~~~ + * + * Custom stylesheet. + * + * :copyright: Copyright 2022 by Xilinx, Inc. + * + */ + +/* -- main layout ----------------------------------------------------------- */ +@media screen and (max-width: 950px){ + .wy-body-for-nav{background:#000000} + .wy-nav-top{display:block} + .wy-nav-side{left:300px} + .wy-nav-side.shift{width:85%;left:0} + .wy-side-scroll{width:auto} + .wy-side-nav-search{width:auto} + .wy-menu.wy-menu-vertical{width:auto} + .wy-nav-content-wrap{margin-left:0} + .wy-nav-content-wrap + .wy-nav-content{padding:1.618em} + .wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden} +} \ No newline at end of file diff --git a/v1.2/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css b/v1.2/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css new file mode 100644 index 00000000..eb19f698 --- /dev/null +++ b/v1.2/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/v1.2/_static/design-tabs.js b/v1.2/_static/design-tabs.js new file mode 100644 index 00000000..36b38cf0 --- /dev/null +++ b/v1.2/_static/design-tabs.js @@ -0,0 +1,27 @@ +var sd_labels_by_text = {}; + +function ready() { + const li = document.getElementsByClassName("sd-tab-label"); + for (const label of li) { + syncId = label.getAttribute("data-sync-id"); + if (syncId) { + label.onclick = onLabelClick; + if (!sd_labels_by_text[syncId]) { + sd_labels_by_text[syncId] = []; + } + sd_labels_by_text[syncId].push(label); + } + } +} + +function onLabelClick() { + // Activate other inputs with the same sync id. + syncId = this.getAttribute("data-sync-id"); + for (label of sd_labels_by_text[syncId]) { + if (label === this) continue; + label.previousElementSibling.checked = true; + } + window.localStorage.setItem("sphinx-design-last-tab", syncId); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/v1.2/_static/doctools.js b/v1.2/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/v1.2/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/v1.2/_static/documentation_options.js b/v1.2/_static/documentation_options.js new file mode 100644 index 00000000..75cbead8 --- /dev/null +++ b/v1.2/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.2', + LANGUAGE: 'English', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/v1.2/_static/file.png b/v1.2/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/v1.2/_static/file.png differ diff --git a/v1.2/_static/jquery.js b/v1.2/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/v1.2/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v1.2/_static/js/html5shiv.min.js b/v1.2/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/v1.2/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/v1.2/_static/js/theme.js b/v1.2/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/v1.2/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/v1.2/_static/layout.html b/v1.2/_static/layout.html new file mode 100644 index 00000000..81ae0134 --- /dev/null +++ b/v1.2/_static/layout.html @@ -0,0 +1,14 @@ +{% extends "!layout.html" %} + {% block footer %} {{ super() }} + + +{% endblock %} \ No newline at end of file diff --git a/v1.2/_static/minus.png b/v1.2/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/v1.2/_static/minus.png differ diff --git a/v1.2/_static/plus.png b/v1.2/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/v1.2/_static/plus.png differ diff --git a/v1.2/_static/pygments.css b/v1.2/_static/pygments.css new file mode 100644 index 00000000..84ab3030 --- /dev/null +++ b/v1.2/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/v1.2/_static/searchtools.js b/v1.2/_static/searchtools.js new file mode 100644 index 00000000..7918c3fa --- /dev/null +++ b/v1.2/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/v1.2/_static/sphinx_highlight.js b/v1.2/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/v1.2/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/v1.2/_static/xilinx-header-logo.png b/v1.2/_static/xilinx-header-logo.png new file mode 100644 index 00000000..00372830 Binary files /dev/null and b/v1.2/_static/xilinx-header-logo.png differ diff --git a/v1.2/_static/xilinx-header-logo.svg b/v1.2/_static/xilinx-header-logo.svg new file mode 100644 index 00000000..6b15297d --- /dev/null +++ b/v1.2/_static/xilinx-header-logo.svg @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + Page-1 + + + Sheet.1 + + + + + + diff --git a/v1.2/c_apis.html b/v1.2/c_apis.html new file mode 100644 index 00000000..ae325a76 --- /dev/null +++ b/v1.2/c_apis.html @@ -0,0 +1,1752 @@ + + + + + + + + + + + + + + + C API Programming Guide — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • C API Programming Guide
  • +
  • +
  • +
+
+
+
+
+ +
+

C API Programming Guide

+ +
+

Overview

+

The AMD AMA Video SDK provides a C-based application programming interface (API) which facilitates the integration of AMD transcoding capabilities in proprietary frameworks. This API is provided in the form of plugins leveraging the Xilinx Media Accelerator (XMA) library and the Xilinx Resource Manager (XRM) library.

+

The XMA Library

+

The XMA library (libxma) is meant to simplify the development of applications managing and controlling video accelerators such as decoders, scalers, filters, and encoders.

+

The XRM Library

+

The XRM library is used to manage the hardware accelerators available in the system. XRM keeps track of total system capacity for each of the compute units such as the decoder, scaler, and encoder. The XRM library makes it possible to perform actions such as reserving, allocating and releasing resources; calculating resource load and max capacity.

+

The AMD AMA Video SDK Plugins

+

The AMD AMA Video SDK provides 4 different plugins, each corresponding to a specific hardware accelerated feature of the card:

+
    +
  • The decoder plugin

  • +
  • The encoder plugin

  • +
  • The filter plugin

  • +
  • The scaler plugin

  • +
+

Any combination of plugins can be used when integrating with a proprietary framework.

+
+

Note

+

For elaborate definition of default and auto values, refer to counterpart sections in Using FFmpeg.

+
+
+
+

General Application Development Guide

+

Integration layers for applications using the AMD AMA Video SDK are organized around the following steps:

+
    +
  1. Initialization

  2. +
  3. Resource Reservation

  4. +
  5. Session Creation

  6. +
  7. Runtime Processing

  8. +
  9. Cleanup

  10. +
+
+

Resource Initialization and Allocation

+

Applications using the plugins must first create a XRM plugin using the xrm_PLUGIN_reserve(), where PLUGIN is one of dec, enc, or scale. This is done using the XRM APIs, as described in detail in the XRM API Reference Guide below.

+
+
+

Session Creation

+

Once the resources have been allocated, the application must create dedicated plugin sessions for each of the hardware accelerators that need to be used (decoder, scaler, encoder, filter).

+

To create a session, the application must first initialize all the required properties and parameters of the particular plugin. It must then call the corresponding session creation function. A complete reference for all the plugins is provided below.

+
+
+

Runtime Processing

+

The plugins provide functions to send data from the host and receive data from the device. The data is in the form of video frames (XmaFrame). It is also possible to do zero-copy operations where frames are passed from one hardware accelerator to the next without being copied back to the host. The send and receive functions are specific to each plugin and the return code should be used to determine the next suitable action. A complete reference for all the plugins is provided below.

+
+
+

Cleanup

+

When the application finishes, it should destroy each plugin session using the corresponding destroy function. Doing so will free the resources on the AMD devices for other jobs and ensure that everything is released and cleaned-up properly.

+

The application should also use the xrm_PLUGIN_release(), where PLUGIN is one of dec, enc, or scale to release allocated resources. This is done using the XRM APIs, as described in detail in the XRM API Reference Guide below.

+
+

+
+
+
+
+

Compiling and Linking with the AMD AMA Video SDK Plugins

+

The plugins can be dynamically linked to the application. The required package to build applications is XRM. This package is provided as part of the AMD AMA Video SDK.

+

To provide the necessary declarations in your application, include the following header in your source code:

+
#include <xrm.h>
+
+
+

To compile and link your application with the plugins, add the following lines to your CMakeList.txt file:

+
target_link_libraries (${PROJECT_NAME} PUBLIC xma PUBLIC xrm_interface)
+target_include_directories (${PROJECT_NAME}
+  PUBLIC "${PROJECT_SOURCE_DIR}/include"
+  PUBLIC "$<TARGET_PROPERTY:xrm,INTERFACE_INCLUDE_DIRECTORIES>")
+
+
+
+

+
+
+
+

Common XMA Data Structures

+
+
+struct XmaParameter
+
+ +

Type-Length-Value data structure used for passing custom arguments to a plugin. The declaration of XmaParameter can be found in the /opt/amd/ama/ma35/include/xma/xmaparam.h file.

+
+
+struct XmaFrameProperties
+
+ +

Data structure describing the frame dimensions for XmaFrame. The declaration of XmaFrameProperties can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+struct XmaFrame
+
+ +

Data structure describing a raw video frame and its buffers. XmaFrame structures can be received from the decoder or sent to the encoder. They are also used as input and outputs for the scaler and the look-ahead. The declaration of XmaFrame can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+

The AMD AMA Video SDK plugins supports 3 types of frames:

+
    +
  • XMA_HOST_BUFFER_TYPE frames must be copied to the device using the upload filter before they can be used by the device..

  • +
  • XMA_DEVICE_ONLY_BUFFER_TYPE frames must be copied to the host using the download filter before they can be used by the host application.

  • +
  • NO_BUFFER frames do not contain buffer data and are used as place holders to be filled in by XMA plugins..

  • +
+

The upload filter plugin send function only supports XMA_HOST_BUFFER_TYPE frames, while all other send frame functions only support XMA_DEVICE_BUFFER_TYPE frames. All frames used in receive functions must contain "dummy" data. All parameters in those frames will be filled in by the respective receive functions. All frames must be allocated using the provided XMA functions.

+
+
+struct XmaDataBuffer
+
+ +

Data structure describing a buffer containing encoded video data. XmaDataBuffer structures can be sent to the decoder or received from the encoder. The declaration of XmaDataBuffer can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+

All XmaDataBuffer structures must be allocated using one of the provided functions. XmaDataBuffer structures used in the encoder receive function must be allocated with "dummy" data and will be filled in by the encoder.

+
+

Note

+

Xma[Scaler|Encoder|Filter]Properties.sw_format

+
+

sw_format, which is a member of XmaScalerProperties, XmaEncoderProperties, and XmaFilterProperties structures, represents the pixel format of a frame on the device. Therefore, its assigned value is determined by the direction of data flow. Specifically:

+
+
+
XMA_NV12_FMT_TYPE and XMA_P010LE_FMT_TYPE, with flags = XMA_FRAME_PROPERTY_FLAG_TILE_4x4, are internal formats that can only be generated by decoder/scaler and not by the upload filter.
+
XMA_PACKED10_FMT_TYPE is an internal format that can only be generated by decoder/scaler and not the upload filter.
+
XMA_RGB24_FMT_TYPE is reserved for future use.
+
XMA_YUV420P_FMT_TYPE and XMA_YUV420P10LE_FMT_TYPE are external formats that can be used by the upload filter
+
+
+
+
+
+

+
+
+
+

Common XMA Data Reference

+

This section describes the commonly used calls and APIs that are required in most applications.

+
+

XMA Log Interface

+

The external interface to the xma logging consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmalogger.h file.

+
+
+int32_t xma_log_init(XmaLogLevelType log_level, XmaLogType log_type, XmaLogHandle *handle, ...)
+
+ +

This function creates a log session and must be called prior to logging. (See /opt/amd/ama/ma35/include/xma/xmalogger.h for details on variadic usage.)

+
+
+void xma_logmsg(XmaLogHandle handle, XmaLogLevelType level, const char *name, const char *msg, ...)
+
+ +

This function logs a message.

+
+
+void xma_log_release(XmaLogHandle handle)
+
+ +

This function releases a log session that was previously created with the xma_log_init() function.

+
+
+

XMA Session Interface

+

The external interface to the xma session consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xma.h file.

+
+
+int32_t xma_initialize(XmaLogHandle log, XmaInitParameter *init_params, XmaHandle *handle)
+
+ +

This function creates a XMA session and must be called prior to creating any plugins.

+
+
+void xma_release(XmaHandle handle)
+
+ +

This function releases a XMA session that was previously created with the xma_initialize() function.

+
+
+

XMA Data Buffer Interface

+

The external interface to the xma data buffer consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+XmaDataBuffer *xma_data_buffer_alloc(XmaHandle handle, size_t size, bool dummy)
+
+ +

This function creates a XmaDataBuffer of the given size.

+
+
+XmaDataBuffer *xma_data_from_buffer_clone(XmaHandle handle, uint8_t *data, size_t size, xma_data_buffer_clone_free_callback_function free_callback, void *opaque)
+
+ +

This function creates a XmaDataBuffer that points to the provided buffer. xma_data_buffer_clone_free_callback_function will be called, when the buffer is no longer needed.

+
+
+void xma_data_buffer_free(XmaDataBuffer *data)
+
+ +

This function releases a previously created XmaDataBuffer.

+
+
+

XMA Frame Interface

+

The external interface to the xma Frame consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+int32_t xma_frame_planes_get(XmaHandle handle, XmaFrameProperties *frame_props)
+
+ +

This returns the number of planes for a given pixel format.

+
+
+int32_t xma_frame_get_plane_height(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the height of the plane based on the frame height, pixel format, and plane.

+
+
+int32_t xma_frame_get_plane_stride(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the stride of the plane based on the frame width, pixel format, and plane.

+
+
+int32_t xma_frame_get_plane_size(XmaHandle handle, XmaFrameProperties *frame_props, size_t plane)
+
+ +

This returns the size of the plane based on the frame width, height, pixel format, and plane.

+
+
+XmaFrame *xma_frame_alloc(XmaHandle handle, XmaFrameProperties *frame_props, bool dummy)
+
+ +

This function creates a XmaFrame with the given properties.

+
+
+XmaFrame *xma_frame_from_buffers_clone(XmaHandle handle, XmaFrameProperties *frame_props, XmaFrameData *frame_data, xma_frame_clone_free_callback_function free_callback, void *opaque)
+
+ +

This function creates a XmaFrame that points to the provided data and with the given properties. xma_frame_clone_free_callback_function will be called when the data is no longer needed.

+
+
+XmaFrame *xma_frame_clone(XmaHandle handle, XmaFrame *xma_frame)
+
+ +

This function creates a XmaFrame that uses the same buffers as the provided XmaFrame, but can have side data added or removed without affecting the original XmaFrame.

+
+
+int32_t xma_frame_inc_ref(XmaFrame *frame)
+
+ +

This function increases the reference count of the given XmaFrame.

+
+
+int32_t xma_frame_dec_ref(XmaFrame *frame)
+
+ +

This function decreases the reference count of the given XmaFrame.

+
+
+void xma_frame_free(XmaFrame *frame)
+
+ +

This function releases a XmaFrame that was created with the previous functions.

+
+
+int32_t xma_frame_add_side_data(XmaFrame *frame, XmaFrameSideData *side_data)
+
+ +

This function adds the side data to the frame. If there is already side data of the same type associated with the frame, it is removed and the new side data is set. The reference count of the side_data buffer is incremented by 1 on successful execution.

+
+
+XmaFrameSideData *xma_frame_get_first_side_data(XmaFrame *frame)
+
+ +

This function returns the handle to the first side data of any type. Added in v1.1.

+
+
+XmaFrameSideData *xma_frame_get_side_data(XmaFrame *frame, enum XmaFrameSideDataType type)
+
+ +

This function returns the handle to the first side data of the given type.

+
+
+XmaFrameSideData *xma_frame_get_next_side_data(XmaFrame *frame, XmaFrameSideData *side_data)
+
+ +

This function returns the handle to the next side data of any type. Added in v1.1.

+
+
+XmaFrameSideData *xma_frame_get_next_side_data_of_type(XmaFrame *frame, XmaFrameSideData *side_data)
+
+ +

This function returns the handle to the next side data of the given type. Added in v1.1.

+
+
+int32_t xma_frame_remove_side_data(XmaFrame *frame, XmaFrameSideData *side_data)
+
+ +

This function removes the side data from the frame. The side data buffer reference count is decremented by 1. If it results in a reference count of zero, then the side data is freed.

+
+
+int32_t xma_frame_remove_side_data_type(XmaFrame *frame, enum XmaFrameSideDataType type)
+
+ +

This function removes all side data of the given type. Any side data buffer that is removed has it's reference count decremented by 1. If it results in a reference count of zero, then the side data buffer is freed.

+
+
+void xma_frame_clear_all_side_data(XmaFrame *frame)
+
+ +

This function removes all side data from the frame. The reference count of each side data buffer associated with the frame is decremented by 1. If it results in a reference count of zero, then the side data is freed.

+
+
+

XMA Side Band Data

+

Passing side band data through xma consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmabuffers.h file.

+
+
+XmaFrameSideData *xma_side_data_alloc(XmaHandle handle, enum XmaFrameSideDataType type, XmaBufferType buffer_type, uint64_t size)
+
+ +

This function allocates side data handle, with reference count 1.

+
+
+void xma_side_data_free(XmaFrameSideData *side_data)
+
+ +

This function decrements the reference count of the side_data by 1.

+
+
+int32_t xma_side_data_inc_ref(XmaFrameSideData *side_data)
+
+ +

This function increments the reference count of the side_data by 1

+
+
+int32_t xma_side_data_dec_ref(XmaFrameSideData *side_data)
+
+ +

This function decrements the reference count of the side_data by 1.

+
+
+int32_t xma_side_data_get_refcount(XmaFrameSideData *side_data)
+
+ +

This function returns the reference count of the side_data.

+
+
+int32_t xma_side_data_read(XmaFrameSideData *side_data)
+
+ +

This function copies data from device to host. Deprecated in v1.1 and above.

+
+
+int32_t xma_side_data_write(XmaFrameSideData *side_data)
+
+ +

This function copies data from host to device. Only use this function if you created the side data and it has not yet been sent to any sessions, otherwise risk of a race condition can occur.

+
+
+int32_t xma_side_data_get_metadata(XmaFrameSideData *side_data, XmaParameter *metadata)
+
+ +

This function gets the value of specified metadata. Added in v1.1.

+
+
+int32_t xma_side_data_set_metadata(XmaFrameSideData *side_data, XmaParameter *metadata)
+
+ +

This function replaces or creates the specified metadata, depending on whether it exists on not. Added in v1.1.

+
+
+
+

1.0 SDK API

+

The following subsections describe APIs applicable to 1.0 SDK. Note that these APIs serve as bases for future versions. In order to allow forwards and backwards ABI compatibility, the application can now set which version of the API to use. If no version is set, version 1.0 is assumed. When a version is set, only features available in that version are allowed. This means if a feature was deprecated in an earlier version, or was added in a later version, it cannot be used and will either be ignored or returned as an error.

+

To set the API version, use the following code snippet:

+
XmaParameter params[1];
+uint32_t api_version = XMA_API_VERSION_M_ m;
+
+params[0].name = (char*)XMA_API_VERSION;
+params[0].type = XMA_UINT32;
+params[0].length = sizeof(uint32_t);
+params[0].value = &api_version;
+
+xma_init_param.params        = params;
+xma_init_param.param_cnt     = 1;
+xma_initialize(logger, &xma_init_param, handle);
+
+
+

, where M and m are major and minor versions of the SDK, e.g., for SDK 1.0 the macro becomes XMA_API_VERSION_1_0.

+
+

Decoder Plugin Reference

+
+

Decoder Interface

+

The external interface to the decoder plugin consists of the following XMA functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmadecoder.h file.

+
+
+XmaDecoderSession *xma_dec_session_create(XmaDecoderProperties *dec_props)
+
+ +

This function creates a decoder session and must be called prior to decoding data. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_dec_session_set_log(XmaDecoderSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_dec_session_send_data(XmaDecoderSession *session, XmaDataBuffer *data, int32_t *data_used)
+
+ +

This function sends input frame data to the hardware decoder by way of the plugin. The application needs to parse the input encoded stream and send one frame of data at a time in a XmaDataBuffer data structure.

+

The data_used value indicates the amount of input data consumed by the decoder.

+

If the function returns XMA_SUCCESS, then the decoder was able to consume the entirety of the available data and data_used will be set accordingly. In this case, the application can proceed with fetching decoded data using the xma_dec_session_recv_frame() API.

+

If the function returns XMA_TRY_AGAIN, then the decoder was did not consume any of the input data and data_used will be reported as 0. In this case, the application can proceed with fetching previously decoded data with the xma_dec_session_recv_frame() function but must send the same input again using using xma_dec_session_send_data() until the function returns XMA_SUCCESS.

+

If the function returns XMA_SEND_MORE_DATA, then the data sent is being processed, but more is required before any frames will be available.

+

Once the application has sent all the input frames to the decoder, it must notify the decoder by sending a null buffer. The application should then continue sending null buffers in order to flush out all the output YUV frames.

+
+
+int32_t xma_dec_session_get_properties(XmaDecoderSession *dec_session, XmaFrameProperties *fprops);
+
+ +

This function returns the decoder properties such as width, height, output format, and frame rate.

+
+
+int32_t xma_dec_session_recv_frame(XmaDecoderSession *session, XmaFrame *frame)
+
+ +

This function tries to fetch a decoded YUV frame from the hardware accelerator.

+

If the function returns XMA_SUCCESS, a valid YUV frame pointer is available in the buffer pointer of the XmaFrame argument.

+

If the function returns XMA_TRY_AGAIN, then the decoder still needs some input data to produce a complete YUV output frame.

+

If the function returns XMA_EOS, then the decoder has flushed out all the frames.

+
+
+int32_t xma_dec_session_destroy(XmaDecoderSession *session)
+
+ +

This function destroys a decoder session that was previously created with the xma_dec_session_create() function.

+
+
+

Decoder Properties

+

The AMD AMA Video SDK decoder is configured using a combination of standard XMA decoder properties and custom decoder parameters, both of which are specified using a XmaDecoderProperties data structure. The declaration of XmaDecoderProperties can be found in the /opt/amd/ama/ma35/include/xma/xmadecoder.h file.

+
+

+
+
+
+struct XmaDecoderProperties
+
+ +

This data structure is used to configure the AMD AMA Video SDK decoder.

+
+

+
+

Standard XMA Decoder Properties

+

When using the decoder plugin, the following members of the XmaDecoderProperties data structure must be set by the application:

+
+
hwdecoder_type

Specifying type of decoder to reserve.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the decoder plugin.

+
+
param_cnt

Count of custom parameters.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840. +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
bits_per_pixel

Bits per pixel for primary plane of output video. +Must be set to 8 or 10 bits per pixel.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS.

+
+
handle

handle to XMA device.

+
+
+

Custom Decoder Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the decoder plugin:

+
+
"out_fmt"

XMA pixel format. See -out_fmt for available options.

+
+
“low_latency”

Set to 1 to enable low latency mode.

+
+
"latency_logging"

Set to 1 to enable logging of latency information to the xma log.

+
+
+
+

+
+
+
+
+

Scaler Plugin Reference

+
+

Scaler Interface

+

The external interface to the scaler plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+
+XmaScalerSession *xma_scaler_session_create(XmaScalerProperties *props)
+
+ +

This function creates scaler session and must be called prior to sending input frames. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_scaler_session_send_frame(XmaScalerSession *session, XmaFrame *frame)
+
+ +

This function sends a YUV frame to the underlying XMA plugin( and eventually to hardware to scale the input frame to one or multiple resolutions.

+

The application can take further action depending upon the return value from this API.

+

If the function returns XMA_SUCCESS, then the application can proceed to fetch scaled output frames.

+

If the function returns XMA_SEND_MORE_DATA, then the application should proceed with sending next YUV frame.

+

If the function returns XMA_FLUSH_AGAIN it means that the application should keep flushing the scaler.

+

Once the application has sent all the input frames to the scaler, it must notify the scaler by sending a null frame to flush the scaler.

+
+
+int32_t xma_scaler_session_recv_frame_list(XmaScalerSession *session, XmaFrame **frame_list)
+
+ +

This function is called after calling the xma_scaler_session_send_frame(). This function returns a list of output frames with every call until it reaches end of scaling. Return codes can only be XMA_SUCCESS and XMA_ERROR.

+
+
+int32_t xma_scaler_session_destroy(XmaScalerSession *session)
+
+ +

This function destroys scaler session that was previously created with the xma_scaler_session_create() function.

+
+

+
+
+
+

Scaler Properties

+

The AMD AMA Video SDK scaler is configured using a combination of standard XMA scaler properties, standard XMA scaler input and output properties and custom scaler parameters, all of which are specified using XmaScalerProperties and XmaScalerInOutProperties data structures.

+
+

+
+
+
+struct XmaScalerProperties
+
+ +

This data structure is used to configure the video scaler. The declaration of XmaScalerProperties can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+
+struct XmaScalerInOutProperties
+
+ +

This data structure is used to configure the input and outputs of the video scaler. The XmaScalerFilterProperties data structure contains one XmaScalerInOutProperties for the scaler input and an array of 16 XmaScalerInOutProperties for the scaler outputs. The declaration of XmaScalerInOutProperties can be found in the /opt/amd/ama/ma35/include/xma/xmascaler.h file.

+
+

+
+

Standard XMA Scaler Properties

+

When using the scaler plugin, the following members of the XmaScalerProperties data structure must be set by the application:

+
+
hwscaler_type

Type of scaler. Must be set to XMA_ABR_SCALER_TYPE.

+
+
num_outputs

Number of scaler outputs.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the scaler plugin.

+
+
param_cnt

Count of custom parameters.

+
+
input

Input property of type XmaScalerInOutProperties

+
+
output

Output properties an array of type XmaScalerInOutProperties of size num_outputs

+
+
+

XMA Scaler Input and Output Properties

+

When configuring the scaler input and outputs, the following members of the XmaScalerInOutProperties data structure must be set by the application:

+
+
format

Host side input video format. +Must be set to XMA_VPE_FMT_TYPE

+
+
sw_format

Device side video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of video stream/data. +Valid values are integers between 128 and 3840, in multiples of 4. +Portrait mode is supported.

+
+
height

Height in pixels of video stream/data. +Valid values are even integers between 128 and 2160, in multiples of 4.

+
+
framerate

Framerate data structure specifying frame rate per second.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
+

Other members of XmaScalerInOutProperties are not applicable to the scaler plugin and should not be used.

+

Custom Scaler Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the scaler plugin:

+
+
"mix_rate"

This parameter is used to configure mix-rate sessions where some scaler outputs are configured at the input frame rate and some other outputs will be configured at half the rate.

+
+
“top”

Cropping the top of the video before scaling.

+
+
“width”

Cropping the width of the video before scaling.

+
+
“height”

Cropping the height of the video before scaling.

+
+
"latency_logging"

Set to 1 to enable logging of latency information to XMA logs. Set to 0 to disable logging.

+
+
+
+

+
+
+
+
+

Encoder Plugin Reference

+
+

Encoder Interface

+

The external interface to the encoder plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmaencoder.h file.

+
+
+XmaEncoderSession *xma_enc_session_create(XmaEncoderProperties *enc_props)
+
+ +

This function creates an encoder session and must be called prior to encoding input YUV. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_enc_session_set_log(XmaEncoderSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_enc_session_send_frame(XmaEncoderSession *session, XmaFrame *frame)
+
+ +

This function sends a YUV frame to the hardware encoder by way of the plugin.

+

Each time the application calls this function, it must provide a XmaFrame containing YUV data and information about this frame (XmaFrameProperties).

+

If the function returns XMA_SUCCESS, then the application can proceed to fetch the encoded data using the xma_enc_session_recv_data() API.

+

If the function returns XMA_SEND_MORE_DATA, then the application must send the next YUV frame before calling xma_enc_session_recv_data().

+

Once the application has sent all the input frames to the encoder, it should notify the hardware by sending a null frame. If the API returns XMA_SUCCESS after a null frame is sent, then the application can call xma_enc_session_recv_data() but must send a null frame again.

+
+
+int32_t xma_enc_session_recv_data(XmaEncoderSession *session, XmaDataBuffer *data, int32_t *data_size)
+
+ +

This function is called after calling the function xma_enc_session_send_frame(). The application is responsible for allocating the "dummy" XmaDataBuffer using one of the provided functions. It is also responsible for releasing it when done.

+

If the function returns XMA_SUCCESS, then valid output data is available.

+

If the function returns XMA_RESEND_AND_RECV, a data buffer is not ready to be returned and the length of the data buffer is set to 0. The XmaDataBuffer is untouched and can either be reused or released.

+

If the function returns XMA_EOS, the encoder has flushed all the output frames. The XmaDataBuffer is untouched and must be released.

+
+
+int32_t xma_enc_session_destroy(XmaEncoderSession *session)
+
+ +

This function destroys an encoder session that was previously created with the xma_enc_session_create() function.

+
+
+

Encoder Properties

+

The AMD AMA Video SDK encoder is configured using a combination of standard XMA encoder properties and custom encoder parameters, both of which are specified using a XmaEncoderProperties data structure.

+
+

+
+
+
+struct XmaEncoderProperties
+
+ +

This data structure is used to configure the video encoder. The declaration of XmaEncoderProperties can be found in the /opt/amd/ama/ma35/include/xma/xmaencoder.h file.

+

Standard XMA Encoder Properties

+

When using the encoder plugin, the following members of the XmaEncoderProperties data structure must be set by the application:

+
+
hwencoder_type

Specify type of encoder to reserve.

+
+
format

Host side input video format. +Must be set to XMA_VPE_FMT_TYPE

+
+
sw_format

Device side input video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840. +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
framerate

Framerate data structure specifying frame rate per second

+
+
lookahead_depth

The lookahead module depth to give start giving lookahead data. +Supported values are 0 to 40.

+
+
rc_mode

Rate control mode for custom rate control +Supported values are 0 (constant QP), 1 (CBR), 2 (VBR), and 3 (CVBR).

+
+
bitrate

Bitrate of output data (in kbps).

+
+
qp

Fixed quantization value. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
gop_size

Maximum group of pictures size in frames.

+
+
temp_aq_gain

Temporal AQ Gain. Valid values are 0-255.

+
+
spat_aq_gain

Spatial AQ Gain. Valid values are 0-255.

+
+
minQP

Minimum QP. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
maxQP

Maximum QP. Valid values are 0-51 for H.264 or HEVC, 0-255 for AV1, or -1 (not used).

+
+
profile

Encoding profile. Valid values are 0 (Baseline), 1 (Main), 2 (High), 3 (High 10), or 4 (High 10 Intra) for H.264, 100 (Main), 101 (Main Intra), 102 (Main 10), or 103 (Main 10 Intra) for HEVC, or 200 (Main) for AV1, or -1 (Auto) for any codec.

+
+
level

Encoding level.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 and/or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the encoder plugin.

+
+
param_cnt

Count of custom parameters.

+
+
+

Custom Encoder Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the encoder plugin:

+
+
"slice"

Slice to perform the encode.

+
+
"latency_logging"

When enabled, it logs latency information to XMA log.

+
+
"spatial_aq"

Enables or disables adaptive spatial qp.

+
+
"temporal_aq"

Enables or disables adaptive temporal qp.

+
+
"qp_mode"

Sets qp mode to auto, relative load or uniform.

+
+
"tune_metrics"

Sets the tuning metric to none, VQ, PSNR, SSIM or VMAF.

+
+
"forced_idr"

Forces insertion of an IDR.

+
+
"crf"

Enables or disables CRF.

+
+
"expert_options"

sets encoder's expert option.

+
+
"device_type"

For AV1 encoder selects between Type 1 and Type 2.

+
+
+
+
+

Encoder Dynamic Parameters

+

Dynamic parameters allow for per frame updates to encoding parameters. These parameters are specified by either XmaDynamicEncParams or XmaDynamicEncParams_v2 structure. To insert dynamic data parameters to encoder, proceed as follows:

+
+
    +
  1. Allocate side band data through xma_side_data_alloc()

  2. +
  3. Set returned structure members, from Step 1, of XmaDynamicEncParams or XmaDynamicEncParams_v2

  4. +
  5. Clone frame using xma_frame_clone()

  6. +
  7. Attach XmaDynamicEncParams or XmaDynamicEncParams_v2 structure using xma_frame_add_side_data()

  8. +
  9. Check return values for status checking

  10. +
  11. Remove dynamic parameters from frame using xma_frame_dec_ref()

  12. +
+
+
+

Note

+

Use XmaDynamicEncParams structure for XMA_API_VERSION_1_1 and below. For XMA_API_VERSION_1_1_2 and above, use XmaDynamicEncParams_v2 structure.

+
+
+
+struct XmaDynamicEncParams
+
+ +

This data structure is used to configure the dynamic parameters of encoder. The declaration of XmaDynamicEncParams can be found in the /opt/amd/ama/ma35/include/xma/xmasidedata.h file. +See Video Encoding for details.

+

Dynamic Encoder Parameters

+
+
is_spatial_aq_gain_changed

Change indicator flag for spatial_aq_gain

+
+
spatial_aq_gain

Spatial adaptive quantizer gain factor

+
+
is_temporal_aq_gain_change

Change indicator flag for temporal_aq_gain

+
+
temporal_aq_gain

Temporal adaptive quantizer gain factor

+
+
is_temporal_mode_changed

Change indicator flag for temporal_aq_mode

+
+
temporal_aq_mode

Enable/disable temporal quantizer

+
+
is_spatial_mode_changed

Change indicator flag for spatial_aq_mode

+
+
spatial_aq_mode

Enable/disable spatial quantizer

+
+
is_bit_rate_changed

Change indicator flag for bit_rate_kbps

+
+
bit_rate_kbps

Bit rate in kbps

+
+
is_b_frames_changed

Change indicator flag for num_b_frames

+
+
num_b_frames

Number of B frames

+
+
is_min_qp_changed

Change indicator flag for min_qp

+
+
min_qp

Minimum QP value

+
+
is_max_qp_changed

Change indicator flag for min_qp

+
+
max_qp

Maximum QP value

+
+
+
+
+struct XmaDynamicEncParams_v2
+
+ +

This data structure is used to configure extra dynamic parameters for encoding. The declaration of XmaDynamicEncParams_v2 can be found in the /opt/amd/ama/ma35/include/xma/xmasidedata.h file. +See Video Encoding for details.

+

Dynamic Encoder Parameters Version 2

+
+
v1

XmaDynamicEncParams memeber

+
+
is_qp_changed

Change indicator flag for qp

+
+
qp

QP value

+
+
is_qp_i_offset_changed

Change indicator flag for qp_i_offset

+
+
qp_i_offset

QP offset for I frames

+
+
is_qp_b_offset_changed

Change indicator flag for qp_b_offset

+
+
qp_b_offset

QP offset for B frames

+
+
is_min_bit_rate_changed

Change indicator flag for min_bit_rate_kbps

+
+
min_bit_rate_kbps

Minimum bit rate in kbps

+
+
is_max_bit_rate_changed

Change indicator flag for max_bit_rate_kbps

+
+
max_bit_rate_kbps

Maximum bit rate in kbps

+
+
is_bit_rate_changed

Change indicator flag for bit_rate_kbps

+
+
reserved

For future use

+
+
+
+

+
+
+
+
+

Filter Plugin Reference

+
+

Filter Interface

+

The filter plugin is based on the Filter XMA plugin type. The external interface to the filter plugin consists of the following XMA application-level functions:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+
+
+XmaFilterSession *xma_filter_session_create(XmaFilterProperties *props)
+
+ +

This function creates a filter session and must be called prior to sending YUV frames to the filter. The hardware resources required to run the session must be previously reserved using the XRM APIs and should not be released until after the session is destroyed. The number of sessions allowed depends on several factors that include: resolution, frame rate, bit depth, and the capabilities of the hardware accelerator.

+
+
+int32_t xma_filter_session_set_log(XmaFilterSession *session, XmaLogHandle handle)
+
+ +

This function changes the logging from the default (set in xma_initialize()) to some other logging.

+
+
+int32_t xma_filter_session_send_frame(XmaFilterSession *session, XmaFrame *frame)
+
+ +

This function sends YUV frames to the filter module in hardware. After sending a frame, the application can take further action depending upon the return value from this API.

+

If this function returns XMA_SUCCESS, then the application can proceed to recieve a frame from this filter.

+

If this function returns XMA_TRY_AGAIN, it means the input frame has not been consumed and needs to re-send the same input frame after calling receive frame.

+

Once the application sends all input frames to the filter module, it should continue sending null frames until all the frames have been flushed out from the filter.

+
+
+int32_t xma_filter_session_recv_frame(XmaFilterSession *session, XmaFrame *frame)
+
+ +

This function is called after calling the function xma_filter_session_send_frame().

+

If this function returns XMA_SUCCESS, then the "dummy" frame provided by the application has been filled in and can be sent to the next plugin.

+

If this function returns XMA_RESEND_AND_RECV, then no frames have been sent to the filter for processing. The XmaFrame is untouched and may be reused or released. +If this function returns XMA_TRY_AGAIN, then frames have been sent and are currently being processed, but are not yet ready. The c:struct:XmaFrame is untouched and may be reused or released. +If this function returns XMA_EOS, then all frames have been processed. The c:struct:XmaFrame is untouched and must be released.

+
+
+int32_t xma_filter_session_destroy(XmaFilterSession *session)
+
+ +

This function destroys the filter session that was previously created with the xma_filter_session_create() function.

+
+
+

Filter Properties

+

The AMD AMA Video SDK filter is configured using a combination of standard XMA filter properties, standard XMA filter input and output properties and custom filter parameters, all of which are specified using XmaFilterProperties and XmaFilterPortProperties data structures.

+
+
+struct XmaFilterProperties
+
+ +

This data structure is used to configure the filter function. The declaration of XmaFilterProperties can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+
+
+struct XmaFilterPortProperties
+
+ +

This data structure is used to configure the input and output of the filter. The XmaFilterProperties data structure contains one XmaFilterPortProperties for the filter input and one XmaFilterPortProperties for the output output. The declaration of XmaFilterPortProperties can be found in the /opt/amd/ama/ma35/include/xma/xmafilter.h file.

+

Standard XMA Filter Properties

+

When using the filter plugin, the following members of the XmaFilterPortProperties data structure must be set by the application:

+
+
hwfilter_type

Sets the direction of stream entry to XMA_UPLOAD_FILTER_TYPE or XMA_DOWNLOAD_FILTER_TYPE.

+
+
params

Array of custom initialization parameters. +See the next section for the list of custom parameters supported by the filter plugin.

+
+
param_cnt

Count of custom parameters.

+
+
input

Input property of type XmaFilterPortProperties

+
+
output

Output property of type XmaFilterPortProperties

+
+
+

Standard XMA Filter Port Properties

+

When configuring the filter input or output, the following members of the XmaFilterPortProperties data structure must be set by the application:

+
+
format

Input video format. +Must be set to XMA_VPE_FMT_TYPE.

+
+
sw_format

Device side input video format. Valid values are XMA_NV12_FMT_TYPE, XMA_P010LE_FMT_TYPE, XMA_PACKED10_FMT_TYPE, XMA_RGB24_FMT_TYPE, XMA_YUV420P_FMT_TYPE, XMA_YUV420P10LE_FMT_TYPE.

+
+
width

Width in pixels of incoming video stream/data. +Valid values are even integers between 128 and 3840 +Portrait mode is supported.

+
+
height

Height in pixels of incoming video stream/data. +Valid values are even integers between 128 and 2160.

+
+
framerate

Framerate data structure specifying frames per second.

+
+
flags

Sets on-device frame property to XMA_FRAME_PROPERTY_FLAG_TILE_4x4 or XMA_FRAME_PROPERTY_FLAG_COMPRESS

+
+
framerate

Framerate data structure specifying frame rate per second.

+
+
+

Custom Filter Parameters

+

In addition to the standard properties, the following XmaParameter custom parameters are supported by the filter plugin:

+
+
"latency_logging"

When enabled, it logs latency information to XMA log.

+
+
+
+

+
+
+
+
+

Ultra Low Latency Considerations

+
+

Decoder Low Latency Mode

+

To enable low latency in the decoder, add a XmaParameter with the name low_latency, of type XMA_INT32, and value of 1. After each frame is sent to the decoder, the decoder will return XMA_SUCCESS. The application can immediately call xma_dec_session_recv_frame(). It will return either XMA_SUCCESS (indicating a frame has been returned), XMA_EOS (indicating the end of stream has been reached), or XMA_RESEND_AND_RECV (indicating the frame is still being processed and xma_dec_session_recv_frame() must keep being called until it is ready).

+
+
+

Encoder Ultra Low Latency Mode

+

To enable Ultra Low Latency in the encoder, set XmaEncoderProperties.lookahead_depth = 0. After each frame is sent to the encoder, the encoder will return XMA_SUCCESS. The application can immediately call xma_enc_session_recv_data(). It will return either XMA_SUCCESS (indicating a frame has been returned), XMA_EOS (indicating the end of stream has been reached), or XMA_RESEND_AND_RECV (indicating the frame is still being processed and xma_enc_session_recv_data() must keep being called until it is ready).

+
+
+
+
+

1.1 SDK API

+

The following subsections delineate 1.1 API improvements over 1.0. To use 1.1 APIs, set XMA_API_VERSION parameter to XMA_API_VERSION_1_1. (See here for how to do this.)

+
+

Note

+

SDK 1.1.1 is not backward ABI compatible with SDK 1.0. This implies that 1.0 applications need to be migrated to 1.1.1 SDK, manually.

+
+
+

Sideband Data

+

The main difference between SDK 1.1 and 1.0 are:

+
    +
  1. v1.0 only allowed 1 sideband data of each type, adding another would replace the first. v1.1 allows multiple of each type. New functions are added to access/modify the sideband data.

  2. +
  3. HDR10 sideband data type are deprecated and replaced with several different SEI sideband data types

  4. +
  5. Applications can define their own sideband data types and add the sideband data to frames. Filters will pass this sideband data downstream. Currently, only frames can have sideband data.

  6. +
  7. All sideband data (both predefined and user defined) can have metadata. Metadata is XmaParameters attached to sideband data used for adding additional information about a sideband data buffer to a sideband data. Each sideband data can have only one sideband metadata with a given name. If an application tries to add new metadata to a sidedata and a metadata with the same name already exists, the original metadata will be deleted and replaced by the new metadata. Metadata exists solely on the host.

  8. +
  9. Added sidedata functions are:

    +
    - xma_side_data_get_metadata(): Gets the value of sideband metadata.
    +- xma_side_data_set_metadata(): Adds/replaces sideband metadata to sideband data.
    +- xma_frame_get_first_side_data(): Get the first sidedata of any type that is attached to a given frame.
    +- xma_frame_get_next_side_data(): Get the next sidedata of any type that is attached to a given frame.
    +- xma_frame_get_next_side_data_of_type(): Get the next sidedata of a given type that is attached to a given frame.
    +
    +
    +
  10. +
  11. Modified sidedata functions are:

    +
    - xma_frame_get_side_data(): In v1.0 it will continue to get the sidedata of a given type from a given frame. In v1.1 it will get the first sidedata of a given type from a given frame.
    +- xma_frame_remove_side_data_type(): In v1.0 it will continue to remove the sidedata of a given type. In v1.1 it will remove all sidedata of a given type.
    +
    +
    +
  12. +
  13. Deprecated sidedata functions are:

    +
    - xma_side_data_read(): In v1.0 it copies the contents of the sidedata buffer from the device to the host.
    +
    +
    +
  14. +
+
+
+

Multithreading

+
    +
  1. In the decoder, 2 XmaParameter parameters are added:XMA_DEC_PARAM_THREADS and XMA_DEC_PARAM_WAIT. If XMA_DEC_PARAM_THREADS is set to 1, a background thread is deployed to improve performance. Note that XMA_DEC_PARAM_THREADS is 0 by default. If the application is using different threads to send and receive data from the decoder, the parameter XMA_DEC_PARAM_WAIT will improve CPU utilization on the host. XMA_DEC_PARAM_WAIT is only available if XMA_DEC_PARAM_THREADS is 1. XMA_DEC_PARAM_WAIT is 0 by default.

  2. +
  3. Similarly, in the encoder, 2 XmaParameter parameters are added: XMA_ENC_PARAM_THREADS and XMA_ENC_PARAM_WAIT. These behave the same as in the decoder.

  4. +
  5. The encoder calling order of send and receive has changed to be more in line with the decoder and scaler.

    +
    +
      +
    • +
      xma_enc_session_send_frame() return values and expected application behavior:
        +
      • XMA_SUCCESS: A frame is successfully sent to the encoder, regardless of if any data can be pulled from the encoder. The application should try calling xma_enc_session_recv_data() and proceed depending on the return value from xma_enc_session_recv_data().

      • +
      • XMA_TRY_AGAIN: The encoder's internal buffers are currently full. The application should try calling xma_enc_session_recv_data() and proceed according to it's return code. The next time xma_enc_session_send_frame() is called, send the same frame as was last sent, as it has not yet been processed. XMA_TRY_AGAIN will only be returned if XMA_ENC_PARAM_WAIT is 0.

      • +
      +
      +
      +
    • +
    • +
      xma_enc_session_recv_data() return values and expected application behavior:
        +
      • XMA_SUCCESS: Compressed data was returned and xma_enc_session_send_frame() can be called.

      • +
      • XMA_RESEND_AND_RECV: No compressed data is ready and the application should call xma_enc_session_send_frame(). Multiple loops of xma_enc_session_send_frame() returning XMA_TRY_AGAIN and xma_enc_session_recv_data() returning XMA_RESEND_AND_RECV may occur if internal buffers are full but no compressed data is ready. Continue looping until one of the functions returns a different value. XMA_RESEND_AND_RECV will only be returned if XMA_ENC_PARAM_WAIT is 0.

      • +
      • XMA_EOS: The end of the stream has been reached.

      • +
      +
      +
      +
    • +
    +
    +
  6. +
  7. XMA_SCALER_PARAM_THREADS is enabled by default in the scaler. To disable threading and pipelining, set this parameter to 0.

  8. +
+
+
+

Logging

+

XMA logging has been extended to be able to optionally output AMA logging. To use it, in the call to xma_log_init(), set the log type to XMA_LOG_TYPE_AMA.

+
+
+

Upgrading

+
    +
  1. If any frame returned by a session needs to have sideband data added/removed, e.g. adding XMA_FRAME_SIDE_DATA_DYN_ENC_PARAMS, then:

    +
      +
    • Original frame will need to be cloned, using xma_frame_clone()

    • +
    • Original frame itself, not its clone, has to have it's reference count decremented, using xma_frame_dec_ref()

    • +
    • Clone frame can have its sideband data added or removed using xma_frame_add_side_data(), xma_frame_remove_side_data(), or xma_frame_remove_side_data_type().

    • +
    +

    Following the above, the clone can then be passed on downstream, same as the original frame.

    +
  2. +
  3. xma_frame_add_side_data() does not remove existing sideband data from a frame, prior to adding a new sideband data. Instead it will add the new sideband data in addition to the old sideband data. To remove existing sideband data, call xma_frame_remove_side_data_type() first.

  4. +
+
+
+
+

1.2 SDK API

+

The following subsections delineate additional APIs supported by 1.2 SDK.

+
+

Sideband Data

+
    +
  1. New structures defined in /opt/amd/ama/ma35/include/xma/xmasidedata.h:

    +
    - XmaDynCompositorParams: Structure to setup the compositor
    +- XmaA53ClosedCaption: Structure to pass closed caption
    +- XmaRpuRawData: Structure to setup raw  Reference Picture Unit (RPU)
    +- XmaRpuDolbyVision: Structure to setup Dolby RPU
    +
    +
    +
  2. +
+
+
+

Pixel Formats

+
    +
  1. New supported pixel formats defined in /opt/amd/ama/ma35/include/xma/xmabuffers.h:

    +
    - XMA_YUV422SP_10BIT_FMT_TYPE: YUV 4:2:2 Semi-planar
    +- XMA_UYVY422_FMT_TYPE: UYVY 4:2:2
    +- XMA_YUY2422_FMT_TYPE: YUY2 4:2:2
    +
    +
    +
  2. +
+
+
+

Decoder

+
    +
  1. New decode type defined in /opt/amd/ama/ma35/include/xma/xmadecoder.h:

    +
    - XMA_JPEG_DECODER_TYPE: JPEG decoder
    +
    +
    +
  2. +
+
+
+

Encoder

+

Updates are defined in /opt/amd/ama/ma35/include/xma/xmaencoder.h

+
    +
  1. New encoder types:

    +
    - XMA_JPEG_ENCODER_TYPE: JPEG encoder
    +- XMA_LOSSLESS_JPEG_ENCODER_TYPE: Lossless JPEG encoder
    +
    +
    +
  2. +
  3. Updates to XmaEncoderProperties:

    +
    - int32_t        qp;  Fixed quantization value, 0-63 for all codecs, default=-1(not used)
    +- int32_t        minQP; Minimum QP, 0-63, default=0 for all codecs
    +- int32_t        maxQP; Maximum QP, 0-63, default=63 for all codecs
    +
    +
    +
  4. +
  5. New rate control mode:

    +
    - XMA_ENC_RC_MODE_CRF: CRF mode
    +
    +
    +
  6. +
  7. New XmaParameter options:

    +
    - XMA_ENC_PARAM_CABR_CONFIG: "cabr" qualifier
    +- XMA_ENC_PARAM_QUALITY: int32 Lossy JPEG quality (0 to 100), default=-1
    +- XMA_ENC_PARAM_STILL_IMAGE: int32 For AV1 selects between video or series of images
    +
    +
    +
  8. +
  9. New still image enum:

    +
    - XmaEncoderStillImage
    +
    +
    +
  10. +
  11. New XmaDataBuffer member:

    +
    -int64_t dts; Used for passing DTS to downstream muxer
    +
    +
    +
  12. +
+
+
+

Filters

+

Updates are defined in /opt/amd/ama/ma35/include/xma/xmafilter.h

+
    +
  1. New filter options:

    +
    - XMA_THREADING_FLAG_USE_THREAD: To enable threading for filter operations
    +- XMA_THREADING_FLAG_WAIT: To wait for a filter thread to end
    +
    +
    +
  2. +
  3. New XmaParameters members:

    +
    - XMA_MIOFILTER_ML_CORE_ID: ML core ID
    +- XMA_MIOFILTER_ML_MODEL: ML inference model
    +- XMA_MIOFILTER_ML_PERFORMANCE: Enables ML performance logging
    +- XMA_MIOFILTER_ML_TENSOR_DUMP: Enables ML tensor dump
    +- XMA_MIOFILTER_ML_INF_REPEAT: Inference repeat count
    +- XMA_MIOFILTER_ML_INF_PERIOD: Inference application period
    +
    +
    +
  4. +
  5. Additional 2D filters:

    +

    Relevant files under /opt/amd/ama/ma35/include/xma/ are noted below.

    +
    - Crop: See xmacrop.h
    +- Color space conversion: See xmacsc.h
    +- Drawbox: See xmadrawbox.h
    +- Overlay: See xmaoverlay.h
    +- Pad: See xmapad.h
    +- Rotate: See xmarotate.h
    +- Subsample: See xmasubsample.h
    +- Tile: See xmatile.h
    +- Compositor: See xmacompositor.h
    +
    +
    +
  6. +
+
+
+
+

XRM API Reference

+

The Xilinx® FPGA Resource Manager (XRM) library is used to manage the hardware accelerators available in the system. XRM keeps track of total system capacity for each of the compute units such as the decoder, scaler, and encoder.

+

The XRM library includes a daemon, a command line tool and a C application programming interface (API). Using the library API, external applications can communicate with the XRM daemon and perform actions such as reserving, allocating and releasing resources.

+

More details on the XRM command line tool (xrmadm) and the XRM daemon (xrmd) can be found in the XRM Reference Guide section of the documentation.

+

The XRM C APIs are defined in /opt/amd/ama/ma35/include/xrm and /opt/amd/ama/ma35/include/xrm_interface directories.

+

The following sections describe XRM resource allocation APIs, for each versions of XRM library.

+
+

Version 1.0

+

The original version of XRM library that only supports decoder, scaler and encoder reservation APIs.

+
+

Decoder

+

The decoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file.

+
+
+int xrm_dec_reserve(XrmDecodeContext *xrm_dec_ctx, int dev_index, XrmInterfaceProperties *xrm_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant decoder parameters

+
+
+void xrm_dec_release(XrmDecodeContext *xrm_dec_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmDecodeContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file, and XrmInterfaceProperties is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_interface.h file.

+
+
+

Encoder

+

The encoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+int32_t xrm_enc_reserve(XrmEncodeContext *xrm_enc_ctx, int dev_index, int slice_id, bool is_xav1, bool is_ull, XrmInterfaceProperties *xrm_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_enc_release(XrmEncodeContext *xrm_enc_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmEncodeContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+

Scaler

+

The scaler plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+
+int32_t xrm_scale_reserve(XrmScaleContext *scaler_xrm_ctx, int dev_index, XrmInterfaceProperties *input_props, XrmInterfaceProperties *output_props, int num_outputs)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_scale_release(XrmScaleContext *scaler_xrm_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmScaleContext is defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+
+
+

Version 2.0

+

This version of XRM library additionally supports ML engine reservation APIs. To ensure backward compatibility, xrm_props_create() API will reset the input data structure to zero and initializes the new parameters to their default values. It is noted that rebuild of applications are required in order to use version 2.0 of APIs.

+
+

Decoder

+

The decoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file.

+
+
+int xrm_dec_reserve_v2(XrmDecodeContextV2 *xrm_dec_ctx, const XrmDecodePropsV2 *xrm_dec_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant decoder parameters

+
+
+void xrm_dec_release_v2(XrmDecodeContextV2 *xrm_dec_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmDecodeContextV2 and XrmDecodePropsV2 are defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_dec_interface.h file.

+
+
+

Encoder

+

The encoder plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+int32_t xrm_enc_reserve_v2(XrmEncodeContextV2 *xrm_enc_ctx, const XrmEncodePropsV2 *xrm_enc_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_enc_release_v2(XrmEncodeContextV2 *xrm_enc_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmEncodeContextV2 and XrmEncodePropsV2 are defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_enc_interface.h file.

+
+
+

Scaler

+

The scaler plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+
+int32_t xrm_scale_reserve_v2(XrmScaleContextV2 *xrm_scale_ctx, const XrmScalePropsV2 *xrm_scale_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_scale_release_v2(XrmScaleContextV2 *scaler_xrm_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmScaleContextV2 and XrmScalePropsV2 are defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_scale_interface.h file.

+
+
+

ML

+

The scaler plugin uses the following function to reserve and release resources:

+ +

The declaration of these functions can be found in the /opt/amd/ama/ma35/include/xrm_interface/xrm_ml_interface.h file.

+
+
+int xrm_ml_reserve_v2(XrmMLContextV2 *xrm_ml_ctx, const XrmMLPropsV2 *xrm_ml_props)
+
+ +

This function checks and allocates the necessary xrm resources given the relevant encoder parameters

+
+
+void xrm_ml_release_v2(XrmMLContextV2 *xrm_ml_ctx)
+
+ +

This function releases the xrm resources which were allocated.

+

XrmMLContextV2 and XrmMLPropsV2 are defined in /opt/amd/ama/ma35/include/xrm_interface/xrm_ml_interface.h file.

+
+
+
+

Building Sample Examples

+

To build the included sample applications, follow the steps below:

+
cd /opt/amd/ama/ma35/examples/xma/
+chmod -R 777 .
+mkdir build && cd build
+cmake ..
+make -j
+
+
+
+

+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/card_management.html b/v1.2/card_management.html new file mode 100644 index 00000000..68b607ff --- /dev/null +++ b/v1.2/card_management.html @@ -0,0 +1,723 @@ + + + + + + + + + + + + + + + Card Management — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Card Management
  • +
  • +
  • +
+
+
+
+
+ +
+

Card Management

+ +
+

Overview

+

The AMD AMA Video SDK builds on the Xilinx Resource Manager (XRM) to interface with AMD video acceleration cards. The AMD AMA Video SDK includes the mautil, mamgmt , and xrmadm command line tools for card installation, upgrade, and management.

+
+

mautil, mamgmt and print_ma35_load

+

The AMD Board Utility (mautil), and the AMD Board Management Utility (mamgmt) are standalone command line tools used to query, and administer AMD acceleration cards. print_ma35_load prints load status of the card in a readable manner.

+
    +
  • mautil is used to examine and identify the installed accelerator card(s). This option is meant for use by unprivileged users to get status information on AMD AMA devices. mautil is available on both the bare-metal host and guest VM.

  • +
  • mamgmt is used to examine devices, flash, reset and administer the installed accelerator card(s). This option is meant for use by privileged users to get status information of AMD AMA devices, flash firmware, create VFs, and reset target devices. mamgmt is not available on VF instances.

  • +
+

The mautil, and mamgmt commands can target specific device(s) by using PCIe BDF (Bus:Device.Function) identifier. The BDF notation works as follows:

+
    +
  • PCI Bus number in hexadecimal, often padded using a leading zeros to two or four digits

  • +
  • A colon (:)

  • +
  • PCI Device number in hexadecimal, often padded using a leading zero to two digits . Sometimes this is also referred to as the slot number.

  • +
  • A decimal point (.)

  • +
  • PCI Function number in hexadecimal.

  • +
+
+
+

xrmadm and xrmd

+

XRM is the software which manages the hardware accelerators available in the system. The XRM Systemd daemon (xrmd) is a background process supporting reservation, allocation, and release of hardware acceleration resources. The XRM xrmadm command line tool is used to interact with the XRM daemon (xrmd) in order to check status and generate resource utilization reports.

+

For more details about the XRM commands specific to the AMD AMA Video SDK refer to the XRM Command Reference Guide.

+
+

Note

+

To start, stop or get the status of xrmd, use systemctl, e.g., to get the current status of the daemon, issue the following:

+
systemctl status xrmd
+
+
+
+
+
+
+

Card and Device Identifiers

+
+

Device BDF

+

The list of all installed AMD AMA Video SDK compatible devices, including their BDF is obtained with the mautil examine or sudo mamgmt examine command.

+

For example, the command below detected 2 devices and lists their BDFs:

+
$ mautil examine
+-----------------------------------------------------------------------------------------
+System Configuration
+-----------------------------------------------------------------------------------------
+  OS Name                  : Linux
+  Release                  : 5.15.0-91-generic
+  Version                  : #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023
+  Machine                  : x86_64
+  CPU Cores                : 24
+  Memory                   : 127950.27 MB (124.95 GB)
+  System Up Time           : 0.02D (00D:00H:33M:57S)
+
+
+Available Devices
+
+  Serial Number                   BDF
+  ------------------------   --------
+  XFxxxxxxxxxx             :  03:00.0 (Primary Device)
+                           :  04:00.0
+  XFyyyyyyyyyy             :  01:00.0 (Primary Device)
+                           :  02:00.0
+
+
+
+
+

Bus ID

+

You can look-up the PCIe bus ID of a device through the following command:

+
cat /sys/class/misc/ama_transcoder{x}/bus_id
+
+
+

, where x is a number between 0 to total number of devices minus 1.

+

Example

+
    +
  • Bus id of /sys/class/misc/ama_transcoder0 is:

    +
    $ cat /sys/class/misc/ama_transcoder0/bus_id
    +  0000:01:00.0
    +
    +
    +
  • +
+
+
+

Firmware Version Number

+

To look-up the version number of each installed firmware, proceed as follows:

+
+
cat /sys/class/misc/ama_transcoder0/version_information
+
+
+

It should return:

+
+
+
ZSP Version = 2.1.0
+SC Version = 9.8.5
+eSecure Version = 1.0.0
+PCIe FW Version = 2.1.0
+PCIe CTRL Patch Version = 1.0.3
+PCIe PHY Patch A Version = 1.0.0
+
+
+
+
+
+
+

mautil

+

The mautil commands provides useful details about your environment and can be used to ensure that your cards and devices are properly detected.:

+
mautil [--help] [--version] [--batch] [--force] [command [commandArgs] --device <BDF>*|all], where "command" is one of the following:
+   examine    - Status of the system and device.
+   validate   - Validates the basic shell acceleration functionality
+
+
+
+

Note

+
    +
  • Running validate sub-command on a device running a video pipeline will impact the performance of the pipeline.

  • +
+
+

The list of applicable devices, for mautil sub-commands, can be obtained via mautil examine.

+

Reports can be generated in JSON format, by adding --format JSON -o <filename> to mautil command.

+
+

Getting Device Report

+

The mautil examine -d <BDF>*|all --report <type> commands provides additional details about the status of each AMD AMA Video SDK compatible device installed.

+

The --report (or -r) switch is used to view specific report(s) of interest:

+
    +
  • electrical: Reports Electrical and power sensors present on the device

  • +
  • device-hw: Provides information on the device's hardware

  • +
  • error-cnt: Reports on device's error counter

  • +
  • host: Prints host information

  • +
  • memory: Reports memory topology of the device

  • +
  • pcie-info: PCIe information of the device

  • +
  • thermal: Reports thermal sensors present on the device

  • +
  • utilization: Reports on accelerators resource utilization

  • +
  • all: Prints all the known status

  • +
+

An example usage for thermal and electrical reports, for the device with BDF 01:00.0 is:

+
mautil examine -r thermal electrical -d 01:00.0
+
+=========================================================================================
+1/1 [01:00.0] : MA35 Device
+-----------------------------------------------------------------------------------------
+Thermal Info [01:00.0]
+-----------------------------------------------------------------------------------------
+  Device Temperature       :  76 C
+  Board Temperature        :  70 C
+  Threshold Temperature    :  85 C
+  Max Operating Temperature: 105 C
+  Shutdown Temperature     : 110 C
+
+-----------------------------------------------------------------------------------------
+Electrical Info [01:00.0]
+-----------------------------------------------------------------------------------------
+Device:
+  Sensor-0                 :  0.749 V /  4.700 A /  3.520 W
+  Sensor-1                 :  0.750 V /  6.500 A /  4.875 W
+  Power Consumed           :  8.395 Watts
+
+  Aux                      :  0.737 V
+  DDR                      :  0.867 V
+  ENC                      :  0.751 V
+  ML Engine                :  0.752 V
+
+Board:
+  3V Aux                   :  3.296 V /  0.080 A /  0.264 W
+  3V Pex                   :  3.296 V /  0.374 A /  1.233 W
+  12V Pex                  : 12.192 V /  1.200 A / 14.630 W
+  Power Consumed           : 16.127 Watts
+
+
+
+

Device Validation

+

The mautil validate -d <BDF>*|all validate commands runs a number diagnostic tests on a device to ensure its proper operation:

+
 mautil validate -d  01:00.0 02:00.0
+...
+       Device              Test                       Progress                        %    Time
+=============  ================  ==================================================  ====  ====
+      01:00.0         mmio_perf  ##################################################  100%   11s 1s
+      02:00.0         mmio_perf  ##################################################  100%   12s 1s
+...
+
+
+
+
+
+
+

mamgmt

+

The mamgmt provides administrative commands for managing the installed devices, and as such, it must be run with root privileges. In addition to commands that are provided by mautil, mamgmt also allows for managing Virtual Functions (VF) on a device, and flashing firmwares:

+
mamgmt [--help] [--version] [--batch] [--force] [command [commandArgs] --device <BDF>*|all], where "command" is one of the following:
+  examine      - Status of the system and device
+  flash        - Update flash of a given device
+  numvfs       - Create a VF or destroys the active VF
+  reset        - Resets the given device
+
+
+
+

Getting Device Report

+

An example usage for all available reports on 01:00.0 is:

+
mamgmt examine -d 01:00.0 -r all
+-----------------------------------------------------------------------------------------
+System Configuration
+-----------------------------------------------------------------------------------------
+  OS Name                  : Linux
+  Release                  : 5.15.0-91-generic
+  Version                  : #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023
+  Machine                  : x86_64
+  CPU Cores                : 24
+  Memory                   : 127950.27 MB (124.95 GB)
+  System Up Time           : 0.07D (00D:01H:38M:27S)
+
+
+Available Devices
+
+  Serial Number                   BDF
+  ------------------------   --------
+  XFxxxxxxxxxxx            :  03:00.0 (Primary Device)
+                           :  04:00.0
+  XFLyyyyyyyyy             :  01:00.0 (Primary Device)
+                           :  02:00.0
+
+
+=========================================================================================
+1/1 [01:00.0] : MA35 Device
+-----------------------------------------------------------------------------------------
+PCIe Info [01:00.0]
+-----------------------------------------------------------------------------------------
+  Vendor ID                : 0X10EE
+  Device ID                : 0X5070
+  Sub Vendor ID            : 0X10EE
+  Sub Device ID            : 0X000E
+  Class Type               : 0x048000 (Multimedia Controller)
+  Link Negotiated Gen      : 5
+  Link Width               : x4
+
+-----------------------------------------------------------------------------------------
+Device Info [01:00.0]
+-----------------------------------------------------------------------------------------
+Board Hardware
+  Part Number              : 05105-02
+  Product Name             : ALVEO MA35D PQ
+  Product Revision         : 1
+  OEM ID                   : 3704
+  Serial Number            : XFxxxxxxx
+
+Firmware
+  eSecure                  : 1.0.0
+  PCIeCtlPatch             : 1.0.3
+  PCIeFw                   : 2.1.0
+  PCIePhyPatch             : 1.0.0
+  SC                       : 9.7.39
+  ZSP                      : 2.0.4
+
+-----------------------------------------------------------------------------------------
+Thermal Info [01:00.0]
+-----------------------------------------------------------------------------------------
+  Device Temperature       :  75 C
+  Board Temperature        :  69 C
+  Threshold Temperature    :  85 C
+  Max Operating Temperature: 105 C
+  Shutdown Temperature     : 110 C
+
+-----------------------------------------------------------------------------------------
+Electrical Info [01:00.0]
+-----------------------------------------------------------------------------------------
+Device:
+  Sensor-0                 :  0.749 V /  4.600 A /  3.445 W
+  Sensor-1                 :  0.750 V /  6.500 A /  4.875 W
+  Power Consumed           :  8.320 Watts
+
+  Aux                      :  0.737 V
+  DDR                      :  0.868 V
+  ENC                      :  0.750 V
+  ML Engine                :  0.752 V
+
+Board:
+  3V Aux                   :  3.296 V /  0.080 A /  0.264 W
+  3V Pex                   :  3.296 V /  0.374 A /  1.233 W
+  12V Pex                  : 12.192 V /  1.187 A / 14.472 W
+  Power Consumed           : 15.968 Watts
+
+-----------------------------------------------------------------------------------------
+Error Counter Info [01:00.0]
+-----------------------------------------------------------------------------------------
+AXI-SRAM (Uncorrectable)
+--------------------------
+  Segment-0                :         0
+  Segment-1                :         0
+
+DDR (Uncorrectable)          Counter-0  Counter-1  Counter-2  Counter-3
+--------------------------   ---------  ---------  ---------  ---------
+  Segment-0                :         0          0          0          0
+  Segment-1                :         0          0          0          0
+
+PCIe (Uncorrectable)       :         0
+
+AXI-SRAM (Correctable)
+--------------------------
+  Segment-0                :         0
+  Segment-1                :         0
+
+DDR (Correctable)            Counter-0  Counter-1  Counter-2  Counter-3
+--------------------------   ---------  ---------  ---------  ---------
+  Segment-0                :         0          0          0          0
+  Segment-1                :         0          0          0          0
+
+PCIe (Correctable)         :         0
+
+-----------------------------------------------------------------------------------------
+Memory Info [01:00.0]
+-----------------------------------------------------------------------------------------
+
+Segment-0 Counters            AXI-Read  AXI-Write   DFI-Read  DFI-Write
+                                (MBps)     (MBps)     (MBps)     (MBps)
+--------------------------   ---------  ---------  ---------  ---------
+  0                        :        33          0         66          0
+  1                        :        68          0        135          0
+  2                        :        33          0         66          0
+  3                        :        68          0        135          0
+--------------------------   ---------  ---------  ---------  ---------
+  Total                    :       202          0        402          0
+
+Segment-1 Counters            AXI-Read  AXI-Write   DFI-Read  DFI-Write
+                                (MBps)     (MBps)     (MBps)     (MBps)
+--------------------------   ---------  ---------  ---------  ---------
+  0                        :         0          0          0          0
+  1                        :         0          0          0          0
+  2                        :         0          0          0          0
+  3                        :         0          0          0          0
+--------------------------   ---------  ---------  ---------  ---------
+  Total                    :         0          0          0          0
+
+-----------------------------------------------------------------------------------------
+Device Memory Utilization [01:00.0]
+-----------------------------------------------------------------------------------------
+
+Type                              Used      Total     % Used
+--------------------------   ---------  ---------  ---------
+  Segment-0                :         0     784384          0
+  Segment-1                :         0     917504          0
+  MMIO                     :      4974      59392          8
+
+
+

Reports can be generated in JSON format, by adding --format JSON -o <filename> to mamgmt examine command.

+
+
+

Device Reset

+

An example usage to reset devices 01:00.0 and 02:00.0 is:

+
mamgmt reset -d 01:00.0 02:00.0
+****************************************************
+Reset Command Completed
+****************************************************
+
+
+
+
+

VF Creation and Destruction

+

To create and destroy a VF device, issue the following commands, respectively:

+
$ mamgmt -d <BDF> numvfs -v 1 # Create VF device
+$ mamgmt -d <BDF> numvfs -v 0 # Destroy VF device
+
+
+
+
+

Flashing Firmware

+

The flash subcommand provides means of programming a card, verifying flash images or for extracting a flash section from a device.

+

To flash or verify a flashing process, specify the <BDF>*|all of target device(s)s:

+
mamgmt flash [-d arg] [-r arg] [-p arg] [-v arg] [-s] [-o arg] [--help]. The following operations are supported:
+
+  -r, --read         - Specify the flash section to read into a file. Syntax:
+                         <flash_section>:<filename>
+                         Valid values for <flash_section> are:
+                         ZSP, SC and All
+  -p, --program      - Specify images to use to update the persistent device.
+  -v, --verify       - Verify if the device has same firmware as in specified image file.
+  -s, --sequential   - Program sequentially
+  -o, --output       - Direct the output to the given file
+
+
+

For example, the following command flashes all subsystems on all devices, using ma35_firmware.bin image:

+
sudo /opt/amd/ama/ma35/bin/mamgmt flash -d all -p /opt/amd/ama/ma35/firmware/ma35_firmware.bin
+Flash Regions and Devices To Be Programmed
+=======================================
+Flash Region: ZSP
+
+BDF        Current Version  New Version
+---------  ---------------  -----------
+  01:00.0            2.0.4        2.1.0
+  02:00.0            2.0.4        2.1.0
+...
+
+***********************************
+*        Programming Flash        *
+*   Do not power off the system   *
+***********************************
+
+=================================================================
+Programming Flash Region: ZSP  Device(s): 4
+
+   BDF     New Version            Status              Time        Phase
+---------  -----------  ---------------------------  -------  ---------------
+  01:00.0        2.1.0  [====================] 100%      41s   Successful
+  02:00.0        2.1.0  [====================] 100%      41s   Successful
+...
+=================================================================
+Total running time: 2m 22s
+
+****************************************************
+Reboot your machine for new firmware to take effect
+****************************************************
+Flash Command Completed
+****************************************************
+
+
+

To compare a flashed device with a flash image, use the --verify operation:

+
sudo /opt/amd/ama/ma35/bin/mamgmt flash  -d all -v /opt/amd/ama/ma35/firmware/ma35_firmware.bin
+****************************************************
+Device: 1/4 [01:00.0] MA35 Device
+****************************************************
+Image /opt/amd/ama/ma35/firmware/ma35_firmware.bin version 2.1.0 matches device ZSP.AMD firmware
+Image /opt/amd/ama/ma35/firmware/ma35_firmware.bin version 9.7.39 matches device SC firmware
+...
+
+
+
+
+
+

Checking Resource Utilization

+

Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

+
source /opt/amd/ama/ma35/scripts/setup.sh
+
+
+

Note that this command should be run only once per boot.

+

To check the current loading of all the devices in your system, use the following command:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

This will generate a report in JSON format containing the load information for all the compute unit (CU) resources. The report contains a section for each device in the system. The device sections contain sub-sections for each of the CUs (decoder, scaler, lookahead, encoder, am ML) in that device. For example, the load information for the encoder on device 0 may look as follows:

+
"device_0": {
+  ...
+  "cu_2": {
+       "cuId         ": "2",
+       "cuType       ": "IP Kernel",
+       "kernelName   ": "encoder",
+       "kernelAlias  ": "ENCODER_TYPE1_AMA",
+       "instanceName ": "encoder_1",
+       "cuName       ": "encoder:encoder_1",
+       "kernelPlugin ": "",
+       "maxCapacity  ": "497664000",
+       "numChanInuse ": "0",
+       "usedLoad     ": "0 of 1000000",
+       "reservedLoad ": "0 of 1000000",
+       "resrvUsedLoad": "0 of 1000000"
+   },
+
+
+

The usedLoad value indicates how much of that resource is currently being used and reserved. The value will range from 0 (nothing running) to 1000000 (fully loaded). The reservedLoad value indicates how much of that resource is being reserved using XRM. The resrvUsedLoad value indicates how much of the reserved load is actually being used.

+ +
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/encoder_comp_matrix.html b/v1.2/encoder_comp_matrix.html new file mode 100644 index 00000000..6760e868 --- /dev/null +++ b/v1.2/encoder_comp_matrix.html @@ -0,0 +1,2031 @@ + + + + + + + + + + + + + + + Encoding Compatibility Matrix — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Encoding Compatibility Matrix
  • +
  • +
  • +
+
+
+
+
+ +
+

Encoding Compatibility Matrix

+ +

Given the many adjustable parameters of an AMD AMA Video encoder, not all combinations of such parameters are permissible. The following tables describe the compatibility matrix for each encoder type.

+
+

AVC and HEVC Encoders

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LA Depth

Latency Mode

Cores

Slow Preset

Medium Preset

Fast Preset

No B Frames

CQP

CBR

VBR

CVBR

CRF

CABR

Spatial AQ

Temporal AQ

ROI QP Map

7-49

+
Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-3
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

6

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-2
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

5

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

4

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

3

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

2

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

1

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
Y
+
+

0

+
ULL
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
+
+

AV1 Type 1 Encoder

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LA Depth

Latency Mode

Cores

Slow Preset

Medium Preset

Fast Preset

No B Frames

CQP

CBR

VBR

CVBR

CRF

CABR

Spatial AQ

Temporal AQ

ROI QP Map

11-53

+
Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-7
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

10

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-6
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

9

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-5
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

8

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-4
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

7

+
Low/Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-3
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

6

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-2
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

5

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0-1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

4

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

3

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

2

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

1

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

0

+
ULL
+
+
+
1 or 2
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
+

Note

+
    +
  1. When using 2 cores, the minimum resolution should have width >= 720 and height >= 720

  2. +
  3. The Slow preset only has an impact for 10-bit content. For 8-bit content it is identical to the medium preset. This statement applies to all values of lookahead depth.

  4. +
+
+
+
+

AV1 Type 2 Encoder

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LA Depth

Latency Mode

Cores

Slow Preset

Medium Preset

Fast Preset

No B Frames

CQP

CBR

VBR

CVBR

CRF

CABR

Spatial AQ

Temporal AQ

ROI QP Map

7-49

+
Normal
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-3
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

6

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-2
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

5

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0-1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

4

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

3

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+

2

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+

1

+
Low
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+

0

+
ULL
+
+
+
1
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
0
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/examples.html b/v1.2/examples.html new file mode 100644 index 00000000..9f654fc2 --- /dev/null +++ b/v1.2/examples.html @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + Tutorials and Examples — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tutorials and Examples
  • +
  • +
  • +
+
+
+ + + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/examples/amf/amf_encoder.html b/v1.2/examples/amf/amf_encoder.html new file mode 100644 index 00000000..8339e304 --- /dev/null +++ b/v1.2/examples/amf/amf_encoder.html @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + AMF Encoder Tutorial — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMF Encoder Tutorial
  • +
  • +
  • +
+
+
+
+
+ +

Under Construction

+
+

AMF Encoder Tutorial

+

The examples in the /opt/amd/ama/ma35/bin folder illustrate how C-based applications can perform encoding in AMD AMA Video SDK devices, using the AMF (Advanced Media Framework) APIs.

+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/examples/ffmpeg/filters.html b/v1.2/examples/ffmpeg/filters.html new file mode 100644 index 00000000..89430914 --- /dev/null +++ b/v1.2/examples/ffmpeg/filters.html @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + FFmpeg Examples using Software Filters — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

FFmpeg Examples using Software Filters

+ +

Examples shown in this section describe how to use FFmpeg combining both AMD accelerated functions and software filters. In all these examples, an AMA compatible device, e.g., MA35D, is used to decode the input stream, the decoded frames are transfered back to the host using the hwdownload filter, one or more software filters are applied to the decoded frames and the filtered frames are transfered back to the device using hwupload for encoding. It should be noted that, when possible, zero-copy filters such as split and fps should be used, to minimize the traffic between the host CPU and target device.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Video Rotation

+

The following example demonstrates how to generate multiple flip-over operations on the host CPU and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "split=2[a][b]; \
+  [a]hwdownload,transpose=dir=1:passthrough=none,hwupload[a1]; \
+  [b]hwdownload,transpose=dir=2:passthrough=none,hwupload[b1]" \
+ -map "[a1]" -c:v h264_ama  -f mp4 <OUT DIR>/90_flip.mp4 \
+ -map "[b1]" -c:v h264_ama  -f mp4 <OUT DIR>/270_flip.mp4
+
+
+

, where INPUT is the path to the input AVC clip and OUT DIR is the name of the output directory. See FFmpeg's filters for details on passthrough and split filters.

+
+
+

Logo Overlay

+

The following example demonstrates how to overlay a yuv420p image on a decoded video, through host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -i <y4M LOGO> -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "[1]hwdownload[vid],[vid][0]overlay=x=0:y=0[l],[l]format=yuv420p[lay],[lay]hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/overlay.mp4
+
+
+

Note that input to accelerated encoder, h264_ama, is in yuv420p format. See FFmpeg's overlay filter for detail usage.

+
+
+

Crop and Shift

+

The following example demonstrates how to crop a decoded video, at a given x and y offsets, through host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p -i <INPUT> \
+ -filter_complex "hwdownload,crop=640:480:(in_w-800):(in_h-out_h)/2,hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/crop.mp4
+
+
+
+
+

Video Composition

+

The following example demonstrates how to compose a tiled video on the host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -out_fmt yuv420p -i <INPUT_1> -c:v h264_ama -out_fmt yuv420p -i <INPUT_2> \
+ -c:v h264_ama -out_fmt yuv420p -i <INPUT_3> -c:v h264_ama -out_fmt yuv420p -i <INPUT_4> \
+ -filter_complex "[0]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[00];[1]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[11];\
+  [2]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[22];[3]scaler_ama=outputs=1:out_res=(1920x1080|yuv420p),hwdownload[33]; [00][11]hstack[top];\
+  [22][33]hstack[bot]; [top][bot] vstack,hwupload" \
+ -c:v h264_ama -b:v 15M -vframes 600 -f mp4 <OUT DIR>/compose.mp4
+
+
+
+

Note

+

For 10-bit support, the following changes are required to the provided examples:

+
    +
  1. Replace -out_fmt yuv420p with -out_fmt yuv420p10le

  2. +
  3. Add format=yuv420p10le to the filter graph.

  4. +
+

As an example, the following command shows 10-bit crop and shift:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -out_fmt yuv420p10le -i <INPUT> \
+ -filter_complex "hwdownload,format=yuv420p10le,crop=640:480:(in_w-800):(in_h-out_h)/2,hwupload" \
+ -c:v h264_ama  -f mp4 <OUT DIR>/crop_10b.mp4
+
+
+
+
+
+

Chroma Subsampling

+

The following example demonstrates how to perform 4:2:2 to 4:2:0 chroma subsampling on the host CPU, and to encode the resultant stream on a target AMA device:

+
ffmpeg -hwaccel ama -i <INPUT>  -vf "format=yuv420p,hwupload" -c:v h264_ama -b:v 1M -f mp4 <OUTPUT>
+
+
+

, where <INPUT> is path of the 442 input raw file and <OUTPUT> is the encoded video file.

+
+
+

Decoding and De-interlacing

+

Given that AMD AMA SDK neither accepts interlaced contents nor performs de-interlacing, such operations need to be performed on the host CPU. The following example demonstrates how to perform interlaced to progressive transcoding:

+
ffmpeg -hwaccel ama -i <INPUT>  -filter_complex  "yadif=0,hwupload" -c:v h264_ama -f mp4 <OUTPUT>
+
+
+

, where <INPUT> is path of the interlaced content and <OUTPUT> is the encoded video file.

+
+
+

Text Insertion

+

The following example demonstrates how to insert a text into encode stream:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -re \
+-f lavfi -i testsrc=duration=60:size=1920x1080:rate=60,format=yuv420p -f rawvideo \
+-filter_complex "drawtext=text='Hello:y=10:fontcolor=yellow:fontsize=36',format=yuv420p, hwupload" \
+-c:v h264_ama -f mp4 <OUTPUT>
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/examples/ffmpeg/quality_analysis.html b/v1.2/examples/ffmpeg/quality_analysis.html new file mode 100644 index 00000000..da58d258 --- /dev/null +++ b/v1.2/examples/ffmpeg/quality_analysis.html @@ -0,0 +1,360 @@ + + + + + + + + + + + + + + + Video Quality Examples — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Video Quality Examples

+

This page is dedicated to explaining some of the details behind Video Quality (VQ), how it is measured, and how you can optimize your FFmpeg commands with the AMD AMA Video SDK to maximize its performance.

+

Further documentation on this topic can be found in the Tuning Video Quality section of the AMD AMA Video SDK user guide.

+ +
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Introduction to Video Quality

+

There has been a longstanding goal for video engineers to quantitatively determine the output quality of an encoder without having to watch and inspect every individual frame. This has led to an evolution of algorithmic solutions, the most common of which are:

+ +

Many people will argue which metric is best (although PSNR is commonly considered the least accurate). Jan Ozer from the Streaming Media Center posted his experimental correlation of MOS vs the above metrics. You can review the findings here.

+

Furthermore, due to the industry standard of tracking encoder "performance" to quantitative metrics like the ones listed above, many encoders have "taught to the test"; that is, they provide different command-line arguments that will give higher scores but may look worse to the human eye. For example, common CPU encoders x264 and x265 have a tune parameter which optimizes to objective metrics.

+

This page discusses the AMD AMA Video SDK command line flags used to optimize for objective quality (scores) and subjective quality (visual appeal) and provides additional details as to what is happening behind the scenes and why.

+
+
+

Optimized Settings for the AMD AMA Video SDK

+

It is highly recommended to perform encoding on raw video clips; that is, clips that have not undergone a transform/compression/encoding in the past. This ensures that the clips are in a universally known state in order to fairly compare encoders.

+

Alternatively, you can add the flags to decode before encoding, and the results will remain accurate as long as the same pre-encoded file is used as the source across all encoders under test. Information on this process can be found on the FFmpeg tutorial page.

+

Flags not illustrated in this page are covered in the Using FFmpeg chapter of the AMD AMA Video SDK user guide.

+

The following table demonstrates various encoder parameters that effect VQ and latency.

+ + ++++++ + + + + + + + + + + + + + + +
Video Tuning Parameters

Tune Mode

Latency Setting

Preset Type

Encoder

VMAF

+

VQ

+

SSIM

+

PSNR

+

(See -tune_metrics)

+

Normal

+

Ultra Low Latency

+

(See -lookahead_depth)

+

Fast

+

Medium

+

Slow

+

(See -preset)

+

h264_ama

+

hevc_ama

+

av1_ama

+

(See -c:v)

+
+

Various permutations of Metrics, Latency and Preset are possible. The following sections provide demonstrative examples.

+
+

AV1 VMAF - Normal Latency - Medium Preset

+

In this mode, which is the default mode, the only adjustable parameter is the tuning mode. The following example, illustrates the VMAF tune mode, for AV1 encoder

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v av1_ama -tune_metrics 4 -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -tune_metrics 4 specifies VMAF optimization mode.

+
+
+

AVC VMAF - Normal Latency - Slow Preset

+

In this mode, real-time performance at capacity is not guaranteed; however, better results are obtained, with respect to the selected tune metric. Note that this mode is not applicable to either types of AV1.

+

The following example, illustrates the VMAF tune mode, for AVC encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v h264_ama -tune_metrics 4 -preset slow -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -preset slow optimizes the objective tuning modes.

+
+
+

AV1 VMAF - Ultra Low Latency - Medium Preset

+

Ultra Low Latency (ULL) is achieved by setting the -lookahead_depth to 0. The following example, illustrates the VMAF tune ULL mode, for AV1 encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v av1_ama -tune_metrics 4 -b:v 2000k -lookahead_depth 0 -f rawvideo <OUTPUT>
+
+
+
+
+

AVC VMAF - Ultra Low Latency - Slow Preset

+

This mode is the combination of ULL and metric optimized options. Note that this mode is not applicable to either types of AV1.

+

The following example, illustrates the VMAF tune ULL mode, for AVC encoder.

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -framerate 60 -pix_fmt yuv420p -i <INPUT> -vf hwupload -c:v h264_ama -tune_metrics 4 -lookahead_depth 0 -preset slow -b:v 2000k -f rawvideo <OUTPUT>
+
+
+

, where -preset slow optimizes the objective tuning modes.

+
+
+
+

Running PSNR/SSIM/VMAF Scores

+

Due to licensing reasons, the FFmpeg binary delivered in this package does not include a comprehensive set of codecs or plugins required for scoring video quality. You have many options:

+
    +
  1. (Easiest) Download a static FFmpeg build from John Van Sickle which has VMAF (among other plugins) precompiled + installed

  2. +
  3. Recompile another version FFmpeg and include the VMAF library

  4. +
  5. Recompile the FFmpeg starting from the source code included in this repository and include the VMAF library. For instructions on how to customize and rebuild the FFmpeg provided with the AMD AMA Video SDK, see the Rebuilding FFmpeg section

  6. +
+

The following sample command line demonstrates a typical VMAF calculation, through FFmpeg:

+
<FFMPEG PATH>/ffmpeg -i <DISTORTED FILE> -framerate <FRAME RATE> -s <RESOLUTION> -pix_fmt yuv420p -i <ORIGINAL> \
+-lavfi libvmaf="log_fmt=json:ms_ssim=1:ssim=1:psnr=1:log_path=/<LOG FILE PATH>.vmaf.json:model_path=<PATH TO VMAF MODEL>" -f null -
+
+
+

, where FFMPEG PATH is the path to modified FFmpeg, DISTORTED FILE is the encoded file, RESOLUTION is WidthxHeigth resolution of the original clip, ORIGINAL is the original clip, LOG FILE PATH is the path of log file and PATH TO VMAF MODEL is the path to an appropriate VMAF model, which typically is vmaf_4k_v0.6.1.pkl for 4K resolution or vmaf_float_v0.6.1.pkl for lower resolutions. See Models for relevant details. The above command line calculates PSNR, SSIM and VMAF, in json format.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/examples/ffmpeg/tutorials.html b/v1.2/examples/ffmpeg/tutorials.html new file mode 100644 index 00000000..8949fd7e --- /dev/null +++ b/v1.2/examples/ffmpeg/tutorials.html @@ -0,0 +1,1005 @@ + + + + + + + + + + + + + + + FFmpeg Tutorials — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

FFmpeg Tutorials

+

This page provides tutorials on how to use FFmpeg with the AMD AMA Video SDK. The complete reference guide for the FFmpeg version included in the AMD AMA Video SDK can be found here.

+

The tutorials break down the commands, starting with simple decode, scale and encode pipelines. The tutorials end with different varieties of full transcode pipelines.

+ +
+

Device Selection

+

As noted in Video Codec Unit section, each card is made of 2 devices, and by default all processing tasks are delegated to the first device in the systems. (See mautil to find out how many devices are available, in a runtime environment.) To override this behavior, default and non-default devices must be set, explicitly. To do so within a FFmpeg command, the default device is set by using FFmpeg's hardware acceleration framework, i.e., ffmpeg -hwaccel ama  -hwaccel_device /dev/ama_transcoder0 ..., and can be further refined, by delegating subtasks to non-default devices by using hwupload_ama. See Multi-device Transcode for an example.

+
+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+

+
+
+
+

Simple FFmpeg Examples

+

Some of the examples read or write RAW files from disk (encode-only or decode-only pipelines). There is a chance that due to the massive bandwidth required for operating on these RAW files, you will notice a drop in FPS; this is not due to the AMD AMA Video SDK but the disk speeds. We recommend reading/writing from /dev/shm which is a RAM disk.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Decode Only

+

This example accepts a clip that is already encoded in H.264, and will decode the file into a RAW format and save it to disk.

+

Command Line:

+
ffmpeg -y -hwaccel ama -c:v h264_ama -out_fmt nv12 -i <INPUT> \
+ -vf hwdownload,format=nv12 -f rawvideo /tmp/dec_out.nv12
+
+
+

Explanation of the flags:

+
    +
  • ffmpeg

    +
      +
    • The ffmpeg application, which is provided by AMD, and moved to the top of the PATH when you sourced the setup.sh script

    • +
    +
  • +
  • hwaccel ama

    +
      +
    • Instructs FFmpeg to use accelerated plugins provided by AMD AMA Video SDK

    • +
    +
  • +
  • -out_fmt nv12

    +
      +
    • Specifies nv12 output format for the decoded video. Note that this option has to be specified twice: 1) To convert from the internal buffer format to nv12 in the decoder and 2) To convert when transferring to the host.

    • +
    +
  • +
  • -f rawvideo

    +
      +
    • This signifies that the video is in a raw format, without container or other metadata/information about the clip

    • +
    +
  • +
  • -c:v h264_ama

    +
      +
    • Declares the decoder's codec for video (as opposed to, e.g., audio -c:a ac3) is the hardware-accelerated H.264 decoder

    • +
    +
  • +
  • -i <INPUT>

    +
      +
    • The input file to be transcoded

    • +
    +
  • +
  • -vf hwdownload

    +
      +
    • Internally, the decoder operates on AMD AMA Video SDK type buffers to improve performance. To convert back to a host-buffer, you must execute this filter.

    • +
    +
  • +
  • -y

    +
      +
    • Enable overwrite without prompting the user if they're sure

    • +
    +
  • +
  • /tmp/dec_out.yuv

    +
      +
    • The decoder will save the file to the path above

    • +
    +
  • +
+
+
+

Encode Only

+

This example accepts a RAW 1080p60 clip in YUV420 format. It will pass the clip to the encoder to produce an AV1 encoded MP4 output with a target bitrate of 5Mbps and saves it to disk. The command uses the default VQ setting. See FFmpeg Video Quality for details.

+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -b:v 5M -f mp4 -y sn1_av1.mp4
+
+
+

Explanation of the flags:

+
    +
  • -re

    +
      +
    • Flag to maintain the target frame rate

    • +
    +
  • +
  • -s 1920x1080

    +
      +
    • Since there is no container or metadata in a RAW clip, the user must define the input clip's resolution/size. This example states the input is 1080p

    • +
    +
  • +
  • -framerate 60

    +
      +
    • Again, without metadata, the encoder requires the framerate of the incoming stream

    • +
    +
  • +
  • -pix_fmt yuv420p

    +
      +
    • The color space of the encoder is by default yuv420p. this example is defining the input clip as being this same color space

    • +
    +
  • +
  • -f mp4

    +
      +
    • Sets the output video container to MP4

    • +
    +
  • +
  • -b:v 5M

    +
      +
    • The target bitrate of the encoded stream. 8M signifies a target bitrate of 8 Megabits per second. You can also use 8000K or 8000000.

    • +
    +
  • +
  • -c:v av1_ama

    +
      +
    • Declares the encoder's codec for video (as opposed to audio -c:a ...) is the hardware-accelerated AV1 encoder

    • +
    +
  • +
  • /tmp/enc_out.mp4

    +
      +
    • Save the output in the above path.

    • +
    +
  • +
+
+

4:2:2 10 Bit Conversion

+

To encode YUV, 4:2:2, 10 bit pixel format to YUV, 4:2:0, 8 bit use the following command:

+

Command Line:

+
ffmpeg -hwaccel ama -i <INPUT>  -vf "format=yuv420p,hwupload" -c:v h264_ama -b:v 1M <OUTPUT>
+
+
+

Explanation of the flags:

+
    +
  • -vf "format=yuv420p,hwupload"

    +
      +
    • Instructs the pipeline to upload and convert the input video as yuv420p.

    • +
    +
  • +
+
+
+

Constant Rate Factor (CRF) Mode

+

The following examples demonstrate the usage of the -crf flag and impact of the -qp option on the quality of the encoded streams.

+
+
High Quality Encoding
+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -crf 1 -qp 0 -f mp4 sn1_crf_hq.mp4
+
+
+

Explanation of the flags:

+
    +
  • -crf 1

    +
      +
    • Enables the -crf mode

    • +
    +
  • +
  • -qp 0

    +
      +
    • Sets the encoded AV1 stream to highest CRF quality

    • +
    +
  • +
+
+
+
Low Quality Encoding
+

Command Line:

+
ffmpeg -re -hwaccel ama -f rawvideo -s 1920x1080 -framerate 60 -i <INPUT> -vf "hwupload" -c:v av1_ama -crf 1 -qp 255 -f mp4 sn1_crf_lq.mp4
+
+
+

Explanation of the flags:

+
    +
  • -qp 255

    +
      +
    • Sets the encoded AV1 stream to lowest CRF quality

    • +
    +
  • +
+
+
+
+
+

Basic Transcode

+

This example takes an H.264 clip and transcodes it to HEVC at the bitrate of 8Mbps. The output is written into /tmp/h264_to_hevc.

+

Command Line:

+
ffmpeg -y -hwaccel ama -c:v h264_ama -i <INPUT> \
+ -c:v hevc_ama -b:v 8M  -f rawvideo  /tmp/h264_to_hevc.hevc
+
+
+
+
+

Decode Only Into Multiple-Resolution Outputs

+

This example decodes an existing H.264 file and then scales it into multiple resolutions as defined below. It will not re-encode them, but save the RAW outputs to disk under /tmp/_scale<resolution>.yuv

+

Command Line:

+
 ffmpeg -y -hwaccel ama \
+-c:v h264_ama  -out_fmt nv12 -i <INPUT>  \
+-filter_complex "scaler_ama=outputs=4:out_res=(1920x1080|full|nv12)(1280x720|full|nv12)(720x480|full|nv12)(360x240|full|nv12) [a][b][c][d]; \
+                 [a]hwdownload,format=nv12[a1];[b]hwdownload,format=nv12[b1];[c]hwdownload,format=nv12[c1];[d]hwdownload,format=nv12[d1]" \
+-map '[a1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_1080p.yuv \
+-map '[b1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_720p.yuv  \
+-map '[c1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_480p.yuv \
+-map '[d1]' -f rawvideo -pix_fmt nv12 -y /tmp/scale_240p.yuv
+
+
+

Explanation of the flags:

+
    +
  • -filter_complex

    +
      +
    • The FFmpeg -filter_complex flag allows combining multiple filters together using a graph-like syntax. This example uses the scaler_ama to create 4 output resolutions from the input stream.

    • +
    • The scaler_ama filter configures the hardware-accelerated scaler to produce 4 output resolutions (1920x1080, 1280x720, 720x480, and 360x240). For each output, the width, height, frame rate and pixel format are defined as arguments to out_res option as in (WidthxHeight|Rate|Format). The 4 outputs are transfered to the host as a1, b1, c1 and d1 respectively.

    • +
    +
  • +
  • -map "[ID]"

    +
      +
    • Selects an output of the filter graph. The flags that follow apply to the selected stream.

    • +
    +
  • +
  • /tmp/scale_<resolution>.yuv

    +
      +
    • Save the output files to the paths listed

    • +
    +
  • +
+
+
+

Encode Only Into Multiple-Resolution Outputs

+

This example takes a raw 1080p60 YUV file, scales it down to different resolutions and frame rates, encodes each of the scaled streams to different formats and saves them to disk under /tmp/<encode format>_<resolution>p<frame rate>.mp4

+

Command Line:

+
ffmpeg -y -hwaccel ama -f rawvideo -pix_fmt yuv420p -s:v 1920x1080 -framerate 60 -i <INPUT> \
+-filter_complex "hwupload,scaler_ama=outputs=4:out_res=(1920x1080|full)(1280x720|half)(720x480|half)(360x240|half) [a][b][c][d]" \
+-map '[a]' -c:v hevc_ama -b:v 6M -f mp4 -y /tmp/hevc_1080p60.mp4 \
+-map '[b]' -c:v av1_ama  -b:v 2M -f mp4 -y /tmp/av1_720p30.mp4 \
+-map '[c]' -c:v h264_ama -b:v 1M -f mp4 -y /tmp/h264_480p30.mp4 \
+-map '[d]' -c:v av1_ama  -b:v 1M -f mp4 -y /tmp/av1_240p30.mp4
+
+
+

Explanation of the flags:

+
    +
  • -filter_complex "hwupload...

    +
      +
    • Specifies that video clip gets upload to the device.

    • +
    +
  • +
  • -filter_complex "...scaler_ama=outputs=4:out_res=...(1280x720|half)...

    +
      +
    • Declares scaler output of given resolution and rate. See scaler_ama for more details.

    • +
    +
  • +
  • -c:v [hevc_ama | av1_ama | h264_ama]

    +
      +
    • Declares various encode types HEVC, AV1 and H.264, respectively.

    • +
    +
  • +
  • /tmp/encode-format_resoultion.encode-format

    +
      +
    • Saves the output clips to the location listed

    • +
    +
  • +
+
+
+

Transcode with Multiple-Resolution Outputs

+

This example implements a complete transcoding pipeline on an 1080p60 H.264 input. It decodes the input stream, scales it to 4 different resolutions and encodes scaler's outputs into various formats and saves them to disk under /tmp/<encoder format>_<resolution>.mp4

+

Command Line:

+
ffmpeg -y -hwaccel ama \
+-c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=4:out_res=(1920x1080)(1280x720)(720x480)(360x240) [a][b][c][d]" \
+-map '[a]' -c:v hevc_ama -b:v 6M -f mp4 -y /tmp/hevc_1080p.mp4 \
+-map '[b]' -c:v av1_ama  -b:v 2M -f mp4 -y /tmp/av1_720p.mp4 \
+-map '[c]' -c:v h264_ama -b:v 1M -f mp4 -y /tmp/h264_480p.mp4 \
+-map '[d]' -c:v av1_ama  -b:v 1M -f mp4 -y /tmp/av1_240p.mp4
+
+
+
+
+

Transcode in ULL Mode

+

This example implements an ultra low latency transcode pipeline. For more details refer Tuning Transcode Latency.

+

Command Line:

+
ffmpeg  -hide_banner -loglevel error -y -hwaccel ama -low_latency 1 -c:v h264_ama -i <INPUT> \
+-c:v hevc_ama -b:v 10M -lookahead_depth 0 -f rawvideo /tmp/h264_to_hevc.hevc
+
+
+

Explanation of the flags:

+
    +
  • -low_latency 1

    +
      +
    • Enables low latency decoding mode.

    • +
    +
  • +
  • -lookahead_depth 0

    +
      +
    • LA size of 0 triggers ultra low latency encoding mode.

    • +
    +
  • +
+
+
+

8kp30 Transcode

+

This example shows how to construct an AV1 Type-1 8kp30 transcode pipeline.

+

Command Line:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i <INPUT> -c:v av1_ama -cores 2 -y -f mp4 <OUTPUT>
+
+
+

Explanation of the flags:

+
    +
  • -cores 2

    +
      +
    • Uses both cores for AV1 Type-1 encoding

    • +
    +
  • +
+
+
+

Multi-slice Transcode

+

This example shows how to transcode a 8kp30 input into a 4kp30 AVC and a 4kp30 HEVC.

+

Command Line:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -resize 3840x2160 -i <INPUT> -filter_complex "split=2[a][b]" \
+-map "[a]" -c:v h264_ama -slice 0 -f mp4 <OUTPUT 1> \
+-map "[b]" -c:v hevc_ama -slice 1 -f mp4 <OUTOUT 2>
+
+
+

Explanation of the flags:

+
    +
  • -resize 3840x2160

    +
      +
    • Uses decoder's downscaling capability

    • +
    +
  • +
  • -slice 0 and 1

    +
      +
    • Explicitly targets both slices, for 2x4kp60 encoding. Note that explicit slice assignment is only required if xrmd is not enabled.

    • +
    +
  • +
+
+
+

Multi-device Transcode

+

This example demonstrates hwdownload_ama ability to execute encoding or 2D processing tasks, on an arbitrary device.

+

Command Line:

+
ffmpeg  -hwaccel ama -hwaccel_device /dev/ama_transcoderX -c:v h264_ama -out_fmt yuv420p -i <INPUT> -filter_complex "hwdownload,hwupload_ama=device=Y" -c:v h264_ama -f mp4 <OUTPUT>
+
+
+

Explanation of the flags:

+
    +
  • hwdownload

    +
      +
    • Downloads the decoded stream from device X to the host

    • +
    +
  • +
  • hwupload_ama=device=Y

    +
      +
    • Uploads the decoded stream from the host to device Y for encoding

    • +
    +
  • +
+
+
+

Double Density Example with xrmd

+

This example demonstrates an example on how to achieve 4x4kp60 density on a single device

+

Command Line:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -i <4Kp6 H.264 file> \
+ -filter_complex "split=4[a][b][c][d]" \
+ -map "[a]" -c:v av1_ama -f rawvideo -y /tmp/out_3840x2160_0.av1 \
+ -map "[b]" -c:v hevc_ama -f rawvideo -y /tmp/out_3840x2160_0.hevc \
+ -map "[c]" -c:v av1_ama -f rawvideo -y /tmp/out_3840x2160_1.av1 \
+ -map "[d]" -c:v hevc_ama -f rawvideo -y /tmp/out_3840x2160_1.hevc
+
+
+

Explanation of the flags:

+
    +
  • -split

    +
      +
    • Splits input into several identical outputs.

    • +
    +
  • +
+
+
+

Double Density Example without xrmd

+

This example demonstrates how to achieve 4x4kp60 density on a single device, by explicitly allocating tasks on slices 0 and 1. Note in this example xrmd service has to be stopped.

+

Command Line:

+
ffmpeg -hide_banner -hwaccel ama -c:v h264_ama -i <4Kp6 H.264 file> \
+ -filter_complex "split=4[a][b][c][d]" \
+ -map "[a]" -c:v av1_ama -slice 0 -f rawvideo -y /tmp/out_3840x2160_0.av1 \
+ -map "[b]" -c:v hevc_ama -slice 0 -f rawvideo -y /tmp/out_3840x2160_0.hevc \
+ -map "[c]" -c:v av1_ama -slice 1 -f rawvideo -y /tmp/out_3840x2160_1.av1 \
+ -map "[d]" -c:v hevc_ama -slice 1 -f rawvideo -y /tmp/out_3840x2160_1.hevc
+
+
+
+
+

Full Double Density

+

This example demonstrates how to achieve full density, by distributing transcode pipelines, between 2 devices.

+

Command Line:

+
for i in `seq 1 16`; do
+ ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoderX -re -c:v h264_ama -i <30 FPS INPUT> -c:v <TYPE 2 ENCODER> -lookahead_depth 10 -f null /dev/null > out_T2_0_$i.log 2>&1 &
+ ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoderX -re -c:v h264_ama -i <30 FPS INPUT> -c:v av1_ama -lookahead_depth 10 -f null /dev/null > out_av1_0_$i.log 2>&1 &
+ ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoderY -re -c:v h264_ama -i <30 FPS INPUT> -c:v <TYPE 2 ENCODER> -lookahead_depth 10 -f null /dev/null > out_T2_1_$i.log 2>&1 &
+ ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoderY -re -c:v h264_ama -i <30 FPS INPUT> -c:v av1_ama -lookahead_depth 10 -f null /dev/null > out_av1_1_$i.log 2>&1 &
+done
+
+
+

, where X and Y represent 2 different devices. <30 FPS INPUT> is a 30 FPS encoded video input. (The above example assumes H264 encoded input.), and <TYPE 2 ENCODER> is any one of AV1 Type-2, H264 or HEVC encoder. Note that by default av1_ama uses Type-1 AV1 encoder.

+

The above example transcodes 64 simultaneous 1080p30 pipelines. Note that if XRMD is disabled, then -slice parameter must be set explicitly.

+
+
+

Image Decoding

+

The following example demonstrates how to decode a series of JPEG images into a AVC video.

+

Command Line:

+
ffmpeg -framerate 60 -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v jpeg_ama -i <FILE PRFIX>_%03d.jpg  \
+-r 60 -c:v h264_ama -b:v 5M -f mp4 <OUTPUT>
+
+
+

, where <FILE PRFIX>_%03d.jpg indicates the name pattern of the JPEG images.

+
+
+

Image Encoding

+

The following example demonstrates how to encode a video stream into a series of JPEG images.

+

Command Line:

+
ffmpeg -y -hwaccel ama -s:v 1920x1080 -pix_fmt yuv420p -i <YUV INPUT> -vf "fps=1,hwupload" -c:v jpeg_ama -quality 90 <FILE PRFIX>_%04d.jpg
+
+
+

, where -quality specifies JPEG encoding quality.

+
+
+
+

2D Processing

+

This section provides examples on usage of various 2D Processing utilities. See 2D Engine for details.

+
+

Cropping

+

The following example demonstrates a 720P crop at offset (320, 180).

+

Command Line:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -re -out_fmt yuv420p -c:v h264_ama -i <INPUT> \
+-filter_complex "crop_ama=b_left=320:b_top=180:b_w=1280:b_h=720 [b]" -map "[b]" -c:v h264_ama -f mp4 <OUTPUT>
+
+
+
+
+

Padding

+

The following example demonstrates padding a 720P clip into a 1080p.

+

Command Line:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i <720P INPUT> \
+-filter_complex "pad_ama=p_left=320:p_top=180:p_w=1920:p_h=1080:color=pink" -c:v h264_ama -b:v 5M -f mp4 <1080P OUTPUT>
+
+
+
+
+

Video Rotation

+

The following example demonstrates how to transcode a flip-over operation

+

Command Line:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -i <INPUT> -filter_complex "rotate_ama=angle=180[c]" -map "[c]" -c:v hevc_ama -f mp4 <OUTPUT>
+
+
+

, where INPUT and OUTPUT are any one of supported encoded files. Note that only rotations which are multiples of 90 degrees are supported.

+
+
+

Color Space Conversion

+

The following example demonstrates how to convert from RGB to YUV:

+

Command Line:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 -pix_fmt bgra -i <INPUT> -filter_complex "[0:v]hwupload,colorspace_ama=csc=rgb2yuv,hwdownload" -pix_fmt yuv420p -f rawvideo <OUTPUT>
+
+
+

The following example demonstrates how to encode a RGBA video file :

+

Command Line:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -f rawvideo -s 1920x1080 -pix_fmt bgra -i <INPUT> -filter_complex "[0:v]hwupload,colorspace_ama=csc=rgb2yuv" -c:v hevc_ama -f mp4 <OUTPUT>
+
+
+

Similarly, the following example demonstrates YUV to planar RGB conversion:

+

Command Line:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i <INPUT> -filter_complex "colorspace_ama=csc=yuv2rgb,hwdownload" -pix_fmt bgra -f rawvideo -y <RGBP OUTPUT>
+
+
+
+
+

Chroma Subsampling

+

The following example demonstrates how to convert from 4:2:2 pixel format to 4:2:0:

+

Command Line:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -s 1920x1080 \
+-pix_fmt yuv422p -i <INPUT> -filter_complex "hwupload,subsample_ama,hwdownload" -pix_fmt yuv420p -f rawvideo <OUTPUT>
+
+
+

, where graphic processor is set for pixel subsampling operation.

+

The following example demonstrates how to transcode a 4:2:2 pixel format video to 4:2:0 using both the host, for decoding, and an AMA AMD compatible card, for subsampling and encoding:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -i <INPUT> -filter_complex "hwupload,subsample_ama" -c:v h264_ama -b:v 5M -f mp4 <OUTPUT>
+
+
+

, where graphic processor is set for pixel subsampling operation.

+
+
+

Picture In Picture (PIP)

+

The following example demonstrates how to create a PIP video:

+

Command Line:

+
ffmpeg -y -hide_banner  -hwaccel ama -hwaccel_device /dev/ama_transcoder0  \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 1> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 2> \
+-filter_complex "[1:v]scaler_ama=outputs=1:out_res=(720x480|yuv420p)[p]; \
+                 [0:v][p]overlay_ama=x=0:y=0[x]" \
+-map "[x]" -c:v h264_ama -frames 1000 -b:v 15M -f mp4 -y <OUTPUT>
+
+
+

, where graphic processor is set for scaling and overlay operations, with INPUT 1 set as the background.

+
+
+

Tiling

+

The following example demonstrates how to create a tiling video:

+

Command Line:

+
ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 1> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 2> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 3> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 4> \
+-filter_complex "[0:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[0]; \
+                 [1:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[1]; \
+                 [2:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[2]; \
+                 [3:v]scaler_ama=outputs=1:out_res=(1280x720|yuv420p)[3]; \
+                 [0][1][2][3]tile_ama=layout=2x2:inputs=4:w=1920:h=1080[r]"
+-map "[r]" -c:v h264_ama -b:v 15M -f mp4 -y <OUTPUT>
+
+
+

, where graphic processor's is set for scaling and tiling operations, with INPUT 1 ... INPUT 4 set as tiles.

+
+
+

Thumbnailing

+

The following example shows how to generate JPEG thumnails from a video asset.

+

Command Line:

+
ffmpeg -hwaccel ama -c:v h264_ama -i <INPUT> -vf "select='eq(pict_type\,I)', scaler_ama=outputs=1:out_res=(144x144|full)" -vsync vfr -c:v jpeg_ama out_%03d.jpg
+
+
+

JPEG thumbnails are named from out_000.jpg through out_999.jpg.

+

Alternatively, down scaling can be done through the decoder.

+

Command Line:

+
ffmpeg -hwaccel ama -c:v h264_ama -resize 144x144 -i <INPUT> -vf "select='eq(pict_type\,I)'" -vsync vfr -c:v jpeg_ama out_%03d.jpg
+
+
+
+
+

Composition

+

The following example demonstrates how to create a static composition.

+

Command Line:

+
/opt/amd/ama/ma35/bin/ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 1> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 2> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 3> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 4> \
+-filter_complex "[0:v][1:v][2:v][3:v]\
+compositor_ama=inputs=4:out_res=1920x1080:enable_background=1:background=black:\
+input_params=\
+(960x540|angle=90|out_x=8|out_y=8|zorder=1)\
+(960x540|angle=90|out_x=408|out_y=208)\
+(960x540|angle=90|out_x=808|out_y=408|zorder=1)\
+(960x540|angle=90|out_x=1208|out_y=608|border_inner_size=2)[co];\
+[co]sendcmd=f=composite_static.txt[c]" \
+-map "[c]" -c:v av1_ama -b:v 5M -vframes 570 -f mp4 composite_test.mp4
+
+
+

, where composite_static.txt contains:

+
00:00:01.000 compositor_ama 'background=pink';
+00:00:03.000 compositor_ama 'background=green:input=1:border_inner_size=4:border_outer_size=2:border_color=blue';
+00:00:06.000 compositor_ama 'input=2:border_inner_size=4:border_outer_size=2:border_color=brown:input=0:border_inner_size=10:border_outer_size=10';
+00:00:08.000 compositor_ama 'input=3:flip=h:zorder=2:out_res=1280x540:in_y=1082';
+00:00:10.000 compositor_ama 'input=0=flip=v';
+00:00:12.000 compositor_ama 'angle=90';
+00:00:15.000 compositor_ama 'inputs_enabled=2';
+00:00:16.000 compositor_ama 'inputs_enabled=3';
+00:00:17.000 compositor_ama 'zorder=0'
+
+
+

This example starts by overlapping 3 scaled and rotated input clips, with a black background. The static composition file, then directs the pipeline to change the background color, z order, boarder line,etc. at prescribed intervals.

+

The compositor can also be executed in a dynamic manner, where different properties can be adjusted interactively, through ZeroMQ protocol.

+

Command Line:

+
/opt/amd/ama/ma35/bin/ffmpeg -y -hide_banner -hwaccel ama -hwaccel_device /dev/ama_transcoder0 \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 1> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 2> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 3> \
+-c:v h264_ama -out_fmt yuv420p -i <INPUT 4> \
+-filter_complex "[0:v][1:v][2:v][3:v]\
+compositor_ama=inputs=4:out_res=1920x1080:enable_background=1:background=black:\
+input_params=\
+(960x540|angle=90|out_x=8|out_y=8|zorder=1)\
+(960x540|angle=90|out_x=408|out_y=208)\
+(960x540|angle=90|out_x=808|out_y=408|zorder=1)\
+(960x540|angle=90|out_x=1208|out_y=608|border_inner_size=2)[co]; \
+[co]zmq=bind_address=tcp\\\://127.0.0.1\\\:5555[c]" \
+-map "[c]" -c:v h264_ama -b:v 5M  570 -f mpegts udp://MC_IP:MC_PORT??pkt_size=1316
+
+
+

To interactively change the compositor's properties, create the following Python script:

+
#!/usr/bin/python3
+import zmq
+import sys
+
+context = zmq.Context()
+Url=sys.argv[1]
+socket = context.socket(zmq.REQ)
+socket.connect(Url)
+cmd = sys.stdin.read()
+socket.send_string(cmd)
+recv = socket.recv()
+print(f"Received reply [{recv.decode()}]")
+
+
+

, and update properties as follows, e.g. the following changes the background to pink:

+
printf "compositor_ama background=pink" |  ./zmq_send.py "tcp://localhost:5555"
+
+
+

To observe the interactive updates, on a machine within the same multicast network, issue the following command:

+
ffplay udp://MC_IP:MC_PORT
+
+
+

, where MC_IP and MC_PORT are multicast address and multicast ports, respectively.

+
+
+
+

ML Processing

+

This section provides examples on usage of ROI for both face and text VQ enhancement.

+
+

ML Based Face ROI

+

The following example demonstrates how to perform ROI face encoding on an AMA AMD compatible card:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i <INPUT> \
+-filter_complex "scaler_ama=outputs=3:out_res=(1280x720|yuv420p)(1280x720|yuv420p)(1280x720|rgbp)[def][ori][a]; \
+                 [a]ml_ama=model=roi:model_args=type=face[mlop];[ori][mlop]roi_scale_ama[res1]" \
+-map [res1] -c:v hevc_ama -b:v 300K -f mp4 <OUTPUT 1> \
+-map [def] -c:v hevc_ama -b:v 300K -f mp4 <OUTPUT 2>
+
+
+

, where ML engine is set for face ROI enhancement, and the resulting enhanced image, res1, is encoded.

+
+
+

ROI Gain Factor

+

The following example demonstrates the impact of probability-to-QP mapping gain factor:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i  <INPUT> \
+   -filter_complex "split=outputs=5 [plain][ml0][l][n][h]; \
+                             [ml0] scaler_ama=outputs=1:out_res=(1280x720|rgbp) [ml1]; \
+                             [ml1] ml_ama=model=roi:model_args=type=face [ml2]; \
+                             [ml2] split=outputs=3 [ml3_1][ml3_2][ml3_3]; \
+                             [l][ml3_1] roi_scale_ama=strength=low [ml_l]; \
+                             [n][ml3_2] roi_scale_ama=strength=normal [ml_n]; \
+                             [h][ml3_3] roi_scale_ama=strength=high [ml_h]" \
+     -map '[plain]' -c:v h264_ama -b:v 300k -f mp4 <OUTPUT1> \
+     -map '[ml_l]' -c:v h264_ama -b:v 300k -f mp4 <OUTPUT2> \
+     -map '[ml_n]' -c:v h264_ama -b:v 300k -f mp4 <OUTPUT3> \
+     -map '[ml_h]' -c:v h264_ama -b:v 300k -f mp4 <OUTPUT4>
+
+
+

Here <OUTPUTx>, for x={1-4}, represent encode streams without ML, low, normal and high gain factors, respectively.

+
+
+

ROI Ladder Transcoding

+

The following example demonstrates how to perform ROI transcoding at different resolutions:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i <INPUT> \
+ -filter_complex "split=2[s_org][s_ml]; \
+                  [s_org]scaler_ama=outputs=4:out_res=(1920x1080)(1280x720)(720x480)(360x240) [sa][sb][sc][sd]; \
+                  [s_ml]scaler_ama=outputs=1:(1280x720|rgbp)[ml_in]; \
+                  [ml_in]ml_ama=model=roi:model_args=type=face[ml_out]; [ml_out]split=4[ml_out_sa][ml_out_sb][ml_out_sc][ml_out_sd]; \
+                  [sa][ml_out_sa]roi_scale_ama[roi_a]; \
+                  [sb][ml_out_sb]roi_scale_ama[roi_b]; \
+                  [sc][ml_out_sc]roi_scale_ama[roi_c]; \
+                  [sd][ml_out_sd]roi_scale_ama[roi_d]" \
+-map [roi_a] -c:v av1_ama -b:v 300K -f rawvideo <OUTPUT1> \
+-map [roi_b] -c:v av1_ama -b:v 300K -f rawvideo <OUTPUT2> \
+-map [roi_c] -c:v av1_ama -b:v 300K -f rawvideo <OUTPUT3> \
+-map [roi_d] -c:v av1_ama -b:v 300K -f rawvideo <OUTPUT4>
+
+
+

Note that scale engine is invoke twice. Once for scaling the outputs and second time to perform pixel conversion.

+
+
+

ROI Face Detection

+

The following example demonstrates inference engine's ability to detect faces:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -i <INPUT> \
+-filter_complex "scaler_ama=outputs=2:out_res=(1280x720|yuv420p)(1280x720|rgbp)[ori][mlip]; \
+                 [mlip]ml_ama=model=roi:model_args=type=face[mlop]; \
+                 [ori][mlop]roi_scale_ama=roi_map_type=roi[rso]; \
+                 [rso]hwdownload, roi_overlay_ama[res1]" \
+-map [res1] -f rawvideo -pix_fmt yuv420p -f rawvideo <OUTPUT>
+
+
+

, where software plugin roi_overlay_ama overlays transparent rectangular boxes around all detected faces.

+
+
+

ML Based Text ROI

+

The following example demonstrates how to perform ROI text encoding on an AMA AMD compatible card:

+
ffmpeg -y -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama  -i <INPUT> \
+-filter_complex "scaler_ama=outputs=3:out_res=(1280x720|yuv420p)(1280x720|yuv420p)(1280x720|rgbp)[def][ori][a]; \
+                 [a]ml_ama=model=roi:model_args=type=text[mlop];[ori][mlop]roi_scale_ama[res1]" \
+-map [res1] -c:v hevc_ama -b:v 200K -f mp4  <OUTPUT 1> \
+-map [def] -c:v hevc_ama -b:v 200K -f mp4  <OUTPUT 2>
+
+
+

, where ML engine is set for text ROI enhancement, and the resulting enhanced image, res1, is encoded.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/examples/gstreamer/filters.html b/v1.2/examples/gstreamer/filters.html new file mode 100644 index 00000000..7bb698f1 --- /dev/null +++ b/v1.2/examples/gstreamer/filters.html @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + GStreamer Examples using Software Filters — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Examples using Software Filters

+ +

The /opt/amd/ama/ma35/examples/gstreamer/ama_pipeline_scripts/filters/ folder contains different examples showing how to use GStreamer combining both AMD accelerated functions and software filters. In all these examples, an AMA compatible device, e.g., MA35D, is used to decode the input stream, the decoded frames are transfered back to the host using the ama_download filter, one of more software filters are applied to the decoded frames and the filtered frames are transfered back to the device using ama_upload for encoding. It should be noted that, when possible, zero-copy filters such as tee should be used, to minimize the traffic between the host CPU and target device.

+

In the following sections, description of command line options is done in an accumulative manner, i.e., previously described options are not explained further.

+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Video Rotation

+
    +
  • Example script: 01_rotate_video.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and will send the rotated, encoded h.264 output to /tmp/xil_rotate_<N>.mp4.

+
+
+

Logo Overlay

+
    +
  • Example script: 02_logo_overlay.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and an image file ("logo"). It will scale the logo to 500x100, place it 16 pixels right and 16 pixels down from the top-left corner of the output video file, which will be an encoded h.264 output saved to /tmp/xil_logo_overlay.mp4.

+
+
+

Crop and Zoom

+
    +
  • Example script: 03_crop_zoom.sh

  • +
+

This example accepts an 8-bit, YUV420, pre-encoded h264 file and will crop a 300x200 sized section of the original video. The section's top left corner begins at 20 pixels to the right, and 10 pixels down from the top-left corner of the original video. The output video is h.264 encoded and is saved to /tmp/xil_crop_zoom.mp4

+
+
+

Video Composition

+
    +
  • Example script: 04_multi_comp.sh

  • +
+

This example accepts 4x 8-bit, YUV420, pre-encoded h264 files of equal dimensions, and will create an output 2x2 composite video which will be an encoded h.264 output saved to /tmp/xil_multi_comp.mp4. The output resolution will be equal to the original input.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/examples/gstreamer/tutorials.html b/v1.2/examples/gstreamer/tutorials.html new file mode 100644 index 00000000..12191d67 --- /dev/null +++ b/v1.2/examples/gstreamer/tutorials.html @@ -0,0 +1,456 @@ + + + + + + + + + + + + + + + GStreamer Introductory Tutorials — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Introductory Tutorials

+

This page provides tutorials on how to use GStreamer with the AMD AMA Video SDK. The complete reference guide for the GStreamer version included in the AMD AMA Video SDK can be found here.

+ +
+

Device Selection

+

As noted in Video Codec Unit section, each card is made of 2 devices, and by default all processing tasks are delegated to the first device in the systems. (See mautil to find out how many devices are available, in a runtime environment.) To override this behavior, default and non-default devices must be set, explicitly. See Working with Multiple Devices for more explanation, and Multidevice Transcode for sample usage.

+
+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

Simple GStreamer Examples

+

By default, all the example scripts use the filesink plug-in and write the output files into the /tmp directory.

+

Some of the examples read or write RAW files from disk (encode-only or decode-only pipelines). There is a chance that due to the massive bandwidth required for operating on these RAW files, you will notice a drop in FPS; this is not due to the AMD AMA Video SDK but the disk speeds. We recommend reading/writing from /dev/shm which is a RAM disk.

+

Most of the scripts allow to use the fakesink plug-in which only displays performance numbers and will not write outputs to disk. This is done by setting the “fakesink” argument to 1.

+

Each script contains error checks before passing arguments to GStreamer pipeline command to help users avoid giving incorrect arguments.

+

Most of the example scripts included in this directory take H.264 input streams. To use H.265 input streams, update the scripts to use the h265parse GStreamer plug-in instead of h264parse.

+

For brevity purposes, explanations of the GStreamer element properties are not repeated after they have been explained once. The detailed explanation of the each GStreamer pipeline element property can be obtained by using gst-inspect-1.0 <element name> (e.g. gst-inspect-1.0 ama_av1enc).

+
+

Decode only

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! parsebin ! h264parse ! ama_h264dec ! capsfilter 'caps=video/x-raw(memory:AMAMemory),format=NV12,width=<WIDTH>,height=<HEIGHT>' !  ama_download ! filesink location=<OUTPUT>
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • gst-launch-1.0

    +
      +
    • The GStreamer application, which is provided by AMD, and moved to the top of the PATH when you sourced the setup.sh script

    • +
    +
  • +
  • filesrc location

    +
      +
    • Location of the file h.264 to read

    • +
    +
  • +
  • parsebin

    +
      +
    • Unpacks the container to elementary stream

    • +
    +
  • +
  • h264parse

    +
      +
    • Parses H.264 streams

    • +
    +
  • +
  • ama_h264dec

    +
      +
    • GStreamer plug-in that provides functionality to decode H.264 encoded streams. This plug-in accepts input encoded stream in byte-stream/NALU format only and produces NV12 frames.

    • +
    +
  • +
  • capsfilter

    +
      +
    • Specifies the capabilities of the streams. Note that keyword capsfilter is optional.

    • +
    +
  • +
+

In the above cli, <WIDTH> and <HEIGHT> are optional parameters that describe the desired resolution of the decoded stream. It should be noted that resizing is done on the decoder and as such does not impose any cost on the host CPU or the accelerated scaler Scaler Plugin.

+
+
+

Downscaling in decoder

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! parsebin ! h264parse ! ama_h264dec allow-downscaling=true ! capsfilter 'caps=video/x-raw(memory:AMAMemory),format=NV12,width=<WIDTH>,height=<HEIGHT>' !  ama_download ! filesink location=<OUTPUT>
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • allow-downscaling

    +
      +
    • Option to inform the downstream capfilter that downscaling will be performed though decoder.

    • +
    +
  • +
+
+
+

Encode only

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! rawvideoparse width=1920 height=1080 format=i420 framerate=60/1 ! ama_upload ! ama_h264enc ! h264parse ! filesink location=/tmp/out.h264
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • ama_h264enc

    +
      +
    • GStreamer plug-in that provides functionality to encode raw bit streams into AVC byte-stream.

    • +
    +
  • +
  • rawvideoparse

    +
      +
    • This element converts unformatted data streams into timestamped raw video frames, with specified resolution, frame rate and pixel format.

    • +
    +
  • +
  • ama_upload

    +
      +
    • This plugin transfer raw video file content from host to the device

    • +
    +
  • +
+
+
+

Transcode with Multiple-Resolution outputs

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! parsebin ! \
+h264parse ! ama_h264dec ! identity eos-after=1200 ! ama_scaler name=s \
+s.src_0 ! 'video/x-raw(memory:AMAMemory),width=1920,height=1080' ! ama_h265enc bitrate=6000000 ! queue ! filesink location=/tmp/hevc_1080p.hevc \
+s.src_1 ! 'video/x-raw(memory:AMAMemory),width=1280,height=720' ! ama_av1enc bitrate=2000000 ! queue ! filesink location=/tmp/av1_720p.av1 \
+s.src_2 ! 'video/x-raw(memory:AMAMemory),width=720,height=480' ! ama_h264enc bitrate=1000000 ! queue ! filesink location=/tmp/h264_480p.h264 \
+s.src_3 ! 'video/x-raw(memory:AMAMemory),width=360,height=240' ! ama_av1enc bitrate=1000000 ! queue ! filesink location=/tmp/av1_240p.av1
+
+
+

Explanation of the pipeline elements and their properties:

+
    +
  • queue

    +
    +
      +
    • The queue will create a new thread on the source pad to decouple the processing on sink and source pad.

    • +
    +
    +
  • +
  • identity

    +
    +
      +
    • In this usage, forces the insertion of EOS after 1200 buffers.

    • +
    +
    +
  • +
+

For more comprehensive sets of examples refer to /opt/amd/ama/ma35/examples/gstreamer/ama_pipeline_scripts/tutorials folder.

+
+
+

Multidevice Transcode

+

This example demonstrates AMA SDK's DMA plugins capabilities to execute any of transcode operations, on a given device.

+

Command Line:

+
gst-launch-1.0 filesrc location=<INPUT> ! qtdemux ! h264parse ! ama_h264dec device=X ! "video/x-raw(memory:AMAMemory),format=I420" ! ama_download ! ama_upload device=Y ! ama_h264enc  ! h264parse ! mp4mux ! filesink location=<OUTPUT>
+
+
+

, where X and Y are device indices for decode and encode operations, respectively.

+
+
+

2D Filters

+

This following examples demonstrate AMA SDK's 2D plugins capabilities.

+

Subsampling:

+
gst-launch-1.0 -v \
+  filesrc location=<4:2:2 YUV> ! rawvideoparse format=uyvy width=1920 height=1080 framerate=30/1 \
+    ! ama_upload ! ama_videoconvert ! ama_download ! video/x-raw,format=I420 ! filesink location=<4:2:0 YUV>
+
+
+

Color space conversion:

+
gst-launch-1.0 -v \
+ filesrc location=<4:2:0 YUV> ! rawvideoparse format=i420 width=1920 height=1080 framerate=24/1 \
+ ! ama_upload ! ama_videoconvert ! ama_download ! video/x-raw,format=BGRA ! filesink location=<RGB>
+
+
+

Rotate:

+
gst-launch-1.0 -v videotestsrc num-buffers=300 ! video/x-raw,format=I420 ! ama_upload ! ama_rotate angle=rotate-90 !  ama_h264enc bitrate=1000000 ! filesink location=rotate.h264
+
+
+

Padding:

+
gst-launch-1.0 -v filesrc location=<4:2:0 YUV> ! rawvideoparse format=i420 width=1920 height=1080 framerate=24/1 ! \
+ ama_upload ! ama_videopad top=150 right=30 left=30 bottom=10 color=0x00FFAA00 ! ama_h264enc bitrate=1000000 ! filesink location=pad.h264
+
+
+

Crop:

+
gst-launch-1.0 -v filesrc location=<4:2:0 YUV> ! rawvideoparse format=i420 width=1920 height=1080 framerate=24/1 ! \
+ ama_upload ! ama_videocrop top=150 right=30 left=30 bottom=10 ! ama_h264enc bitrate=1000000 ! filesink location=pad.h264
+
+
+

Tile:

+
gst-launch-1.0 -v \
+ ama_tile name=tile grid_x=2 grid_y=2 \
+ ! 'video/x-raw(memory:AMAMemory)' ! ama_h264enc bitrate=1000000 ! filesink location=tile.h264 \
+ filesrc location=<INPUT 1> ! qtdemux ! h264parse ! ama_h264dec ! tile.sink_0 \
+ filesrc location=<INPUT 2> ! qtdemux ! h264parse ! ama_h264dec ! tile.sink_1 \
+ filesrc location=<INPUT 3> ! qtdemux ! h264parse ! ama_h264dec ! tile.sink_2 \
+ filesrc location=<INPUT 4> ! qtdemux ! h264parse ! ama_h264dec ! tile.sink_3
+
+
+

Overlay:

+
gst-launch-1.0 -v  ama_overlay name=overlay offset-x=50 offset-y=100 !  'video/x-raw(memory:AMAMemory)' ! ama_h264enc bitrate=1000000 ! filesink location=overlay.h264  \
+ filesrc location=<Background Video> ! qtdemux ! h264parse ! ama_h264dec ! 'video/x-raw(memory:AMAMemory),format=I420' ! overlay.video \
+ videotestsrc pattern=checkers-8 num-buffers=300 ! video/x-raw,format=I420,framerate=60/1 ! ama_upload ! overlay.overlay
+
+
+

Drawbox:

+
gst-launch-1.0 -v \
+ filesrc location=<INPUT> ! qtdemux ! h264parse ! ama_h264dec \
+ ! ama_drawbox top=10 left=20 width=200 height=400 thickness=10 color=0x00FFFF00 \
+ ! ama_h264enc bitrate=1000000 ! filesink location=drawbox.h264
+
+
+

Composition:

+
gst-launch-1.0  -v ama_compositor name=comp params-file=./dynamic_params.txt \
+ sink_0::width=200 sink_0::height=100 sink_0::xpos=0 sink_0::ypos=0 sink_0::border-inner-width=2 sink_0::border-color=0x00FF0000 \
+ sink_1::width=200 sink_1::height=100 sink_1::xpos=0 sink_1::ypos=108 sink_1::border-inner-width=2 sink_1::border-color=0x00FF0000 \
+ ! 'video/x-raw(memory:AMAMemory),format=I420' ! ama_h264enc bitrate=5000000 ! h264parse ! mp4mux ! filesink location=comp.mp4 \
+ filesrc location=<INPUT 1> ! qtdemux ! h264parse ! ama_h264dec ! comp.sink_0 \
+ filesrc location=<INPUT 2> ! qtdemux ! h264parse ! ama_h264dec ! comp.sink_1
+
+
+

, where parameter file contains:

+
00:00:01.000 compositor_ama 'background=pink';
+00:00:03.000 compositor_ama 'background=green:input=1:border_inner_size=4:border_outer_size=2:border_color=blue';
+00:00:06.000 compositor_ama 'input=1:border_inner_size=4:border_outer_size=2:border_color=brown:input=0:border_inner_size=10:border_outer_size=10';
+00:00:08.000 compositor_ama 'background=0x0000FF00';
+00:00:10.000 compositor_ama 'input=1:flip=hv';
+
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/examples/gstreamer/xabrladder.html b/v1.2/examples/gstreamer/xabrladder.html new file mode 100644 index 00000000..b3579cc5 --- /dev/null +++ b/v1.2/examples/gstreamer/xabrladder.html @@ -0,0 +1,391 @@ + + + + + + + + + + + + + + + GStreamer ABR Ladder Application — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer ABR Ladder Application

+ +
+

Introduction

+

The sample multi-scale program located at /opt/amd/ama/ma35/bin/gstreamer/ is a command line utility which implements the GStreamer video transcoding pipeline described in the diagram below. This application expects an input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams. The resolution of each output stream is configured using a JSON file (by default: /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder/abrladder.json). The output streams produced by this application are saved in the /tmp/ladder_outputs/ folder.

+

This application is installed through the amd-ama-gstreamer package. If this package is not present on your system, install it by following the steps described in the package feed page. The source code for this application is also available under, /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder.

+GStreamer pipeline of the ama_xabrladder application +
+

Note

+

This example supports input files of elementary stream NAL type or mp4 containers, with H.264/H.265 elementary stream in it. No other formats are supported

+
+
+
+

Host System Requirement

+
    +
  • AMD AMA Video SDK

  • +
  • amd-ama-gstreamer package

  • +
+
+
+

Usage

+

Below are the input parameters required to run the application.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Parameter

Short Form

Description

+
+--devidx
+
+ +
+
+-i
+
+ +
+
device index
+
Type: int
+
Range: 0 to 31
+
Default: NA
+
Option: Mandatory
+
+
+
+--json
+
+ +
+
+-j
+
+ +
+
JSON file used to describe the configuration of the ABR ladder
+
Type: string
+
Range: NA
+
Default: /opt/amd/ama/ma35/examples/gstreamer/ama_xabrladder
+
Option: Optional
+
+
+
+--codectype
+
+ +
+
+-c
+
+ +
+
Output codec type
+
Type: int
+
Range: 0 (H264), 1 (H265)
+
Default: NA
+
Option: Mandatory
+
+
+
+--file
+
+ +
+
+-f
+
+ +
+
Input file path name (mp4/elementary-stream)
+
Type: string
+
Range: NA
+
Default: NA
+
Option: Mandatory
+
+
+
+--forcekeyframe
+
+ +
+
+-k
+
+ +
+
Keyframe (IDR frame) insertion frequency in number of frames
+
Type: int
+
Range: NA
+
Default: 0
+
Option: Optional
+
+
+
+
+

Examples

+

Below are example commands for the ABR ladder use case. The output files are stored in /tmp/ladder_outputs/ folder. Ensure that enough space is available in this folder.

+
    +
  1. Running one ABR ladder on one device:

    +
    ama_xabrladder  --devidx 0 --codectype 0 --file <path to file>
    +
    +
    +
  2. +
+

The above command takes the input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams based on the codec type provided (0 for H.264 and 1 for H.265) with the following resolutions: 720p60, 720p30, 480p30, 360p30 and 160p30.

+
    +
  1. Running one ABR ladder on one device without lookahead:

    +
    ama_xabrladder  --devidx 0 --lookahead_enable 0 --codectype 0 --file <path to file>
    +
    +
    +
  2. +
+

The above command takes the input video file (mp4 with H.264/H.265 or H.264/H.265 elementary stream) and produces 5 different H.264/H.265 elementary streams based on the codec type provided (0 for H.264 and 1 for H.265) with the following resolutions: 720p60, 720p30, 480p30, 360p30 and 160p30.

+
    +
  1. Running one ABR ladder on one device with lookahead enabled, and using the short-form options:

    +
    ama_xabrladder -i 0  -c 0 -f <path to file>
    +
    +
    +
  2. +
  3. Running two ABR ladders, mapping each ladder to a specific device using the devidx option:

    +
    ama_xabrladder --devidx 0  --codectype 1 --file <path to file>
    +ama_xabrladder --devidx 1  --codectype 1 --file <path to file>
    +
    +
    +
  4. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/examples/gstreamer/xcompositor.html b/v1.2/examples/gstreamer/xcompositor.html new file mode 100644 index 00000000..ddd3fd38 --- /dev/null +++ b/v1.2/examples/gstreamer/xcompositor.html @@ -0,0 +1,365 @@ + + + + + + + + + + + + + + + GStreamer Compositor Application — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

GStreamer Compositor Application

+ +
+

Introduction

+

The sample compositor program located at /opt/amd/ama/ma35/bin/gstreamer/ is a command line utility which implements the GStreamer video transcoding pipeline described in the diagram below. This application expects four input video files 60(mp4 with H.264/H.265 or H.264/H.265 elementary stream). The resolution of each input cannot exceed 1080p. The application creates an output stream by first composing the four inputs in a 2x2 grid, then by adding an optional logo and lastly by inserting a time stamp.

+

This application is installed through the amd-ama-gstreamer package. If this package is not present on your system, install it by following the steps described in the package feed page. The source code for this application is also available under, /opt/amd/ama/ma35/examples/gstreamer/ama_xcompositor.

+GStreamer pipeline of the ama_xcompositor application +
+

+
+
+
+

Host System Requirement

+
    +
  • AMD AMA Video SDK

  • +
  • amd-ama-gstreamer package

  • +
+
+
+

Usage

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Parameter

Description

-f

+
mp4/elementary-stream file path. Resolutions up to 1080p are supported.
+
Type: string
+
Range: NA
+
Default: NA
+
Option: Mandatory
+
+

-l

+
png/jpg logo file path. No logo will be overlayed if this option is not specified.
+
Type: string
+
Range: NA
+
Default: Null
+
Option: Optional
+
+

-b

+
Max bitrate for encoder in Kbps
+
Type: int
+
Range: 0 to 4294967295
+
Default: 5000
+
Option: Optional
+
+

-i

+
device index
+
Type: int
+
Range: 0 to 31
+
Default: 0
+
Option: Optional
+
+

-h

+
Horizontal offset of overlay logo in fractions of video image width, from top-left corner of video image (in relative positioning)
+
Type: double
+
Range: 0 to 1
+
Default: 0.9
+
Option: Optional
+
+

-v

+
Vertical offset of overlay logo in fractions of video image height, from top-left corner of video image (in relative positioning)
+
Type: double
+
Range: 0 to 1
+
Default: 0
+
Option: Optional
+
+

-n

+
Number of input buffers
+
Type: integer
+
Range: 20 to 2147483647
+
Default: 2000
+
Option: Optional
+
+

-o

+
Output file name and path
+
Type: String
+
Range: NA
+
Default: ./result.mp4
+
Option: Optional
+
+
+
+
+

Examples

+
    +
  1. Composition along with logo on top right of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png
    +
    +
    +
  2. +
  3. Composition with logo on top left of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png -h 0 -v 0
    +
    +
    +
  4. +
  5. Composition with logo on center of video:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -l ./logo.png -h 0.5 -v 0.5
    +
    +
    +
  6. +
  7. Composition without logo layer:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265
    +
    +
    +
  8. +
  9. Composition on device with index 2:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265 -i 2
    +
    +
    +
  10. +
  11. Composition on decoder soft kernel start index at 8:

    +
    ama_xcompositor -f ./video1.mp4 -f ./video2.mp4 -f ./video3.h264 -f ./video4.h265
    +
    +
    +
  12. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/examples/xma/xma_apps.html b/v1.2/examples/xma/xma_apps.html new file mode 100644 index 00000000..7e1ace6b --- /dev/null +++ b/v1.2/examples/xma/xma_apps.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + + + XMA Examples for the AMD AMA Video SDK — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

XMA Examples for the AMD AMA Video SDK

+ +

The examples in the /opt/amd/ama/ma35/bin folder illustrate how C-based applications can natively interact with AMD AMA Video SDK devices using the XMA (Xilinx Media Accelerator) APIs. Source codes for decoder, encoder, scaler and transcoder can be found under /opt/amd/ama/ma35/examples/xma directory.

+

Detailed documentation on the AMD AMA Video SDK plugin interface and the XMA APIs can be found in the C API Programming Guide section of the documentation.

+

Requirements

+
    +
  • The XMA applications has been built for and verified on a supported OS.

  • +
  • The XMA applications only work with elementary streams. Container formats such as mp4 are not supported.

  • +
+
+

Environment Setup

+
    +
  1. The AMD AMA Video SDK version of FFmpeg, Gstreamer and XMA applications can be found in the /opt/amd/ama/ma35/bin folder of your system. If this folder is not present, install the required packages:

    +

    See On Premises

    +
  2. +
  3. Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  4. +
+

The setup script exports important environment variables and ensures proper execution environment for AMD AMA Video SDK.

+

Sourcing the setup script should be performed each time you open a new terminal on your system. This is required for the environment to be correctly configured.

+
+
+

XMA Decoder App

+
+

Decoder Test Instructions

+

The XMA decoder application supports most of the decode options supported by FFmpeg. The XMA decoder application supports only elementary H.264, HEVC and AV1 encoded bitstreams.

+
+

Decoder Usage

+

Running the decoder app with the --help option will print the complete list of options:

+
ma35_decoder_app --help
+encoded file and utilizes hardware acceleration to get the decoded
+output.
+
+Usage:
+        ma35_decoder_app [options] -i <input-file> -c:v <codec-type>
+        [codec_options] -o <output-file>
+
+Arguments:
+        --help                     Print this message and exit
+        -log_level <value>         Specify the log level
+        -log_location <value>      Log location. 0 for none,
+                                   1 console (default), 2 syslog, 3 file
+        -log_file <file>           Name and path of the log file. Default
+                                   ma35_decoder_app.log
+        -d <device_id>             Specify a device on which to run.
+                                   Default: 0
+
+Input Arguments:
+
+        -stream_loop <loop-count>  Number of times to loop the input
+                                   file
+        -i <input-file>            Input file to be used
+
+Codec Arguments:
+
+        -c:v <codec>               Specify H264 or H265 decoding.
+                                   (h264_ama, hevc_ama)
+        -latency_logging           Enable latency logging
+        -frames <frame-count>      Number of frames to be processed.
+        -pix_fmt fmt               The output format (nv12, yuv420p,
+                                   yuv420p10le, xv15) Default: nv12 8 bit,
+                                   yuv420p10le 10 bit
+        -o <file>                  File to which output is written.
+
+
+
+
+

Sample Decoder Command

+

Decode an hevc encoded file into raw N12 format:

+
ma35_decoder_app -c:v hevc_ama -i <INPUT> -frames 100 -pix_fmt nv12 -o out1.nv12
+
+
+
+

+
+
+
+
+
+

XMA Encoder App

+
+

Encoder Test Instructions

+

The encoder XMA application supports most of the encoder options supported by FFmpeg. The XMA application supports variety of input pixel formats, see -out_fmt, and can output H.264/HEVC/AV1 encoded elementary stream formats.

+
+

Encoder Usage

+

Running the encoder app with the --help option will print the complete list of options:

+
ma35_encoder_app --help
+XMA Encoder App Usage:
+     ./ma35_encoder_app [input options] -i input-file -c:v <codec-option>  [encoder options] -o <output-file>
+
+Arguments:
+
+     --help                     Print this message and exit.
+     -log_level <value>         Log level settings, supported are 0 or
+                                emergency, 1 or alert, 2 or critical, 3
+                                or error, 4 or warning, 5 or notice, 6
+                                or info, 7 or debug.
+                                Default is 3/error
+     -log_location <value>      Log location settings, supported are 0 or
+                                none, 1 or console, 2 or syslog, 3
+                                or file.
+                                Default is 1/console
+     -log_file <log-file>       Name and path of log file
+                                Default is ma35_encoder_app.log
+     -d <device-id>             Specify a device on which the
+                                encoder to run.
+                                Default is /dev/ama_transcoder0
+     -frames <frame-count>      Number of frames to be processed.
+
+Input options:
+
+     -stream_loop <loop-count>  Number of times to loop the input
+                                YUV file.
+     -w <width>                 Width of YUV input.
+     -h <height>                Height of YUV input.
+     -pix_fmt <pixel-format>    Pixel format of the input file. It must be yuv420p,
+
+     -i <input-file>            Name and path of input YUV file
+
+Codec option:
+
+     -c:v <codec>               Encoder codec to be used. Supported
+                                are h264_ama, hevc_ama, av1_ama
+     -device_type               When encoding to AV1, this sets which
+                                AV1 encoder will be used. Supported
+                                values are 1(Xilinx), 2(Vendor
+                                supplied), or any
+
+Encoder params:
+
+     -b:v <bitrate>             Bitrate can be given in Kbps or Mbps
+                                or bits i.e., 5000000, 5000K, 5M.
+                                Default is 5Mbps
+     -fps <fps>                 Input frame rate. Default is 30.
+     -g <intraperiod>           Intra period. Default is 15.
+     -qp <qp>                   QP. Supported are -1 to 51,
+                                default is -1
+     -min_qp <qp>               Minimum QP. Supported are 0 to 51,
+                                default is 0.
+     -max_qp <qp>               Maximum QP. Supported values are 0
+                                to 51, default is 51.
+     -spat_aq_gain <gain>       Spatial AQ gain. Supported values are
+                                0 to 100 or 255, default is 255.
+     -temp_aq_gain <gain>       Temporal AQ gain. Supported values are
+                                0 to 100 or 255, default is 255.
+     -temporal_aq <0/1>         Temporal AQ. Enable/Disable,
+                                default is -1.
+     -spatial_aq <0/1>          Spatial AQ. Enable/Disable,
+                                default is -1.
+     -qp_mode <qp>              QP Mode. Supported values 0, 1 and 2
+                                default is 0.
+     -control_rate <rc_mode>    Rate Control. Supported values -1, 0, 1, 2 and 3
+                                default is -1.
+     -bf <frames>               Number of B frames. Supported are -1
+                                to 3, default is -1.
+     -force_idr <0/1            Supported values are 0 and 1
+     -preset <value>            Encoder preset. Supported: slow, medium and fast
+                                are supported. Default: medium
+     -profile <value>           Encoder profile.
+                For AV1, supported -1 (auto) and 200 (main). Default: -1 (auto)
+                For HEVC, supported -1 (auto), 100 (main), 101 (main10_intra), 102
+                                (main10), 103 (main10_intra). Default: -1 (auto)
+                For H264, supported -1 (auto), 0 (baseline), 1 (main), 2 (high),
+                                3 (high10) 4 (high10_intra). Default: -1 (auto)
+     -level <value>             Encoder level.
+                For H264, supported are 0 (auto), 10, 11, 12, 13, 20, 21, 22, 30,
+                                31, 32, 40, 41, 42, 50, 51, 52, 60, 61, 62. Default:
+                                0 (auto)
+                For HEVC, supported are 0 (auto), 10, 20, 21, 30, 31, 40, 41, 50,
+                                51, 52, 60, 61, 62. Default: 0 (auto)
+                For AV1, supported are 0 (auto), 20, 21, 30, 31, 40, 41, 50, 51,
+                                52, 53, 60, 61, 62, 63. Default: 0 (auto)
+     -tier <value>              HEVC tier, supported are -1 (auto), 0 (main), 1 (high).
+                                Default: -1 (auto)
+                                Default is -1/auto
+     -crf <value>               Enable / disable CRF mode. Default: 0
+     -bufsize <value>           Size of VBV buffer (in bits). Default is -1. Strict
+                                ULL = 0, Relaxed ULL > 0
+     -dynamic_gop <value>       Dynamic GOP supported values are -1 (auto), 0 (disable)
+                                and 1 (enable). Default: -1
+     -tune_metrics <value>      Tunes encoder's video quality for objective metrics.
+                                Supported values are vq or 1, psnr or 2, ssim or
+                                3, vmaf or 4. Default: 1
+     -lookahead_depth <value>   Lookahead depth. Supported [-1, 53]. Default: -1
+     -latency_ms <value>        Lookahead depth specified in milliseconds. Supported
+                                [-1, 60000]. Default: -1
+     -no_bll <value>            No low latency b-frames. Supported [-1, 1]. Default:
+                                -1
+     -latency_logging <0/1>     Enable latency logging
+     -expert_options <string>   Expert options
+     -o <file>                  File to which output is written.
+     -stats <file>              File to which csv statistics output is written.
+
+
+
+
+

Sample Encoder Commands

+

H.265 encoding, ultra low latency (Consult the Tuning Latency of Transcode Pipeline section for more details):

+
ma35_encoder_app -w 1920 -h 1080 -pix_fmt yuv420p -i <INPUT> -c:v hevc_ama -b:v 5M -lookahead_depth 0 -g 30 -o out0.265
+
+
+
+

+
+
+
+
+
+

XMA Scaler App

+
+

Scaler Test Instructions

+

The scaler XMA application supports most of the scaler options supported by FFmpeg. The XMA application supports -out_fmt pixel formats.

+
+

Scaler Usage

+

Running the scaler app with the --help option will print the complete list of options:

+
ma35_scaler_app --help
+This program ingests an nv12, yuv420p, yuv420p10le, or xv15 input
+file and utilizes hardware acceleration to scale to various resolutions.
+
+Usage:
+        ma35_scaler_app [options] -w <input-width> -h <input-height> -i
+        <input-file> [scaler_options] -w <output-1-width> -h
+        <output-1-height> -o <output-1-file> -w ...
+
+Arguments:
+        --help                     Print this message and exit
+        -log <level>               Specify the log level
+        -log_location <value>      Log location. 0 for none,
+                                   1 console (default), 2 syslog, 3 file
+        -log_file <file>           Name and path of the log file. Default
+                                    ma35_scaler_app.log
+        -d <device-id>             Specify a device on which to run.
+                                   Default: 0
+
+Input Arguments:
+
+        -stream_loop <loop-count>  Number of times to loop the input
+                                   file
+        -w <width>                 Specify the input's width
+        -h <height>                Specify the input's height
+        -pix_fmt <pixel-format>    Pixel format of the input file (nv12,
+                                   xv15, yuv420p10le). Default : nv12.
+        -fps <frame-rate>          Frame rate. Used for scaler load
+                                   calculation.
+        -i <input-file>            Input file to be used
+
+Output Arguments:
+        -rate <half/full>          Set the rate to half. Half rate drops
+                                   frames to reduce resource usage.
+                                   Default: full.
+        -latency_logging           Enable latency logging
+        -w <width>                 Specify the output's width
+        -h <height>                Specify the output's height
+        -pix_fmt <pixel-format>    Pixel format of the output file (nv12,
+                                   xv15, yuv420p10le). Default: input fmt
+        -frames <frame-count>      Number of frames to be processed.
+        -o <file>                  File to which output is written.
+
+
+
+
+

Sample Scaler Command

+

Scale 1080p nv12 to 720p, 480p, 360p, and 240p nv12:

+
ma35_scaler_app -pix_fmt nv12 -w 1920 -h 1080 -i <INPUT> \
+-w 1280 -h 720  -pix_fmt nv12 -o out1.nv12 \
+-w 848  -h 480  -pix_fmt nv12 -o out2.nv12 \
+-w 640  -h 360  -pix_fmt nv12 -o out3.nv12 \
+-w 288  -h 160  -pix_fmt nv12 -o out4.nv12
+
+
+
+

+
+
+
+
+
+

XMA Transcoder App

+
+

Transcoder Test Instructions

+

The transcoder XMA application supports most of the options supported by ffmpeg. The XMA application supports only elementary H.264, HEVC and AV1 encoded stream input and outputs H.264/HEVC/AV1 encoded elementary stream.

+
+

Transcoder Usage

+

Running the transcoder app with the --help option will print the complete list of options:

+
 ma35_transcoder_app --help
+ XMA Transcoder App Usage:
+        ./program [generic options] -c:v <decoder codec> [decoder options]  -i input-file -scaler_ma -outputs [num] [Scaler options]  -c:v <encoder codec> [encoder options] -o <output-file>  -c:v <encoder codec> [encoder options] -o <output-file>  -c:v <encoder codec> [encoder options] -o <output-file>.....
+
+Arguments:
+
+        --help                     Print this message and exit.
+        -d <device-id>             Specify a device on which the
+                                   transcoder to run. Default: 0
+        -stream_loop <loop-count>  Number of times to loop the input file
+        -frames <frame-count>      Number of input frames to be processed
+
+Decoder options:
+
+        -c:v <codec>               Decoder codec to be used. Supported
+                                   are hevc_ama, h264_ama
+        -latency_logging <0/1>     Latency logging for decoder. Default
+                                   disabled
+        -push-model <0/1>          Decoder streaming model (pull or push). Default
+                                   is pull (can be faster than real-time)
+        -i <input-file>            Name and path of input H.264/HEVC file
+
+Scaler options:
+
+        -scaler_ma                 Name of the ABR scaler filter
+        -num-output <value>        Number of output files from scaler
+        -out_1_width <width>       Width of the scaler output channel 1
+        -out_1_height <height>     Height of the scaler output channel 1
+        -out_1_rate <full/half>    Full of Half rate for output channel 1
+        -out_2_width <width>       Width of the scaler output channel 2
+        -out_2_height <height>     Height of the scaler output channel 2
+        -out_2_rate <full/half>    Full of Half rate for output channel 2
+        -out_3_width <width>       Width of the scaler output channel 3
+        -out_3_height <height>     Height of the scaler output channel 3
+        -out_3_rate <full/half>    Full of Half rate for output channel 3
+        -out_4_width <width>       Width of the scaler output channel 4
+        -out_4_height <height>     Height of the scaler output channel 4
+        -out_4_rate <full/half>    Full of Half rate for output channel 4
+        -out_5_width <width>       Width of the scaler output channel 5
+        -out_5_height <height>     Height of the scaler output channel 5
+        -out_5_rate <full/half>    Full of Half rate for output channel 5
+        -out_6_width <width>       Width of the scaler output channel 6
+        -out_6_height <height>     Height of the scaler output channel 6
+        -out_6_rate <full/half>    Full of Half rate for output channel 6
+        -out_7_width <width>       Width of the scaler output channel 7
+        -out_7_height <height>     Height of the scaler output channel 7
+        -out_7_rate <full/half>    Full of Half rate for output channel 7
+        -out_8_width <width>       Width of the scaler output channel 8
+        -out_8_height <height>     Height of the scaler output channel 8
+        -out_8_rate <full/half>    Full of Half rate for output channel 8
+        -latency_logging <0/1>     Latency logging for scaler. Default
+                                   disabled
+Encoder options:
+
+        -c:v <codec>               Encoder codec to be used. Supported
+                                   are hevc_ama, h264_ama, and av1_ama
+        -device_type               When encoding to AV1, this sets which
+                                   AV1 encoder will be used. Supported
+                                   values are 1(Xilinx), 2(Vendor
+                                   supplied), or any
+        -b:v <bitrate>             Bitrate can be given in Kbps or Mbps
+                                   or bits i.e., 5000000, 5000K, 5M.
+                                   Default is 200kbps
+        -fps <fps>                 Input frame rate. Default is 30.
+        -g <intraperiod>           Intra period. Default is 12.
+        -max-bitrate <bitrate>     Maximum bit rate. Supported are -1 to
+                                   350000000, default is -1
+        -min_qp <qp>               Minimum QP. Supported are 0 to 51,
+                                   default is 0.
+        -max_qp <qp>               Maximum QP. Supported values are 0
+                                   to 51, default is 51.
+        -spatial_aq_gain <gain>    Spatial AQ gain. Supported values are
+                                   0 to 100 or 255, default is 255.
+        -temporal_aq_gain <gain>   Temporal AQ gain. Supported values are
+                                   0 to 100 or 255, default is 255.
+        -bf <frames>               Number of B frames. Supported are 0
+                                   to 7, default is 2.
+        -force_idr <0/1            Supported values are 0 and 1
+        -profile <value>           Encoder profile.
+                   For HEVC, supported are 100 or main, 101 or main10_intra,
+                                   102 or main10 , 103 or main10_intra
+                                   or still.
+                                   Default is 0/automatic
+                                   ENC_HEVC_MAIN - 100 or main
+                                   ENC_HEVC_MAIN_INTRA - 101 or main_intr
+                                   ENC_HEVC_MAIN_10 - 102 or main10
+                                   ENC_HEVC_MAIN10_INTRA - 103 or main10_intra             For H264, supported are auto or -1, 0 or baseline,
+                                   1 or main, 2 or high, 3 or high10
+                                   4 or high10_intra, Default is auto or -1
+                                   ENC_H264_BASELINE - 0 or baseline.
+                                   ENC_H264_MAIN - 1 or main.
+                                   ENC_H264_HIGH - 2 or high.
+                                   ENC_H264_HIGH_10 - 3 or high10.
+                                   ENC_H264_HIGH_10_INTRA - 4 or high10_intra   -level <value>             Encoder level.
+                                   For HEVC, supported are 10 to 52,
+                                   default is 50.
+                                   For H264, supported are 10 to 52,
+                                   default is 50.
+        -slices <value>            Number of slices per frame. Supported
+                                   are 1 to 68, default is 1.
+        -qp_mode <qp>              QP Mode. Supported values 0, 1 and 2
+                                   default is 0.
+        -control_rate <rc_mode>    Rate Control. Supported values -1 to 3
+                                   default is -1.
+        -aspect_ratio <value>      Aspect ratio. Supported values are 0
+                                   to 3, default is 0.
+        -lookahead_depth <value>   Lookahead depth. Supported are 0 to
+                                   20, default is 0.
+        -temporal_aq <0/1>         Temporal AQ. Enable/Disable,
+                                   default is -1.
+        -spatial_aq <0/1>          Spatial AQ. Enable/Disable,
+                                   default is -1.
+        -tune_metrics <value>      Tunes MPSoC H.264/HEVC encoder's video
+                                   quality for objective metrics, default 1.
+                                   Supported value from 1 to 4
+        -tier <value>              HEVC tier, supported are -1 or auto, 0 or main,
+                                   1 or high.
+                                   Default is -1/auto
+        -crf <value>               CRF supported values are 0 and 1 i.e. enable
+                                   and disable
+                                   Default is -1/auto
+        -latency_logging           Enable latency logging
+        -latency_mode <value>      0 normal latency (default), 1 low
+                                   latency, or 2 ultra low latency      -o <file>                  File to which output is written.
+
+
+
+
+

Sample Transcoder Commands

+

H.264 to AV1 Transcoder:

+
ma35_transcoder_app -streams 1 -frames 2000 -c:v h264_ama \
+-i <INPUT> \
+-c:v av1_ama -b:v 10M  -o h264_av1_transcode.av1
+
+
+

H.264 to H264 ABR Transcoder:

+
ma35_transcoder_app -streams 1 -c:v h264_ama \
+-i <INPUT> \
+-scaler_ma -num-output 4 \
+-out_1_width 1280 -out_1_height 720 -out_2_width 848 -out_2_height 480 \
+-out_3_width 640 -out_3_height 360 -out_4_width 288 -out_4_height 160 \
+-c:v h264_ama -b:v 4000K -o abr_ladder1.264 \
+-c:v h264_ama -b:v 3000K -o abr_ladder2.264 \
+-c:v h264_ama -b:v 2500K -o abr_ladder3.264 \
+-c:v h264_ama -b:v 1250K -o abr_ladder4.264
+
+
+

H.264 to AV1 ULL Transcode

+
ma35_transcoder_app -streams 1 -frames 2000 -c:v h264_ama \
+-i <INPUT>\
+-c:v av1_ama  -b:v 10M -lookahead_depth 0 -o h264_av1_transcode.av1
+
+
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/genindex.html b/v1.2/genindex.html new file mode 100644 index 00000000..70b721ce --- /dev/null +++ b/v1.2/genindex.html @@ -0,0 +1,1779 @@ + + + + + + + + + + + + + + Index — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Index
  • +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ Symbols + | A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | V + | W + | X + | Y + | Z + +
+

Symbols

+ + + +
+ +

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + +
+ +

G

+ + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + +
+ +

P

+ + + +
+ +

Q

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

V

+ + +
+ +

W

+ + +
+ +

X

+ + + +
+ +

Y

+ + +
+ +

Z

+ + +
+ + + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/v1.2/getting_started_on_prem.html b/v1.2/getting_started_on_prem.html new file mode 100644 index 00000000..a7f4a38d --- /dev/null +++ b/v1.2/getting_started_on_prem.html @@ -0,0 +1,410 @@ + + + + + + + + + + + + + + + Getting Started with AMD AMA Video SDK Cards — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Getting Started with AMD AMA Video SDK Cards
  • +
  • +
  • +
+
+
+
+
+ +
+

Getting Started with AMD AMA Video SDK Cards

+ +
+

Chassis Setup

+
    +
  1. BIOS setting:

    +
      +
    1. Ensure that chassis's BIOS is set to performance mode, e.g., sleep states, clock throttling, etc. are disabled.

    2. +
    3. 4x4 PCIe bifurcation must be enabled on each slot with a MA35 card.

    4. +
    5. Enable Single Root IO/Virtualization (SR-IOV).

    6. +
    7. Secure boot must be disabled.

    8. +
    9. Enable Above 4G Decoding.

    10. +
    11. Enable Access Control Services (ACS)

    12. +
    13. Enable virtualization.

    14. +
    +
  2. +
  3. Install a compatible kernel, e.g., see Linux VM Guest, Step 2, for details on how to install kernel 5.15 and other required packages. Note that if you are installing on kernel 6.5, gcc-12 is required.

  4. +
  5. Enable IOMMU by updating /etc/default/grub file to include

    +
      +
    • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on iommu=pt", for AMD based systems

    • +
    • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on iommu=pt", for Intel based chassis

    • +
    +
  6. +
  7. Update Grub

    +
    sudo update-grub
    +
    +
    +
  8. +
  9. Allocate at least 4GB of huge pages, per device, plus an extra 96 huge pages, e.g., a single card with 2 devices requires 2*2048+96=4192 huge pages

    +
    sudo sh -c "echo 'vm.nr_hugepages=4192' >> /etc/sysctl.conf"
    +
    +
    +

    Note that if a chassis is being configured to host VMs, then the total number of huge pages, on the host, needs to be the sum of allocated RAM of all VM instances plus 96. As an example, running 6 VMs, each with 12GB of RAM, requires 6*12GB/2MB+96=36960 huge pages. (See Virtualization for details.)

    +
  10. +
  11. Reboot

    +
    sudo reboot
    +
    +
    +
  12. +
  13. Verify settings

    +
    cat /proc/cmdline
    +BOOT_IMAGE=/vmlinuz-5.15.0-50-generic root=/dev/mapper/vg00-rootlv ro quiet splash amd_iommu=on iommu=pt
    +
    +
    +

    and

    +
    cat /proc/meminfo | grep -i huge
    +
    +
    +

    , should return:

    +
    HugePages_Total:    4192
    +HugePages_Free:     4192
    +HugePages_Rsvd:        0
    +Hugepagesize:       2048 kB
    +
    +
    +
  14. +
+
+
+

Check Cards

+

To establish whether deployed cards have proper firmware installed, proceed as follows:

+
    +
  1. List AMD AMA Video SDK PCIe devices

    +
    sudo lspci -vvvd 10ee:
    +
    +
    +

    If devices are not listed as Multimedia controller and/or Region 4 size is not 512MB, a flash update is required. Refer to Flash Firmware section, for instructions.

    +
  2. +
+
+
+

Install the AMD AMA Video SDK

+ +
    +
  • Ubuntu & Debian 12

    +
    +
      +
    1. Install packages

      +
      sudo apt -y install libhugetlbfs0 libboost-all-dev
      +sudo apt-mark unhold amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer amd-ama-ml
      +dpkg --get-selections 'amd-ama*' | awk '{system("sudo apt -y purge " $1)}'
      +sudo apt update
      +sudo apt install amd-ama-driver=1.2.0-* amd-ama-core=1.2.0-* amd-ama-xma=1.2.0-* amd-ama-ffmpeg=1.2.0-* amd-ama-gstreamer=1.2.0-* amd-ama-ml=1.2.0-*
      +sudo apt-mark hold amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer amd-ama-ml
      +
      +
      +
    2. +
    +
    +
  • +
+
    +
  • Fedora

    +
    +
      +
    1. On first install

      +
      sudo yum update
      +sudo yum install yum-plugin-versionlock
      +
      +
      +

      Lock your kernel, by inserting exclude=kernel* in the /etc/dnf/dnf.conf file.

      +
    2. +
    3. Install packages

      +
      sudo yum update
      +sudo yum versionlock delete amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer
      +sudo yum remove amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer
      +sudo yum install amd-ama-driver amd-ama-core amd-ama-xma amd-ama-ffmpeg amd-ama-gstreamer
      +
      +
      +
    4. +
    +
    +
  • +
  • Insert kernel module

    +
    +
    sudo modprobe ama_transcoder
    +
    +
    +
    +
  • +
+
+
+

Flash Firmware

+

Flashing is required for this release:

+
    +
  1. To flash all devices, in parallel, issue the following:

    +
    sudo /opt/amd/ama/ma35/bin/mamgmt flash program -d all -p <firmware bin>
    +
    +
    +

    , where firmware bin is /opt/amd/ama/ma35/firmware/ma35_firmware.bin.

    +

    Ignore warning messages that state:

    +
    ...
    +Warning: SC update is not supported from ASIC 1 (skipping)
    +...
    +
    +
    +
  2. +
  3. Cold reboot:

    +
    sudo systemctl poweroff
    +
    +
    +

    , and power up.

    +
  4. +
+

For more details on flashing, refer to Programing a Device.

+
+
+

Installation Verification

+

After each reboot or SDK update execute the following command:

+
    +
  1. Confirm driver's successful installation by:

    +
    cat /sys/class/misc/ama_transcoder0/version_information
    +
    +
    +

    It should return:

    +
  2. +
+
+
ZSP Version = 2.1.0
+SC Version = 9.8.5
+eSecure Version = 1.0.0
+PCIe FW Version = 2.1.0
+PCIe CTRL Patch Version = 1.0.3
+PCIe PHY Patch A Version = 1.0.0
+
+
+
+

If the observed version numbers are older than the above, flashing is required. Refer to Flash Firmware section, for instructions.

+
+
+

Set Up the Runtime Environment

+
    +
  1. Run the setup script:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +

    Note that this script requires Bash shell to run.

    +
  2. +
  3. Prior to running any video processing pipeline, run the following command:

    +
    +
    mautil validate -d all
    +
    +
    +
    +
  4. +
  5. Ensure that all tests have passed.

  6. +
+
+
+

Run Your First Examples

+

See the tutorials and examples page to learn how to run jobs on your system.

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/git_hub.html b/v1.2/git_hub.html new file mode 100644 index 00000000..f0f6756c --- /dev/null +++ b/v1.2/git_hub.html @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) Repository — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA) Repository
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA) Repository

+

AMD AMA Video SDK code repository contains source codes for various elements of the SDK along with sample codes, 3rd party integrations, convenience utilities and much more. It is located at ma35d sdk v1.2

+
+

Note

+

It is noted that sample codes, 3rd party integrations and convenience utilities are meant for demonstrative purposes and, as such, no guarantees are made regarding their usage in a production setting.

+
+ + ++++ + + + + + + + + + + + + + + + + +
Development & Helper Utilities

Name

Notes

+
+
Python script that generates human readable timing stats, for a given video pipeline
+
+
+
+
Python script that uses map-reduce to transcode a file in faster than real-time.
+
+
+
+
Collection of simple startup C codes, using XMA library, for decoding, encoding and multi-rung transcoding.
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/index.html b/v1.2/index.html new file mode 100644 index 00000000..b9c1d995 --- /dev/null +++ b/v1.2/index.html @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA)
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA)

+

The AMD AMA Video SDK is a complete software stack allowing users to seamlessly leverage the hardware accelerated features of AMD video codec units and enable high-density real-time transcoding for live streaming video service providers, OEMs, and Content Delivery Network (CDNs), on compatible cards. Included in the AMD AMA Video SDK is a pre-compiled version of FFmpeg which integrates video transcoding plug-ins for AMD devices, enabling simple hardware acceleration of video decoding, scaling and encoding. The AMD AMA Video SDK also provides a C-based application programming interface (API) which facilitates the integration of AMD video codec units transcoding capabilities in proprietary frameworks.

+

Cards compatible with AMA SDK offer low power usage, high visual quality at high density. Specifically, MA35D video transcoding card, which is made of 2 Video Processing Units (VPU), is capable of transcoding to and from HEVC, AVC and AV1 formats, at an aggregate rate of up to two 4Kp60, for AVC and HEVC formats, and four 4Kp60 for AV1 format, per VPU.

+ +
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/managing_compute_resources.html b/v1.2/managing_compute_resources.html new file mode 100644 index 00000000..963b4348 --- /dev/null +++ b/v1.2/managing_compute_resources.html @@ -0,0 +1,732 @@ + + + + + + + + + + + + + + + Managing Video Acceleration Compute Resources — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Managing Video Acceleration Compute Resources
  • +
  • +
  • +
+
+
+
+
+ +
+

Managing Video Acceleration Compute Resources

+ +
+

Introduction

+

The notion of compute units (CUs) and CU pool is central to resource management. A typical video transcode pipeline is made of multiple CUs such as decoder, scaler, lookahead, and encoder. These together form a CU pool. Based on the input resolution, framerate and type of transcode, the load of CUs within a CU pool varies. The number of required resources determines how many parallel jobs can run in real-time. CUs and CU pool are managed by the Xilinx® resource manager (XRM). XRM is a software layer responsible for managing the video hardware accelerators available in the host system. AMD AMA Video SDK compilable cards have a set processing capacity, e.g., an MA35 device is capable of an aggregate processing equivalent of 2 4kp60 H264/HEVC in parallel to 2 4kp60 AV1 streams. XRM allows for running and managing multiple heterogeneous job, in parallel, on all devices hosted in a chassis. It is noted that XRM strictly adheres to the total capacity of the hosted accelerators, i.e., it does not allow for over-subscription of resources.

+

The rest of this guide explains how to:

+
    +
  1. Assign jobs to specific devices using explicit device identifiers

  2. +
  3. Measure device load and determine where to run jobs using either manual or automated resource management techniques

  4. +
+
+
+

Assigning Jobs to Specific Devices

+

By default, a job is submitted to device 0 and slice handling/assignment by XRMD. When running multiple jobs in parallel, device 0 is bound to run out of resources rapidly and additional jobs will error out due to insufficient resources. By using explicit device identifiers, new jobs can be individually submitted to a specific device. This makes it easy and straightforward to leverage the entire video acceleration capacity of your system, based on the number of cards and devices.

+

The FFmpeg -hwaccel option can be used to specify the device on which a specific job should be run. This makes it possible to assign multiple jobs across all available devices in the host. +Determining on which device(s) to run a job can be done using either the manual or automated methods described in the following sections.

+
+

Examples using Explicit Device IDs

+

FFmpeg example of two different jobs run on two different devices

+

In this example, two different FFmpeg jobs are run in parallel. The -hwaccel option is used to submit each job to a different device:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0  -c:v h264_ama -i INPUT1.h264 -f mp4 -c:v hevc_ama -y /dev/null &
+ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder1  -c:v h264_ama -i INPUT2.h264 -f mp4 -c:v hevc_ama -y /dev/null &
+
+
+
+

+
+
+
+
+

Manual Resource Management

+

The card management tools included in the AMD AMA Video SDK provide ways to query the status and utilization of the video accelerator devices. Using these tools the user can determine which resources are available and thereby determine on which device to submit a job (using explicit device identifies, as explained in the previous section).

+

Given that each device has a set compute capacity, the user is responsible for only submitting jobs which will not exceed the capacity of the specified device. If a job is submitted on a device where there are not enough compute unit resources available to support the job, the job will error out with a message about resource allocation failure.

+

The XRM and card management tools provide methods to estimate CU requirements and check current device load.

+
+

Checking System Load

+

Configure the environment to use the AMD AMA Video SDK. This a mandatory step for all applications:

+
source /opt/amd/ama/ma35/scripts/setup.sh
+
+
+

Note that this command should be run only once per boot.

+

To check the current loading of all the devices in your system, use the following command:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

This will generate a report in JSON format containing the load information for all the compute unit (CU) resources. The report contains a section for each device in the system. The device sections contain sub-sections for each of the CUs (decoder, scaler, lookahead, encoder, am ML) in that device. For example, the load information for the encoder on device 0 may look as follows:

+
"device_0": {
+  ...
+  "cu_2": {
+       "cuId         ": "2",
+       "cuType       ": "IP Kernel",
+       "kernelName   ": "encoder",
+       "kernelAlias  ": "ENCODER_TYPE1_AMA",
+       "instanceName ": "encoder_1",
+       "cuName       ": "encoder:encoder_1",
+       "kernelPlugin ": "",
+       "maxCapacity  ": "497664000",
+       "numChanInuse ": "0",
+       "usedLoad     ": "0 of 1000000",
+       "reservedLoad ": "0 of 1000000",
+       "resrvUsedLoad": "0 of 1000000"
+   },
+
+
+

The usedLoad value indicates how much of that resource is currently being used and reserved. The value will range from 0 (nothing running) to 1000000 (fully loaded). The reservedLoad value indicates how much of that resource is being reserved using XRM. The resrvUsedLoad value indicates how much of the reserved load is actually being used.

+
+ +
+

Insufficient Resources

+

If there are not enough compute unit resources available on the device to support a FFmpeg job, the job will error out with a message about resource allocation failure:

+
Insufficient resources available for allocation
+
+
+

In this case, you can check the system load (as described in the section below) and look for a device with enough free resources, or wait until another job finishes and releases enough resources to run the desired job.

+
+
+

Job Resource Requirements

+

The load of a given job can be estimated by taking the resolution and frame rate of the job as a percentage of the total capacity of a device. For instance, on an MA35D device, a 1080p60 stream will require 12.5% of encode resources available on that device. Resource loads are reported with a precision of 1/1000000.

+
+

+
+
+
+
+

Automated Resource Management

+

The AMD AMA Video SDK provides a mechanism to automatically determine how many instances of various jobs can be submitted to the system and on which device(s) to dispatch each job instance. This mechanism relies on Job Descriptions files and a Job Slot Reservation tool which calculates the resources required for each job, determines on which device each job should be run and reserves the resources accordingly. Note that there is no requirement for job descriptions to be homogeneous.

+
+

Note

+

To observe the various job management log messages use tail -F /var/log/syslog command.

+
+
+

Video Transcode Job Descriptions

+

A video transcode Job Description File (JDF) provides information to the resource manager about what resources are needed to run a particular job. With this information, the resource manager can calculate the CU load for the specified job as well as the maximum possible number of jobs that can be run real-time in parallel.

+

A video transcode job description is specified through a JSON file and the key-value pairs specify the functions, formats, and resolutions needed.

+
+
function

Which HW resource to use (DECODER, SCALER, ENCODER, and ML)

+
+
format

Input/output format (H264, HEVC, AV1, VP9, yuv420p, and yuv420p10le)

+
+
resolution

Input/output height, width, and frame-rate as a numerator / denominator fraction

+
+
type

Optional entry to select between Type 1 and Type 2 AV1 encoder. Valid values are 1 and 2, with default equal 1

+
+
load_factor

Optional entry that instructs XRM to allocate a multiple factor of required resources. The multiplication factor is either the default 1.0, i.e., no addition allocation or explicitly defined by this entry. A typical usage of this entry is in cases where there is a need for headroom, while allocating resources.

+
+
num_job_slots

Optional entry that explicitly specifies the number of resources or job slots for a particular job. The absence of this entry allows for a given job to reserve all available resources on a given device, instead of what is required to complete the job.

+
+
resources

All the resources listed in this section of the job description will be allocated on the same device. If the job requires a single device, this is the section in which resources should be specified.

+
+
additionalresources_n

Optional entry to allocate resources on the nth device, n in the 1 to N-1 range, where N is the number of available devices. If a job cannot fit on a single device and must be split across two devices, then resources which should be allocated on the first device are listed under resources section and the resources which should be allocated on the nth device are listed in the additionalresources_n section.

+
+
cores

Optional entry to enable 2-core encoding in order to achieve higher throughput. Valid values are 1 and 2, for single core and double cores encodings, respectively. Default value is 1. See /opt/amd/ama/ma35/scripts/describe_job/example_2_core_encode.json for usage example.

+
+
preset

Optional entry to select one of fast, medium or slow encoding presets. Default value is medium. See /opt/amd/ama/ma35/scripts/describe_job/example_fast_preset.json for usage example.

+
+
model (Applicable when function is set to ML.)

Valid value is "roi".

+
+
model_args (Applicable when function is set to ML.)

Valid values are "type=face" and "type=text"

+
+
+

Several examples of JSON job slot descriptions can be found in the /opt/amd/ama/ma35/scripts/describe_job folder once the AMD AMA Video SDK has been installed.

+

Below is the /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale example. This JSON example describes an ABR transcode job which uses a decoder, scaler, and encoder to generate 12 output renditions.

+
{
+    "request": {
+        "name": "t10_transcode_multiscale",
+        "request_id": 1,
+        "parameters": {
+            "name": "testjob",
+            "resources": 
+            [
+                {
+                    "function": "DECODER",
+                    "format":   "H264",
+                    "resolution": { "input": { "width": 3840, "height": 2160, "frame-rate": { "num":60, "den":1} } }
+                },
+                        {
+                    "function": "SCALER",
+                    "format":   "yuv420p",
+                    "resolution":{                                                                                 
+                        "input": { "width": 3840, "height": 2160, "frame-rate": { "num":60, "den":1} },
+                        "output":
+                        [        
+                            { "width": 1920, "height": 1080, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1600, "height": 900, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1440, "height": 900, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1360, "height": 768, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1280, "height": 720, "frame-rate": { "num":60, "den":1}},
+                            { "width": 1024, "height": 768, "frame-rate": { "num":60, "den":1}},
+                            { "width": 960, "height": 540, "frame-rate": { "num":60, "den":1}},
+                            { "width": 848, "height": 480, "frame-rate": { "num":60, "den":1}},
+                            { "width": 640, "height": 360, "frame-rate": { "num":60, "den":1}},
+                            { "width": 540, "height": 480, "frame-rate": { "num":60, "den":1}},
+                            { "width": 352, "height": 288, "frame-rate": { "num":60, "den":1}},
+                            { "width": 288, "height": 160, "frame-rate": { "num":60, "den":1}}
+                        ]
+                    }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1920, "height": 1080, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1600, "height": 900, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1440, "height": 900, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1360, "height": 768, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1280, "height": 720, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 1024, "height": 768, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 960, "height": 540, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 848, "height": 480, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 640, "height": 360, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 540, "height": 480, "frame-rate": { "num":60, "den":1} } } 
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 352, "height": 288, "frame-rate": { "num":60, "den":1} } }
+                },
+                {
+                    "function": "ENCODER",
+                    "format":   "HEVC",
+                    "resolution": { "input": { "width": 288, "height": 160, "frame-rate": { "num":60, "den":1} } } 
+                }
+            ]
+        }
+    }
+}
+
+
+

The next sections document the two different ways of using job descriptions to run multiple jobs across one or more devices:

+ +
+
+

The Job Slot Reservation Tool

+

The job slot reservation application, jobslot_reservation, takes as input multiple JSON job description files. Each JSON JDF provides information to the resource manager about what kind of transcode is intended to run on a card. With this information, the resource manager calculates the CU load for the specified job as well as the maximum possible number of jobs that can be run real-time in parallel.

+

Once the maximum possible number of jobs is known, CUs and job slots are reserved, and corresponding reservation IDs are stored in a bash file at /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh, where TIMESTAMP refers to Linux epoch timestamp and JDF is the name of JSON JDF, without its extension. A reservation ID is a unique identifier which is valid while the job slot reservation application is running. After sourcing the respective /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh files, the reservation IDs are then passed to individual FFmpeg processes via the XRM_RESERVE_ID environment variable. The FFmpeg processes then use this reservation ID to retrieve and use the corresponding CUs reserved by the job slot reservation tool.

+

The reserved resources are released by ending the job reservation process. Reserved slots can be reused after an FFmpeg job finishes, as long as the job reservation process is still running.

+

Optionally, jobslot_reservation can take --dry_run argument to check how many job slots are possible for a given job, without actual reservation. Additionally, this application is process-safe.

+

Ill-formed JSON Job Descriptions

+

If you run the jobslot_reservation tool with a syntactically incorrect JSON description, you will see the following messages:

+
decoder plugin function=0 fail to run the function
+scaler plugin function=0 fail to run the function
+encoder plugin function=0 fail to run the function
+
+
+

This indicates that the job description is ill-formed and needs to be corrected.

+
+

Example requiring a single device per job

+

This example uses the /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json file describing a 1080p ABR ladder running on a single device.

+
    +
  1. Setup the environment:

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  2. +
  3. Run the job slot reservation application with the desired JSON job description. For example

    +
    $ jobslot_reservation /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json
    +JobDescriptionFile: /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json
    +Requested Loads:
    +scaler [0]: 523634
    +
    +decoder [0]: 250000
    +
    +...
    +
    +lookahead [0]: 6111
    +
    +encoder [0]: 5555
    +
    +lookahead [0]: 2777
    +
    +===============================================================
    +Total Job Slots possible : 2
    +Dry run: Disabled
    +
    +Job Type: /opt/amd/ama/ma35/scripts/describe_job/t10_transcode_multiscale.json
    +Job Slots Alloted: 2
    +XRM_RESERVE_ID file - "/var/tmp/amd/xrm_jobReservation_79533431_t10_transcode_multiscale.sh"
    +================================================================
    +
    +---------------------------------------------------------------
    +
    +The Job-slot reservations are alive as long as this Application is alive!
    +(press Enter to close this app)
    +
    +---------------------------------------------------------------
    +
    +
    +
  4. +
+

The job slot reservation application creates a /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh with XRM_RESERVE_ID_{n} set to unique IDs generated by XRM (with n ranging from 1 to the number of possible job slots for the given job). Here is an example of this generated file:

+
export XRM_RESERVE_ID_0=1
+export XRM_RESERVE_ID_1=2
+
+
+
    +
  1. Launch individual FFmpeg processes in distinct shells after sourcing the /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh file and setting XRM_RESERVE_ID environment to a unique XRM_RESERVE_ID_{n}.

    +

    For job 1, within a new terminal:

    +
    source /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh
    +export XRM_RESERVE_ID=${XRM_RESERVE_ID_1}
    +ffmpeg -c:v h264_ama ...
    +
    +
    +

    For job 2, within a new terminal:

    +
    source /var/tmp/amd/ma35/xrm_jobReservation_TIMESTAMP_JDF.sh
    +export XRM_RESERVE_ID=${XRM_RESERVE_ID_2}
    +ffmpeg -c:v h264_ama ...
    +
    +
    +

    And so forth for the other jobs.

    +
  2. +
  3. Press Enter in the job reservation app terminal to release the resources after the jobs are complete.

  4. +
+
+
+

Multi-devices Flow

+

Multi-device flow is identical to the single device one, with the addition of additionalresources_n key(s) in JDFs. (See /opt/amd/ama/ma35/scripts/describe_job/t27_2-dev_h264_4kp60_to_hevc_2kp60.json for a sample JSON file.) The generated script will include new variables of the form var_dev_x_y = D, where D represents the target device. (x and y are used for internal resource tracking.) Similar to the single device steps:

+
    +
  1. Execute jobslot_reservation, with a proper multi-device JDF.

  2. +
  3. Source the generated script file.

  4. +
  5. Export the relevant XRM_RESERVE_ID variables.

  6. +
  7. Assign var_dev_x_y variables to the default device and to device parameter of hwupload_ama, e.g.:

    +
    ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder${var_dev_0_0} -c:v h264_ama -i ... \
    +  -filter_complex "hwdownload,hwupload_ama=device=${var_dev_0_1}" -c:v hevc_ama ...
    +
    +
    +
  8. +
+

, performs the decode operation on the device noted by var_dev_0_0 and the encode operation on device var_dev_0_1.

+
+
+
+

Automated Job Launching

+

The Job Slot Reservation tool automatically reserves job slots, but actual jobs still need to be manually launched using the generated reservations IDs. It is possible to create custom orchestration layers to automatically handle the reservation of job slots and the launching of jobs.

+

The AMD AMA Video SDK includes an example launcher application for FFmpeg. Source code for the FFmpeg Launcher example and the Job Slot Reservation tool are included in the Github repository of AMD AMA Video SDK and can be used as a starting point for developing custom orchestration layers.

+
+

The FFmpeg Launcher Example

+

The FFmpeg launcher, launcher, is an example application which automates the dispatching of FFmpeg jobs across multiple devices. It simplifies the process of manually setting up XRM reservation IDs and launching FFmpeg for many video streams. The FFmpeg launcher takes tuples of source, Transcode Job Description (TJD) files, where each line of source file is a full path to the location of an input file and TJD has the following format:

+
+
job_description = JDF_PATH

JDF_PATH value refers to the full path of a JDF

+
+
cmdline = FFMPEG_CMD

FFMPEG_CMD refers to a complete FFmpeg pipeline command, without input source file after -i.

+
+
+

As an example, the source1.txt and job1.txt tuple describes a decode pipeline running on device 0:

+

source1.txt:

+
/path/to/4kp60.h264
+
+
+

job1.txt:

+
job_description = /path/to/JDF file
+
+cmdline = ffmpeg -y -hwaccel ama -c:v h264_ama -out_fmt nv12 -i -filter_hw_device dev0 -filter_complex "hwdownload,format=nv12[out]" -map "out]" -vframes 300 -f rawvideo -pix_fmt nv12 /dev/null
+
+
+
+

Note

+

The FFmpeg launcher is only an example application. It is provided as an illustration of how an orchestration layer can use Job Descriptions, but it is not an official feature of the AMD AMA Video SDK.

+
+

The following steps show how to use the FFmpeg launcher for an arbitrary number of jobs, assuming all are within the total compute capacity of the accelerator cards.

+
    +
  1. Environment setup

    +
    source /opt/amd/ama/ma35/scripts/setup.sh
    +
    +
    +
  2. +
  3. To run the FFmpeg launcher, use the following command:

    +
    launcher <(source, TJD)> {(source, TJD)}
    +
    +
    +

    Here is an example of the command:

    +
    launcher source1.txt job1.txt source2.txt job2.txt
    +
    +
    +
  4. +
+
+

+
+
+
+
+
+

XRM Reference Guide

+

The Xilinx® resource manager (XRM) is the software which manages the hardware accelerators available in the system. XRM includes the following components:

+
    +
  • xrmd: the XRM daemon, a background process supporting reservation, allocation, and release of hardware acceleration resources.

  • +
  • xrmadm the command line tool is used to interact with the XRM daemon (xrmd).

  • +
  • a C Application Programming Interface (API)

  • +
+
+

Command Line Interface

+

The XRM xrmadm command line tool is used to interact with the XRM daemon (xrmd). It provides the following capabilities and uses a JSON file as input for each action:

+
    +
  • Generate status reports for each device

  • +
  • Load and unload the hardware accelerators

  • +
  • Load and unload the software plugins

  • +
+

The XRM related files are installed under /opt/amd/ama/ma35/scripts/.

+
+

Setup

+

When sourced, the /opt/amd/ama/ma35/scripts/setup.sh script takes care of setting up the enviroment for the AMD AMA Video SDK, including its XRM components:

+
    +
  • The XRM daemon (xrmd) is started

  • +
  • The hardware accelerators (xclbin) and software plugins are loaded on the Xilinx devices

  • +
+
+
+

Generating Status Reports

+

xrmadm can generate reports with the status of each device in the system. This capability is particularly useful to check the loading of each hardware accelerator.

+

To generate a report for all the devices in the system:

+
xrmadm /opt/amd/ama/ma35/scripts/list_cmd.json
+
+
+

To generate a more detailed report for a single device, which is specified in the json file:

+
xrmadm /opt/amd/ama/ma35/scripts/list_onedevice_cmd.json
+
+
+

A sample JSON file for generating a report for device 0 is shown below:

+
{
+    "request": {
+        "name": "list",
+        "requestId": 1,
+        "device": 0
+    }
+}
+
+
+
+
+

Loading/Unloading Software Plugins

+

xrmadm can be used to load or unload the software plugins required to manage the compute resources. The software plugins perform resource management functions such as calculating CU load and CU max capacity. Once a plugin is loaded, it becomes usable by a host application through the XRM APIs. The XRM plugins need to be loaded before executing an application (such as FFmpeg/GStreamer) which relies on the plugins.

+

To load the plugins:

+
xrmadm /opt/amd/ama/ma35/scripts/load_xrm_plugins_cmd.json
+ {
+     "response": {
+         "name": "loadXrmPlugins",
+         "requestId": "1",
+         "status": "ok"
+     }
+ }
+
+
+

To unload the plugins:

+
xrmadm /opt/amd/ama/ma35/scripts/unload_xrm_plugins_cmd.json
+ {
+     "response": {
+         "name": "unloadXrmPlugins",
+         "requestId": "1",
+         "status": "ok"
+     }
+ }
+
+
+
+
+
+

C Application Programming Interface

+

XRM provides a C Application Programming Interface (API) to reserve, allocate and release CUs from within a custom application. For complete details about this programming interface, refer to the XRM API Reference Guide section of the documentation.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/migration.html b/v1.2/migration.html new file mode 100644 index 00000000..9440f086 --- /dev/null +++ b/v1.2/migration.html @@ -0,0 +1,760 @@ + + + + + + + + + + + + + + + Software Migration Considerations — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Software Migration Considerations
  • +
  • +
  • +
+
+
+
+
+ +
+

Software Migration Considerations

+ +

This section of documentation covers the notable API differences between the current release of SDK, 1.2, and previous versions.

+
+

API Changes from Alveo U30

+

This sub-section describes differences between U30 and MA35D

+
+

FFmpeg API Changes

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + +

Options General

MA35D

U30

-c:v:

+

Used for codec selection. Aside from naming convention changes, new AV1 codec and VP9 decoder are now available.

+

-c:v

-c:v

-filter_complex:

+

Used for frame filtering operation. Aside from naming convention changes, new 2D composition and ML operations are now available.

+

-filter_complex

-filter_complex

-hwaccel:

+

Used to select hardware accelerator engine. This option was previously referred to as xlnx_hwdev.

+

-hwaccel

-xlnx_hwdev

-vf:

+

Used to select the DMA transfer direction between host and accelerator.

+

-vf

xvbm_convert

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Encoder

Version 1.2

U30

-level:

+

Used to specify encoder's level. It now supports AV1's levels.

+

-level

-level

-profile:

+

Used to set encoder's profile. It now supports AV1's main.

+

-profile

-profile

-control_rate:

+

Used to set rate control mode. Options to this setting have changed.

+

-control_rate

-control-rate

-tune_metrics:

+

Used to tune VQ metrics. Options to this setting have changed.

+

-tune_metrics

-tune-metrics

-cores:

+

Used to explicitly specify the number of processing cores.

+

Deprecated

-cores

-periodicity-idr:

+

Used to determine IDR frame frequency.

+

Deprecated

-periodicity-idr

-force_key_frames:

+

Used to force IDR frame insertion, at specified frame numbers.

+

Deprecated

-force_key_frames

-disable-pipeline:

+

Used to enable/disable pipelining.

+

Deprecated

-disable-pipeline

-aspect-ratio:

+

Used to set video's aspect ratio.

+

Deprecated

-aspect-ratio

-expert-options:

+

Used to set encoder's expert option.

+

Deprecated

-expert-options

-avc-lowlat:

+

Used to enable/disable ULL for AVC.

+

Deprecated

-avc-lowlat

+ +++++ + + + + + + + + + + + + + + + + +

Options Decoder

Version 1.2

U30

-splitbuff_mode:

+

Used to configure decoder's buffer mode.

+

Deprecated

-splitbuff_mode

-entropy_buffers_count:

+

Used to set number of decoder's entropy buffers.

+

Deprecated

-entropy_buffers_count

+ +++++ + + + + + + + + + + + + + + + + + + + + +

Options Scaler

Version 1.2

U30

-out_{N}_width:

+

Used to configure width of an output rung.

+

Deprecated

-out_{N}_width

-out_{N}_height:

+

Used to configure height of an output rung.

+

Deprecated

-out_{N}_height

-out_{N}_rate:

+

Used to configure frame rate of an output rung.

+

Deprecated

-out_{N}_rate

+
+
+

Gstreamer API Changes

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Encoder

Version 1.2

U30

tune_metrics:

+

Used to tune VQ metrics. Options to this setting have changed.

+

tune-metrics

tune-metrics

ultra-low-latency:

+

Used to set ULL mode.

+

Set lookahead-depth to 0.

ultra-low-latency

target-bitrate:

+

Used to set target bit rate.

+

bitrate

target-bitrate

control_rate:

+

Used to set rate control mode. Options to this setting have changed.

+

rate-control

control-rate

dev-idx:

+

Used to specify the index of the device on which the encoder should be executed.

+

device

dev-idx

aspect-ratio:

+

Used to set video’s aspect ratio.

+

Deprecated

aspect-ratio

avc-lowlat:

+

Used to enable/disable ULL for AVC.

+

Deprecated

avc-lowlat

dependent-slice:

+

Used to specify slice dependency.

+

Deprecated

dependent-slice

enable-pipeline:

+

Used to enable/disable pipelining.

+

Deprecated

enable-pipeline

ip-delta:

+

Used to set IP delta.

+

Deprecated

ip-delta

loop-filter-beta-offset:

+

Used to set loop filter beta offset.

+

Deprecated

loop-filter-beta-offset

loop-filter-tc-offset:

+

Used to set loop filter tc offset..

+

Deprecated

loop-filter-tc-offset

slice-qp:

+

Used to set slice QP mode.

+

Deprecated

slice-qp

scaling-list:

+

Used to set lscaling list mode.

+

Deprecated

scaling-list

reservation-id:

+

Used to set resource pool reservation id.

+

Deprecated

reservation-id

rc-mode:

+

Used to enable custom rate control mode.

+

Deprecated

rc-mode

qp-mode:

+

Used to set QP control mode used by the encoder.

+

Deprecated

qp-mode

pb-delta:

+

Used to set PB delta.

+

Deprecated

pb-delta

periodicity-idr:

+

Used to set periodicity of IDR frames.

+

Deprecated

periodicity-idr

num-cores:

+

Used to set the number of encoder cores to be used for current stream.

+

Deprecated

num-cores

num-slices:

+

Used to set the number of slices produced for each frame.

+

Deprecated

num-slices

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Decoder

Version 1.2

U30

dev-idx:

+

Used to specify the index of the device on which the decoder should be executed.

+

device

dev-idx

avoid-dynamic-alloc:

+

Used to set a flag to avoid dynamic allocation of output buffers.

+

Deprecated

avoid-dynamic-alloc

avoid-output-copy:

+

Used to set a flag to avoid output frames copy.

+

Deprecated

avoid-output-copy

disable-hdr10-sei:

+

Used to configure whether to passthrough HDR10/10+ SEI messages or not.

+

Deprecated

disable-hdr10-sei

interpolate-timestamps:

+

Used to configure interpolation of output buffers PTS.

+

Deprecated

interpolate-timestamps

num-entropy-buf:

+

Used to specifie the number of decoder internal entropy buffers.

+

Deprecated

num-entropy-buf

reservation-id:

+

Used to set resource Pool Reservation id.

+

Deprecated

reservation-id

splitbuff-mode:

+

Used to configure decoder in split/unsplit input buffer mode.

+

Deprecated

splitbuff-mode

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Options Scaler

Version 1.2

U30

dev-idx:

+

Used to specify the index of the device on which the scaler should be executed.

+

device

dev-idx

avoid-output-copy:

+

Used to set a flag to avoid output frames copy on all source pads.

+

Deprecated

avoid-output-copy

coef-load-type:

+

Used to configure coefficients loading type for scaling.

+

Deprecated

coef-load-type

enable-pipeline:

+

Used to enable buffer pipelining to improve performance in non zero-copy use cases.

+

Deprecated

enable-pipeline

reservation-id:

+

Used to configure resource pool reservation id.

+

Deprecated

reservation-id

+
+
+
+

CLI Changes from 1.1.2 to 1.2

+

This sub-section describes differences between 1.1.2 and current version.

+
+

PCIe Addressing

+

Unlike the previous version, where PCIe devices were addressed as DBDF, this release uses BDF scheme. See Card Management.

+
+
+

FFmpeg CLI Changes

+ +++++ + + + + + + + + + + + + +

Options General

1.2

1.1.2

-c:v:

+

New still image codecs are now available. See -c:v for details.

+

-c:v

-c:v

+ +++++ + + + + + + + + + + + + +

Options Encoder

1.2

1.1.2

-control_rate:

+

cabr has been removed as a rate control mode, and can now be applied as a modifier to all encoding modes.

+

-control_rate and -cabr

-control_rate

+ +++++ + + + + + + + + + + + + +

Options Decoder

1.2

1.1.2

-resize:

+

Option to perform downscaling through decoders has been added.

+

-resize

+ +++++ + + + + + + + + + + + + +

Options 2D Engine

1.2

1.1.2

crop, pad, drawbox, and other 2D operations:

+

2D operations that were previously sub-commands of 2d_ama are now invoked with a simpler syntax.

+

2D Engine

-scaler_ama and -2d_ama

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/objects.inv b/v1.2/objects.inv new file mode 100644 index 00000000..e88c4d6f Binary files /dev/null and b/v1.2/objects.inv differ diff --git a/v1.2/package_feed.html b/v1.2/package_feed.html new file mode 100644 index 00000000..530ca434 --- /dev/null +++ b/v1.2/package_feed.html @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + Distribution Package Feed — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Distribution Package Feed
  • +
  • +
  • +
+
+
+
+
+ +
+

Distribution Package Feed

+ +
+

Package Descriptions

+ ++++ + + + + + + + + + + + + + + + + + + + + + + +

Name

Description

amd-ama-core

This package includes all the core elements that are required for running applications.

amd-ama-driver

This package includes all kernel driver and firmware elements.

amd-ama-ffmpeg

This package includes all the relevant software for running hardware-accelerated FFmpeg pipelines.

amd-ama-gstreamer

This package includes all the relevant software for running hardware-accelerated Gstreamer pipelines.

amd-ama-xma

This package includes various XMA based application programs and development header files.

+
+
+

Configuring the Package Feed

+

Distribution based package feeds allow for convenient and robust methods to update and upgrade relevant packages of the AMD AMA Video SDK. In order to be able to install the AMD AMA Video SDK packages from the package feed, point your package management client to the remote AMD AMA Video SDK package repository according to the instructions described below.

+
+

Ubuntu

+
    +
  1. Add Xilinx key:

    +
    wget -qO - https://www.xilinx.com/support/download/2018-2-1/xilinx-master-signing-key.asc | sudo tee /usr/share/keyrings/xilinx-master-signing-key.asc
    +
    +
    +
  2. +
  3. Add Xilinx PPA feed:

    +
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/xilinx-master-signing-key.asc] https://packages.xilinx.com/artifactory/debian-packages $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/xilinx.list
    +
    +
    +
  4. +
+
+
+

Debian 12

+
    +
  1. Add Xilinx key:

    +
    wget -qO - https://www.xilinx.com/support/download/2018-2-1/xilinx-master-signing-key.asc | sudo tee /usr/share/keyrings/xilinx-master-signing-key.asc
    +
    +
    +
  2. +
  3. Add Xilinx PPA feed:

    +
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/xilinx-master-signing-key.asc] https://packages.xilinx.com/artifactory/debian-packages jammy main" | sudo tee /etc/apt/sources.list.d/xilinx.list
    +
    +
    +
  4. +
+
+
+

Fedora

+
    +
  1. Add Xilinx key:

    +
    sudo rpm --import https://www.xilinx.com/support/download/2018-2-1/xilinx-master-signing-key.asc
    +
    +
    +
  2. +
  3. List keys and check for Xilinx key

    +
    rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n'
    +
    +
    +
  4. +
  5. Add the following lines to the /etc/yum.repos.d/xilinx.repo file:

    +
    +
    [Artifactory]
    +name=Artifactory
    +baseurl=https://packages.xilinx.com/artifactory/rpm-packages/$basearch/
    +enabled=1
    +gpgcheck=0
    +sslverify=0
    +
    +
    +
    +
  6. +
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/preview.html b/v1.2/preview.html new file mode 100644 index 00000000..843051b0 --- /dev/null +++ b/v1.2/preview.html @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + New Feature Preview — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • New Feature Preview
  • +
  • +
  • +
+
+
+
+
+ +
+

New Feature Preview

+ +
+

Overview

+

This section describes new enhanced features, which are meant for demonstrative proposes and are only supported in FFmpeg. Note that although these features are not meant to be used in production environments; however, as they mature, they will become fully qualified as production ready.

+
+

Machine Learning Content Aware Encoding (MLCAE)

+

MLCAE is a novel rate control mode designed to optimize frames' encoding based on their complexity. By leveraging the statistics generated by the lookahead module, the ML algorithm updates the encoder's configuration and achieves significant bitrate savings without compromising perceived video quality.

+

The current implementation of MLCAE enhances the CBR mode by dynamically adjusting the bitrate according to the frame's predicted complexity. This feature optimizes the encoder's performance, leading to more efficient video encoding. The MLCAE algorithm monitors the lookahead module's stats and dynamically adjusts the encoder's parameters based on the predicted frame complexity. These adjustments ensure that the encoder config is optimally set in real-time, resulting in consistent video quality and bitrate savings throughout the entire video stream.

+

The following example demonstrates how MLCAE gets invoked:

+
ffmpeg -hide_banner -loglevel info -hwaccel ama -hwaccel_device /dev/ama_transcoder0  -re -c:v h264_ama -i <INPUT>  -c:v h264_ama -control_rate mlcae -b:v 5M -f mp4 -y <OUTPUT>
+
+
+
+

Note

+

For the best results, when using mlcae mode, encode bit rate should be above 3 Mbps. Also note that for this release, only h264_ama encoder is supported.

+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/release_notes.html b/v1.2/release_notes.html new file mode 100644 index 00000000..5d26f1b0 --- /dev/null +++ b/v1.2/release_notes.html @@ -0,0 +1,412 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) Release Notes — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA) Release Notes
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA) Release Notes

+
+

Note

+

Version: 1.2

+
+ +
+

+
+
+

Overview

+

This section describes various requirements, limitations, known issues and their respective workarounds that are applicable to AMD AMA Video SDK.

+
+
+

Release Requirements

+
    +
  1. This release will upgrade the MA35D firmware versions to:

    +
    +
    ZSP Version = 2.1.0
    +SC Version = 9.8.5
    +eSecure Version = 1.0.0
    +PCIe FW Version = 2.1.0
    +PCIe CTRL Patch Version = 1.0.3
    +PCIe PHY Patch A Version = 1.0.0
    +
    +
    +
    +
  2. +
  3. This documentation is applicable to 1.2 release.

  4. +
  5. Ensure that chassis's BIOS is set to performance mode, e.g., sleep states, clock throttling, etc. are disabled.

  6. +
+
+
+

New in This Release

+
    +
  1. Support for new encoder features in resource management toolchain.

  2. +
  3. New rate control modifier -cabr.

  4. +
  5. Improvements to board management utilities, e.g., see mautil and mamgmt.

  6. +
  7. Preview of ML based content adaptive (mlcae) rate control mode.

  8. +
  9. Support for PCIe passthrough.

  10. +
  11. Support for FFmpeg v6.1.1. (v5.1.2 deprecated.)

  12. +
  13. Compositor 2D gpu plugin support, e.g., see compositor_ama.

  14. +
  15. Support for downscaling using the decoder, e.g., see -resize.

  16. +
  17. Support for pipelines spanning multiple devices.

  18. +
  19. Created AMA specific DMA filters to improve throughput, e.g., see hwupload_ama and hwdownload_ama.

  20. +
  21. Support for 2D gpu color space conversion, input rotation, color subsampling, and overlay and tiling in GStreamer. See 2D Engines for details.

  22. +
  23. Support for JPEG and AVIF image processing, e.g., see -c:v.

  24. +
  25. Dual core AV1 encoding, enabling 4kp120 and 8Kp30, is now supported for all lookahead depths.

  26. +
  27. Support for min QP and CABR with ULL

  28. +
  29. Support for passing through CEA 608, 708 closed captions in transcode flows.

  30. +
  31. Support for passing through video full range flag in transcode flows.

  32. +
  33. Support for passing through DolbyVision T.35s in transcode flows.

  34. +
  35. Simplified command-line options for configuring CRF.

  36. +
  37. Support for unified QP range among all codecs.

  38. +
  39. Support for Fedora 40.

  40. +
  41. Support for pipeline and inference_period in ML plugin.

  42. +
+
+
+

Feature Highlight

+
    +
  1. Support for video transcode using either our supplied FFmpeg (n6.1), Gstreamer (v1.22), or custom Xilinx Media Acceleration (XMA) applications.

  2. +
  3. Support for up to 8 x 4Kp60 8-bit or 10-bit video decode VP9, AV1, AVC or HEVC per device.

  4. +
  5. Support for up to 4 x 4Kp60 8-bit or 10-bit video decode of AV1 per device.

  6. +
  7. Support for up to 2 x 4Kp60 8-bit or 10-bit video transcode of AVC or HEVC per device.

  8. +
  9. Support for up to 4 x 4Kp60 8-bit or 10-bit video transcode of AV1 per device.

  10. +
  11. Support for up to 1 x 8Kp30 8-bit or 10-bit video transcode of AV1 per device

  12. +
  13. Support for integration with software-based video image filters using our hardware DMA support to/from device memory.

  14. +
  15. Support for up to 160 Mbps encode throughput per device

  16. +
  17. Support for encoder levels >= 6.

  18. +
  19. Support for virtualization using either SR-IOV or PCIe passthrough.

  20. +
  21. Optional use of our supplied resource management daemon (xrmd) for automated accelerator selection and load balancing.

  22. +
  23. Detailed telemetry report, which includes resource utilization, power usage, heat dissipation, PCIe and memory bandwidth.

  24. +
  25. Dedicated 2D GPU and Machine Learning (ML) engines for pixel processing and encoding enhancements.

  26. +
  27. Face and text-based ML models for enhanced low bitrate video encoding for fine text and faces using the ML engine of the card.

  28. +
  29. Dual core AV1 encoding enabling 4kp120 and 8Kp30.

  30. +
  31. Programmable latency modes from 0 - 40 frames, with no impact on density.

  32. +
  33. Selectable video metrics modes MOS, SSIM and PSNR, with no impact on density.

  34. +
  35. HDR10, HDR10+ and/or HLG metadata pass through transcode support.

  36. +
  37. Simple to use validation applications.

  38. +
+
+
+

Supported Kernels and Distributions

+

The following table denotes the current supported kernels and distributions.

+ + +++++ + + + + + + + + + + + + + + + + + + + + +
Supported OS & Kernel

OS Name(s)

Generic Kernel(s)

Notes

+
Ubuntu 22.04
+
Ubuntu 20.04
+
+
+
5.15.0, 5.19.0, 6.2.0 and 6.5.0
+
+
+
Preferred kernels are 5.15.0, 6.2.0 and 6.5.0
+
+
+
Debian 12
+
+
+
6.1
+
+
+

+
+
+
Fedora 40
+
+
+
6.8
+
+
+
Preferred kernel is 6.9
+
+
+
+
+

Known Limitations

+
    +
  1. PF and VF must support PCIe memory regions BAR0 of 8 MB, BAR2 of 64 MB and BAR4 of 512 MB sizes.

  2. +
  3. PF and VF release versions must match.

  4. +
  5. A device that has been assigned to a VM cannot share its resources with its host.

  6. +
  7. Only a single VF may be assigned to a VM.

  8. +
  9. For maximum server scalability, ensure that a single VF is assigned to a VM.

  10. +
  11. Ensure that both the host and VMs are running the same SDK version.

  12. +
  13. MA35D only supports progressive content, i.e., interlaced contents are not supported in either the decoder or encoder.

  14. +
  15. For encoding, only resolutions that are divisible by 4 are supported, i.e., both height and width.

  16. +
  17. For decoding, only resolutions that are divisible by 2 are supported, i.e., both height and width.

  18. +
  19. This version of the SDK does not support splitting a video acceleration use case across multiple MA35D devices.

  20. +
  21. With the current version of FFmpeg, n5.1.2, it is not recommended to transport AV1 over MPEG TS.

  22. +
  23. XMA sample applications are not meant to be run at maximum density.

  24. +
  25. Encode rates up to maximum of 400 Mbps are supported.

  26. +
  27. 4Kp120 is only supported for AV1 (type 1) encoder, under ultra low latency mode, using both cores.

  28. +
  29. VBR and CVBR rate control modes are not supported for lookahead depth between 0 and 4.

  30. +
  31. Using an encoder lookahead_depth value of <11 may limit the number of b-frames or other encoder features such as rate control modes, aq modes and so forth. See Encoding Compatibility Matrix for details.

  32. +
  33. When using the encoder fast preset, lookahead_depth must be > 0.

  34. +
  35. Mixing 2-slice AV1 Type 1 encoding and 1-slice encoding is not supported on a single device

  36. +
  37. Encoder does not support dynamic QP maps in either AV1 Type 2 encoding or with lookahead_depth = 0.

  38. +
  39. 2D GPU only supports 8-bit video.

  40. +
  41. The 2D GPU and ML engines are not supported in Gstreamer or through XMA interface.

  42. +
  43. AV1 decoder does not support 8k resolution in portrait mode.

  44. +
+
+
+

Known Issues

+
    +
  1. A secondary bus reset (SBR) will cause the server to hang. A cold boot of the server will restore function. After installation of our driver package, our setup.sh script should be run prior to utilizing any of the features of the SDK. The setup.sh will disable secondary bus reset.

  2. +
  3. AV1 decoding using the included ama_av1dec Gstreamer plugin requires the use of an IVF packaged AV1 raw video stream and a corresponding ivfparse plugin to be utilized to demux the AV1 video stream.

  4. +
  5. If the kernel driver is not loaded, tools such as mautil may crash when invoked.

  6. +
  7. An AV1 HLS stream may playback at slower than real time speeds. Recommend explicitly setting of fps playback frame rate when using ffplay or use ffplay from ffmpeg 5.1.2 or 6.0

  8. +
  9. Recommend playback of raw video using more recent versions of ffplay (n5.1.2n6.0 or later) or more recent versions of media players such as VLC v3.0.17.4. Alternatively, muxing the raw video into an IVF container format is also permitted.

  10. +
  11. Using Gstreamer, 1080p30 transcodes and or lower resolutions cannot run at full density with default lookahead depth.

  12. +
  13. ROI Model currently doesn't support portrait mode in a specific resolution of 1080x1920.

  14. +
  15. A strict HDR10+ compliance checker may report some warnings in encoded HDR10+ bitstreams generated by this release.

  16. +
  17. Firmware downgrade to GA1.0 may not work on some desktop machines or low end servers. Warm boot the server to get to working state.

  18. +
  19. AV1 decoder accepts streams up to 40 Mbps.

  20. +
  21. Attempts to firmware updates before the 10-minute mark, of card uptime, with 9.7.35 satellite controller firmware will fail.

  22. +
  23. XMA ML APIs do not include roi_scale xma filter.

  24. +
  25. Logo overlay prints error messages every 30s, which are innocuous.

  26. +
+
+
+

Upgrading from Previous Versions

+
    +
  1. Remove any previously installed ma35 and amd-ama packages as per installation instructions.

  2. +
  3. Remove any manually created Boost library soft links that may have been created, previously.

  4. +
  5. Remove all entries from /etc/apt/sources.list.d/xilinx.list if this file exists.

  6. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/search.html b/v1.2/search.html new file mode 100644 index 00000000..66e9a5c4 --- /dev/null +++ b/v1.2/search.html @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + Search — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Search
  • +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/v1.2/searchindex.js b/v1.2/searchindex.js new file mode 100644 index 00000000..9845fa8c --- /dev/null +++ b/v1.2/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["c_apis", "card_management", "encoder_comp_matrix", "examples", "examples/amf/amf_encoder", "examples/ffmpeg/filters", "examples/ffmpeg/quality_analysis", "examples/ffmpeg/tutorials", "examples/gstreamer/filters", "examples/gstreamer/tutorials", "examples/gstreamer/xabrladder", "examples/gstreamer/xcompositor", "examples/xma/xma_apps", "getting_started_on_prem", "git_hub", "index", "managing_compute_resources", "migration", "package_feed", "preview", "release_notes", "specs_and_features", "troubleshooting", "tuning_pipeline_latency", "tuning_video_quality", "unified_logging", "using_ffmpeg", "using_gstreamer", "virtualization"], "filenames": ["c_apis.rst", "card_management.rst", "encoder_comp_matrix.rst", "examples.rst", "examples/amf/amf_encoder.rst", "examples/ffmpeg/filters.rst", "examples/ffmpeg/quality_analysis.rst", "examples/ffmpeg/tutorials.rst", "examples/gstreamer/filters.rst", "examples/gstreamer/tutorials.rst", "examples/gstreamer/xabrladder.rst", "examples/gstreamer/xcompositor.rst", "examples/xma/xma_apps.rst", "getting_started_on_prem.rst", "git_hub.rst", "index.rst", "managing_compute_resources.rst", "migration.rst", "package_feed.rst", "preview.rst", "release_notes.rst", "specs_and_features.rst", "troubleshooting.rst", "tuning_pipeline_latency.rst", "tuning_video_quality.rst", "unified_logging.rst", "using_ffmpeg.rst", "using_gstreamer.rst", "virtualization.rst"], "titles": ["C API Programming Guide", "Card Management", "Encoding Compatibility Matrix", "Tutorials and Examples", "AMF Encoder Tutorial", "FFmpeg Examples using Software Filters", "Video Quality Examples", "FFmpeg Tutorials", "GStreamer Examples using Software Filters", "GStreamer Introductory Tutorials", "GStreamer ABR Ladder Application", "GStreamer Compositor Application", "XMA Examples for the AMD AMA Video SDK", "Getting Started with AMD AMA Video SDK Cards", "AMD Advanced Media Acceleration (AMA) Repository", "AMD Advanced Media Acceleration (AMA)", "Managing Video Acceleration Compute Resources", "Software Migration Considerations", "Distribution Package Feed", "New Feature Preview", "AMD Advanced Media Acceleration (AMA) Release Notes", "Specs and Features of the AMD AMA Video SDK", "AMD Advanced Media Acceleration (AMA) Troubleshooting", "Tuning Latency", "Tuning Video Quality", "Unified Logging", "Using FFmpeg", "Using GStreamer", "Virtualization"], "terms": {"amazon": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "ec2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "vt2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "2022": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "2024": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "ma35": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "opt": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "The": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 19, 20, 22, 23, 24, 25, 26, 27, 28], "provid": [0, 1, 5, 6, 7, 9, 10, 15, 16, 21, 24, 25, 26, 27, 28], "base": [0, 3, 4, 10, 12, 13, 15, 16, 18, 19, 20, 21, 22, 23, 24, 26, 27], "which": [0, 1, 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28], "facilit": [0, 15, 21], "integr": [0, 14, 15, 20, 21], "transcod": [0, 5, 10, 11, 14, 15, 20, 22, 24, 26, 27], "capabl": [0, 7, 9, 15, 16, 21, 24, 26], "proprietari": [0, 15, 21], "framework": [0, 4, 7, 15, 21, 25, 27], "thi": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 21, 22, 23, 24, 26, 27, 28], "i": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "form": [0, 10, 16, 21, 24, 26], "leverag": [0, 15, 16, 19, 21, 26, 27], "xilinx": [0, 1, 12, 16, 18, 20, 21, 22, 28], "media": [0, 4, 6, 12, 21, 27], "acceler": [0, 1, 5, 7, 8, 9, 12, 17, 18, 21, 25, 28], "librari": [0, 6, 14, 20, 25, 26], "manag": [0, 17, 18, 20, 21, 28], "libxma": 0, "meant": [0, 1, 14, 19, 20, 28], "simplifi": [0, 16, 20], "control": [0, 1, 12, 13, 17, 19, 20, 21, 22, 25, 26, 27, 28], "us": [0, 1, 2, 4, 6, 7, 9, 10, 12, 14, 17, 19, 20, 21, 22, 23, 24, 28], "hardwar": [0, 1, 7, 12, 15, 16, 17, 18, 20, 21, 22, 25, 26], "avail": [0, 1, 7, 9, 10, 11, 16, 17, 21, 22, 26, 27, 28], "system": [0, 1, 5, 6, 7, 8, 9, 12, 13, 21, 22, 27, 28], "keep": 0, "track": [0, 1, 6, 16, 22, 23, 26], "total": [0, 1, 13, 16, 26, 27], "capac": [0, 6, 16, 27], "each": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 21, 22, 24, 25, 26, 28], "comput": [0, 1, 21], "unit": [0, 1, 7, 9, 15, 16, 28], "make": [0, 16, 21, 26, 28], "possibl": [0, 5, 6, 8, 16, 22], "perform": [0, 1, 4, 5, 6, 7, 8, 9, 12, 13, 16, 17, 19, 20, 22, 23, 25, 27, 28], "action": [0, 16, 21, 26], "reserv": [0, 1, 17], "releas": [0, 1, 13, 15, 16, 17, 18, 19, 22, 24, 26], "calcul": [0, 6, 12, 16, 21], "load": [0, 1, 12, 17, 20, 21, 28], "max": [0, 1, 11, 12, 16, 24, 25, 26, 27], "4": [0, 1, 2, 5, 6, 9, 12, 13, 20, 21, 22, 23, 24, 26, 27, 28], "differ": [0, 6, 7, 8, 10, 16, 17, 21, 24, 25, 26, 27], "correspond": [0, 16, 20, 24], "specif": [0, 1, 10, 15, 20, 21, 24, 25, 26, 27, 28], "featur": [0, 15, 16, 26, 27, 28], "card": [0, 7, 9, 15, 16, 17, 20, 28], "ani": [0, 7, 9, 12, 13, 20, 21, 22, 24, 25, 26, 27], "combin": [0, 2, 5, 6, 7, 8, 21, 23, 26], "can": [0, 1, 4, 5, 6, 7, 8, 9, 12, 16, 17, 21, 22, 23, 24, 26, 27, 28], "when": [0, 2, 5, 7, 8, 9, 12, 16, 19, 20, 22, 24, 26, 27], "For": [0, 1, 2, 5, 6, 7, 9, 12, 13, 16, 19, 20, 21, 23, 24, 26, 27, 28], "elabor": 0, "definit": [0, 21], "default": [0, 6, 7, 9, 10, 11, 12, 13, 16, 20, 22, 23, 24, 25, 26, 27, 28], "auto": [0, 12, 21, 26, 27], "valu": [0, 1, 2, 12, 16, 20, 22, 24, 25, 26, 27], "counterpart": 0, "section": [0, 1, 5, 6, 7, 8, 9, 12, 13, 16, 17, 19, 20, 21, 22, 24, 25, 26, 27, 28], "ffmpeg": [0, 3, 6, 8, 9, 12, 13, 15, 18, 19, 20, 21, 24, 25], "layer": [0, 11, 16, 25], "ar": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "organ": 0, "around": [0, 7, 24], "follow": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "step": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 21, 22, 28], "must": [0, 1, 7, 9, 12, 13, 16, 20, 21, 24, 26, 27], "first": [0, 7, 9, 11, 16, 26, 28], "creat": [0, 1, 7, 8, 9, 11, 16, 20, 21, 22, 27, 28], "xrm_plugin_reserv": 0, "where": [0, 1, 5, 6, 7, 9, 13, 16, 17, 21, 24, 25, 26, 28], "one": [0, 1, 5, 7, 8, 10, 16, 21, 24, 26, 27, 28], "dec": [0, 23, 25, 26], "enc": [0, 1, 25], "scale": [0, 7, 8, 10, 12, 15, 17, 26, 27], "done": [0, 5, 7, 8, 9, 16, 21, 22], "describ": [0, 2, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28], "detail": [0, 1, 5, 6, 7, 9, 12, 13, 16, 17, 20, 21, 22, 24, 26, 27], "below": [0, 1, 7, 10, 11, 16, 18, 21, 22, 24, 26, 27], "onc": [0, 1, 7, 9, 16, 21, 26], "have": [0, 2, 6, 9, 13, 16, 17, 20, 21, 23, 24, 26, 27, 28], "been": [0, 6, 9, 12, 16, 17, 20, 21, 22, 26, 28], "dedic": [0, 6, 20, 21], "need": [0, 5, 13, 16, 21, 27, 28], "To": [0, 1, 7, 9, 13, 16, 21, 22, 23, 24, 26, 28], "all": [0, 1, 2, 5, 6, 7, 8, 9, 12, 13, 16, 17, 18, 20, 21, 23, 24, 25, 26, 27, 28], "requir": [0, 5, 6, 7, 8, 9, 12, 13, 18, 21, 22, 23, 26], "particular": [0, 16], "It": [0, 1, 5, 6, 7, 8, 9, 12, 13, 14, 16, 17, 21, 22, 23, 24, 26, 27, 28], "call": [0, 21], "function": [0, 1, 5, 8, 9, 16, 20, 21, 24, 27, 28], "A": [0, 1, 13, 16, 20, 21, 26], "complet": [0, 1, 7, 9, 12, 15, 16, 21, 26, 27, 28], "send": [0, 8, 25, 26], "from": [0, 1, 6, 7, 8, 9, 11, 12, 13, 15, 16, 18, 21, 22, 24, 25, 26, 27, 28], "host": [0, 1, 5, 7, 8, 9, 13, 16, 17, 20, 21, 22, 26, 27], "receiv": [0, 7], "devic": [0, 4, 5, 8, 10, 11, 12, 13, 15, 17, 20, 21, 24, 26, 28], "xmafram": 0, "also": [0, 1, 7, 10, 11, 15, 19, 20, 21, 22, 23, 24, 26, 27, 28], "do": [0, 1, 7, 20, 21, 22, 23, 24, 28], "zero": [0, 1, 5, 8, 17, 27], "copi": [0, 5, 8, 17, 22, 26, 27], "oper": [0, 1, 5, 7, 9, 16, 17, 21, 22, 24, 25, 26, 27, 28], "pass": [0, 7, 9, 13, 16, 20, 21, 22, 26, 28], "next": [0, 16], "without": [0, 6, 10, 11, 16, 19, 21, 24, 26, 27, 28], "being": [0, 1, 7, 13, 16, 22], "back": [0, 5, 7, 8, 22], "return": [0, 1, 13, 22, 28], "code": [0, 6, 10, 11, 12, 14, 16, 21, 26, 27], "should": [0, 1, 2, 5, 6, 7, 8, 9, 12, 13, 16, 17, 19, 20, 21, 24, 26], "determin": [0, 6, 16, 17, 23, 24, 25], "suitabl": [0, 21], "finish": [0, 16], "destroi": [0, 1], "so": [0, 7, 16, 20, 21, 23, 26], "free": [0, 16], "other": [0, 6, 7, 10, 13, 16, 17, 20, 21, 22, 24], "job": [0, 13, 26, 27], "ensur": [0, 1, 5, 6, 7, 8, 9, 10, 12, 13, 19, 20, 22, 24, 26, 28], "everyth": 0, "clean": 0, "up": [0, 1, 11, 15, 16, 20, 21, 22, 26], "properli": [0, 1, 22, 28], "xrm_plugin_releas": 0, "packag": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 20, 22, 27, 28], "part": [0, 1, 21, 28], "necessari": 0, "declar": [0, 7], "your": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 16, 18, 22, 26, 27], "includ": [0, 1, 6, 7, 9, 13, 15, 16, 18, 20, 21, 25, 26, 27, 28], "header": [0, 18, 28], "sourc": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 20, 21, 22, 25, 26], "h": [0, 7, 8, 9, 10, 11, 12, 21, 26], "add": [0, 5, 6, 18, 22, 23, 26, 27, 28], "line": [0, 1, 5, 6, 7, 8, 9, 10, 11, 18, 20, 21, 24, 25, 26, 27], "cmakelist": 0, "txt": [0, 7, 9, 16, 23, 24, 25], "file": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28], "target_link_librari": 0, "project_nam": 0, "public": 0, "xrm_interfac": [0, 26, 27], "target_include_directori": 0, "project_source_dir": 0, "target_properti": 0, "interface_include_directori": 0, "struct": 0, "xmaparamet": 0, "type": [0, 1, 6, 7, 10, 11, 12, 16, 17, 20, 21, 22, 25, 26, 27, 28], "length": [0, 27], "custom": [0, 6, 16, 17, 20, 21, 27, 28], "argument": [0, 6, 7, 9, 12, 16, 22, 26], "found": [0, 5, 6, 7, 8, 9, 12, 16, 23, 24, 26, 27, 28], "xmaparam": 0, "xmaframeproperti": 0, "dimens": [0, 8, 26], "xmabuff": 0, "raw": [0, 5, 6, 7, 9, 12, 20, 22, 24], "its": [0, 1, 6, 16, 20, 21, 22, 24, 26, 27, 28], "sent": 0, "thei": [0, 6, 7, 9, 19, 21, 24, 26], "input": [0, 5, 6, 7, 8, 9, 10, 11, 12, 16, 17, 19, 20, 21, 22, 26], "output": [0, 1, 5, 6, 8, 10, 11, 12, 16, 17, 19, 21, 22, 23, 24, 25, 26], "look": [0, 1, 6, 16, 21, 24, 26], "ahead": [0, 1, 16, 21, 24, 26], "support": [0, 1, 5, 7, 10, 11, 12, 13, 16, 17, 18, 19, 22, 23, 24, 26, 27, 28], "3": [0, 1, 2, 5, 7, 9, 12, 13, 19, 20, 21, 22, 24, 26, 27, 28], "xma_host_buffer_typ": 0, "upload": [0, 7, 26, 27], "befor": [0, 6, 9, 16, 20, 22, 26], "xma_device_only_buffer_typ": 0, "download": [0, 6, 7, 18, 26, 27, 28], "no_buff": 0, "contain": [0, 1, 7, 8, 9, 10, 12, 14, 16, 20, 22, 24, 26, 27], "place": [0, 8], "holder": 0, "fill": 0, "onli": [0, 1, 2, 6, 12, 16, 19, 20, 21, 22, 23, 24, 26, 27, 28], "while": [0, 16, 21, 22, 24, 26], "xma_device_buffer_typ": 0, "dummi": 0, "those": 0, "respect": [0, 1, 6, 7, 9, 16, 20, 21, 26, 27], "xmadatabuff": 0, "sw_format": 0, "member": 0, "xmascalerproperti": 0, "xmaencoderproperti": 0, "xmafilterproperti": 0, "repres": [0, 7, 16, 26], "therefor": 0, "assign": [0, 7, 20, 21, 26, 28], "direct": [0, 1, 7, 17, 21, 26, 27], "flow": [0, 20, 25], "xma_nv12_fmt_typ": 0, "xma_p010le_fmt_typ": 0, "flag": [0, 6, 7, 17, 20, 23], "xma_frame_property_flag_tile_4x4": 0, "intern": [0, 7, 16, 17, 22, 27], "xma_packed10_fmt_typ": 0, "an": [0, 1, 2, 5, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 20, 21, 22, 23, 24, 25, 26, 27, 28], "xma_rgb24_fmt_typ": 0, "futur": [0, 27], "xma_yuv420p_fmt_typ": 0, "xma_yuv420p10le_fmt_typ": 0, "extern": [0, 21], "commonli": [0, 6], "most": [0, 6, 9, 12, 21, 24], "consist": [0, 19], "xma_log_init": 0, "xma_logmsg": 0, "xma_log_releas": 0, "xmalogg": 0, "int32_t": 0, "xmalogleveltyp": 0, "log_level": [0, 12, 23, 25], "xmalogtyp": 0, "log_typ": 0, "xmaloghandl": 0, "handl": [0, 16, 26], "prior": [0, 13, 20, 24], "see": [0, 5, 6, 7, 8, 9, 12, 13, 16, 17, 20, 21, 22, 23, 24, 26], "variad": 0, "usag": [0, 1, 5, 7, 9, 14, 15, 16, 20, 21, 24, 26, 27], "void": 0, "level": [0, 12, 17, 20, 21, 23, 25, 26], "const": 0, "char": 0, "name": [0, 1, 5, 7, 9, 10, 11, 12, 14, 16, 17, 18, 20, 21, 25, 26, 27, 28], "msg": 0, "messag": [0, 12, 13, 16, 17, 20, 22, 26, 28], "wa": [0, 17, 25], "previous": [0, 5, 7, 8, 17, 20], "xma_initi": 0, "xma_releas": 0, "xmainitparamet": 0, "init_param": 0, "xmahandl": 0, "xma_data_buffer_alloc": 0, "xma_data_from_buffer_clon": 0, "xma_data_buffer_fre": 0, "size_t": 0, "size": [0, 5, 7, 8, 12, 13, 20, 22, 23, 24, 25, 26, 27, 28], "bool": 0, "given": [0, 1, 2, 5, 7, 9, 12, 14, 16, 21, 23, 24], "uint8_t": 0, "xma_data_buffer_clone_free_callback_funct": 0, "free_callback": 0, "opaqu": 0, "point": [0, 1, 16, 18, 22, 24], "longer": 0, "xma_frame_planes_get": 0, "xma_frame_get_plane_height": 0, "xma_frame_get_plane_strid": 0, "xma_frame_get_plane_s": 0, "xma_frame_alloc": 0, "xma_frame_from_buffers_clon": 0, "xma_frame_clon": 0, "xma_frame_inc_ref": 0, "xma_frame_dec_ref": 0, "xma_frame_fre": 0, "xma_frame_add_side_data": 0, "xma_frame_get_first_side_data": 0, "xma_frame_get_side_data": 0, "xma_frame_get_next_side_data": 0, "xma_frame_get_next_side_data_of_typ": 0, "xma_frame_remove_side_data": 0, "xma_frame_remove_side_data_typ": 0, "xma_frame_clear_all_side_data": 0, "frame_prop": 0, "number": [0, 9, 10, 11, 12, 13, 16, 17, 20, 22, 23, 24, 25, 26, 27], "plane": 0, "height": [0, 2, 7, 9, 11, 12, 16, 17, 20, 24, 26, 27], "stride": 0, "width": [0, 1, 2, 7, 9, 11, 12, 16, 17, 20, 24, 26, 27], "xmaframedata": 0, "frame_data": 0, "xma_frame_clone_free_callback_funct": 0, "xma_fram": 0, "same": [0, 1, 6, 7, 16, 20, 22, 24, 26, 27], "ad": [0, 1, 11, 17, 26], "remov": [0, 13, 17, 20, 22, 28], "affect": 0, "origin": [0, 6, 8], "increas": [0, 21, 23, 24, 26, 27], "count": [0, 12], "decreas": [0, 21, 22, 24], "previou": [0, 16, 17], "xmaframesidedata": 0, "side_data": 0, "If": [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 22, 23, 25, 26, 27, 28], "alreadi": [0, 7], "associ": [0, 21, 22, 24, 26, 28], "new": [0, 1, 5, 6, 7, 8, 9, 12, 16, 17], "set": [0, 7, 9, 12, 14, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "increment": [0, 21], "success": [0, 1, 13], "execut": [0, 5, 6, 7, 8, 9, 12, 13, 16, 17, 22, 26, 27, 28], "v1": [0, 14, 20], "enum": [0, 27], "xmaframesidedatatyp": 0, "decrement": [0, 22], "result": [0, 1, 5, 6, 7, 11, 16, 19, 21, 23, 24, 26], "freed": 0, "ha": [0, 1, 2, 6, 7, 12, 16, 17, 20, 21, 22, 23, 24, 26, 27], "": [0, 1, 5, 6, 7, 8, 9, 12, 13, 16, 17, 19, 20, 21, 22, 24, 26, 27, 28], "through": [0, 1, 5, 6, 7, 10, 11, 16, 17, 20, 21, 24, 26, 28], "xma_side_data_alloc": 0, "xma_side_data_fre": 0, "xma_side_data_inc_ref": 0, "xma_side_data_dec_ref": 0, "xma_side_data_get_refcount": 0, "xma_side_data_read": 0, "xma_side_data_writ": 0, "xma_side_data_get_metadata": 0, "xma_side_data_set_metadata": 0, "xmabuffertyp": 0, "buffer_typ": 0, "uint64_t": 0, "deprec": [0, 17, 20], "abov": [0, 6, 7, 9, 10, 13, 19, 21, 22, 23, 24, 25, 26, 28], "you": [0, 1, 5, 6, 7, 8, 9, 12, 13, 16, 22, 26, 27, 28], "yet": 0, "otherwis": [0, 25, 26, 28], "risk": 0, "race": 0, "condit": [0, 21, 22], "occur": 0, "metadata": [0, 7, 20, 26], "get": [0, 7, 12, 15, 19, 20, 22, 25, 27, 28], "specifi": [0, 1, 6, 7, 9, 11, 12, 16, 17, 22, 24, 26, 27], "replac": [0, 5], "depend": [0, 17, 21, 22, 23, 24, 27], "whether": [0, 13, 17, 24, 27], "exist": [0, 7, 20, 21, 28], "subsect": 0, "note": [0, 1, 5, 6, 7, 8, 9, 13, 14, 15, 16, 19, 21, 22, 23, 24, 26, 27, 28], "serv": [0, 27], "In": [0, 1, 5, 6, 8, 9, 16, 18, 21, 23, 26], "order": [0, 1, 6, 7, 16, 18, 23, 26, 27, 28], "allow": [0, 1, 7, 9, 15, 16, 18, 21, 23, 24, 26, 27, 28], "forward": 0, "backward": 0, "abi": 0, "compat": [0, 1, 5, 7, 8, 13, 15, 16, 20, 21, 23, 24, 27, 28], "now": [0, 17, 20], "assum": [0, 7, 16, 21, 25, 26, 28], "mean": [0, 1, 6, 24, 26], "earlier": 0, "later": [0, 20, 22, 26], "cannot": [0, 11, 16, 20], "either": [0, 6, 16, 20, 21, 26], "ignor": [0, 13, 26, 28], "error": [0, 1, 7, 9, 12, 16, 20, 22, 25, 26, 27], "snippet": [0, 28], "param": [0, 9, 12, 24, 27], "uint32_t": 0, "api_vers": 0, "xma_api_version_m_": 0, "m": [0, 23, 27, 28], "xma_api_vers": 0, "xma_uint32": 0, "sizeof": 0, "xma_init_param": 0, "param_cnt": 0, "logger": 0, "major": [0, 24], "minor": 0, "e": [0, 1, 5, 7, 8, 9, 12, 13, 16, 20, 21, 22, 24, 26, 27, 28], "g": [0, 1, 5, 7, 8, 9, 12, 13, 16, 20, 21, 22, 24, 26, 27], "macro": 0, "becom": [0, 16, 19, 22], "xma_api_version_1_0": 0, "xma_dec_session_cr": 0, "xma_dec_set_log": 0, "xma_dec_session_send_data": 0, "xma_dec_session_get_properti": 0, "xma_dec_session_recv_fram": 0, "xma_dec_session_destroi": 0, "xmadecod": 0, "xmadecodersess": 0, "xmadecoderproperti": 0, "dec_prop": 0, "run": [0, 1, 10, 12, 16, 18, 20, 21, 22, 26, 27, 28], "until": [0, 16, 21], "after": [0, 9, 13, 16, 20, 22, 26, 28], "sever": [0, 7, 16, 21], "factor": [0, 16, 24, 26, 27], "resolut": [0, 2, 6, 8, 10, 11, 12, 16, 20, 21, 22, 24, 26, 27], "rate": [0, 5, 6, 9, 12, 15, 16, 17, 19, 20, 21, 23, 26, 27], "bit": [0, 2, 5, 8, 9, 12, 17, 19, 20, 23, 26, 27], "depth": [0, 2, 12, 17, 20, 21, 22, 24, 26, 27], "xma_dec_session_set_log": 0, "chang": [0, 5, 7, 21, 24, 26], "some": [0, 6, 7, 9, 20, 22, 24], "data_us": 0, "wai": [0, 16, 21, 26, 27], "pars": [0, 9, 14], "stream": [0, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 19, 20, 21, 22, 24, 26, 27], "time": [0, 1, 5, 6, 7, 8, 9, 11, 12, 14, 15, 16, 19, 20, 22, 23, 24], "indic": [0, 1, 7, 9, 16, 22, 26, 28], "amount": [0, 24], "consum": [0, 1, 16], "xma_success": 0, "abl": [0, 18, 22, 28], "entireti": 0, "accordingli": [0, 16], "case": [0, 10, 16, 17, 20, 21, 22, 24, 26], "proce": [0, 1, 13, 22, 28], "fetch": 0, "xma_try_again": 0, "did": 0, "report": [0, 20, 21, 22, 25], "again": [0, 7, 21, 22], "xma_send_more_data": 0, "more": [0, 1, 5, 7, 8, 9, 12, 13, 14, 16, 19, 20, 21, 22, 24, 26, 27], "notifi": 0, "null": [0, 6, 7, 11, 16, 21, 23], "continu": [0, 22], "flush": 0, "out": [0, 5, 7, 9, 16, 21, 22, 27], "yuv": [0, 7, 9, 12, 26, 27], "dec_sess": 0, "fprop": 0, "tri": 0, "valid": [0, 13, 16, 20, 21, 26, 27], "pointer": 0, "still": [0, 12, 16, 17, 21, 26], "produc": [0, 7, 9, 10, 17, 21, 27], "xma_eo": 0, "configur": [0, 1, 5, 6, 7, 8, 9, 10, 12, 13, 16, 17, 19, 20, 21, 22, 24, 25, 26, 27, 28], "standard": [0, 6, 21, 26, 27], "both": [0, 1, 5, 7, 8, 20, 21, 23, 24, 26], "hwdecoder_typ": 0, "arrai": 0, "list": [0, 1, 6, 7, 12, 13, 16, 17, 18, 20, 21, 23, 24, 26], "incom": [0, 7, 24, 26], "even": [0, 21], "integ": [0, 11, 26, 27], "between": [0, 1, 5, 7, 8, 16, 17, 20, 21, 23, 26, 27, 28], "128": [0, 26, 28], "3840": [0, 16], "portrait": [0, 20, 21, 26], "2160": [0, 16], "bits_per_pixel": 0, "per": [0, 1, 7, 12, 13, 15, 20, 24, 27, 28], "primari": [0, 1, 24], "8": [0, 1, 2, 7, 8, 9, 11, 12, 13, 16, 20, 23, 26, 27, 28], "10": [0, 2, 5, 8, 9, 12, 17, 20, 22, 23, 26, 27], "xma_frame_property_flag_compress": 0, "addit": [0, 1, 6, 16, 24, 25, 27], "out_fmt": [0, 5, 7, 12, 16, 26], "option": [0, 1, 5, 6, 7, 8, 9, 10, 11, 12, 16, 17, 20, 23, 24, 27, 28], "low_lat": [0, 7, 23, 26], "enabl": [0, 7, 10, 12, 13, 15, 16, 17, 18, 20, 21, 22, 23, 25, 26, 27, 28], "latency_log": [0, 12], "inform": [0, 1, 6, 7, 9, 16, 23, 25], "xma_scaler_session_cr": 0, "xma_scaler_set_log": 0, "xma_scaler_session_send_fram": 0, "xma_scaler_session_recv_frame_list": 0, "xma_scaler_session_destroi": 0, "xmascal": 0, "xmascalersess": 0, "prop": 0, "underli": [0, 24], "eventu": 0, "multipl": [0, 5, 16, 20, 21, 24, 26], "take": [0, 1, 7, 9, 10, 16, 26, 27], "further": [0, 5, 6, 7, 8, 22, 23, 24, 27], "upon": [0, 22], "xma_flush_again": 0, "frame_list": 0, "everi": [0, 6, 20, 23], "reach": [0, 21, 26], "end": [0, 7, 16, 20, 22, 23, 24, 26], "xma_error": 0, "xmascalerinoutproperti": 0, "xmascalerfilterproperti": 0, "16": [0, 1, 7, 8, 21, 26, 27], "hwscaler_typ": 0, "xma_abr_scaler_typ": 0, "num_output": 0, "xma_vpe_fmt_typ": 0, "framer": [0, 6, 7, 9, 16, 24, 27], "second": [0, 7, 24, 27, 28], "mix_rat": 0, "mix": [0, 20], "half": [0, 7, 12, 22, 26, 27], "top": [0, 5, 7, 8, 9, 11, 21, 26, 27], "crop": [0, 9, 17, 21, 26, 27], "disabl": [0, 7, 12, 13, 16, 17, 20, 25, 26, 27], "xma_enc_session_cr": 0, "xma_enc_session_set_log": 0, "xma_enc_session_send_fram": 0, "xma_enc_session_recv_data": 0, "xma_enc_session_destroi": 0, "xmaencod": 0, "xmaencodersess": 0, "enc_prop": 0, "about": [0, 1, 7, 16, 24], "data_s": 0, "respons": [0, 16], "xma_resend_and_recv": 0, "readi": [0, 19], "untouch": 0, "reus": [0, 16], "hwencoder_typ": 0, "lookahead_depth": [0, 6, 7, 12, 20, 22, 23, 24, 26], "lookahead": [0, 1, 2, 10, 12, 16, 17, 19, 20, 22, 26, 27], "modul": [0, 13, 19, 26, 28], "give": [0, 6, 9], "start": [0, 1, 6, 7, 11, 15, 16, 22, 23, 24, 28], "40": [0, 12, 20, 21], "rc_mode": [0, 12], "constant": [0, 21, 23, 26, 27], "qp": [0, 2, 7, 12, 17, 20, 21, 24, 26, 27], "cbr": [0, 2, 19, 21, 23, 24, 26, 27], "vbr": [0, 2, 20, 21, 24, 26, 27], "cvbr": [0, 2, 20, 21, 24, 26, 27], "bitrat": [0, 7, 9, 11, 12, 17, 19, 20, 22, 24, 26, 27], "kbp": [0, 11, 12], "fix": [0, 22, 24, 27], "quantiz": [0, 21, 23, 24, 26, 27], "51": [0, 12, 24, 26, 27], "264": [0, 1, 7, 8, 9, 10, 11, 12, 21, 26], "hevc": [0, 7, 9, 12, 15, 16, 20, 21, 24, 26, 27], "255": [0, 7, 12, 24, 26, 27], "av1": [0, 1, 7, 9, 12, 15, 16, 17, 20, 21, 26, 27], "gop_siz": 0, "maximum": [0, 12, 16, 20, 21, 24, 26, 27], "group": [0, 22, 28], "pictur": [0, 26, 27], "temp_aq_gain": [0, 12], "tempor": [0, 2, 12, 21, 24, 26, 27], "aq": [0, 2, 12, 20, 24, 26, 27], "gain": [0, 12, 24, 26, 27], "spat_aq_gain": [0, 12], "spatial": [0, 2, 12, 21, 24, 26, 27], "minqp": [0, 24], "minimum": [0, 2, 12, 26, 27], "maxqp": [0, 24], "profil": [0, 12, 17, 21, 26], "baselin": [0, 12, 21, 26], "main": [0, 12, 17, 18, 21, 22, 26, 27], "high": [0, 12, 15, 21, 22, 24, 26, 27], "intra": [0, 12, 21, 26, 27], "100": [0, 1, 9, 12, 21, 22, 26], "101": [0, 1, 12], "102": [0, 12], "103": [0, 12], "200": [0, 1, 9, 12], "codec": [0, 6, 7, 9, 10, 12, 15, 17, 20, 26], "slice": [0, 12, 16, 17, 20, 21, 26, 27], "spatial_aq": [0, 12, 26], "adapt": [0, 20], "temporal_aq": [0, 12, 26], "qp_mode": [0, 12, 26], "rel": [0, 11, 27], "uniform": [0, 26, 27], "tune_metr": [0, 6, 12, 17, 24, 26], "tune": [0, 7, 12, 17, 21, 26, 27], "metric": [0, 6, 12, 17, 20, 26, 27], "none": [0, 5, 12, 26, 28], "vq": [0, 6, 7, 12, 17, 21, 23, 24, 26, 27], "psnr": [0, 12, 20, 24, 26, 27], "ssim": [0, 12, 20, 24, 26, 27], "vmaf": [0, 12, 24, 26, 27], "forced_idr": [0, 26], "forc": [0, 1, 9, 17, 25, 26, 27, 28], "insert": [0, 9, 10, 11, 13, 17, 23, 26, 27, 28], "idr": [0, 10, 17, 21, 26, 27], "crf": [0, 2, 12, 20, 24, 26, 27], "expert_opt": [0, 12], "expert": [0, 12, 17], "device_typ": [0, 12], "select": [0, 6, 13, 16, 17, 20, 21, 23, 26, 27], "updat": [0, 1, 7, 9, 13, 18, 19, 20, 22], "These": [0, 16, 19, 21, 24, 26], "xmadynamicencparam": 0, "xmadynamicencparams_v2": 0, "clone": [0, 27], "attach": [0, 28], "check": [0, 9, 18, 22, 28], "statu": [0, 1, 21, 22, 27, 28], "xma_api_version_1_1": 0, "xma_api_version_1_1_2": 0, "xmasidedata": 0, "is_spatial_aq_gain_chang": 0, "spatial_aq_gain": [0, 12, 26], "is_temporal_aq_gain_chang": 0, "temporal_aq_gain": [0, 12, 26], "is_temporal_mode_chang": 0, "temporal_aq_mod": 0, "is_spatial_mode_chang": 0, "spatial_aq_mod": 0, "is_bit_rate_chang": 0, "bit_rate_kbp": 0, "is_b_frames_chang": 0, "num_b_fram": 0, "b": [0, 2, 5, 6, 7, 11, 12, 19, 20, 23, 24, 26, 27], "is_min_qp_chang": 0, "min_qp": [0, 12, 26], "is_max_qp_chang": 0, "max_qp": [0, 12, 26], "extra": [0, 13, 26, 28], "memeb": 0, "is_qp_chang": 0, "is_qp_i_offset_chang": 0, "qp_i_offset": [0, 26], "offset": [0, 5, 7, 9, 11, 17, 24, 26, 27], "is_qp_b_offset_chang": 0, "qp_b_offset": [0, 26], "is_min_bit_rate_chang": 0, "min_bit_rate_kbp": 0, "is_max_bit_rate_chang": 0, "max_bit_rate_kbp": 0, "xma_filter_session_cr": 0, "xma_filter_session_set_log": 0, "xma_filter_session_send_fram": 0, "xma_filter_session_recv_fram": 0, "xma_filter_session_destroi": 0, "xmafilt": 0, "xmafiltersess": 0, "reciev": 0, "re": [0, 5, 7, 19, 21, 23, 24, 26], "mai": [0, 1, 6, 16, 20, 21, 22, 23, 24, 26, 27, 28], "current": [0, 1, 16, 17, 19, 20, 24, 26, 27], "xmafilterportproperti": 0, "hwfilter_typ": 0, "entri": [0, 16, 20, 26], "xma_upload_filter_typ": 0, "xma_download_filter_typ": 0, "port": [0, 7], "xma_int32": 0, "immedi": 0, "delin": [0, 21, 23, 28], "improv": [0, 7, 17, 20, 21, 24, 26], "over": [0, 5, 7, 16, 20, 22, 26, 27], "here": [0, 6, 7, 9, 16, 24], "how": [0, 1, 4, 5, 6, 7, 8, 9, 12, 13, 16, 19, 21, 23, 24, 26, 27], "impli": [0, 21, 24, 26], "migrat": 0, "manual": [0, 20, 21, 28], "anoth": [0, 6, 16, 26, 27], "would": 0, "access": [0, 13, 21, 22, 27], "modifi": [0, 6, 17, 20, 24], "hdr10": [0, 17, 20, 21], "sei": [0, 17, 21], "defin": [0, 7, 16, 21, 24, 25, 26, 28], "own": [0, 22, 24, 28], "downstream": [0, 9, 26, 27], "predefin": 0, "user": [0, 1, 6, 7, 9, 15, 16, 21, 25, 26, 27, 28], "sidedata": 0, "delet": [0, 13], "sole": 0, "xma_dec_param_thread": 0, "xma_dec_param_wait": 0, "background": [0, 1, 7, 9, 16, 26, 27], "thread": [0, 9, 21, 25], "deploi": [0, 13, 21, 24], "cpu": [0, 1, 5, 6, 8, 9, 28], "util": [0, 7, 10, 11, 12, 16, 20, 21, 22, 23, 24, 25, 26, 28], "similarli": [0, 7, 24], "xma_enc_param_thread": 0, "xma_enc_param_wait": 0, "behav": [0, 28], "expect": [0, 10, 11, 21, 22, 26, 27], "behavior": [0, 7, 9, 21, 24, 26], "successfulli": 0, "regardless": 0, "pull": [0, 12], "try": [0, 22], "full": [0, 12, 16, 20, 21, 22, 26, 27], "accord": [0, 18, 19, 21], "last": [0, 26], "compress": [0, 6, 23, 24, 26], "No": [0, 2, 10, 11, 12, 21, 27], "loop": [0, 12, 17], "xma_scaler_param_thread": 0, "pipelin": [0, 1, 7, 9, 10, 11, 12, 13, 14, 16, 17, 18, 20, 21, 23, 24, 26], "extend": [0, 26], "xma_log_type_ama": 0, "xma_frame_side_data_dyn_enc_param": 0, "itself": [0, 24], "doe": [0, 1, 6, 9, 16, 20, 21, 22, 26, 27], "instead": [0, 9, 16, 24], "old": 0, "xmadyncompositorparam": 0, "setup": [0, 1, 20, 27, 28], "compositor": [0, 3, 7, 20, 26], "xmaa53closedcapt": 0, "close": [0, 16, 20, 21], "caption": [0, 20], "xmarpurawdata": 0, "rpu": 0, "xmarpudolbyvis": 0, "dolbi": 0, "xma_yuv422sp_10bit_fmt_typ": 0, "semi": 0, "planar": [0, 7], "xma_uyvy422_fmt_typ": 0, "uyvi": [0, 9], "xma_yuy2422_fmt_typ": 0, "yuy2": 0, "xma_jpeg_decoder_typ": 0, "jpeg": [0, 7, 20, 21, 26, 27], "xma_jpeg_encoder_typ": 0, "xma_lossless_jpeg_encoder_typ": 0, "lossless": [0, 26, 27], "63": [0, 12, 26], "xma_enc_rc_mode_crf": 0, "xma_enc_param_cabr_config": 0, "cabr": [0, 2, 17, 20, 26], "qualifi": [0, 19], "xma_enc_param_qu": 0, "int32": 0, "lossi": 0, "qualiti": [0, 3, 12, 15, 19, 22, 23, 26, 27], "xma_enc_param_still_imag": 0, "seri": [0, 7], "imag": [0, 1, 5, 8, 11, 17, 20, 21, 27, 28], "xmaencoderstillimag": 0, "int64_t": 0, "dt": 0, "muxer": 0, "xma_threading_flag_use_thread": 0, "xma_threading_flag_wait": 0, "wait": [0, 16, 22], "xma_miofilter_ml_core_id": 0, "core": [0, 1, 2, 7, 13, 16, 17, 18, 20, 21, 22, 26, 27, 28], "id": [0, 7, 12, 17, 21, 25, 26, 27], "xma_miofilter_ml_model": 0, "infer": [0, 7], "model": [0, 6, 7, 12, 16, 20, 24, 26, 28], "xma_miofilter_ml_perform": 0, "xma_miofilter_ml_tensor_dump": 0, "tensor": [0, 21], "dump": 0, "xma_miofilter_ml_inf_repeat": 0, "repeat": [0, 9, 26, 28], "xma_miofilter_ml_inf_period": 0, "period": [0, 12, 17, 23, 26, 27], "2d": [0, 1, 16, 17, 20], "relev": [0, 6, 16, 18, 23, 26, 28], "under": [0, 4, 6, 7, 10, 11, 12, 16, 20, 26, 27], "xmacrop": 0, "color": [0, 9, 20, 26, 27], "space": [0, 9, 10, 20, 21, 25, 26, 27], "convers": [0, 9, 20, 21, 26, 27], "xmacsc": 0, "drawbox": [0, 9, 17, 27], "xmadrawbox": 0, "overlai": [0, 7, 9, 11, 20, 21, 27], "xmaoverlai": 0, "pad": [0, 1, 9, 17, 21, 26], "xmapad": 0, "rotat": [0, 9, 20, 21, 24, 26, 27], "xmarot": 0, "subsampl": [0, 9, 20, 21, 26, 27], "xmasubsampl": 0, "tile": [0, 5, 9, 20, 21, 26, 27], "xmatil": 0, "xmacompositor": 0, "fpga": 0, "daemon": [0, 1, 16, 20, 28], "command": [0, 1, 5, 6, 7, 8, 9, 10, 11, 13, 17, 20, 21, 22, 24, 28], "tool": [0, 1, 20, 21, 24], "commun": [0, 21, 26, 27], "xrmadm": [0, 16], "xrmd": [0, 16, 20, 21, 26], "document": [0, 6, 12, 16, 17, 20, 24, 26, 27], "directori": [0, 5, 9, 12], "xrm_dec_reserv": 0, "xrm_dec_releas": 0, "xrm_dec_interfac": 0, "int": [0, 10, 11, 24], "xrmdecodecontext": 0, "xrm_dec_ctx": 0, "dev_index": 0, "xrminterfaceproperti": 0, "xrm_prop": 0, "were": [0, 17], "xrm_enc_reserv": 0, "xrm_enc_releas": 0, "xrm_enc_interfac": 0, "xrmencodecontext": 0, "xrm_enc_ctx": 0, "slice_id": 0, "is_xav1": 0, "is_ul": 0, "xrm_scale_reserv": 0, "xrm_scale_releas": 0, "xrm_scale_interfac": 0, "xrmscalecontext": 0, "scaler_xrm_ctx": 0, "input_prop": 0, "output_prop": 0, "addition": [0, 16, 25, 26], "engin": [0, 1, 6, 7, 17, 20, 24], "xrm_props_creat": 0, "reset": [0, 20, 21, 22], "rebuild": [0, 6], "xrm_dec_reserve_v2": 0, "xrm_dec_release_v2": 0, "xrmdecodecontextv2": 0, "xrmdecodepropsv2": 0, "xrm_dec_prop": 0, "xrm_enc_reserve_v2": 0, "xrm_enc_release_v2": 0, "xrmencodecontextv2": 0, "xrmencodepropsv2": 0, "xrm_enc_prop": 0, "xrm_scale_reserve_v2": 0, "xrm_scale_release_v2": 0, "xrmscalecontextv2": 0, "xrm_scale_ctx": 0, "xrmscalepropsv2": 0, "xrm_scale_prop": 0, "xrm_ml_reserve_v2": 0, "xrm_ml_release_v2": 0, "xrm_ml_interfac": 0, "xrmmlcontextv2": 0, "xrm_ml_ctx": 0, "xrmmlpropsv2": 0, "xrm_ml_prop": 0, "cd": [0, 27], "chmod": 0, "r": [0, 1, 7, 21, 26, 28], "777": 0, "mkdir": 0, "cmake": [0, 27], "j": [0, 10, 26], "amd": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 23, 24, 25, 26, 27, 28], "ama": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 16, 17, 18, 19, 23, 24, 25, 27, 28], "video": [1, 2, 3, 4, 9, 10, 11, 14, 15, 17, 18, 19, 20, 22, 23, 25, 27, 28], "sdk": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28], "build": [1, 6, 26, 27, 28], "xrm": [1, 21, 22, 25, 26, 27], "interfac": [1, 12, 15, 20, 21], "instal": [1, 5, 6, 7, 8, 9, 10, 11, 12, 16, 18, 20, 26, 27, 28], "upgrad": [1, 18], "board": [1, 20], "standalon": 1, "queri": [1, 16, 21], "administ": 1, "print": [1, 7, 12, 20, 26], "readabl": [1, 14, 16, 23], "manner": [1, 5, 7, 8, 21], "examin": [1, 21], "unprivileg": 1, "bare": [1, 28], "metal": [1, 28], "guest": [1, 13], "vm": [1, 13, 20], "privileg": 1, "target": [1, 5, 7, 8, 16, 17, 21, 22, 24, 25, 26, 27, 28], "instanc": [1, 13, 16, 23, 28], "pcie": [1, 13, 20, 21, 22], "notat": 1, "work": [1, 9, 12, 20, 22], "pci": [1, 21, 28], "hexadecim": 1, "often": 1, "lead": [1, 19], "two": [1, 10, 15, 16, 21, 24, 27], "four": [1, 11, 15], "digit": 1, "colon": 1, "sometim": [1, 22], "refer": [1, 7, 9, 13, 17, 21, 24, 25, 26, 27], "slot": [1, 13, 22], "decim": 1, "softwar": [1, 3, 7, 15, 18, 20, 21, 22, 25, 26], "systemd": [1, 28], "process": [1, 6, 9, 12, 13, 15, 16, 17, 20, 23, 24, 25, 26, 27], "alloc": [1, 7, 13, 16, 17, 21, 27, 28], "interact": [1, 7, 12, 16, 23, 25, 28], "gener": [1, 5, 7, 12, 13, 14, 17, 19, 20, 21, 23, 25, 28], "guid": [1, 6, 7, 9, 12, 26, 27], "stop": [1, 7], "systemctl": [1, 13, 28], "issu": [1, 7, 13, 26, 28], "obtain": [1, 6, 9, 23, 26, 27, 28], "sudo": [1, 13, 18, 22, 27, 28], "exampl": [1, 4, 15, 19, 21, 22, 23, 24, 28], "detect": [1, 22, 26], "2": [1, 5, 9, 11, 12, 13, 14, 15, 16, 18, 20, 21, 22, 24, 26, 27, 28], "o": [1, 11, 12, 28], "linux": [1, 13, 16], "5": [1, 2, 7, 10, 11, 12, 13, 16, 20, 21, 22, 26, 27, 28], "15": [1, 7, 12, 13, 20, 24, 28], "0": [1, 2, 5, 6, 7, 9, 10, 11, 12, 13, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28], "91": 1, "ubuntu": [1, 13, 20, 28], "smp": 1, "tue": 1, "nov": 1, "14": 1, "13": [1, 12], "30": [1, 7, 9, 12, 20, 21, 24], "08": [1, 7, 9], "utc": 1, "2023": [1, 28], "machin": [1, 7, 20, 24, 28], "x86_64": 1, "24": [1, 9], "memori": [1, 9, 20, 21, 27, 28], "127950": 1, "27": 1, "mb": [1, 20, 26], "124": 1, "95": 1, "gb": 1, "02d": 1, "00d": 1, "00h": 1, "33m": 1, "57": 1, "serial": [1, 28], "xfxxxxxxxxxx": 1, "03": [1, 7, 9, 28], "00": [1, 5, 7, 9, 21, 22, 28], "04": [1, 20, 28], "xfyyyyyyyyyi": 1, "01": [1, 7, 9, 21, 28], "02": [1, 22, 28], "cat": [1, 13, 28], "sy": [1, 7, 13, 22, 28], "class": [1, 13, 24, 26], "misc": [1, 13], "ama_transcod": [1, 13, 16, 22, 28], "x": [1, 5, 7, 9, 16, 20, 24, 26, 27], "bus_id": 1, "minu": [1, 26], "1": [1, 5, 6, 7, 9, 10, 11, 12, 13, 16, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28], "ama_transcoder0": [1, 5, 6, 7, 12, 13, 16, 19, 21, 22, 23, 26], "0000": [1, 22, 28], "version_inform": [1, 13], "zsp": [1, 13, 20], "sc": [1, 7, 13, 18, 20, 22], "9": [1, 2, 11, 13, 20, 22, 27], "esecur": [1, 13, 20], "fw": [1, 13, 20, 22], "ctrl": [1, 13, 20, 22], "patch": [1, 13, 20, 26, 27], "phy": [1, 13, 20], "environ": [1, 16, 19], "help": [1, 9, 12, 26, 28], "batch": 1, "commandarg": 1, "basic": 1, "shell": [1, 13, 16], "sub": [1, 16, 17], "impact": [1, 2, 7, 20, 24, 26], "applic": [1, 3, 4, 5, 6, 7, 8, 9, 12, 15, 18, 20, 21, 23, 24, 26, 27, 28], "via": [1, 16, 28], "json": [1, 6, 10, 16], "format": [1, 5, 6, 7, 9, 10, 12, 15, 16, 20, 24, 26, 27], "filenam": 1, "d": [1, 7, 12, 13, 16, 18, 20, 21, 22, 27, 28], "switch": [1, 22], "view": 1, "interest": 1, "electr": 1, "power": [1, 13, 15, 20, 21], "sensor": 1, "present": [1, 5, 6, 7, 8, 9, 10, 11, 12, 21], "hw": [1, 16], "cnt": 1, "counter": [1, 27], "topologi": [1, 23, 24], "info": [1, 12, 19, 21, 23, 25, 26, 27, 28], "thermal": 1, "known": [1, 6, 16, 22, 24, 27], "temperatur": 1, "76": 1, "c": [1, 3, 4, 5, 6, 7, 10, 12, 13, 14, 15, 17, 19, 20, 21, 22, 23, 24, 26, 28], "70": 1, "threshold": [1, 24, 26], "85": 1, "105": 1, "shutdown": 1, "110": 1, "749": 1, "v": [1, 5, 6, 7, 9, 11, 12, 16, 17, 19, 20, 21, 23, 24, 26, 28], "700": 1, "520": 1, "w": [1, 7, 12, 22, 26], "750": 1, "6": [1, 2, 6, 12, 13, 20, 22, 26, 27], "500": 1, "875": 1, "395": 1, "watt": 1, "aux": 1, "737": 1, "ddr": 1, "867": 1, "751": 1, "ml": [1, 13, 16, 17, 19, 20, 21, 24, 26], "752": 1, "3v": 1, "296": 1, "080": 1, "pex": 1, "374": 1, "233": 1, "12v": 1, "12": [1, 7, 12, 13, 16, 20, 21], "192": 1, "630": 1, "127": [1, 7], "diagnost": 1, "test": [1, 6, 13, 21, 28], "proper": [1, 5, 6, 7, 8, 9, 12, 13, 16], "progress": [1, 5, 20, 21], "mmio_perf": 1, "11": [1, 2, 5, 12, 20, 21, 28], "administr": [1, 28], "root": [1, 13, 26, 28], "virtual": [1, 13, 20, 22], "numvf": [1, 28], "activ": [1, 26, 28], "07d": 1, "01h": 1, "38m": 1, "xfxxxxxxxxxxx": 1, "xflyyyyyyyyi": 1, "vendor": [1, 12, 28], "0x10ee": 1, "0x5070": 1, "0x000e": 1, "0x048000": 1, "multimedia": [1, 13, 27, 28], "link": [1, 20, 21, 27], "negoti": [1, 27], "gen": [1, 25], "x4": 1, "05105": 1, "product": [1, 14, 19], "alveo": 1, "ma35d": [1, 5, 8, 14, 15, 16, 17, 20, 22], "pq": 1, "revis": 1, "oem": [1, 15, 21], "3704": 1, "xfxxxxxxx": 1, "pciectlpatch": 1, "pciefw": 1, "pciephypatch": 1, "7": [1, 2, 12, 20, 22, 26, 27, 28], "39": 1, "75": [1, 22], "69": 1, "600": [1, 5, 23, 24], "445": 1, "320": [1, 7], "868": 1, "187": 1, "472": 1, "968": 1, "axi": 1, "sram": 1, "uncorrect": 1, "segment": [1, 24], "correct": [1, 16], "read": [1, 7, 9], "write": [1, 7, 9, 25], "dfi": 1, "mbp": [1, 12, 19, 20], "33": [1, 5, 23], "66": 1, "68": [1, 12, 21], "135": 1, "202": 1, "402": 1, "784384": 1, "917504": 1, "mmio": 1, "4974": 1, "59392": 1, "subcommand": 1, "program": [1, 10, 11, 12, 13, 15, 18, 21, 22, 24], "verifi": [1, 12, 13], "extract": [1, 26], "arg": [1, 28], "p": [1, 7, 13, 26, 27], "syntax": [1, 7, 17, 26], "flash_sect": 1, "persist": [1, 21], "sequenti": 1, "subsystem": 1, "ma35_firmwar": [1, 13], "bin": [1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 22, 28], "region": [1, 13, 20, 24, 26], "Be": 1, "off": [1, 22, 23, 24, 26, 27, 28], "phase": [1, 21], "41": [1, 12], "2m": [1, 7], "22": [1, 5, 12, 20], "reboot": [1, 13, 22, 28], "effect": [1, 6, 23, 24, 26, 27], "compar": [1, 6], "match": [1, 20, 21], "mandatori": [1, 5, 6, 7, 8, 9, 10, 11, 12, 16], "script": [1, 5, 6, 7, 8, 9, 12, 13, 14, 16, 20, 23, 26], "sh": [1, 5, 6, 7, 8, 9, 12, 13, 16, 20, 22, 28], "boot": [1, 13, 16, 20], "list_cmd": [1, 16], "cu": [1, 16], "decod": [1, 6, 8, 11, 13, 14, 15, 16, 17, 20, 25], "scaler": [1, 7, 9, 16, 17], "encod": [1, 5, 6, 8, 11, 14, 15, 16, 17, 20, 21, 25], "am": [1, 16], "device_0": [1, 16], "cu_2": [1, 16], "cuid": [1, 16], "cutyp": [1, 16], "ip": [1, 16, 17, 22, 28], "kernel": [1, 11, 13, 16, 18, 22, 28], "kernelnam": [1, 16], "kernelalia": [1, 16], "encoder_type1_ama": [1, 16], "instancenam": [1, 16], "encoder_1": [1, 16], "cunam": [1, 16], "kernelplugin": [1, 16], "maxcapac": [1, 16], "497664000": [1, 16], "numchaninus": [1, 16], "usedload": [1, 16], "1000000": [1, 9, 16], "reservedload": [1, 16], "resrvusedload": [1, 16], "much": [1, 14, 16], "rang": [1, 10, 11, 16, 20, 21, 22, 23, 24, 26, 27], "noth": [1, 16], "fulli": [1, 16, 19, 21], "actual": [1, 16, 21, 24], "snapshot": [1, 16], "1080p60": [1, 7, 16, 21], "singl": [1, 7, 13, 20, 21, 26, 28], "deviceid": [1, 16], "scaler_ama": [1, 5, 7, 16, 17, 21, 26], "decoder_ama": [1, 16], "250000": [1, 16], "25": [1, 16, 24], "encoder_type2_ama": [1, 16], "lookahead_ama": [1, 16], "125000": [1, 16], "ml_ama": [1, 7, 16, 26], "enc_channel_ama": [1, 16], "8000": [1, 16], "decoder_av1_ama": [1, 16], "device_1": [1, 16], "Not": [1, 16, 26, 27], "observ": [1, 7, 13, 16, 22, 24], "quarter": [1, 16], "8th": [1, 16], "sinc": [1, 7, 16, 28], "plugin": [1, 6, 7, 9, 12, 13, 20, 21, 22, 25, 26], "gpu": [1, 16, 20, 21], "mani": [2, 6, 7, 9, 16, 21, 26, 27, 28], "adjust": [2, 6, 7, 19, 24, 26], "paramet": [2, 7, 9, 10, 11, 16, 19, 23, 25, 26, 28], "permiss": 2, "la": [2, 7, 21], "latenc": [2, 7, 12, 17, 20, 21, 26, 27], "mode": [2, 6, 12, 13, 17, 19, 20, 21, 25, 27], "slow": [2, 12, 16, 21, 24, 26, 27], "preset": [2, 12, 16, 20, 21, 26, 27, 28], "medium": [2, 12, 16, 21, 24, 26, 27], "fast": [2, 6, 12, 16, 20, 21, 24, 26, 27], "frame": [2, 5, 6, 7, 8, 9, 10, 12, 16, 17, 19, 20, 23, 24, 26, 27], "cqp": [2, 23, 24, 27], "roi": [2, 16, 20, 21], "map": [2, 5, 7, 10, 14, 16, 20, 21, 24, 26, 27], "49": 2, "normal": [2, 7, 12, 21, 26], "y": [2, 5, 6, 7, 9, 13, 16, 19, 21, 23, 24, 26, 27, 28], "low": [2, 12, 15, 17, 20, 21, 22, 24, 26, 27], "n": [2, 7, 8, 11, 16, 17, 18, 21, 24, 26], "ull": [2, 6, 12, 17, 20, 24, 26, 27], "53": [2, 12], "720": [2, 7, 9, 12, 16], "ident": [2, 7, 9, 16, 25, 26, 27], "statement": 2, "appli": [2, 5, 7, 8, 17, 26, 27], "filter": [3, 7, 12, 17, 20, 21, 22, 25, 27], "gstreamer": [3, 5, 6, 7, 12, 13, 16, 18, 20, 21, 24, 25], "abr": [3, 12, 16, 24, 25, 26], "ladder": [3, 16, 24, 25, 26], "xma": [3, 5, 6, 7, 8, 9, 13, 14, 18, 20, 21, 25, 27], "construct": [4, 7], "folder": [4, 5, 6, 7, 8, 9, 10, 12, 16, 26, 27], "illustr": [4, 6, 12, 16, 21, 24, 26, 27], "advanc": [4, 21], "api": [4, 12, 15, 16, 20, 21], "shown": [5, 16], "transfer": [5, 7, 8, 9, 17, 21, 26, 27], "hwdownload": [5, 7, 16, 26], "hwupload": [5, 6, 7, 24, 26], "split": [5, 7, 14, 16, 17, 20, 21], "fp": [5, 7, 9, 12, 20, 21, 26], "minim": [5, 8, 25], "traffic": [5, 8], "descript": [5, 7, 8, 10, 11, 25, 26, 27], "accumul": [5, 7, 8], "explain": [5, 6, 7, 8, 9, 16], "version": [5, 6, 7, 8, 9, 12, 13, 15, 17, 18, 21, 22, 26, 27, 28], "On": [5, 6, 7, 8, 9, 12, 13, 28], "premis": [5, 6, 7, 8, 9, 12, 15, 28], "export": [5, 6, 7, 8, 9, 12, 16, 23, 25, 27], "import": [5, 6, 7, 8, 9, 12, 18, 24], "variabl": [5, 6, 7, 8, 9, 12, 16, 25, 26, 27], "open": [5, 6, 7, 8, 9, 12, 26], "termin": [5, 6, 7, 8, 9, 12, 16, 25, 26], "correctli": [5, 6, 7, 8, 9, 12], "demonstr": [5, 6, 7, 9, 14, 19, 21, 23], "flip": [5, 7, 9, 26, 27], "hwaccel": [5, 6, 7, 16, 17, 19, 21, 23, 24, 26], "hwaccel_devic": [5, 6, 7, 16, 19, 21, 23, 26], "dev": [5, 6, 7, 9, 12, 13, 16, 17, 19, 21, 23, 26, 27, 28], "h264_ama": [5, 6, 7, 12, 16, 19, 21, 23, 26], "yuv420p": [5, 6, 7, 12, 16, 21, 24, 26], "filter_complex": [5, 7, 16, 17, 21, 26], "transpos": 5, "dir": [5, 22], "passthrough": [5, 17, 20], "a1": [5, 7], "b1": [5, 7], "f": [5, 6, 7, 10, 11, 16, 19, 21, 23, 24, 26], "mp4": [5, 7, 8, 9, 10, 11, 12, 16, 19, 21, 23, 26], "90_flip": 5, "270_flip": 5, "path": [5, 6, 7, 9, 10, 11, 12, 16, 25, 26, 27, 28], "avc": [5, 7, 9, 15, 17, 20, 21, 24, 27], "clip": [5, 6, 7, 24], "y4m": 5, "vid": 5, "l": [5, 7, 11, 22, 26], "lai": 5, "640": [5, 12, 16], "480": [5, 9, 12, 16], "in_w": 5, "800": [5, 23], "in_h": 5, "out_h": 5, "compos": [5, 11], "hide_bann": [5, 7, 19, 21], "input_1": 5, "input_2": 5, "input_3": 5, "input_4": 5, "out_r": [5, 7, 21, 26], "1920x1080": [5, 6, 7, 21, 24, 26], "hstack": 5, "bot": 5, "vstack": 5, "15m": [5, 7], "vframe": [5, 7, 16], "yuv420p10l": [5, 12, 16, 21, 26], "graph": [5, 7, 26], "As": [5, 7, 9, 13, 16, 21, 22, 23, 24, 28], "show": [5, 7, 8, 16, 21, 24], "crop_10b": 5, "vf": [5, 6, 7, 17, 20, 24, 26, 28], "1m": [5, 7, 26], "442": [5, 23], "neither": 5, "accept": [5, 7, 8, 9, 20, 26], "nor": 5, "yadif": 5, "lavfi": [5, 6, 24], "testsrc": [5, 24], "durat": [5, 24, 26], "60": [5, 6, 7, 9, 11, 12, 16, 22, 24, 26, 28], "rawvideo": [5, 6, 7, 16, 24], "drawtext": 5, "hello": 5, "fontcolor": 5, "yellow": 5, "fontsiz": 5, "36": 5, "page": [6, 7, 9, 10, 11, 13, 26, 28], "behind": 6, "measur": [6, 16, 24, 25], "maxim": 6, "topic": 6, "There": [6, 7, 9, 26], "longstand": 6, "goal": 6, "quantit": 6, "watch": 6, "inspect": [6, 9], "individu": [6, 16, 27], "led": 6, "evolut": 6, "algorithm": [6, 19], "solut": [6, 21], "common": [6, 22, 25], "peak": 6, "signal": [6, 26], "nois": 6, "ratio": [6, 12, 17, 21], "structur": [6, 24, 26], "similar": [6, 16, 21, 22], "index": [6, 10, 11, 17], "multimethod": 6, "assess": 6, "fusion": 6, "opinion": 6, "mo": [6, 20], "human": [6, 14, 23], "visual": [6, 15, 23, 24, 27], "screen": 6, "feedback": 6, "peopl": 6, "argu": 6, "best": [6, 19, 21, 22, 23, 24, 26, 27], "although": [6, 19], "consid": 6, "least": [6, 13, 28], "accur": 6, "jan": 6, "ozer": 6, "center": [6, 11], "post": 6, "hi": 6, "experiment": 6, "correl": [6, 21], "review": 6, "find": [6, 7, 9, 22, 26, 28], "furthermor": [6, 21, 23], "due": [6, 7, 9, 16, 22, 26, 27], "industri": [6, 26], "like": [6, 7, 23, 26], "ones": [6, 21, 24], "taught": 6, "higher": [6, 16, 23, 24, 26, 28], "wors": 6, "ey": 6, "x264": [6, 21], "x265": [6, 21], "object": [6, 12, 21, 23, 24, 26, 27], "discuss": 6, "subject": [6, 24], "appeal": 6, "what": [6, 16], "happen": [6, 24], "scene": [6, 24], "why": 6, "highli": [6, 21], "recommend": [6, 7, 9, 20, 21, 22, 23, 24], "undergon": 6, "transform": 6, "past": 6, "univers": 6, "state": [6, 7, 13, 20, 21, 22, 28], "fairli": 6, "altern": [6, 7, 20, 21, 22], "remain": 6, "long": [6, 16], "pre": [6, 8, 15, 21], "across": [6, 16, 20, 21, 27], "tutori": [6, 13, 15, 21, 26, 28], "cover": [6, 17], "chapter": [6, 26], "variou": [6, 7, 12, 14, 16, 18, 20, 21, 22, 24, 26, 27], "hevc_ama": [6, 7, 12, 16, 21, 24, 26], "av1_ama": [6, 7, 12, 21, 23, 26], "permut": 6, "pix_fmt": [6, 7, 12, 16], "2000k": 6, "real": [6, 12, 14, 15, 16, 19, 20, 22], "guarante": [6, 14], "howev": [6, 19, 21, 24, 26, 28], "better": [6, 23, 24], "achiev": [6, 7, 16, 19, 21, 23, 24, 28], "licens": [6, 26], "reason": 6, "binari": [6, 26], "deliv": [6, 21], "comprehens": [6, 9, 26], "easiest": 6, "static": [6, 7, 21, 24, 26], "john": 6, "van": 6, "sickl": 6, "among": [6, 20, 21, 23, 24], "precompil": 6, "recompil": 6, "repositori": [6, 16, 18, 22, 28], "instruct": [6, 7, 13, 16, 18, 20, 21, 22, 26, 27], "sampl": [6, 9, 10, 11, 14, 16, 20, 24, 26], "typic": [6, 16, 21, 24], "distort": [6, 24], "libvmaf": 6, "log_fmt": 6, "ms_ssim": 6, "log_path": 6, "log": [6, 7, 12, 14, 16, 22, 23, 27], "model_path": 6, "TO": 6, "widthxheigth": 6, "appropri": [6, 27], "vmaf_4k_v0": 6, "pkl": 6, "4k": [6, 21], "vmaf_float_v0": 6, "lower": [6, 20, 21, 22, 23, 24, 26, 27], "break": 7, "down": [7, 8, 21, 25, 26], "varieti": [7, 12, 27], "made": [7, 9, 14, 15, 16, 21], "task": [7, 9, 21, 28], "deleg": [7, 9], "mautil": [7, 9, 13, 20, 21], "runtim": [7, 9, 24], "overrid": [7, 9], "non": [7, 9, 17, 21], "explicitli": [7, 9, 16, 17, 20, 21, 22, 23], "within": [7, 16, 24, 26, 27, 28], "refin": 7, "subtask": 7, "hwupload_ama": [7, 16, 20, 26], "disk": [7, 9, 28], "chanc": [7, 9], "massiv": [7, 9], "bandwidth": [7, 9, 20, 21, 23], "notic": [7, 9, 12, 24], "drop": [7, 9, 12], "speed": [7, 9, 20, 21, 22, 24], "we": [7, 9, 25], "shm": [7, 9, 26], "ram": [7, 9, 13, 21, 28], "save": [7, 8, 10, 19], "nv12": [7, 9, 12, 16, 21, 26, 27], "tmp": [7, 8, 9, 10, 16, 25], "dec_out": 7, "explan": [7, 9], "move": [7, 9, 24], "twice": [7, 26], "convert": [7, 9, 22, 26, 27], "buffer": [7, 9, 11, 12, 17, 22, 23, 24, 26, 27], "signifi": 7, "oppos": 7, "audio": [7, 26], "ac3": [7, 22], "overwrit": 7, "prompt": 7, "sure": [7, 26], "yuv420": [7, 8], "5mbp": [7, 12], "5m": [7, 12, 19, 24], "sn1_av1": 7, "maintain": 7, "1080p": [7, 11, 12, 16, 21, 26], "8m": 7, "megabit": 7, "8000k": 7, "8000000": 7, "enc_out": 7, "pixel": [7, 8, 9, 12, 20, 24, 26, 27], "sn1_crf_hq": 7, "highest": [7, 21], "sn1_crf_lq": 7, "lowest": [7, 23], "8mbp": 7, "written": [7, 12, 21], "h264_to_hevc": 7, "them": 7, "_scale": 7, "1280x720": 7, "720x480": 7, "360x240": 7, "c1": 7, "d1": 7, "scale_1080p": 7, "scale_720p": 7, "scale_480p": 7, "scale_240p": 7, "togeth": [7, 16, 26, 27], "widthxheight": [7, 26], "scale_": 7, "_": [7, 16, 25], "6m": 7, "hevc_1080p60": 7, "av1_720p30": 7, "h264_480p30": 7, "av1_240p30": 7, "format_resoult": 7, "locat": [7, 9, 10, 11, 12, 14, 16, 23, 25, 26, 27, 28], "implement": [7, 10, 11, 19, 26], "hevc_1080p": [7, 9], "av1_720p": [7, 9], "h264_480p": [7, 9], "av1_240p": [7, 9], "ultra": [7, 12, 17, 20], "loglevel": [7, 19, 21], "10m": [7, 12], "trigger": 7, "4kp30": [7, 21], "resiz": [7, 9, 17, 20, 21, 26, 27], "3840x2160": [7, 21, 26], "outout": 7, "downscal": [7, 17, 20, 21, 27], "2x4kp60": 7, "explicit": [7, 21, 26], "hwdownload_ama": [7, 20, 26], "abil": [7, 24], "arbitrari": [7, 16], "ama_transcoderx": 7, "4x4kp60": [7, 21], "4kp6": 7, "out_3840x2160_0": 7, "out_3840x2160_1": 7, "servic": [7, 13, 15, 21, 22, 28], "distribut": [7, 21], "seq": [7, 21], "nostdin": [7, 21, 23], "out_t2_0_": 7, "out_av1_0_": 7, "ama_transcoderi": 7, "out_t2_1_": 7, "out_av1_1_": 7, "h264": [7, 8, 9, 10, 11, 12, 16, 26, 27], "64": [7, 20, 21, 26], "simultan": [7, 21], "1080p30": [7, 20, 21], "jpeg_ama": [7, 26], "prfix": 7, "03d": 7, "jpg": [7, 11], "pattern": [7, 9], "90": [7, 9, 21, 24, 26, 27], "04d": 7, "720p": [7, 12, 21, 26], "180": [7, 26, 27], "crop_ama": [7, 26], "b_left": [7, 26], "b_top": [7, 26], "b_w": [7, 26], "1280": [7, 9, 12, 16], "b_h": [7, 26], "pad_ama": [7, 26], "p_left": [7, 26], "p_top": [7, 26], "p_w": [7, 26], "1920": [7, 9, 12, 16, 24], "p_h": [7, 26], "1080": [7, 9, 12, 16, 24, 26], "pink": [7, 9], "rotate_ama": [7, 26], "angl": [7, 9, 26, 27], "degre": [7, 27], "rgb": [7, 9, 26, 27], "bgra": [7, 9, 21, 27], "colorspace_ama": [7, 26], "csc": [7, 26], "rgb2yuv": [7, 26], "rgba": [7, 21, 27], "yuv2rgb": [7, 26], "rgbp": [7, 21, 26, 27], "yuv422p": 7, "subsample_ama": [7, 26], "graphic": [7, 28], "processor": 7, "overlay_ama": [7, 26], "1000": 7, "tile_ama": [7, 26], "layout": [7, 22, 26, 27], "2x2": [7, 8, 11, 26], "thumnail": 7, "asset": [7, 21], "eq": 7, "pict_typ": 7, "144x144": 7, "vsync": 7, "vfr": 7, "out_": [7, 17], "out_000": 7, "out_999": 7, "compositor_ama": [7, 9, 20, 26], "enable_background": [7, 26], "black": [7, 26, 27], "input_param": [7, 26], "960x540": [7, 21], "out_x": [7, 26], "out_i": [7, 26], "zorder": [7, 26, 27], "408": 7, "208": 7, "808": 7, "1208": 7, "608": [7, 20], "border_inner_s": [7, 9, 26], "co": [7, 26], "sendcmd": [7, 26], "composite_stat": 7, "570": 7, "composite_test": 7, "000": [7, 9], "green": [7, 9], "border_outer_s": [7, 9, 26], "border_color": [7, 9, 26], "blue": [7, 9], "06": [7, 9, 28], "brown": [7, 9], "1280x540": 7, "in_i": [7, 26], "1082": 7, "inputs_en": [7, 26], "17": [7, 20, 22], "overlap": 7, "z": [7, 26, 27], "boarder": 7, "etc": [7, 13, 18, 20, 22, 23, 24, 27, 28], "prescrib": 7, "interv": [7, 27], "dynam": [7, 12, 17, 19, 20, 26, 27], "properti": [7, 9, 22, 26, 27], "zeromq": 7, "protocol": 7, "zmq": 7, "bind_address": 7, "tcp": 7, "5555": [7, 16], "mpegt": 7, "udp": 7, "mc_ip": 7, "mc_port": 7, "pkt_size": 7, "1316": 7, "python": [7, 14], "usr": [7, 18, 26], "python3": [7, 27], "context": 7, "url": 7, "argv": 7, "socket": 7, "req": 7, "connect": [7, 28], "cmd": 7, "stdin": 7, "send_str": 7, "recv": 7, "repli": 7, "printf": 7, "zmq_send": 7, "py": [7, 23], "localhost": [7, 25], "multicast": 7, "network": [7, 15, 21, 23, 28], "ffplai": [7, 20, 22], "address": [7, 28], "enhanc": [7, 19, 20, 21, 24, 26, 27], "def": 7, "ori": 7, "model_arg": [7, 16, 26], "mlop": 7, "roi_scale_ama": [7, 26], "res1": 7, "300k": 7, "probabl": [7, 24, 26], "plain": 7, "ml0": 7, "ml1": 7, "ml2": 7, "ml3_1": 7, "ml3_2": 7, "ml3_3": 7, "strength": [7, 24, 26], "ml_l": 7, "ml_n": 7, "ml_h": 7, "output1": 7, "output2": 7, "output3": 7, "output4": 7, "outputx": 7, "s_org": 7, "s_ml": 7, "sa": 7, "sb": 7, "sd": 7, "ml_in": 7, "ml_out": 7, "ml_out_sa": 7, "ml_out_sb": 7, "ml_out_sc": 7, "ml_out_sd": 7, "roi_a": 7, "roi_b": 7, "roi_c": 7, "roi_d": 7, "invok": [7, 17, 19, 20], "mlip": 7, "roi_map_typ": [7, 26], "rso": 7, "roi_overlay_ama": [7, 26], "transpar": [7, 21, 27], "rectangular": 7, "box": [7, 21, 26, 27], "200k": 7, "ama_pipeline_script": [8, 9], "ama_download": [8, 9, 27], "ama_upload": [8, 9, 24, 27], "tee": [8, 18, 28], "01_rotate_video": 8, "xil_rotate_": 8, "02_logo_overlai": 8, "500x100": 8, "right": [8, 9, 11, 27], "left": [8, 9, 11, 26, 27], "corner": [8, 11], "xil_logo_overlai": 8, "03_crop_zoom": 8, "300x200": 8, "begin": 8, "20": [8, 9, 11, 12, 20, 21, 24, 28], "xil_crop_zoom": 8, "04_multi_comp": 8, "4x": [8, 21], "equal": [8, 16, 25], "xil_multi_comp": 8, "By": [9, 16, 19, 24, 27], "filesink": [9, 27], "plug": [9, 15, 21], "fakesink": [9, 24], "displai": [9, 21, 23], "avoid": [9, 17, 22], "incorrect": [9, 16], "265": [9, 10, 11, 12, 21], "h265pars": 9, "h264pars": 9, "breviti": 9, "purpos": [9, 14, 28], "element": [9, 14, 18, 21, 22, 27], "gst": [9, 24, 25], "ama_av1enc": [9, 27], "launch": [9, 24], "filesrc": 9, "parsebin": 9, "ama_h264dec": [9, 27], "capsfilt": [9, 24], "cap": [9, 22, 24, 26, 27], "amamemori": 9, "unpack": 9, "elementari": [9, 10, 11, 12], "byte": [9, 27], "nalu": 9, "keyword": 9, "cli": 9, "desir": [9, 16, 22, 24, 26], "impos": [9, 26], "cost": [9, 23], "true": [9, 27], "capfilt": 9, "though": 9, "rawvideopars": [9, 24], "i420": [9, 24, 27], "ama_h264enc": [9, 27], "unformat": 9, "data": [9, 21, 22, 26], "timestamp": [9, 16, 17, 25], "eo": 9, "1200": [9, 24], "ama_scal": [9, 27], "src_0": 9, "ama_h265enc": [9, 24, 27], "6000000": 9, "queue": [9, 26], "src_1": 9, "2000000": 9, "src_2": 9, "src_3": 9, "360": [9, 12, 16], "240": 9, "decoupl": 9, "sink": 9, "dma": [9, 17, 20, 21, 26], "qtdemux": 9, "mp4mux": 9, "ama_videoconvert": [9, 27], "videotestsrc": 9, "num": [9, 12, 16, 17, 24], "300": [9, 16, 24], "ama_rot": [9, 27], "ama_videopad": [9, 27], "150": 9, "bottom": [9, 27], "0x00ffaa00": 9, "ama_videocrop": [9, 27], "ama_til": [9, 27], "grid_x": 9, "grid_i": 9, "sink_0": 9, "sink_1": 9, "sink_2": 9, "sink_3": 9, "ama_overlai": [9, 27], "50": [9, 12, 13, 24], "checker": [9, 20, 28], "ama_drawbox": [9, 27], "400": [9, 20], "thick": [9, 26, 27], "0x00ffff00": 9, "composit": [9, 11, 17, 23, 26, 27], "ama_compositor": [9, 27], "comp": 9, "dynamic_param": 9, "xpo": [9, 27], "ypo": [9, 26, 27], "border": [9, 26, 27], "inner": [9, 27], "0x00ff0000": 9, "108": 9, "5000000": [9, 12, 27], "0x0000ff00": 9, "hv": 9, "multi": [10, 14, 21, 23], "diagram": [10, 11], "ama_xabrladd": 10, "abrladd": 10, "ladder_output": 10, "feed": [10, 11, 13], "nal": 10, "short": 10, "devidx": 10, "31": [10, 11, 12], "na": [10, 11], "string": [10, 11, 12, 26], "codectyp": 10, "h265": [10, 11, 12, 24, 27], "forcekeyfram": 10, "k": 10, "keyfram": 10, "frequenc": [10, 17], "store": [10, 16], "enough": [10, 16], "720p60": [10, 21], "720p30": [10, 21], "480p30": [10, 21], "360p30": [10, 21], "160p30": [10, 21], "lookahead_en": 10, "exce": [11, 16, 24], "grid": [11, 26, 27], "logo": [11, 20], "lastli": 11, "stamp": 11, "ama_xcompositor": 11, "png": 11, "4294967295": [11, 27], "5000": [11, 24, 26], "horizont": [11, 21, 27], "fraction": [11, 16], "posit": [11, 24, 26, 27], "doubl": [11, 16, 21], "vertic": [11, 21, 26, 27], "2147483647": [11, 27], "2000": [11, 12], "along": [11, 14, 21, 26], "video1": 11, "video2": 11, "video3": 11, "video4": 11, "soft": [11, 20], "nativ": [12, 27], "built": [12, 21, 26], "bitstream": [12, 20], "ma35_decoder_app": 12, "codec_opt": 12, "exit": 12, "log_loc": 12, "consol": [12, 25, 28], "syslog": [12, 16, 25, 27], "log_fil": 12, "device_id": 12, "stream_loop": [12, 26], "fmt": 12, "xv15": 12, "n12": 12, "out1": 12, "ma35_encoder_app": 12, "emerg": 12, "alert": 12, "critic": 12, "warn": [12, 13, 20, 22, 23, 25], "debug": [12, 25, 28], "suppli": [12, 20, 26], "5000k": 12, "intraperiod": 12, "control_r": [12, 17, 19, 23, 26], "bf": [12, 26], "force_idr": 12, "main10_intra": 12, "main10": [12, 21], "high10": 12, "high10_intra": 12, "21": 12, "32": [12, 21, 26], "42": 12, "52": 12, "61": 12, "62": 12, "tier": [12, 26, 27], "bufsiz": [12, 23, 26], "vbv": [12, 26], "strict": [12, 20, 23, 26], "relax": [12, 23, 26], "dynamic_gop": [12, 26], "gop": [12, 23, 26, 27], "latency_m": [12, 26], "millisecond": [12, 26, 27], "60000": [12, 26, 27], "no_bll": [12, 24, 26], "stat": [12, 14, 19, 24], "csv": 12, "statist": [12, 19], "consult": [12, 26, 27], "out0": 12, "ma35_scaler_app": 12, "ingest": 12, "scaler_opt": 12, "reduc": [12, 14, 21, 22, 23, 24, 26], "resourc": [12, 17, 20, 21, 26, 27], "480p": 12, "360p": 12, "240p": 12, "848": [12, 16], "out2": 12, "out3": 12, "288": [12, 16], "160": [12, 16, 20], "out4": 12, "ma35_transcoder_app": 12, "scaler_ma": 12, "push": 12, "faster": [12, 14, 21], "than": [12, 13, 14, 20, 21, 22, 23, 24, 26, 27], "out_1_width": 12, "channel": [12, 21, 22, 24, 26, 27], "out_1_height": 12, "out_1_rat": 12, "out_2_width": 12, "out_2_height": 12, "out_2_rat": 12, "out_3_width": 12, "out_3_height": 12, "out_3_rat": 12, "out_4_width": 12, "out_4_height": 12, "out_4_rat": 12, "out_5_width": 12, "out_5_height": 12, "out_5_rat": 12, "out_6_width": 12, "out_6_height": 12, "out_6_rat": 12, "out_7_width": 12, "out_7_height": 12, "out_7_rat": 12, "out_8_width": 12, "out_8_height": 12, "out_8_rat": 12, "200kbp": 12, "350000000": 12, "automat": [12, 16, 21, 22, 26], "enc_hevc_main": 12, "enc_hevc_main_intra": 12, "main_intr": 12, "enc_hevc_main_10": 12, "enc_hevc_main10_intra": 12, "enc_h264_baselin": 12, "enc_h264_main": 12, "enc_h264_high": 12, "enc_h264_high_10": 12, "enc_h264_high_10_intra": 12, "aspect_ratio": 12, "aspect": [12, 17], "mpsoc": 12, "latency_mod": 12, "h264_av1_transcod": 12, "4000k": 12, "abr_ladder1": 12, "3000k": 12, "abr_ladder2": 12, "2500k": 12, "abr_ladder3": 12, "1250k": 12, "abr_ladder4": 12, "bio": [13, 20, 22], "sleep": [13, 20], "clock": [13, 20], "throttl": [13, 20], "4x4": [13, 21, 22], "bifurc": [13, 22], "io": 13, "sr": [13, 20], "iov": [13, 20], "secur": 13, "4g": 13, "ac": [13, 22], "gcc": [13, 28], "iommu": [13, 22, 28], "grub": 13, "grub_cmdline_linux_default": 13, "quiet": 13, "splash": 13, "amd_iommu": 13, "pt": [13, 17, 26], "intel_iommu": 13, "intel": [13, 28], "4gb": 13, "huge": [13, 28], "plu": [13, 28], "96": [13, 28], "2048": [13, 28], "4192": 13, "echo": [13, 18, 28], "nr_hugepag": [13, 28], "sysctl": [13, 28], "conf": [13, 28], "sum": 13, "12gb": [13, 21, 28], "2mb": 13, "36960": 13, "proc": 13, "cmdline": [13, 16], "boot_imag": 13, "vmlinuz": [13, 28], "mapper": 13, "vg00": 13, "rootlv": 13, "ro": 13, "meminfo": 13, "grep": [13, 28], "hugepages_tot": 13, "hugepages_fre": 13, "hugepages_rsvd": 13, "hugepages": 13, "kb": [13, 26], "establish": 13, "lspci": [13, 28], "vvvd": 13, "10ee": [13, 22, 28], "512mb": 13, "ppa": [13, 18, 22, 28], "debian": [13, 20, 22], "apt": [13, 18, 20, 22, 27, 28], "libhugetlbfs0": 13, "libboost": 13, "mark": [13, 20], "unhold": 13, "driver": [13, 18, 20, 21, 22, 28], "dpkg": 13, "awk": 13, "purg": 13, "hold": [13, 21], "fedora": [13, 20], "yum": [13, 18], "versionlock": 13, "lock": [13, 28], "exclud": 13, "dnf": 13, "modprob": [13, 22, 28], "parallel": [13, 16, 21, 27], "mamgmt": [13, 20, 22, 28], "asic": 13, "skip": [13, 26], "cold": [13, 20], "poweroff": 13, "confirm": [13, 28], "older": 13, "bash": [13, 16], "learn": [13, 20], "3rd": 14, "parti": 14, "conveni": [14, 18], "regard": 14, "stich": 14, "simplexma": 14, "collect": [14, 21], "simpl": [14, 15, 20, 21, 26], "startup": 14, "rung": [14, 17, 26], "stack": [15, 21], "seamlessli": [15, 21], "densiti": [15, 20, 21, 24, 26, 27], "live": [15, 21], "content": 15, "deliveri": [15, 21], "cdn": [15, 21], "compil": [15, 16, 21, 26], "ins": [15, 21], "offer": [15, 21, 24], "vpu": [15, 21], "aggreg": [15, 16, 21, 26], "4kp60": [15, 16, 20, 21, 26, 27], "notion": 16, "pool": [16, 17], "central": 16, "vari": [16, 21], "equival": 16, "heterogen": 16, "chassi": [16, 20, 21, 22, 28], "strictli": 16, "adher": 16, "subscript": [16, 22], "rest": 16, "identifi": [16, 27], "techniqu": 16, "submit": [16, 27], "bound": [16, 27], "rapidli": 16, "easi": [16, 24, 27], "straightforward": [16, 27], "entir": [16, 19, 26, 27], "method": [16, 18, 22, 27], "input1": 16, "ama_transcoder1": 16, "input2": 16, "therebi": 16, "failur": 16, "estim": 16, "percentag": [16, 26], "precis": 16, "mechan": 16, "dispatch": 16, "reli": [16, 28], "homogen": [16, 24, 26], "tail": 16, "var": 16, "jdf": 16, "With": [16, 20, 21], "well": [16, 26], "kei": [16, 18, 21, 24, 25], "pair": [16, 24], "vp9": [16, 17, 20, 21, 26, 27], "numer": [16, 26, 27], "denomin": 16, "load_factor": 16, "headroom": 16, "num_job_slot": 16, "absenc": 16, "additionalresources_": 16, "th": 16, "fit": 16, "throughput": [16, 20, 21, 24, 26, 27], "describe_job": 16, "example_2_core_encod": 16, "example_fast_preset": 16, "face": [16, 20, 24, 26], "text": [16, 20, 24, 26], "t10_transcode_multiscal": 16, "rendit": [16, 21, 26], "request": 16, "request_id": 16, "testjob": 16, "den": 16, "1600": 16, "900": 16, "1440": 16, "1360": 16, "768": 16, "1024": 16, "960": 16, "540": [16, 21], "352": 16, "jobslot_reserv": 16, "kind": 16, "intend": [16, 26], "xrm_jobreservation_timestamp_jdf": 16, "epoch": 16, "extens": 16, "uniqu": [16, 22], "xrm_reserve_id": 16, "retriev": 16, "dry_run": 16, "safe": 16, "ill": [16, 24], "syntact": 16, "fail": [16, 20, 22], "jobdescriptionfil": 16, "523634": 16, "6111": 16, "2777": 16, "dry": 16, "allot": 16, "xrm_jobreservation_79533431_t10_transcode_multiscal": 16, "aliv": 16, "press": 16, "enter": 16, "app": 16, "xrm_reserve_id_": 16, "xrm_reserve_id_0": 16, "xrm_reserve_id_1": 16, "distinct": [16, 28], "xrm_reserve_id_2": 16, "And": 16, "forth": [16, 20], "t27_2": 16, "dev_h264_4kp60_to_hevc_2kp60": 16, "var_dev_": 16, "var_dev_0_0": 16, "var_dev_0_1": 16, "orchestr": 16, "github": [16, 26, 27], "develop": [16, 18, 28], "tupl": [16, 26], "tjd": 16, "job_descript": 16, "jdf_path": 16, "ffmpeg_cmd": 16, "source1": 16, "job1": 16, "filter_hw_devic": 16, "dev0": 16, "offici": 16, "source2": 16, "job2": 16, "compon": [16, 23, 26], "relat": [16, 21, 25], "care": [16, 27], "enviro": 16, "xclbin": 16, "particularli": 16, "list_onedevice_cmd": 16, "requestid": 16, "usabl": 16, "load_xrm_plugins_cmd": 16, "loadxrmplugin": 16, "ok": [16, 28], "unload_xrm_plugins_cmd": 16, "unloadxrmplugin": 16, "notabl": 17, "asid": [17, 21], "convent": [17, 26], "xlnx_hwdev": 17, "xvbm_convert": 17, "force_key_fram": 17, "lowlat": 17, "splitbuff_mod": 17, "entropy_buffers_count": 17, "entropi": 17, "_width": 17, "_height": 17, "_rate": 17, "idx": 17, "delta": 17, "beta": 17, "tc": 17, "lscale": 17, "rc": 17, "pb": 17, "interpol": 17, "buf": 17, "splitbuff": 17, "unsplit": 17, "coef": 17, "coeffici": 17, "unlik": [17, 21, 28], "dbdf": [17, 28], "bdf": 17, "scheme": 17, "2d_ama": 17, "simpler": 17, "firmwar": [18, 20, 22], "robust": 18, "client": [18, 28], "remot": 18, "wget": 18, "qo": 18, "http": [18, 22, 26, 27], "www": [18, 26], "com": [18, 22, 27], "2018": 18, "master": [18, 21], "sign": 18, "asc": 18, "share": [18, 20, 26], "keyr": 18, "deb": 18, "arch": 18, "amd64": [18, 22], "artifactori": [18, 22], "lsb_releas": 18, "jammi": 18, "rpm": 18, "q": 18, "gpg": 18, "pubkei": 18, "qf": 18, "summari": 18, "repo": 18, "baseurl": 18, "basearch": 18, "gpgcheck": 18, "sslverifi": 18, "propos": 19, "matur": 19, "novel": 19, "design": [19, 27, 28], "optim": [19, 23, 24, 26, 27], "complex": [19, 26, 27], "signific": [19, 24], "compromis": [19, 23], "perceiv": 19, "predict": 19, "effici": [19, 21, 27, 28], "monitor": 19, "config": [19, 24, 27], "throughout": 19, "workaround": [20, 22], "toolchain": [20, 28], "preview": 20, "mlcae": 20, "v6": 20, "v5": 20, "span": 20, "avif": [20, 21], "dual": 20, "4kp120": [20, 26], "8kp30": 20, "min": [20, 24, 26, 27], "cea": 20, "708": 20, "dolbyvis": [20, 21], "t": [20, 26, 27, 28], "35": [20, 22, 24], "unifi": [20, 23], "inference_period": [20, 26], "our": 20, "n6": 20, "autom": 20, "balanc": [20, 21], "telemetri": 20, "heat": 20, "dissip": 20, "fine": [20, 24], "programm": 20, "hlg": 20, "denot": 20, "19": [20, 26, 28], "prefer": 20, "pf": [20, 22, 28], "bar0": 20, "bar2": 20, "bar4": 20, "512": 20, "server": [20, 26, 28], "scalabl": 20, "interlac": 20, "divis": [20, 21], "n5": [20, 22], "transport": [20, 26], "mpeg": [20, 21], "matrix": [20, 23], "8k": 20, "secondari": 20, "bu": [20, 28], "sbr": 20, "caus": [20, 24], "hang": [20, 22], "restor": 20, "ama_av1dec": [20, 27], "ivf": [20, 22], "ivfpars": 20, "demux": 20, "crash": [20, 22], "hl": [20, 22], "playback": 20, "slower": [20, 22], "recent": [20, 22], "2n6": 20, "player": [20, 22, 27], "vlc": [20, 22], "v3": [20, 22], "mux": [20, 22], "permit": [20, 22], "doesn": [20, 28], "1080x1920": 20, "complianc": 20, "downgrad": 20, "ga1": 20, "desktop": 20, "warm": 20, "attempt": [20, 22], "minut": [20, 22], "uptim": 20, "satellit": [20, 22], "roi_scal": 20, "innocu": 20, "boost": 20, "offload": 21, "intens": 21, "workload": 21, "popular": 21, "experi": 21, "suit": 21, "fed": 21, "special": [21, 23], "vcu": 21, "ycbcr": 21, "iso": [21, 28], "itu": 21, "constrain": [21, 22, 26, 27], "aom": 21, "aomedia": 21, "128x128": 21, "landscap": [21, 26], "8x": 21, "driven": [21, 24], "flexibl": 21, "hdr": 21, "popul": 21, "volum": 21, "light": 21, "charaterist": 21, "st2094_10": 21, "st2094_40": 21, "samsung": 21, "mdcv": 21, "cll": 21, "atc": 21, "sequenc": [21, 26], "constraint": [21, 23, 26], "ts_103572v010101p": 21, "pdf": 21, "whenev": 21, "a341s34": 21, "582r4": 21, "a341": 21, "amend": 21, "2094": 21, "smaller": 21, "pyramid": 21, "tap": 21, "stage": 21, "polyphas": 21, "luma": 21, "chroma": [21, 26], "2160p": 21, "larger": [21, 23, 24, 26], "intermediari": 21, "540p": 21, "initi": [21, 26], "latter": 21, "penalti": 21, "8x4kp60": 21, "8x1440p60": 21, "rich": [21, 27], "draw": [21, 26, 27], "blend": [21, 26, 27], "wherea": [21, 26], "intervent": 21, "fatal": [21, 25], "av1_1080p60": 21, "h264_1080p60": 21, "accompani": 21, "averag": 21, "npu": 21, "nomin": 21, "wide": [21, 26, 27], "vision": 21, "ai": 21, "art": 21, "awar": 21, "interchang": 21, "IFs": 21, "smallest": 21, "footprint": 21, "IF": 21, "packed10": [21, 26], "p010le": [21, 26], "p010_10le": [21, 27], "bgr0": 21, "argb": [21, 27], "uyv422": 21, "abgr": [21, 27], "uyvy422": 21, "yuyv422": 21, "270": [21, 26, 27], "422": [21, 26], "har": 21, "few": 21, "linearli": 21, "hyper": 21, "meet": [21, 26], "met": 21, "thing": 21, "4x1080p60": 21, "1x1080p240": 21, "vod": 21, "540p30": 21, "ftrt": 21, "turn": [21, 22, 24], "4kp75": [21, 26, 27], "84": 21, "136": 21, "1440p60": 21, "1440p30": 21, "540p60": 21, "2160p60": 21, "240p30": 21, "144p30": 21, "2160p30": 21, "dmesg": 22, "could": 22, "date": 22, "isol": [22, 28], "bifur": 22, "xxxxx": 22, "devicealloc": 22, "pressur": 22, "obviou": 22, "resolv": 22, "plai": 22, "videor": 22, "encount": [22, 26], "bitdepth": 22, "30fp": 22, "26": 22, "60fp": 22, "46": [22, 23], "greater": 22, "unavail": 22, "rmmod": 22, "reload": 22, "323": 22, "436842": 22, "05": 22, "hdma": 22, "hdma_link_rc2ep_xf": 22, "0x1": 22, "440802": 22, "rc2ep": 22, "element_cnt": 22, "link_table_pa": 22, "0x160000": 22, "443387": 22, "ctl": 22, "0x01": 22, "0x4": 22, "0x2": 22, "sl": 22, "0x97e00000": 22, "dh": 22, "0x0": 22, "dl": 22, "0x20831000": 22, "445538": 22, "0x06": 22, "rsv": 22, "llp_h": 22, "llp_l": 22, "447257": 22, "0x500": 22, "io_page_fault": 22, "mi": 22, "iommu_group": 22, "sort": 22, "34": 22, "appear": 22, "e2": 22, "bmc": 22, "msp432": 22, "pl": 22, "invalid": 22, "flac": 22, "aac": 22, "leav": 22, "0x564a3c67f580": 22, "good": 22, "exhibit": 22, "symptom": 22, "contact": 22, "err": 22, "focal": [22, 28], "2408071645": 22, "403": 22, "forbidden": 22, "162": 22, "443": 22, "bug": 22, "gpxbv": 22, "urlfix": 22, "trade": 23, "delai": [23, 24], "understood": [23, 24], "come": [23, 24], "let": 23, "unaccept": 23, "alwai": [23, 27], "overal": 23, "transmiss": 23, "restrict": [23, 26], "variat": 23, "expens": [23, 24], "Such": [23, 24], "log_ama_config": 23, "destin": [23, 25, 26], "max_siz": [23, 25], "1000mb": 23, "debug_file_lin": [23, 25], "debug_time_stamp": [23, 25], "debug_pid": [23, 25], "debug_thread": [23, 25], "perf_log": [23, 25], "log_ama_filter_perf": 23, "h264_1080p30": 23, "parse_log": 23, "0x564cbc07cc40": 23, "perfbeg": 23, "perfend": 23, "decsdk": 23, "dwlreservecmdbuf": 23, "rsv_osalsubmit": 23, "rsv_osalwait": 23, "dwldma_rc2ep": 23, "dwlenablecmdbuf": 23, "enc_0": 23, "431": 23, "0x560d0c196540": 23, "putfram": 23, "057": 23, "getpkt": 23, "009": 23, "postdecode_ch1": 23, "458": 23, "0x560d0c194980": 23, "end2end_ch1": 23, "168": 23, "958": 23, "985": 23, "primarili": 24, "pertain": [24, 28], "concept": 24, "analysi": 24, "score": 24, "necessarili": 24, "limit": [24, 26, 27], "spent": 24, "dure": [24, 28], "motion": 24, "vector": 24, "search": 24, "rdoq": 24, "term": 24, "bd": 24, "opportunist": 24, "degrad": [24, 26], "vq_offset": [24, 26], "neg": 24, "hierarch": 24, "unidirect": 24, "anchor": 24, "visibl": 24, "conferenc": 24, "occupi": 24, "area": [24, 27], "5x5": 24, "amen": 24, "sensit": 24, "reflect": 24, "lear": 24, "therein": 24, "flavor": 24, "stai": 24, "emploi": 24, "independ": 24, "concern": 24, "int_max": [24, 26], "consider": 24, "game": 24, "camera": 24, "pan": 24, "talk": 24, "head": 24, "exact": 24, "initil": 24, "compli": 24, "unexpect": 24, "dynamic_params_fil": [24, 26], "framenumbern1": 24, "key1": 24, "value1": 24, "framenumbern2": 24, "key2": 24, "value2": 24, "key3": 24, "value3": 24, "numb": 24, "minbrkbp": 24, "maxbrkbp": 24, "brkbp": 24, "taq": 24, "taqgain": 24, "saq": 24, "saqgain": 24, "qpoffseti": 24, "qpoffsetb": 24, "6000": 24, "1800": 24, "2400": 24, "10000": 24, "fakesrc": 24, "sizetyp": 24, "sizemax": 24, "4147200": 24, "4000": 24, "param1": 24, "ul": [25, 27], "aim": 25, "three": 25, "environment": 25, "global": [25, 26], "narrow": 25, "release_preset": 25, "debug_preset": 25, "async": 25, "10mb": 25, "log_ama_": 25, "pid": 25, "facil": 25, "local0": 25, "shortcut": 25, "debug_file_nam": 25, "1gb": 25, "asynchron": [25, 26], "trace": 25, "inclus": 25, "accel": 25, "vpi": [25, 26], "log_ama": 25, "100mb": 25, "want": [25, 26], "log_ama_perf": 25, "encapsul": 26, "n4": 26, "scope": [26, 27], "exhaust": [26, 27], "onlin": [26, 27], "org": [26, 27], "html": 26, "howto": 26, "infil": 26, "1000k": 26, "uri": 26, "vp9_ama": 26, "ljpeg_ama": 26, "hz": 26, "transact": [26, 27], "benign": 26, "0x5555b71aa980": 26, "492302": 26, "roman": 26, "max_bitr": 26, "5e": 26, "unspecifi": [26, 27], "uint32_max": 26, "400m": 26, "unless": 26, "control_mod": 26, "47": [26, 27], "treat": 26, "72": 26, "80": 26, "relative_load": 26, "const_qp": 26, "ii": 26, "disbal": 26, "iii": 26, "iv": 26, "empti": [26, 27, 28], "176x144": 26, "144x176": 26, "720x720": 26, "av1imag": 26, "av1if": 26, "coordin": [26, 27], "core_id": 26, "7680": 26, "except": 26, "drawbox_ama": 26, "multiscal": 26, "wxh": 26, "ordin": 26, "420": 26, "shortest": 26, "fals": [26, 27], "x_posit": 26, "y_posit": 26, "src_alpha": 26, "src": 26, "alpha": [26, 27], "dst_alpha": 26, "dst": 26, "raster": 26, "blit": 26, "solid": [26, 27], "mask": 26, "84467e": 26, "4895412794951729152": 26, "in_x": 26, "dsestin": 26, "horizon": 26, "a8r8g8b8": 26, "insid": 26, "outsid": 26, "eof_act": 26, "eof": 26, "endal": 26, "against": 26, "Its": 26, "nb_input": 26, "cutoff": 26, "100000": 26, "67": 26, "5670": 26, "shut": 26, "That": [26, 28], "spend": 26, "block": 26, "dqp": 26, "dqp_and_roi": 26, "static_map_fil": 26, "ceil": 26, "divid": 26, "boundari": 26, "shade": 26, "rectangl": 26, "skip_fram": 26, "toggl": 26, "highlight_threshold": 26, "introduc": 26, "worth": 26, "zip": [26, 27], "ma35d_sdk_v1": [26, 27], "0_ffmpeg": 26, "unzip": [26, 27], "ma35_ffmpeg": 26, "fork": 26, "wiki": 26, "libhugetlbf": 26, "nasm": 26, "yasm": 26, "navig": 26, "alsa": 26, "libxcb": 26, "xfix": 26, "shape": 26, "xlib": 26, "libmfx": 26, "vaapi": 26, "vulkan": 26, "prefix": 26, "pwd": 26, "strip": 26, "vpe": 26, "libxrm": 26, "lib": [26, 27, 28], "lvpi": 26, "lroi_scal": 26, "llog_ama": 26, "lxrm": 26, "lxrm_interfac": 26, "lhugetlbf": 26, "lpthread": 26, "lstdc": 26, "lm": 26, "ldl": 26, "lrt": 26, "cflag": 26, "dsupport_os": 26, "ldflag": 26, "wl": 26, "rpath": 26, "libavutil": 26, "libavfilt": 26, "libavcodec": 26, "libavformat": 26, "libavdevic": 26, "libswscal": 26, "libswresampl": 26, "libx264": 26, "gnu": 26, "81": 26, "workflow": 27, "editor": 27, "broadcast": 27, "freedesktop": 27, "ama_h265dec": 27, "ama_vp9dec": 27, "cropper": 27, "ama_jpegdec": 27, "ama_jpegenc": 27, "ama_ljpegenc": 27, "obu": 27, "One": 27, "nv12_4l4": 27, "nv12_10le32": 27, "p010_10e": 27, "i420_10l": 27, "nv12_10le_4l4": 27, "boolean": 27, "isn": 27, "consecut": 27, "distanc": 27, "analyz": 27, "account": 27, "35000000000": 27, "fquantiz": 27, "temporal": 27, "vma": 27, "bll": 27, "i420_10b": 27, "bgr": 27, "succeed": 27, "144": 27, "7580": 27, "0xff000000": 27, "side": 27, "i422": 27, "beld": 27, "float": 27, "0x00rrggbb": 27, "16777215": 27, "outer": 27, "90r": 27, "clockwis": 27, "90l": 27, "horiz": 27, "horzont": 27, "vert": 27, "lr": 27, "upper": 27, "diagon": 27, "ur": 27, "ll": 27, "orient": 27, "tag": 27, "unsign": 27, "unnecessari": 27, "upstream": 27, "larg": 27, "insuffici": 27, "0_gstreamer": 27, "ma35_gstream": 27, "prerequisit": 27, "ninja": 27, "flex": 27, "bison": 27, "pip": 27, "pkg": 27, "libjansson": 27, "uuid": 27, "snap": 27, "classic": 27, "pip3": 27, "meson": 27, "git": 27, "checkout": 27, "f6e672f27fcac06af58d7ac995551893d36944c": 27, "cp": 27, "ama_gstream": 27, "ln": 27, "subproject": 27, "c_include_path": 27, "library_path": 27, "technologi": 28, "kvm": 28, "qemu": 28, "libvirt": 28, "bridg": 28, "virt": 28, "lscpu": 28, "sbin": 28, "domain": 28, "corpor": 28, "5070": 28, "lsmod": 28, "831488": 28, "sriov_numvf": 28, "5071": 28, "physic": 28, "creation": 28, "libvirtd": 28, "wed": 28, "07": 28, "09": 28, "44": 28, "pdt": 28, "7h": 28, "ago": 28, "fossa": 28, "instanti": 28, "12288": 28, "vcpu": 28, "q35": 28, "qcow2": 28, "variant": 28, "ubuntu20": 28, "pty": 28, "target_typ": 28, "ttys0": 28, "casper": 28, "initrd": 28, "apic": 28, "ioapic": 28, "intremap": 28, "eim": 28, "caching_mod": 28, "memoryback": 28, "hugepag": 28, "nosharepag": 28, "hostdev": 28, "xx": 28, "vfio": 28, "storag": 28, "virsh": 28, "edit": 28, "kib": 28, "acpi": 28, "vmport": 28, "rng": 28, "ssh": 28, "openssh": 28, "net": 28, "dhcp": 28, "leas": 28, "6gb": 28, "3072": 28, "3168": 28, "dkm": 28, "essenti": 28, "procedur": 28, "sai": 28, "intent": 28, "nest": 28, "vsdk_vm_passthrough": 28, "sriov_drivers_autoprob": 28}, "objects": {"": [[0, 0, 1, "c.XmaDataBuffer", "XmaDataBuffer"], [0, 0, 1, "c.XmaDecoderProperties", "XmaDecoderProperties"], [0, 0, 1, "c.XmaDynamicEncParams", "XmaDynamicEncParams"], [0, 0, 1, "c.XmaDynamicEncParams_v2", "XmaDynamicEncParams_v2"], [0, 0, 1, "c.XmaEncoderProperties", "XmaEncoderProperties"], [0, 0, 1, "c.XmaFilterPortProperties", "XmaFilterPortProperties"], [0, 0, 1, "c.XmaFilterProperties", "XmaFilterProperties"], [0, 0, 1, "c.XmaFrame", "XmaFrame"], [0, 0, 1, "c.XmaFrameProperties", "XmaFrameProperties"], [0, 0, 1, "c.XmaParameter", "XmaParameter"], [0, 0, 1, "c.XmaScalerInOutProperties", "XmaScalerInOutProperties"], [0, 0, 1, "c.XmaScalerProperties", "XmaScalerProperties"], [0, 1, 1, "c.xma_data_buffer_alloc", "xma_data_buffer_alloc"], [0, 1, 1, "c.xma_data_buffer_free", "xma_data_buffer_free"], [0, 1, 1, "c.xma_data_from_buffer_clone", "xma_data_from_buffer_clone"], [0, 1, 1, "c.xma_dec_session_create", "xma_dec_session_create"], [0, 1, 1, "c.xma_dec_session_destroy", "xma_dec_session_destroy"], [0, 1, 1, "c.xma_dec_session_get_properties", "xma_dec_session_get_properties"], [0, 1, 1, "c.xma_dec_session_recv_frame", "xma_dec_session_recv_frame"], [0, 1, 1, "c.xma_dec_session_send_data", "xma_dec_session_send_data"], [0, 1, 1, "c.xma_dec_session_set_log", "xma_dec_session_set_log"], [0, 1, 1, "c.xma_enc_session_create", "xma_enc_session_create"], [0, 1, 1, "c.xma_enc_session_destroy", "xma_enc_session_destroy"], [0, 1, 1, "c.xma_enc_session_recv_data", "xma_enc_session_recv_data"], [0, 1, 1, "c.xma_enc_session_send_frame", "xma_enc_session_send_frame"], [0, 1, 1, "c.xma_enc_session_set_log", "xma_enc_session_set_log"], [0, 1, 1, "c.xma_filter_session_create", "xma_filter_session_create"], [0, 1, 1, "c.xma_filter_session_destroy", "xma_filter_session_destroy"], [0, 1, 1, "c.xma_filter_session_recv_frame", "xma_filter_session_recv_frame"], [0, 1, 1, "c.xma_filter_session_send_frame", "xma_filter_session_send_frame"], [0, 1, 1, "c.xma_filter_session_set_log", "xma_filter_session_set_log"], [0, 1, 1, "c.xma_frame_add_side_data", "xma_frame_add_side_data"], [0, 1, 1, "c.xma_frame_alloc", "xma_frame_alloc"], [0, 1, 1, "c.xma_frame_clear_all_side_data", "xma_frame_clear_all_side_data"], [0, 1, 1, "c.xma_frame_clone", "xma_frame_clone"], [0, 1, 1, "c.xma_frame_dec_ref", "xma_frame_dec_ref"], [0, 1, 1, "c.xma_frame_free", "xma_frame_free"], [0, 1, 1, "c.xma_frame_from_buffers_clone", "xma_frame_from_buffers_clone"], [0, 1, 1, "c.xma_frame_get_first_side_data", "xma_frame_get_first_side_data"], [0, 1, 1, "c.xma_frame_get_next_side_data", "xma_frame_get_next_side_data"], [0, 1, 1, "c.xma_frame_get_next_side_data_of_type", "xma_frame_get_next_side_data_of_type"], [0, 1, 1, "c.xma_frame_get_plane_height", "xma_frame_get_plane_height"], [0, 1, 1, "c.xma_frame_get_plane_size", "xma_frame_get_plane_size"], [0, 1, 1, "c.xma_frame_get_plane_stride", "xma_frame_get_plane_stride"], [0, 1, 1, "c.xma_frame_get_side_data", "xma_frame_get_side_data"], [0, 1, 1, "c.xma_frame_inc_ref", "xma_frame_inc_ref"], [0, 1, 1, "c.xma_frame_planes_get", "xma_frame_planes_get"], [0, 1, 1, "c.xma_frame_remove_side_data", "xma_frame_remove_side_data"], [0, 1, 1, "c.xma_frame_remove_side_data_type", "xma_frame_remove_side_data_type"], [0, 1, 1, "c.xma_initialize", "xma_initialize"], [0, 1, 1, "c.xma_log_init", "xma_log_init"], [0, 1, 1, "c.xma_log_release", "xma_log_release"], [0, 1, 1, "c.xma_logmsg", "xma_logmsg"], [0, 1, 1, "c.xma_release", "xma_release"], [0, 1, 1, "c.xma_scaler_session_create", "xma_scaler_session_create"], [0, 1, 1, "c.xma_scaler_session_destroy", "xma_scaler_session_destroy"], [0, 1, 1, "c.xma_scaler_session_recv_frame_list", "xma_scaler_session_recv_frame_list"], [0, 1, 1, "c.xma_scaler_session_send_frame", "xma_scaler_session_send_frame"], [0, 1, 1, "c.xma_side_data_alloc", "xma_side_data_alloc"], [0, 1, 1, "c.xma_side_data_dec_ref", "xma_side_data_dec_ref"], [0, 1, 1, "c.xma_side_data_free", "xma_side_data_free"], [0, 1, 1, "c.xma_side_data_get_metadata", "xma_side_data_get_metadata"], [0, 1, 1, "c.xma_side_data_get_refcount", "xma_side_data_get_refcount"], [0, 1, 1, "c.xma_side_data_inc_ref", "xma_side_data_inc_ref"], [0, 1, 1, "c.xma_side_data_read", "xma_side_data_read"], [0, 1, 1, "c.xma_side_data_set_metadata", "xma_side_data_set_metadata"], [0, 1, 1, "c.xma_side_data_write", "xma_side_data_write"], [0, 1, 1, "c.xrm_dec_release", "xrm_dec_release"], [0, 1, 1, "c.xrm_dec_release_v2", "xrm_dec_release_v2"], [0, 1, 1, "c.xrm_dec_reserve", "xrm_dec_reserve"], [0, 1, 1, "c.xrm_dec_reserve_v2", "xrm_dec_reserve_v2"], [0, 1, 1, "c.xrm_enc_release", "xrm_enc_release"], [0, 1, 1, "c.xrm_enc_release_v2", "xrm_enc_release_v2"], [0, 1, 1, "c.xrm_enc_reserve", "xrm_enc_reserve"], [0, 1, 1, "c.xrm_enc_reserve_v2", "xrm_enc_reserve_v2"], [0, 1, 1, "c.xrm_ml_release_v2", "xrm_ml_release_v2"], [0, 1, 1, "c.xrm_ml_reserve_v2", "xrm_ml_reserve_v2"], [0, 1, 1, "c.xrm_scale_release", "xrm_scale_release"], [0, 1, 1, "c.xrm_scale_release_v2", "xrm_scale_release_v2"], [0, 1, 1, "c.xrm_scale_reserve", "xrm_scale_reserve"], [0, 1, 1, "c.xrm_scale_reserve_v2", "xrm_scale_reserve_v2"], [10, 3, 1, "cmdoption-codectype", "--codectype"], [10, 3, 1, "cmdoption-devidx", "--devidx"], [10, 3, 1, "cmdoption-file", "--file"], [10, 3, 1, "cmdoption-forcekeyframe", "--forcekeyframe"], [10, 3, 1, "cmdoption-json", "--json"], [26, 3, 1, "cmdoption-b-v", "-b:v"], [26, 3, 1, "cmdoption-bf", "-bf"], [26, 3, 1, "cmdoption-bufsize", "-bufsize"], [10, 3, 1, "cmdoption-c", "-c"], [26, 3, 1, "cmdoption-c-v", "-c:v"], [26, 3, 1, "cmdoption-cabr", "-cabr"], [26, 3, 1, "cmdoption-control_rate", "-control_rate"], [26, 3, 1, "cmdoption-cores", "-cores"], [26, 3, 1, "cmdoption-crf", "-crf"], [26, 3, 1, "cmdoption-dynamic_gop", "-dynamic_gop"], [26, 3, 1, "cmdoption-dynamic_params_file", "-dynamic_params_file"], [10, 3, 1, "cmdoption-f", "-f"], [26, 3, 1, "cmdoption-filter_complex", "-filter_complex"], [26, 3, 1, "cmdoption-forced_idr", "-forced_idr"], [26, 3, 1, "cmdoption-g", "-g"], [26, 3, 1, "cmdoption-hwaccel", "-hwaccel"], [10, 3, 1, "cmdoption-i", "-i"], [10, 3, 1, "cmdoption-j", "-j"], [10, 3, 1, "cmdoption-k", "-k"], [26, 3, 1, "cmdoption-latency_ms", "-latency_ms"], [26, 3, 1, "cmdoption-level", "-level"], [26, 3, 1, "cmdoption-lookahead_depth", "-lookahead_depth"], [26, 3, 1, "cmdoption-low_latency", "-low_latency"], [26, 3, 1, "cmdoption-max_bitrate", "-max_bitrate"], [26, 3, 1, "cmdoption-max_qp", "-max_qp"], [26, 3, 1, "cmdoption-min_qp", "-min_qp"], [26, 3, 1, "cmdoption-no_bll", "-no_bll"], [26, 3, 1, "cmdoption-out_fmt", "-out_fmt"], [26, 3, 1, "cmdoption-preset", "-preset"], [26, 3, 1, "cmdoption-profile", "-profile"], [26, 3, 1, "cmdoption-qp", "-qp"], [26, 3, 1, "cmdoption-qp_b_offset", "-qp_b_offset"], [26, 3, 1, "cmdoption-qp_i_offset", "-qp_i_offset"], [26, 3, 1, "cmdoption-qp_mode", "-qp_mode"], [26, 3, 1, "cmdoption-quality", "-quality"], [26, 3, 1, "cmdoption-r", "-r"], [26, 3, 1, "cmdoption-resize", "-resize"], [26, 3, 1, "cmdoption-s", "-s"], [26, 3, 1, "cmdoption-slice", "-slice"], [26, 3, 1, "cmdoption-spatial_aq", "-spatial_aq"], [26, 3, 1, "cmdoption-spatial_aq_gain", "-spatial_aq_gain"], [26, 3, 1, "cmdoption-temporal_aq", "-temporal_aq"], [26, 3, 1, "cmdoption-temporal_aq_gain", "-temporal_aq_gain"], [26, 3, 1, "cmdoption-tier", "-tier"], [26, 3, 1, "cmdoption-tune_metrics", "-tune_metrics"], [26, 3, 1, "cmdoption-type", "-type"], [26, 3, 1, "cmdoption-vf", "-vf"], [27, 3, 1, "cmdoption-arg-allow-downscaling", "allow-downscaling"], [27, 3, 1, "cmdoption-arg-alpha", "alpha"], [27, 3, 1, "cmdoption-arg-ama_drawbox", "ama_drawbox"], [27, 3, 1, "cmdoption-arg-ama_overlay", "ama_overlay"], [27, 3, 1, "cmdoption-arg-ama_rotate", "ama_rotate"], [27, 3, 1, "cmdoption-arg-ama_tile", "ama_tile"], [27, 3, 1, "cmdoption-arg-ama_videoconvert", "ama_videoconvert"], [27, 3, 1, "cmdoption-arg-ama_videocrop", "ama_videocrop"], [27, 3, 1, "cmdoption-arg-ama_videopad", "ama_videopad"], [27, 3, 1, "cmdoption-arg-b-frames", "b-frames"], [27, 3, 1, "cmdoption-arg-background", "background"], [27, 3, 1, "cmdoption-arg-background-color", "background-color"], [27, 3, 1, "cmdoption-arg-bitrate", "bitrate"], [27, 3, 1, "cmdoption-arg-border-color", "border-color"], [27, 3, 1, "cmdoption-arg-border-inner-width", "border-inner-width"], [27, 3, 1, "cmdoption-arg-border-outer-width", "border-outer-width"], [26, 3, 1, "cmdoption-arg-colorspace_ama", "colorspace_ama"], [26, 3, 1, "cmdoption-arg-compositor_ama", "compositor_ama"], [27, 3, 1, "cmdoption-arg-core-id", "core-id"], [26, 3, 1, "cmdoption-arg-core_id", "core_id"], [27, 3, 1, "cmdoption-arg-crf", "crf"], [27, 3, 1, "cmdoption-arg-crop-bottom", "crop-bottom"], [27, 3, 1, "cmdoption-arg-crop-left", "crop-left"], [27, 3, 1, "cmdoption-arg-crop-right", "crop-right"], [27, 3, 1, "cmdoption-arg-crop-top", "crop-top"], [26, 3, 1, "cmdoption-arg-crop_ama", "crop_ama"], [26, 3, 1, "cmdoption-arg-cutoff", "cutoff"], [27, 3, 1, "cmdoption-arg-device", "device"], [27, 3, 1, "cmdoption-arg-device-type", "device-type"], [26, 3, 1, "cmdoption-arg-drawbox_ama", "drawbox_ama"], [27, 3, 1, "cmdoption-arg-dynamic-gop", "dynamic-gop"], [27, 3, 1, "cmdoption-arg-encoding-params-file", "encoding-params-file"], [27, 3, 1, "cmdoption-arg-forced-idr", "forced-idr"], [27, 3, 1, "cmdoption-arg-gop-length", "gop-length"], [27, 3, 1, "cmdoption-arg-height", "height"], [26, 3, 1, "cmdoption-arg-highlight_threshold", "highlight_threshold"], [26, 3, 1, "cmdoption-arg-hwdownload_ama", "hwdownload_ama"], [26, 3, 1, "cmdoption-arg-hwupload_ama", "hwupload_ama"], [27, 3, 1, "cmdoption-arg-idr-interval", "idr-interval"], [26, 3, 1, "cmdoption-arg-inference_period", "inference_period"], [27, 3, 1, "cmdoption-arg-latency-logging", "latency-logging"], [27, 3, 1, "cmdoption-arg-latency-ms", "latency-ms"], [27, 3, 1, "cmdoption-arg-lookahead-depth", "lookahead-depth"], [27, 3, 1, "cmdoption-arg-low-latency", "low-latency"], [27, 3, 1, "cmdoption-arg-max-bitrate", "max-bitrate"], [27, 3, 1, "cmdoption-arg-max-qp", "max-qp"], [27, 3, 1, "cmdoption-arg-min-qp", "min-qp"], [26, 3, 1, "cmdoption-arg-ml_ama", "ml_ama"], [26, 3, 1, "cmdoption-arg-model", "model"], [26, 3, 1, "cmdoption-arg-model_args", "model_args"], [26, 3, 1, "cmdoption-arg-nb_inputs", "nb_inputs"], [27, 3, 1, "cmdoption-arg-no-bll", "no-bll"], [26, 3, 1, "cmdoption-arg-overlay_ama", "overlay_ama"], [26, 3, 1, "cmdoption-arg-pad_ama", "pad_ama"], [27, 3, 1, "cmdoption-arg-preset", "preset"], [27, 3, 1, "cmdoption-arg-qp", "qp"], [27, 3, 1, "cmdoption-arg-qp-b-offset", "qp-b-offset"], [27, 3, 1, "cmdoption-arg-qp-i-offset", "qp-i-offset"], [27, 3, 1, "cmdoption-arg-qp-mode", "qp-mode"], [27, 3, 1, "cmdoption-arg-rate-control", "rate-control"], [26, 3, 1, "cmdoption-arg-roi_map_type", "roi_map_type"], [26, 3, 1, "cmdoption-arg-roi_overlay_ama", "roi_overlay_ama"], [26, 3, 1, "cmdoption-arg-roi_scale_ama", "roi_scale_ama"], [26, 3, 1, "cmdoption-arg-rotate_ama", "rotate_ama"], [26, 3, 1, "cmdoption-arg-scaler_ama", "scaler_ama"], [26, 3, 1, "cmdoption-arg-skip_frames", "skip_frames"], [27, 3, 1, "cmdoption-arg-slice", "slice"], [27, 3, 1, "cmdoption-arg-spatial-aq", "spatial-aq"], [27, 3, 1, "cmdoption-arg-spatial-aq-gain", "spatial-aq-gain"], [26, 3, 1, "cmdoption-arg-static_map_file", "static_map_file"], [26, 3, 1, "cmdoption-arg-still-picture", "still-picture"], [26, 3, 1, "cmdoption-arg-strength", "strength"], [26, 3, 1, "cmdoption-arg-subsample_ama", "subsample_ama"], [27, 3, 1, "cmdoption-arg-temporal-aq-gain", "temporal-aq-gain"], [27, 3, 1, "cmdoption-arg-temporall-aq", "temporall-aq"], [27, 3, 1, "cmdoption-arg-tier", "tier"], [26, 3, 1, "cmdoption-arg-tile_ama", "tile_ama"], [27, 3, 1, "cmdoption-arg-tune-metrics", "tune-metrics"], [27, 3, 1, "cmdoption-arg-video-direction", "video-direction"], [27, 3, 1, "cmdoption-arg-width", "width"], [27, 3, 1, "cmdoption-arg-xpos", "xpos"], [27, 3, 1, "cmdoption-arg-ypos", "ypos"], [27, 3, 1, "cmdoption-arg-zorder", "zorder"]], "xma_data_buffer_alloc": [[0, 2, 1, "c.xma_data_buffer_alloc", "dummy"], [0, 2, 1, "c.xma_data_buffer_alloc", "handle"], [0, 2, 1, "c.xma_data_buffer_alloc", "size"]], "xma_data_buffer_free": [[0, 2, 1, "c.xma_data_buffer_free", "data"]], "xma_data_from_buffer_clone": [[0, 2, 1, "c.xma_data_from_buffer_clone", "data"], [0, 2, 1, "c.xma_data_from_buffer_clone", "free_callback"], [0, 2, 1, "c.xma_data_from_buffer_clone", "handle"], [0, 2, 1, "c.xma_data_from_buffer_clone", "opaque"], [0, 2, 1, "c.xma_data_from_buffer_clone", "size"]], "xma_dec_session_create": [[0, 2, 1, "c.xma_dec_session_create", "dec_props"]], "xma_dec_session_destroy": [[0, 2, 1, "c.xma_dec_session_destroy", "session"]], "xma_dec_session_get_properties": [[0, 2, 1, "c.xma_dec_session_get_properties", "dec_session"], [0, 2, 1, "c.xma_dec_session_get_properties", "fprops"]], "xma_dec_session_recv_frame": [[0, 2, 1, "c.xma_dec_session_recv_frame", "frame"], [0, 2, 1, "c.xma_dec_session_recv_frame", "session"]], "xma_dec_session_send_data": [[0, 2, 1, "c.xma_dec_session_send_data", "data"], [0, 2, 1, "c.xma_dec_session_send_data", "data_used"], [0, 2, 1, "c.xma_dec_session_send_data", "session"]], "xma_dec_session_set_log": [[0, 2, 1, "c.xma_dec_session_set_log", "handle"], [0, 2, 1, "c.xma_dec_session_set_log", "session"]], "xma_enc_session_create": [[0, 2, 1, "c.xma_enc_session_create", "enc_props"]], "xma_enc_session_destroy": [[0, 2, 1, "c.xma_enc_session_destroy", "session"]], "xma_enc_session_recv_data": [[0, 2, 1, "c.xma_enc_session_recv_data", "data"], [0, 2, 1, "c.xma_enc_session_recv_data", "data_size"], [0, 2, 1, "c.xma_enc_session_recv_data", "session"]], "xma_enc_session_send_frame": [[0, 2, 1, "c.xma_enc_session_send_frame", "frame"], [0, 2, 1, "c.xma_enc_session_send_frame", "session"]], "xma_enc_session_set_log": [[0, 2, 1, "c.xma_enc_session_set_log", "handle"], [0, 2, 1, "c.xma_enc_session_set_log", "session"]], "xma_filter_session_create": [[0, 2, 1, "c.xma_filter_session_create", "props"]], "xma_filter_session_destroy": [[0, 2, 1, "c.xma_filter_session_destroy", "session"]], "xma_filter_session_recv_frame": [[0, 2, 1, "c.xma_filter_session_recv_frame", "frame"], [0, 2, 1, "c.xma_filter_session_recv_frame", "session"]], "xma_filter_session_send_frame": [[0, 2, 1, "c.xma_filter_session_send_frame", "frame"], [0, 2, 1, "c.xma_filter_session_send_frame", "session"]], "xma_filter_session_set_log": [[0, 2, 1, "c.xma_filter_session_set_log", "handle"], [0, 2, 1, "c.xma_filter_session_set_log", "session"]], "xma_frame_add_side_data": [[0, 2, 1, "c.xma_frame_add_side_data", "frame"], [0, 2, 1, "c.xma_frame_add_side_data", "side_data"]], "xma_frame_alloc": [[0, 2, 1, "c.xma_frame_alloc", "dummy"], [0, 2, 1, "c.xma_frame_alloc", "frame_props"], [0, 2, 1, "c.xma_frame_alloc", "handle"]], "xma_frame_clear_all_side_data": [[0, 2, 1, "c.xma_frame_clear_all_side_data", "frame"]], "xma_frame_clone": [[0, 2, 1, "c.xma_frame_clone", "handle"], [0, 2, 1, "c.xma_frame_clone", "xma_frame"]], "xma_frame_dec_ref": [[0, 2, 1, "c.xma_frame_dec_ref", "frame"]], "xma_frame_free": [[0, 2, 1, "c.xma_frame_free", "frame"]], "xma_frame_from_buffers_clone": [[0, 2, 1, "c.xma_frame_from_buffers_clone", "frame_data"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "frame_props"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "free_callback"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "handle"], [0, 2, 1, "c.xma_frame_from_buffers_clone", "opaque"]], "xma_frame_get_first_side_data": [[0, 2, 1, "c.xma_frame_get_first_side_data", "frame"]], "xma_frame_get_next_side_data": [[0, 2, 1, "c.xma_frame_get_next_side_data", "frame"], [0, 2, 1, "c.xma_frame_get_next_side_data", "side_data"]], "xma_frame_get_next_side_data_of_type": [[0, 2, 1, "c.xma_frame_get_next_side_data_of_type", "frame"], [0, 2, 1, "c.xma_frame_get_next_side_data_of_type", "side_data"]], "xma_frame_get_plane_height": [[0, 2, 1, "c.xma_frame_get_plane_height", "frame_props"], [0, 2, 1, "c.xma_frame_get_plane_height", "handle"], [0, 2, 1, "c.xma_frame_get_plane_height", "plane"]], "xma_frame_get_plane_size": [[0, 2, 1, "c.xma_frame_get_plane_size", "frame_props"], [0, 2, 1, "c.xma_frame_get_plane_size", "handle"], [0, 2, 1, "c.xma_frame_get_plane_size", "plane"]], "xma_frame_get_plane_stride": [[0, 2, 1, "c.xma_frame_get_plane_stride", "frame_props"], [0, 2, 1, "c.xma_frame_get_plane_stride", "handle"], [0, 2, 1, "c.xma_frame_get_plane_stride", "plane"]], "xma_frame_get_side_data": [[0, 2, 1, "c.xma_frame_get_side_data", "frame"], [0, 2, 1, "c.xma_frame_get_side_data", "type"]], "xma_frame_inc_ref": [[0, 2, 1, "c.xma_frame_inc_ref", "frame"]], "xma_frame_planes_get": [[0, 2, 1, "c.xma_frame_planes_get", "frame_props"], [0, 2, 1, "c.xma_frame_planes_get", "handle"]], "xma_frame_remove_side_data": [[0, 2, 1, "c.xma_frame_remove_side_data", "frame"], [0, 2, 1, "c.xma_frame_remove_side_data", "side_data"]], "xma_frame_remove_side_data_type": [[0, 2, 1, "c.xma_frame_remove_side_data_type", "frame"], [0, 2, 1, "c.xma_frame_remove_side_data_type", "type"]], "xma_initialize": [[0, 2, 1, "c.xma_initialize", "handle"], [0, 2, 1, "c.xma_initialize", "init_params"], [0, 2, 1, "c.xma_initialize", "log"]], "xma_log_init": [[0, 2, 1, "c.xma_log_init", "handle"], [0, 2, 1, "c.xma_log_init", "log_level"], [0, 2, 1, "c.xma_log_init", "log_type"]], "xma_log_release": [[0, 2, 1, "c.xma_log_release", "handle"]], "xma_logmsg": [[0, 2, 1, "c.xma_logmsg", "handle"], [0, 2, 1, "c.xma_logmsg", "level"], [0, 2, 1, "c.xma_logmsg", "msg"], [0, 2, 1, "c.xma_logmsg", "name"]], "xma_release": [[0, 2, 1, "c.xma_release", "handle"]], "xma_scaler_session_create": [[0, 2, 1, "c.xma_scaler_session_create", "props"]], "xma_scaler_session_destroy": [[0, 2, 1, "c.xma_scaler_session_destroy", "session"]], "xma_scaler_session_recv_frame_list": [[0, 2, 1, "c.xma_scaler_session_recv_frame_list", "frame_list"], [0, 2, 1, "c.xma_scaler_session_recv_frame_list", "session"]], "xma_scaler_session_send_frame": [[0, 2, 1, "c.xma_scaler_session_send_frame", "frame"], [0, 2, 1, "c.xma_scaler_session_send_frame", "session"]], "xma_side_data_alloc": [[0, 2, 1, "c.xma_side_data_alloc", "buffer_type"], [0, 2, 1, "c.xma_side_data_alloc", "handle"], [0, 2, 1, "c.xma_side_data_alloc", "size"], [0, 2, 1, "c.xma_side_data_alloc", "type"]], "xma_side_data_dec_ref": [[0, 2, 1, "c.xma_side_data_dec_ref", "side_data"]], "xma_side_data_free": [[0, 2, 1, "c.xma_side_data_free", "side_data"]], "xma_side_data_get_metadata": [[0, 2, 1, "c.xma_side_data_get_metadata", "metadata"], [0, 2, 1, "c.xma_side_data_get_metadata", "side_data"]], "xma_side_data_get_refcount": [[0, 2, 1, "c.xma_side_data_get_refcount", "side_data"]], "xma_side_data_inc_ref": [[0, 2, 1, "c.xma_side_data_inc_ref", "side_data"]], "xma_side_data_read": [[0, 2, 1, "c.xma_side_data_read", "side_data"]], "xma_side_data_set_metadata": [[0, 2, 1, "c.xma_side_data_set_metadata", "metadata"], [0, 2, 1, "c.xma_side_data_set_metadata", "side_data"]], "xma_side_data_write": [[0, 2, 1, "c.xma_side_data_write", "side_data"]], "xrm_dec_release": [[0, 2, 1, "c.xrm_dec_release", "xrm_dec_ctx"]], "xrm_dec_release_v2": [[0, 2, 1, "c.xrm_dec_release_v2", "xrm_dec_ctx"]], "xrm_dec_reserve": [[0, 2, 1, "c.xrm_dec_reserve", "dev_index"], [0, 2, 1, "c.xrm_dec_reserve", "xrm_dec_ctx"], [0, 2, 1, "c.xrm_dec_reserve", "xrm_props"]], "xrm_dec_reserve_v2": [[0, 2, 1, "c.xrm_dec_reserve_v2", "xrm_dec_ctx"], [0, 2, 1, "c.xrm_dec_reserve_v2", "xrm_dec_props"]], "xrm_enc_release": [[0, 2, 1, "c.xrm_enc_release", "xrm_enc_ctx"]], "xrm_enc_release_v2": [[0, 2, 1, "c.xrm_enc_release_v2", "xrm_enc_ctx"]], "xrm_enc_reserve": [[0, 2, 1, "c.xrm_enc_reserve", "dev_index"], [0, 2, 1, "c.xrm_enc_reserve", "is_ull"], [0, 2, 1, "c.xrm_enc_reserve", "is_xav1"], [0, 2, 1, "c.xrm_enc_reserve", "slice_id"], [0, 2, 1, "c.xrm_enc_reserve", "xrm_enc_ctx"], [0, 2, 1, "c.xrm_enc_reserve", "xrm_props"]], "xrm_enc_reserve_v2": [[0, 2, 1, "c.xrm_enc_reserve_v2", "xrm_enc_ctx"], [0, 2, 1, "c.xrm_enc_reserve_v2", "xrm_enc_props"]], "xrm_ml_release_v2": [[0, 2, 1, "c.xrm_ml_release_v2", "xrm_ml_ctx"]], "xrm_ml_reserve_v2": [[0, 2, 1, "c.xrm_ml_reserve_v2", "xrm_ml_ctx"], [0, 2, 1, "c.xrm_ml_reserve_v2", "xrm_ml_props"]], "xrm_scale_release": [[0, 2, 1, "c.xrm_scale_release", "scaler_xrm_ctx"]], "xrm_scale_release_v2": [[0, 2, 1, "c.xrm_scale_release_v2", "scaler_xrm_ctx"]], "xrm_scale_reserve": [[0, 2, 1, "c.xrm_scale_reserve", "dev_index"], [0, 2, 1, "c.xrm_scale_reserve", "input_props"], [0, 2, 1, "c.xrm_scale_reserve", "num_outputs"], [0, 2, 1, "c.xrm_scale_reserve", "output_props"], [0, 2, 1, "c.xrm_scale_reserve", "scaler_xrm_ctx"]], "xrm_scale_reserve_v2": [[0, 2, 1, "c.xrm_scale_reserve_v2", "xrm_scale_ctx"], [0, 2, 1, "c.xrm_scale_reserve_v2", "xrm_scale_props"]]}, "objtypes": {"0": "c:struct", "1": "c:function", "2": "c:functionParam", "3": "std:cmdoption"}, "objnames": {"0": ["c", "struct", "C struct"], "1": ["c", "function", "C function"], "2": ["c", "functionParam", "C function parameter"], "3": ["std", "cmdoption", "program option"]}, "titleterms": {"c": [0, 16], "api": [0, 17], "program": [0, 16], "guid": [0, 16], "tabl": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "content": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], "overview": [0, 1, 19, 20, 22, 27], "gener": [0, 16, 26], "applic": [0, 10, 11, 16], "develop": [0, 14], "resourc": [0, 1, 16], "initi": 0, "alloc": 0, "session": 0, "creation": [0, 1], "runtim": [0, 13], "process": [0, 7, 21], "cleanup": 0, "compil": 0, "link": [0, 15], "amd": [0, 6, 12, 13, 14, 15, 20, 21, 22], "ama": [0, 6, 12, 13, 14, 15, 20, 21, 22, 26], "video": [0, 5, 6, 7, 8, 12, 13, 16, 21, 24, 26], "sdk": [0, 6, 12, 13, 21], "plugin": [0, 16, 27], "common": 0, "xma": [0, 12], "data": [0, 27], "structur": 0, "refer": [0, 16], "log": [0, 25], "interfac": [0, 16], "buffer": 0, "frame": [0, 22], "side": 0, "band": 0, "1": [0, 2, 17], "0": 0, "decod": [0, 5, 7, 9, 12, 21, 23, 26, 27], "properti": 0, "scaler": [0, 12, 21, 26, 27], "encod": [0, 2, 4, 7, 9, 12, 19, 22, 23, 24, 26, 27], "dynam": [0, 24], "paramet": [0, 6, 24, 27], "filter": [0, 5, 8, 9, 26], "ultra": [0, 6, 23], "low": [0, 6, 7, 23], "latenc": [0, 6, 23, 24], "consider": [0, 17], "mode": [0, 7, 23, 24, 26], "sideband": 0, "multithread": 0, "upgrad": [0, 20], "2": [0, 2, 7, 17], "pixel": [0, 21], "format": [0, 21, 22], "xrm": [0, 16], "version": [0, 1, 20], "ml": [0, 7], "build": 0, "sampl": [0, 12], "exampl": [0, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 25, 26, 27], "card": [1, 13, 21, 22], "manag": [1, 16], "mautil": 1, "mamgmt": 1, "print_ma35_load": [1, 16], "xrmadm": 1, "xrmd": [1, 7], "devic": [1, 7, 9, 16, 22, 27], "identifi": 1, "bdf": 1, "bu": 1, "id": [1, 16], "firmwar": [1, 13], "number": [1, 21], "get": [1, 13], "report": [1, 16], "valid": [1, 24], "reset": 1, "vf": [1, 22], "destruct": 1, "flash": [1, 13, 22], "check": [1, 13, 16], "util": [1, 14], "compat": 2, "matrix": 2, "avc": [2, 6], "hevc": 2, "av1": [2, 6, 22, 24], "type": [2, 24], "tutori": [3, 4, 7, 9], "amf": 4, "ffmpeg": [5, 7, 16, 17, 22, 23, 26], "us": [5, 8, 16, 26, 27], "softwar": [5, 8, 16, 17], "environ": [5, 6, 7, 8, 9, 12, 13], "setup": [5, 6, 7, 8, 9, 12, 13, 16], "rotat": [5, 7, 8], "logo": [5, 8], "overlai": [5, 8, 26], "crop": [5, 7, 8], "shift": 5, "composit": [5, 7, 8, 24], "chroma": [5, 7], "subsampl": [5, 7], "de": 5, "interlac": 5, "text": [5, 7], "insert": 5, "qualiti": [6, 7, 21, 24], "introduct": [6, 10, 11, 16, 26, 27], "optim": 6, "set": [6, 13], "tune": [6, 23, 24], "vmaf": 6, "normal": 6, "medium": 6, "preset": [6, 24], "slow": [6, 22], "run": [6, 13], "psnr": 6, "ssim": 6, "score": 6, "select": [7, 9, 24], "simpl": [7, 9], "onli": [7, 9], "4": 7, "10": [7, 21], "bit": [7, 21, 22, 24], "convers": [7, 22], "constant": 7, "rate": [7, 22, 24], "factor": 7, "crf": 7, "high": 7, "basic": 7, "transcod": [7, 9, 12, 16, 21], "Into": 7, "multipl": [7, 9, 27], "resolut": [7, 9], "output": [7, 9, 27], "ull": [7, 23], "8kp30": 7, "multi": [7, 16], "slice": 7, "doubl": 7, "densiti": [7, 22], "without": 7, "full": 7, "imag": [7, 26], "2d": [7, 9, 21, 26, 27], "pad": [7, 27], "color": [7, 21], "space": 7, "pictur": 7, "In": 7, "pip": 7, "tile": 7, "thumbnail": 7, "base": 7, "face": 7, "roi": [7, 24, 26], "gain": 7, "ladder": [7, 10, 21], "detect": 7, "gstreamer": [8, 9, 10, 11, 17, 22, 27], "zoom": 8, "introductori": 9, "downscal": 9, "multidevic": 9, "abr": [10, 21], "host": [10, 11, 28], "system": [10, 11, 16], "requir": [10, 11, 16, 20], "usag": [10, 11, 12, 22], "compositor": [11, 27], "app": 12, "test": 12, "instruct": 12, "command": [12, 16, 26], "start": 13, "chassi": 13, "instal": [13, 22], "verif": 13, "up": [13, 27], "your": 13, "first": 13, "advanc": [14, 15, 20, 22], "media": [14, 15, 20, 22], "acceler": [14, 15, 16, 20, 22, 26, 27], "repositori": 14, "helper": 14, "quick": 15, "comput": 16, "assign": [16, 22], "job": [16, 21], "specif": 16, "explicit": 16, "manual": 16, "load": [16, 27], "insuffici": 16, "autom": 16, "descript": [16, 18], "The": [16, 21], "slot": 16, "reserv": 16, "tool": 16, "singl": [16, 22], "per": [16, 21, 22], "flow": 16, "launch": 16, "launcher": 16, "line": 16, "statu": 16, "unload": 16, "migrat": 17, "chang": 17, "from": [17, 20], "alveo": 17, "u30": 17, "cli": 17, "pcie": [17, 28], "address": 17, "distribut": [18, 20], "packag": 18, "feed": 18, "configur": [18, 23], "ubuntu": [18, 22], "debian": 18, "12": 18, "fedora": 18, "new": [19, 20], "featur": [19, 20, 21], "preview": 19, "machin": [19, 21, 26], "learn": [19, 21, 26], "awar": 19, "mlcae": 19, "releas": 20, "note": 20, "thi": 20, "highlight": 20, "support": [20, 21], "kernel": 20, "o": 20, "known": 20, "limit": 20, "issu": [20, 22], "previou": 20, "spec": 21, "ma35d": 21, "codec": [21, 22], "unit": 21, "adapt": [21, 24], "bitrat": 21, "downsampl": 21, "capac": 21, "engin": [21, 26, 27], "perform": 21, "8": 21, "real": 21, "time": 21, "scale": 21, "troubleshoot": 22, "No": 22, "show": 22, "lspci": 22, "memori": 22, "playback": 22, "mp4": 22, "30": 22, "fp": 22, "variabl": 22, "400": 22, "mbp": 22, "max": 22, "mani": 22, "parallel": 22, "hdr": 22, "spatialaqgain": 22, "nonrespons": 22, "vm": [22, 28], "cannot": 22, "unsupport": 22, "audio": 22, "led": 22, "red": 22, "light": 22, "On": 22, "20": 22, "04": 22, "guidelin": 23, "automat": 23, "look": 23, "ahead": 23, "depth": 23, "calcul": 23, "adjust": 23, "measur": 23, "metric": 24, "cabr": 24, "gop": 24, "control": 24, "combin": 24, "unifi": 25, "log_ama_config": 25, "log_ama_filt": 25, "log_ama_filter_perf": 25, "option": 26, "rc": 26, "infer": 26, "other": 26, "rebuild": [26, 27], "input": 27, "pipelin": 27, "sink": 27, "sourc": 27, "hardwar": 27, "down": 27, "dma": 27, "move": 27, "through": 27, "work": 27, "virtual": 28, "sr": 28, "iov": 28, "linux": 28, "guest": 28, "passthrough": 28}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"C API Programming Guide": [[0, "c-api-programming-guide"]], "Table of Contents": [[0, "table-of-contents"], [1, "table-of-contents"], [2, "table-of-contents"], [5, "table-of-contents"], [6, "table-of-contents"], [7, "table-of-contents"], [8, "table-of-contents"], [9, "table-of-contents"], [10, "table-of-contents"], [11, "table-of-contents"], [12, "table-of-contents"], [13, "table-of-contents"], [16, "table-of-contents"], [17, "table-of-contents"], [18, "table-of-contents"], [19, "table-of-contents"], [20, "table-of-contents"], [21, "table-of-contents"], [22, "table-of-contents"], [23, "table-of-contents"], [24, "table-of-contents"], [25, "table-of-contents"], [26, "table-of-contents"], [27, "table-of-contents"], [28, "table-of-contents"]], "Overview": [[0, "overview"], [1, "overview"], [19, "overview"], [20, "overview"], [22, "overview"]], "General Application Development Guide": [[0, "general-application-development-guide"]], "Resource Initialization and Allocation": [[0, "resource-initialization-and-allocation"]], "Session Creation": [[0, "session-creation"]], "Runtime Processing": [[0, "runtime-processing"]], "Cleanup": [[0, "cleanup"]], "Compiling and Linking with the AMD AMA Video SDK Plugins": [[0, "compiling-and-linking-with-the-sdk-plugins"]], "Common XMA Data Structures": [[0, "common-xma-data-structures"]], "Common XMA Data Reference": [[0, "common-xma-data-reference"]], "XMA Log Interface": [[0, "xma-log-interface"]], "XMA Session Interface": [[0, "xma-session-interface"]], "XMA Data Buffer Interface": [[0, "xma-data-buffer-interface"]], "XMA Frame Interface": [[0, "xma-frame-interface"]], "XMA Side Band Data": [[0, "xma-side-band-data"]], "1.0 SDK API": [[0, "sdk-api"]], "Decoder Plugin Reference": [[0, "decoder-plugin-reference"]], "Decoder Interface": [[0, "decoder-interface"]], "Decoder Properties": [[0, "decoder-properties"]], "Scaler Plugin Reference": [[0, "scaler-plugin-reference"]], "Scaler Interface": [[0, "scaler-interface"]], "Scaler Properties": [[0, "scaler-properties"]], "Encoder Plugin Reference": [[0, "encoder-plugin-reference"]], "Encoder Interface": [[0, "encoder-interface"]], "Encoder Properties": [[0, "encoder-properties"]], "Encoder Dynamic Parameters": [[0, "encoder-dynamic-parameters"]], "Filter Plugin Reference": [[0, "filter-plugin-reference"]], "Filter Interface": [[0, "filter-interface"]], "Filter Properties": [[0, "filter-properties"]], "Ultra Low Latency Considerations": [[0, "ultra-low-latency-considerations"]], "Decoder Low Latency Mode": [[0, "decoder-low-latency-mode"]], "Encoder Ultra Low Latency Mode": [[0, "encoder-ultra-low-latency-mode"]], "1.1 SDK API": [[0, "id3"]], "Sideband Data": [[0, "sideband-data"], [0, "id5"]], "Multithreading": [[0, "multithreading"]], "Logging": [[0, "logging"]], "Upgrading": [[0, "upgrading"]], "1.2 SDK API": [[0, "id4"]], "Pixel Formats": [[0, "pixel-formats"]], "Decoder": [[0, "decoder"], [0, "id7"], [0, "id9"]], "Encoder": [[0, "encoder"], [0, "id8"], [0, "id10"]], "Filters": [[0, "filters"]], "XRM API Reference": [[0, "xrm-api-reference"]], "Version 1.0": [[0, "version-1-0"]], "Scaler": [[0, "scaler"], [0, "id11"]], "Version 2.0": [[0, "version-2-0"]], "ML": [[0, "ml"]], "Building Sample Examples": [[0, "building-sample-examples"]], "Card Management": [[1, "card-management"]], "mautil, mamgmt and print_ma35_load": [[1, "mautil-mamgmt-and-print-ma35-load"]], "xrmadm and xrmd": [[1, "xrmadm-and-xrmd"]], "Card and Device Identifiers": [[1, "card-and-device-identifiers"]], "Device BDF": [[1, "device-bdf"]], "Bus ID": [[1, "bus-id"]], "Firmware Version Number": [[1, "firmware-version-number"]], "mautil": [[1, "mautil"]], "Getting Device Report": [[1, "getting-device-report"], [1, "id2"]], "Device Validation": [[1, "device-validation"]], "mamgmt": [[1, "mamgmt"]], "Device Reset": [[1, "device-reset"]], "VF Creation and Destruction": [[1, "vf-creation-and-destruction"]], "Flashing Firmware": [[1, "flashing-firmware"]], "Checking Resource Utilization": [[1, "checking-resource-utilization"]], "print_ma35_load": [[1, "print-ma35-load"], [16, "print-ma35-load"]], "Encoding Compatibility Matrix": [[2, "encoding-compatibility-matrix"]], "AVC and HEVC Encoders": [[2, "avc-and-hevc-encoders"]], "AV1 Type 1 Encoder": [[2, "av1-type-1-encoder"]], "AV1 Type 2 Encoder": [[2, "av1-type-2-encoder"]], "Tutorials and Examples": [[3, "tutorials-and-examples"]], "AMF Encoder Tutorial": [[4, "amf-encoder-tutorial"]], "FFmpeg Examples using Software Filters": [[5, "ffmpeg-examples-using-software-filters"]], "Environment Setup": [[5, "environment-setup"], [6, "environment-setup"], [7, "environment-setup"], [8, "environment-setup"], [9, "environment-setup"], [12, "environment-setup"]], "Video Rotation": [[5, "video-rotation"], [7, "video-rotation"], [8, "video-rotation"]], "Logo Overlay": [[5, "logo-overlay"], [8, "logo-overlay"]], "Crop and Shift": [[5, "crop-and-shift"]], "Video Composition": [[5, "video-composition"], [8, "video-composition"]], "Chroma Subsampling": [[5, "chroma-subsampling"], [7, "chroma-subsampling"]], "Decoding and De-interlacing": [[5, "decoding-and-de-interlacing"]], "Text Insertion": [[5, "text-insertion"]], "Video Quality Examples": [[6, "video-quality-examples"]], "Introduction to Video Quality": [[6, "introduction-to-video-quality"]], "Optimized Settings for the AMD AMA Video SDK": [[6, "optimized-settings-for-the-sdk"]], "Video Tuning Parameters": [[6, "id1"]], "AV1 VMAF - Normal Latency - Medium Preset": [[6, "av1-vmaf-normal-latency-medium-preset"]], "AVC VMAF - Normal Latency - Slow Preset": [[6, "avc-vmaf-normal-latency-slow-preset"]], "AV1 VMAF - Ultra Low Latency - Medium Preset": [[6, "av1-vmaf-ultra-low-latency-medium-preset"]], "AVC VMAF - Ultra Low Latency - Slow Preset": [[6, "avc-vmaf-ultra-low-latency-slow-preset"]], "Running PSNR/SSIM/VMAF Scores": [[6, "running-psnr-ssim-vmaf-scores"]], "FFmpeg Tutorials": [[7, "ffmpeg-tutorials"]], "Device Selection": [[7, "device-selection"], [9, "device-selection"]], "Simple FFmpeg Examples": [[7, "simple-ffmpeg-examples"]], "Decode Only": [[7, "decode-only"]], "Encode Only": [[7, "encode-only"]], "4:2:2 10 Bit Conversion": [[7, "bit-conversion"]], "Constant Rate Factor (CRF) Mode": [[7, "constant-rate-factor-crf-mode"]], "High Quality Encoding": [[7, "high-quality-encoding"]], "Low Quality Encoding": [[7, "low-quality-encoding"]], "Basic Transcode": [[7, "basic-transcode"]], "Decode Only Into Multiple-Resolution Outputs": [[7, "decode-only-into-multiple-resolution-outputs"]], "Encode Only Into Multiple-Resolution Outputs": [[7, "encode-only-into-multiple-resolution-outputs"]], "Transcode with Multiple-Resolution Outputs": [[7, "transcode-with-multiple-resolution-outputs"]], "Transcode in ULL Mode": [[7, "transcode-in-ull-mode"]], "8kp30 Transcode": [[7, "kp30-transcode"]], "Multi-slice Transcode": [[7, "multi-slice-transcode"]], "Multi-device Transcode": [[7, "multi-device-transcode"]], "Double Density Example with xrmd": [[7, "double-density-example-with-xrmd"]], "Double Density Example without xrmd": [[7, "double-density-example-without-xrmd"]], "Full Double Density": [[7, "full-double-density"]], "Image Decoding": [[7, "image-decoding"]], "Image Encoding": [[7, "image-encoding"]], "2D Processing": [[7, "d-processing"]], "Cropping": [[7, "cropping"]], "Padding": [[7, "padding"]], "Color Space Conversion": [[7, "color-space-conversion"]], "Picture In Picture (PIP)": [[7, "picture-in-picture-pip"]], "Tiling": [[7, "tiling"]], "Thumbnailing": [[7, "thumbnailing"]], "Composition": [[7, "composition"]], "ML Processing": [[7, "ml-processing"]], "ML Based Face ROI": [[7, "ml-based-face-roi"]], "ROI Gain Factor": [[7, "roi-gain-factor"]], "ROI Ladder Transcoding": [[7, "roi-ladder-transcoding"]], "ROI Face Detection": [[7, "roi-face-detection"]], "ML Based Text ROI": [[7, "ml-based-text-roi"]], "GStreamer Examples using Software Filters": [[8, "gstreamer-examples-using-software-filters"]], "Crop and Zoom": [[8, "crop-and-zoom"]], "GStreamer Introductory Tutorials": [[9, "gstreamer-introductory-tutorials"]], "Simple GStreamer Examples": [[9, "simple-gstreamer-examples"]], "Decode only": [[9, "decode-only"]], "Downscaling in decoder": [[9, "downscaling-in-decoder"]], "Encode only": [[9, "encode-only"]], "Transcode with Multiple-Resolution outputs": [[9, "transcode-with-multiple-resolution-outputs"]], "Multidevice Transcode": [[9, "multidevice-transcode"]], "2D Filters": [[9, "d-filters"]], "GStreamer ABR Ladder Application": [[10, "gstreamer-abr-ladder-application"]], "Introduction": [[10, "introduction"], [11, "introduction"], [16, "introduction"], [26, "introduction"], [27, "introduction"]], "Host System Requirement": [[10, "host-system-requirement"], [11, "host-system-requirement"]], "Usage": [[10, "usage"], [11, "usage"]], "Examples": [[10, "examples"], [11, "examples"], [25, "examples"]], "GStreamer Compositor Application": [[11, "gstreamer-compositor-application"]], "XMA Examples for the AMD AMA Video SDK": [[12, "xma-examples-for-the-sdk"]], "XMA Decoder App": [[12, "xma-decoder-app"]], "Decoder Test Instructions": [[12, "decoder-test-instructions"]], "Decoder Usage": [[12, "decoder-usage"]], "Sample Decoder Command": [[12, "sample-decoder-command"]], "XMA Encoder App": [[12, "xma-encoder-app"]], "Encoder Test Instructions": [[12, "encoder-test-instructions"]], "Encoder Usage": [[12, "encoder-usage"]], "Sample Encoder Commands": [[12, "sample-encoder-commands"]], "XMA Scaler App": [[12, "xma-scaler-app"]], "Scaler Test Instructions": [[12, "scaler-test-instructions"]], "Scaler Usage": [[12, "scaler-usage"]], "Sample Scaler Command": [[12, "sample-scaler-command"]], "XMA Transcoder App": [[12, "xma-transcoder-app"]], "Transcoder Test Instructions": [[12, "transcoder-test-instructions"]], "Transcoder Usage": [[12, "transcoder-usage"]], "Sample Transcoder Commands": [[12, "sample-transcoder-commands"]], "Getting Started with AMD AMA Video SDK Cards": [[13, "getting-started-with-sdk-cards"]], "Chassis Setup": [[13, "chassis-setup"]], "Check Cards": [[13, "check-cards"]], "Install the AMD AMA Video SDK": [[13, "install-the-sdk"]], "Flash Firmware": [[13, "flash-firmware"]], "Installation Verification": [[13, "installation-verification"]], "Set Up the Runtime Environment": [[13, "set-up-the-runtime-environment"]], "Run Your First Examples": [[13, "run-your-first-examples"]], "AMD Advanced Media Acceleration (AMA) Repository": [[14, "amd-advanced-media-acceleration-ama-repository"]], "Development & Helper Utilities": [[14, "id1"]], "AMD Advanced Media Acceleration (AMA)": [[15, "amd-advanced-media-acceleration-ama"]], "Quick Links": [[15, "quick-links"]], "Managing Video Acceleration Compute Resources": [[16, "managing-video-acceleration-compute-resources"]], "Assigning Jobs to Specific Devices": [[16, "assigning-jobs-to-specific-devices"]], "Examples using Explicit Device IDs": [[16, "examples-using-explicit-device-ids"]], "Manual Resource Management": [[16, "manual-resource-management"]], "Checking System Load": [[16, "checking-system-load"]], "Insufficient Resources": [[16, "insufficient-resources"]], "Job Resource Requirements": [[16, "job-resource-requirements"]], "Automated Resource Management": [[16, "automated-resource-management"]], "Video Transcode Job Descriptions": [[16, "video-transcode-job-descriptions"]], "The Job Slot Reservation Tool": [[16, "the-job-slot-reservation-tool"]], "Example requiring a single device per job": [[16, "example-requiring-a-single-device-per-job"]], "Multi-devices Flow": [[16, "multi-devices-flow"]], "Automated Job Launching": [[16, "automated-job-launching"]], "The FFmpeg Launcher Example": [[16, "the-ffmpeg-launcher-example"]], "XRM Reference Guide": [[16, "xrm-reference-guide"]], "Command Line Interface": [[16, "command-line-interface"]], "Setup": [[16, "setup"]], "Generating Status Reports": [[16, "generating-status-reports"]], "Loading/Unloading Software Plugins": [[16, "loading-unloading-software-plugins"]], "C Application Programming Interface": [[16, "c-application-programming-interface"]], "Software Migration Considerations": [[17, "software-migration-considerations"]], "API Changes from Alveo U30": [[17, "api-changes-from-alveo-u30"]], "FFmpeg API Changes": [[17, "ffmpeg-api-changes"]], "Gstreamer API Changes": [[17, "gstreamer-api-changes"]], "CLI Changes from 1.1.2 to 1.2": [[17, "cli-changes-from-1-1-2-to-1-2"]], "PCIe Addressing": [[17, "pcie-addressing"]], "FFmpeg CLI Changes": [[17, "ffmpeg-cli-changes"]], "Distribution Package Feed": [[18, "distribution-package-feed"]], "Package Descriptions": [[18, "package-descriptions"]], "Configuring the Package Feed": [[18, "configuring-the-package-feed"]], "Ubuntu": [[18, "ubuntu"]], "Debian 12": [[18, "debian-12"]], "Fedora": [[18, "fedora"]], "New Feature Preview": [[19, "new-feature-preview"]], "Machine Learning Content Aware Encoding (MLCAE)": [[19, "machine-learning-content-aware-encoding-mlcae"]], "AMD Advanced Media Acceleration (AMA) Release Notes": [[20, "amd-advanced-media-acceleration-ama-release-notes"]], "Release Requirements": [[20, "release-requirements"]], "New in This Release": [[20, "new-in-this-release"]], "Feature Highlight": [[20, "feature-highlight"]], "Supported Kernels and Distributions": [[20, "supported-kernels-and-distributions"]], "Supported OS & Kernel": [[20, "id1"]], "Known Limitations": [[20, "known-limitations"]], "Known Issues": [[20, "known-issues"]], "Upgrading from Previous Versions": [[20, "upgrading-from-previous-versions"]], "Specs and Features of the AMD AMA Video SDK": [[21, "specs-and-features-of-the-sdk"]], "The AMD AMA Video SDK": [[21, "the-sdk"]], "The AMD MA35D Card": [[21, "the-amd-ma35d-card"]], "Video Codec Unit": [[21, "video-codec-unit"]], "Adaptive Bitrate Scaler": [[21, "adaptive-bitrate-scaler"]], "Decoder Downsampler": [[21, "decoder-downsampler"]], "2D Pixel Processing": [[21, "d-pixel-processing"]], "Decoding Capacity": [[21, "decoding-capacity"]], "Video Quality": [[21, "video-quality"]], "Machine Learning Engine": [[21, "machine-learning-engine"]], "Pixel Format": [[21, "pixel-format"]], "Supported Pixel Formats": [[21, "id3"]], "Performance Tables": [[21, "performance-tables"]], "Performance Tables for 8-bit Color": [[21, "performance-tables-for-8-bit-color"]], "Number of Real-Time Transcode Jobs per Card (8-bit)": [[21, "id4"]], "Number of Real-Time Transcode with Scale Jobs per Card (8-bit)": [[21, "id5"]], "Number of Real-Time ABR Ladders (8-bit)": [[21, "id6"]], "Performance Tables for 10-bit Color": [[21, "performance-tables-for-10-bit-color"]], "Number of Real-Time Transcode Jobs per Card (10-bit)": [[21, "id7"]], "Number of Real-Time Transcode with Scale Jobs per Card (10-bit)": [[21, "id8"]], "Number of Real-Time ABR Ladders (10-bit)": [[21, "id9"]], "AMD Advanced Media Acceleration (AMA) Troubleshooting": [[22, "amd-advanced-media-acceleration-ama-troubleshooting"]], "No Device Showing in lspci": [[22, "no-device-showing-in-lspci"]], "Single Device per Card": [[22, "single-device-per-card"]], "Memory Usage": [[22, "memory-usage"]], "AV1 Slow Playback": [[22, "av1-slow-playback"]], "AV1 MP4 Playback": [[22, "av1-mp4-playback"]], "30 FPS Density": [[22, "fps-density"]], "Gstreamer Variable Frame Rate": [[22, "gstreamer-variable-frame-rate"]], "400 Mbps Max Bit Rate": [[22, "mbps-max-bit-rate"]], "Many Parallel Encodes": [[22, "many-parallel-encodes"]], "HDR & spatialAqGain": [[22, "hdr-spatialaqgain"]], "Nonresponsive Devices": [[22, "nonresponsive-devices"]], "Codec Issues in VM": [[22, "codec-issues-in-vm"]], "Cannot Assign a VF to a VM": [[22, "cannot-assign-a-vf-to-a-vm"]], "Cannot Flash the Card": [[22, "cannot-flash-the-card"]], "FFmpeg Unsupported Audio Format Conversion": [[22, "ffmpeg-unsupported-audio-format-conversion"]], "LED Red Lights On": [[22, "led-red-lights-on"]], "Ubuntu 20.04 Installation": [[22, "ubuntu-20-04-installation"]], "Tuning Latency": [[23, "tuning-latency"]], "Decoder Latency": [[23, "decoder-latency"]], "Encoder Latency": [[23, "encoder-latency"]], "Guidelines on Encoder Latency Configuration": [[23, "guidelines-on-encoder-latency-configuration"]], "Automatic Look Ahead Depth Calculation": [[23, "automatic-look-ahead-depth-calculation"]], "Ultra Low Latency (ULL) Mode": [[23, "ultra-low-latency-ull-mode"]], "Latency Adjustment": [[23, "latency-adjustment"]], "FFmpeg Latency Measurements": [[23, "ffmpeg-latency-measurements"]], "Tuning Video Quality": [[24, "tuning-video-quality"]], "Metrics": [[24, "metrics"]], "Latency": [[24, "latency"]], "Preset": [[24, "preset"]], "Content Adaptive Bit Rate (CABR)": [[24, "content-adaptive-bit-rate-cabr"]], "GOP Composition": [[24, "gop-composition"]], "ROI": [[24, "roi"]], "AV1 Type Selection": [[24, "av1-type-selection"]], "Dynamic Encoder Parameters": [[24, "dynamic-encoder-parameters"]], "Valid Rate Control Modes and Dynamic Parameters Combinations": [[24, "id4"]], "Unified Logging": [[25, "unified-logging"]], "LOG_AMA_CONFIG": [[25, "log-ama-config"]], "LOG_AMA_FILTER": [[25, "log-ama-filter"]], "LOG_AMA_FILTER_PERF": [[25, "log-ama-filter-perf"]], "Using FFmpeg": [[26, "using-ffmpeg"]], "Example Commands": [[26, "example-commands"]], "General FFmpeg Options": [[26, "general-ffmpeg-options"], [26, "id3"]], "Video Decoding": [[26, "video-decoding"]], "Video Decoding Options": [[26, "id4"]], "Video Encoding": [[26, "video-encoding"]], "Video Encoding Options": [[26, "id5"]], "RC Mode Options": [[26, "id6"]], "Image Encoding Options": [[26, "id7"]], "2D Engines": [[26, "d-engines"], [27, "d-engines"]], "2D Accelerator Engines": [[26, "id8"], [27, "id4"]], "Video Machine Learning": [[26, "video-machine-learning"]], "Inference Engine": [[26, "inference-engine"]], "Inference Engine Options": [[26, "id9"]], "ROI Scaler": [[26, "roi-scaler"]], "Scaler Options": [[26, "id10"]], "ROI Overlay": [[26, "roi-overlay"]], "Overlay Options": [[26, "id11"]], "Other AMA Filters": [[26, "other-ama-filters"], [26, "id12"]], "Rebuilding FFmpeg": [[26, "rebuilding-ffmpeg"]], "Using GStreamer": [[27, "using-gstreamer"]], "Overview of the GStreamer Plugins": [[27, "overview-of-the-gstreamer-plugins"]], "Decoder Plugin": [[27, "decoder-plugin"]], "Decoder Inputs and Outputs": [[27, "decoder-inputs-and-outputs"]], "Decoder Parameters": [[27, "decoder-parameters"]], "Decoder Example Pipelines": [[27, "decoder-example-pipelines"]], "Encoder Plugin": [[27, "encoder-plugin"]], "Encoder Inputs and Outputs": [[27, "encoder-inputs-and-outputs"]], "Encoder Parameters": [[27, "encoder-parameters"]], "Encoder Example Pipelines": [[27, "encoder-example-pipelines"]], "Scaler Plugin": [[27, "scaler-plugin"]], "Scaler Inputs and Outputs": [[27, "scaler-inputs-and-outputs"]], "Scaler Parameters": [[27, "scaler-parameters"]], "Sink Pad": [[27, "id3"], [27, "id5"]], "Scaler Example Pipelines": [[27, "scaler-example-pipelines"]], "Inputs and Outputs": [[27, "inputs-and-outputs"], [27, "id2"]], "2D Plugins": [[27, "d-plugins"]], "Compositor Plugin": [[27, "compositor-plugin"]], "Compositor Inputs and Outputs": [[27, "compositor-inputs-and-outputs"]], "Compositor Parameters": [[27, "compositor-parameters"]], "Source Pad": [[27, "id6"]], "Hardware Down and Up Loads": [[27, "hardware-down-and-up-loads"]], "DMA Parameters": [[27, "dma-parameters"]], "Moving Data through the Pipeline": [[27, "moving-data-through-the-pipeline"]], "Working with Multiple Devices": [[27, "working-with-multiple-devices"]], "Rebuilding GStreamer": [[27, "rebuilding-gstreamer"]], "Virtualization": [[28, "virtualization"]], "SR-IOV": [[28, "sr-iov"]], "Linux Host": [[28, "linux-host"]], "Linux VM Guest": [[28, "linux-vm-guest"]], "PCIe Passthrough": [[28, "pcie-passthrough"]]}, "indexentries": {"xmadatabuffer (c struct)": [[0, "c.XmaDataBuffer"]], "xmadecoderproperties (c struct)": [[0, "c.XmaDecoderProperties"]], "xmadynamicencparams (c struct)": [[0, "c.XmaDynamicEncParams"]], "xmadynamicencparams_v2 (c struct)": [[0, "c.XmaDynamicEncParams_v2"]], "xmaencoderproperties (c struct)": [[0, "c.XmaEncoderProperties"]], "xmafilterportproperties (c struct)": [[0, "c.XmaFilterPortProperties"]], "xmafilterproperties (c struct)": [[0, "c.XmaFilterProperties"]], "xmaframe (c struct)": [[0, "c.XmaFrame"]], "xmaframeproperties (c struct)": [[0, "c.XmaFrameProperties"]], "xmaparameter (c struct)": [[0, "c.XmaParameter"]], "xmascalerinoutproperties (c struct)": [[0, "c.XmaScalerInOutProperties"]], "xmascalerproperties (c struct)": [[0, "c.XmaScalerProperties"]], "xma_data_buffer_alloc (c function)": [[0, "c.xma_data_buffer_alloc"]], "xma_data_buffer_free (c function)": [[0, "c.xma_data_buffer_free"]], "xma_data_from_buffer_clone (c function)": [[0, "c.xma_data_from_buffer_clone"]], "xma_dec_session_create (c function)": [[0, "c.xma_dec_session_create"]], "xma_dec_session_destroy (c function)": [[0, "c.xma_dec_session_destroy"]], "xma_dec_session_get_properties (c function)": [[0, "c.xma_dec_session_get_properties"]], "xma_dec_session_recv_frame (c function)": [[0, "c.xma_dec_session_recv_frame"]], "xma_dec_session_send_data (c function)": [[0, "c.xma_dec_session_send_data"]], "xma_dec_session_set_log (c function)": [[0, "c.xma_dec_session_set_log"]], "xma_enc_session_create (c function)": [[0, "c.xma_enc_session_create"]], "xma_enc_session_destroy (c function)": [[0, "c.xma_enc_session_destroy"]], "xma_enc_session_recv_data (c function)": [[0, "c.xma_enc_session_recv_data"]], "xma_enc_session_send_frame (c function)": [[0, "c.xma_enc_session_send_frame"]], "xma_enc_session_set_log (c function)": [[0, "c.xma_enc_session_set_log"]], "xma_filter_session_create (c function)": [[0, "c.xma_filter_session_create"]], "xma_filter_session_destroy (c function)": [[0, "c.xma_filter_session_destroy"]], "xma_filter_session_recv_frame (c function)": [[0, "c.xma_filter_session_recv_frame"]], "xma_filter_session_send_frame (c function)": [[0, "c.xma_filter_session_send_frame"]], "xma_filter_session_set_log (c function)": [[0, "c.xma_filter_session_set_log"]], "xma_frame_add_side_data (c function)": [[0, "c.xma_frame_add_side_data"]], "xma_frame_alloc (c function)": [[0, "c.xma_frame_alloc"]], "xma_frame_clear_all_side_data (c function)": [[0, "c.xma_frame_clear_all_side_data"]], "xma_frame_clone (c function)": [[0, "c.xma_frame_clone"]], "xma_frame_dec_ref (c function)": [[0, "c.xma_frame_dec_ref"]], "xma_frame_free (c function)": [[0, "c.xma_frame_free"]], "xma_frame_from_buffers_clone (c function)": [[0, "c.xma_frame_from_buffers_clone"]], "xma_frame_get_first_side_data (c function)": [[0, "c.xma_frame_get_first_side_data"]], "xma_frame_get_next_side_data (c function)": [[0, "c.xma_frame_get_next_side_data"]], "xma_frame_get_next_side_data_of_type (c function)": [[0, "c.xma_frame_get_next_side_data_of_type"]], "xma_frame_get_plane_height (c function)": [[0, "c.xma_frame_get_plane_height"]], "xma_frame_get_plane_size (c function)": [[0, "c.xma_frame_get_plane_size"]], "xma_frame_get_plane_stride (c function)": [[0, "c.xma_frame_get_plane_stride"]], "xma_frame_get_side_data (c function)": [[0, "c.xma_frame_get_side_data"]], "xma_frame_inc_ref (c function)": [[0, "c.xma_frame_inc_ref"]], "xma_frame_planes_get (c function)": [[0, "c.xma_frame_planes_get"]], "xma_frame_remove_side_data (c function)": [[0, "c.xma_frame_remove_side_data"]], "xma_frame_remove_side_data_type (c function)": [[0, "c.xma_frame_remove_side_data_type"]], "xma_initialize (c function)": [[0, "c.xma_initialize"]], "xma_log_init (c function)": [[0, "c.xma_log_init"]], "xma_log_release (c function)": [[0, "c.xma_log_release"]], "xma_logmsg (c function)": [[0, "c.xma_logmsg"]], "xma_release (c function)": [[0, "c.xma_release"]], "xma_scaler_session_create (c function)": [[0, "c.xma_scaler_session_create"]], "xma_scaler_session_destroy (c function)": [[0, "c.xma_scaler_session_destroy"]], "xma_scaler_session_recv_frame_list (c function)": [[0, "c.xma_scaler_session_recv_frame_list"]], "xma_scaler_session_send_frame (c function)": [[0, "c.xma_scaler_session_send_frame"]], "xma_side_data_alloc (c function)": [[0, "c.xma_side_data_alloc"]], "xma_side_data_dec_ref (c function)": [[0, "c.xma_side_data_dec_ref"]], "xma_side_data_free (c function)": [[0, "c.xma_side_data_free"]], "xma_side_data_get_metadata (c function)": [[0, "c.xma_side_data_get_metadata"]], "xma_side_data_get_refcount (c function)": [[0, "c.xma_side_data_get_refcount"]], "xma_side_data_inc_ref (c function)": [[0, "c.xma_side_data_inc_ref"]], "xma_side_data_read (c function)": [[0, "c.xma_side_data_read"]], "xma_side_data_set_metadata (c function)": [[0, "c.xma_side_data_set_metadata"]], "xma_side_data_write (c function)": [[0, "c.xma_side_data_write"]], "xrm_dec_release (c function)": [[0, "c.xrm_dec_release"]], "xrm_dec_release_v2 (c function)": [[0, "c.xrm_dec_release_v2"]], "xrm_dec_reserve (c function)": [[0, "c.xrm_dec_reserve"]], "xrm_dec_reserve_v2 (c function)": [[0, "c.xrm_dec_reserve_v2"]], "xrm_enc_release (c function)": [[0, "c.xrm_enc_release"]], "xrm_enc_release_v2 (c function)": [[0, "c.xrm_enc_release_v2"]], "xrm_enc_reserve (c function)": [[0, "c.xrm_enc_reserve"]], "xrm_enc_reserve_v2 (c function)": [[0, "c.xrm_enc_reserve_v2"]], "xrm_ml_release_v2 (c function)": [[0, "c.xrm_ml_release_v2"]], "xrm_ml_reserve_v2 (c function)": [[0, "c.xrm_ml_reserve_v2"]], "xrm_scale_release (c function)": [[0, "c.xrm_scale_release"]], "xrm_scale_release_v2 (c function)": [[0, "c.xrm_scale_release_v2"]], "xrm_scale_reserve (c function)": [[0, "c.xrm_scale_reserve"]], "xrm_scale_reserve_v2 (c function)": [[0, "c.xrm_scale_reserve_v2"]], "--codectype": [[10, "cmdoption-codectype"]], "--devidx": [[10, "cmdoption-devidx"]], "--file": [[10, "cmdoption-file"]], "--forcekeyframe": [[10, "cmdoption-forcekeyframe"]], "--json": [[10, "cmdoption-json"]], "-c": [[10, "cmdoption-c"]], "-f": [[10, "cmdoption-f"], [26, "cmdoption-f"]], "-i": [[10, "cmdoption-i"], [26, "cmdoption-i"]], "-j": [[10, "cmdoption-j"]], "-k": [[10, "cmdoption-k"]], "command line option": [[10, "cmdoption-c"], [10, "cmdoption-codectype"], [10, "cmdoption-devidx"], [10, "cmdoption-f"], [10, "cmdoption-file"], [10, "cmdoption-forcekeyframe"], [10, "cmdoption-i"], [10, "cmdoption-j"], [10, "cmdoption-json"], [10, "cmdoption-k"], [26, "cmdoption-arg-0"], [26, "cmdoption-arg-colorspace_ama"], [26, "cmdoption-arg-compositor_ama"], [26, "cmdoption-arg-core_id"], [26, "cmdoption-arg-crop_ama"], [26, "cmdoption-arg-cutoff"], [26, "cmdoption-arg-drawbox_ama"], [26, "cmdoption-arg-highlight_threshold"], [26, "cmdoption-arg-hwdownload_ama"], [26, "cmdoption-arg-hwupload_ama"], [26, "cmdoption-arg-inference_period"], [26, "cmdoption-arg-ml_ama"], [26, "cmdoption-arg-model"], [26, "cmdoption-arg-model_args"], [26, "cmdoption-arg-nb_inputs"], [26, "cmdoption-arg-overlay_ama"], [26, "cmdoption-arg-pad_ama"], [26, "cmdoption-arg-roi_map_type"], [26, "cmdoption-arg-roi_overlay_ama"], [26, "cmdoption-arg-roi_scale_ama"], [26, "cmdoption-arg-rotate_ama"], [26, "cmdoption-arg-scaler_ama"], [26, "cmdoption-arg-skip_frames"], [26, "cmdoption-arg-static_map_file"], [26, "cmdoption-arg-still-picture"], [26, "cmdoption-arg-strength"], [26, "cmdoption-arg-subsample_ama"], [26, "cmdoption-arg-tile_ama"], [26, "cmdoption-b-v"], [26, "cmdoption-bf"], [26, "cmdoption-bufsize"], [26, "cmdoption-c-v"], [26, "cmdoption-cabr"], [26, "cmdoption-control_rate"], [26, "cmdoption-cores"], [26, "cmdoption-crf"], [26, "cmdoption-dynamic_gop"], [26, "cmdoption-dynamic_params_file"], [26, "cmdoption-f"], [26, "cmdoption-filter_complex"], [26, "cmdoption-forced_idr"], [26, "cmdoption-g"], [26, "cmdoption-hwaccel"], [26, "cmdoption-i"], [26, "cmdoption-latency_ms"], [26, "cmdoption-level"], [26, "cmdoption-lookahead_depth"], [26, "cmdoption-low_latency"], [26, "cmdoption-max_bitrate"], [26, "cmdoption-max_qp"], [26, "cmdoption-min_qp"], [26, "cmdoption-no_bll"], [26, "cmdoption-out_fmt"], [26, "cmdoption-preset"], [26, "cmdoption-profile"], [26, "cmdoption-qp"], [26, "cmdoption-qp_b_offset"], [26, "cmdoption-qp_i_offset"], [26, "cmdoption-qp_mode"], [26, "cmdoption-quality"], [26, "cmdoption-r"], [26, "cmdoption-resize"], [26, "cmdoption-s"], [26, "cmdoption-slice"], [26, "cmdoption-spatial_aq"], [26, "cmdoption-spatial_aq_gain"], [26, "cmdoption-temporal_aq"], [26, "cmdoption-temporal_aq_gain"], [26, "cmdoption-tier"], [26, "cmdoption-tune_metrics"], [26, "cmdoption-type"], [26, "cmdoption-vf"], [27, "cmdoption-arg-0"], [27, "cmdoption-arg-1"], [27, "cmdoption-arg-2"], [27, "cmdoption-arg-3"], [27, "cmdoption-arg-4"], [27, "cmdoption-arg-allow-downscaling"], [27, "cmdoption-arg-alpha"], [27, "cmdoption-arg-ama_drawbox"], [27, "cmdoption-arg-ama_overlay"], [27, "cmdoption-arg-ama_rotate"], [27, "cmdoption-arg-ama_tile"], [27, "cmdoption-arg-ama_videoconvert"], [27, "cmdoption-arg-ama_videocrop"], [27, "cmdoption-arg-ama_videopad"], [27, "cmdoption-arg-b-frames"], [27, "cmdoption-arg-background"], [27, "cmdoption-arg-background-color"], [27, "cmdoption-arg-bitrate"], [27, "cmdoption-arg-border-color"], [27, "cmdoption-arg-border-inner-width"], [27, "cmdoption-arg-border-outer-width"], [27, "cmdoption-arg-core-id"], [27, "cmdoption-arg-crf"], [27, "cmdoption-arg-crop-bottom"], [27, "cmdoption-arg-crop-left"], [27, "cmdoption-arg-crop-right"], [27, "cmdoption-arg-crop-top"], [27, "cmdoption-arg-device"], [27, "cmdoption-arg-device-type"], [27, "cmdoption-arg-dynamic-gop"], [27, "cmdoption-arg-encoding-params-file"], [27, "cmdoption-arg-forced-idr"], [27, "cmdoption-arg-gop-length"], [27, "cmdoption-arg-height"], [27, "cmdoption-arg-idr-interval"], [27, "cmdoption-arg-latency-logging"], [27, "cmdoption-arg-latency-ms"], [27, "cmdoption-arg-lookahead-depth"], [27, "cmdoption-arg-low-latency"], [27, "cmdoption-arg-max-bitrate"], [27, "cmdoption-arg-max-qp"], [27, "cmdoption-arg-min-qp"], [27, "cmdoption-arg-no-bll"], [27, "cmdoption-arg-preset"], [27, "cmdoption-arg-qp"], [27, "cmdoption-arg-qp-b-offset"], [27, "cmdoption-arg-qp-i-offset"], [27, "cmdoption-arg-qp-mode"], [27, "cmdoption-arg-rate-control"], [27, "cmdoption-arg-slice"], [27, "cmdoption-arg-spatial-aq"], [27, "cmdoption-arg-spatial-aq-gain"], [27, "cmdoption-arg-temporal-aq-gain"], [27, "cmdoption-arg-temporall-aq"], [27, "cmdoption-arg-tier"], [27, "cmdoption-arg-tune-metrics"], [27, "cmdoption-arg-video-direction"], [27, "cmdoption-arg-width"], [27, "cmdoption-arg-xpos"], [27, "cmdoption-arg-ypos"], [27, "cmdoption-arg-zorder"]], "xrm_reserve_id": [[16, "index-0"], [16, "index-2"]], "xrm_reserve_id_{n}": [[16, "index-1"], [16, "index-3"]], "environment variable": [[16, "index-0"], [16, "index-1"], [16, "index-2"], [16, "index-3"]], "-b:v": [[26, "cmdoption-b-v"]], "-bf": [[26, "cmdoption-bf"]], "-bufsize": [[26, "cmdoption-bufsize"]], "-c:v": [[26, "cmdoption-c-v"]], "-cabr": [[26, "cmdoption-cabr"]], "-control_rate": [[26, "cmdoption-control_rate"]], "-cores": [[26, "cmdoption-cores"]], "-crf": [[26, "cmdoption-crf"]], "-dynamic_gop": [[26, "cmdoption-dynamic_gop"]], "-dynamic_params_file": [[26, "cmdoption-dynamic_params_file"]], "-filter_complex": [[26, "cmdoption-filter_complex"]], "-forced_idr": [[26, "cmdoption-forced_idr"]], "-g": [[26, "cmdoption-g"]], "-hwaccel": [[26, "cmdoption-hwaccel"]], "-latency_ms": [[26, "cmdoption-latency_ms"]], "-level": [[26, "cmdoption-level"]], "-lookahead_depth": [[26, "cmdoption-lookahead_depth"]], "-low_latency": [[26, "cmdoption-low_latency"]], "-max_bitrate": [[26, "cmdoption-max_bitrate"]], "-max_qp": [[26, "cmdoption-max_qp"]], "-min_qp": [[26, "cmdoption-min_qp"]], "-no_bll": [[26, "cmdoption-no_bll"]], "-out_fmt": [[26, "cmdoption-out_fmt"]], "-preset": [[26, "cmdoption-preset"]], "-profile": [[26, "cmdoption-profile"]], "-qp": [[26, "cmdoption-qp"]], "-qp_b_offset": [[26, "cmdoption-qp_b_offset"]], "-qp_i_offset": [[26, "cmdoption-qp_i_offset"]], "-qp_mode": [[26, "cmdoption-qp_mode"]], "-quality": [[26, "cmdoption-quality"]], "-r": [[26, "cmdoption-r"]], "-resize": [[26, "cmdoption-resize"]], "-s": [[26, "cmdoption-s"]], "-slice": [[26, "cmdoption-slice"]], "-spatial_aq": [[26, "cmdoption-spatial_aq"]], "-spatial_aq_gain": [[26, "cmdoption-spatial_aq_gain"]], "-temporal_aq": [[26, "cmdoption-temporal_aq"]], "-temporal_aq_gain": [[26, "cmdoption-temporal_aq_gain"]], "-tier": [[26, "cmdoption-tier"]], "-tune_metrics": [[26, "cmdoption-tune_metrics"]], "-type": [[26, "cmdoption-type"]], "-vf": [[26, "cmdoption-vf"]], "colorspace_ama": [[26, "cmdoption-arg-colorspace_ama"]], "compositor_ama": [[26, "cmdoption-arg-compositor_ama"]], "core_id": [[26, "cmdoption-arg-core_id"]], "crop_ama": [[26, "cmdoption-arg-crop_ama"]], "cutoff": [[26, "cmdoption-arg-cutoff"]], "drawbox_ama": [[26, "cmdoption-arg-drawbox_ama"]], "highlight_threshold": [[26, "cmdoption-arg-highlight_threshold"]], "hwdownload_ama": [[26, "cmdoption-arg-hwdownload_ama"]], "hwupload_ama": [[26, "cmdoption-arg-hwupload_ama"]], "inference_period": [[26, "cmdoption-arg-inference_period"]], "ml_ama": [[26, "cmdoption-arg-ml_ama"]], "model": [[26, "cmdoption-arg-model"]], "model_args": [[26, "cmdoption-arg-model_args"]], "nb_inputs": [[26, "cmdoption-arg-0"], [26, "cmdoption-arg-nb_inputs"]], "overlay_ama": [[26, "cmdoption-arg-overlay_ama"]], "pad_ama": [[26, "cmdoption-arg-pad_ama"]], "roi_map_type": [[26, "cmdoption-arg-roi_map_type"]], "roi_overlay_ama": [[26, "cmdoption-arg-roi_overlay_ama"]], "roi_scale_ama": [[26, "cmdoption-arg-roi_scale_ama"]], "rotate_ama": [[26, "cmdoption-arg-rotate_ama"]], "scaler_ama": [[26, "cmdoption-arg-scaler_ama"]], "skip_frames": [[26, "cmdoption-arg-skip_frames"]], "static_map_file": [[26, "cmdoption-arg-static_map_file"]], "still-picture": [[26, "cmdoption-arg-still-picture"]], "strength": [[26, "cmdoption-arg-strength"]], "subsample_ama": [[26, "cmdoption-arg-subsample_ama"]], "tile_ama": [[26, "cmdoption-arg-tile_ama"]], "allow-downscaling": [[27, "cmdoption-arg-allow-downscaling"]], "alpha": [[27, "cmdoption-arg-alpha"]], "ama_drawbox": [[27, "cmdoption-arg-ama_drawbox"]], "ama_overlay": [[27, "cmdoption-arg-ama_overlay"]], "ama_rotate": [[27, "cmdoption-arg-ama_rotate"]], "ama_tile": [[27, "cmdoption-arg-ama_tile"]], "ama_videoconvert": [[27, "cmdoption-arg-ama_videoconvert"]], "ama_videocrop": [[27, "cmdoption-arg-ama_videocrop"]], "ama_videopad": [[27, "cmdoption-arg-ama_videopad"]], "b-frames": [[27, "cmdoption-arg-b-frames"]], "background": [[27, "cmdoption-arg-background"]], "background-color": [[27, "cmdoption-arg-background-color"]], "bitrate": [[27, "cmdoption-arg-bitrate"]], "border-color": [[27, "cmdoption-arg-border-color"]], "border-inner-width": [[27, "cmdoption-arg-border-inner-width"]], "border-outer-width": [[27, "cmdoption-arg-2"], [27, "cmdoption-arg-border-outer-width"]], "core-id": [[27, "cmdoption-arg-core-id"]], "crf": [[27, "cmdoption-arg-crf"]], "crop-bottom": [[27, "cmdoption-arg-crop-bottom"]], "crop-left": [[27, "cmdoption-arg-crop-left"]], "crop-right": [[27, "cmdoption-arg-crop-right"]], "crop-top": [[27, "cmdoption-arg-crop-top"]], "device": [[27, "cmdoption-arg-0"], [27, "cmdoption-arg-1"], [27, "cmdoption-arg-3"], [27, "cmdoption-arg-4"], [27, "cmdoption-arg-device"]], "device-type": [[27, "cmdoption-arg-device-type"]], "dynamic-gop": [[27, "cmdoption-arg-dynamic-gop"]], "encoding-params-file": [[27, "cmdoption-arg-encoding-params-file"]], "forced-idr": [[27, "cmdoption-arg-forced-idr"]], "gop-length": [[27, "cmdoption-arg-gop-length"]], "height": [[27, "cmdoption-arg-height"]], "idr-interval": [[27, "cmdoption-arg-idr-interval"]], "latency-logging": [[27, "cmdoption-arg-latency-logging"]], "latency-ms": [[27, "cmdoption-arg-latency-ms"]], "lookahead-depth": [[27, "cmdoption-arg-lookahead-depth"]], "low-latency": [[27, "cmdoption-arg-low-latency"]], "max-bitrate": [[27, "cmdoption-arg-max-bitrate"]], "max-qp": [[27, "cmdoption-arg-max-qp"]], "min-qp": [[27, "cmdoption-arg-min-qp"]], "no-bll": [[27, "cmdoption-arg-no-bll"]], "preset": [[27, "cmdoption-arg-preset"]], "qp": [[27, "cmdoption-arg-qp"]], "qp-b-offset": [[27, "cmdoption-arg-qp-b-offset"]], "qp-i-offset": [[27, "cmdoption-arg-qp-i-offset"]], "qp-mode": [[27, "cmdoption-arg-qp-mode"]], "rate-control": [[27, "cmdoption-arg-rate-control"]], "slice": [[27, "cmdoption-arg-slice"]], "spatial-aq": [[27, "cmdoption-arg-spatial-aq"]], "spatial-aq-gain": [[27, "cmdoption-arg-spatial-aq-gain"]], "temporal-aq-gain": [[27, "cmdoption-arg-temporal-aq-gain"]], "temporall-aq": [[27, "cmdoption-arg-temporall-aq"]], "tier": [[27, "cmdoption-arg-tier"]], "tune-metrics": [[27, "cmdoption-arg-tune-metrics"]], "video-direction": [[27, "cmdoption-arg-video-direction"]], "width": [[27, "cmdoption-arg-width"]], "xpos": [[27, "cmdoption-arg-xpos"]], "ypos": [[27, "cmdoption-arg-ypos"]], "zorder": [[27, "cmdoption-arg-zorder"]]}}) \ No newline at end of file diff --git a/v1.2/specs_and_features.html b/v1.2/specs_and_features.html new file mode 100644 index 00000000..0b64e533 --- /dev/null +++ b/v1.2/specs_and_features.html @@ -0,0 +1,817 @@ + + + + + + + + + + + + + + + Specs and Features of the AMD AMA Video SDK — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Specs and Features of the AMD AMA Video SDK
  • +
  • +
  • +
+
+
+
+
+ +
+

Specs and Features of the AMD AMA Video SDK

+ +
+

The AMD AMA Video SDK

+

The AMD AMA Video SDK is a complete software stack allowing users to seamlessly leverage the features of AMD video acceleration units such as MA35D. It includes the following elements:

+
    +
  • Pre-compiled versions of FFmpeg and GStreamer which integrate key video transcoding plug-ins, enabling simple hardware offloading of compute-intensive workloads using these two popular frameworks. These custom versions of FFmpeg and GStreamer link to a host driver which communicates with the hardware on the PCIe card. No hardware experience is required to run FFmpeg or GStreamer commands with the AMD AMA Video SDK.

  • +
  • The Xilinx Resource Manager (XRM) which is the software used to manage and allocate all the hardware-accelerated features available in the system. XRM allows running multiple video processing jobs across multiple devices and multiple AMD video acceleration cards.

  • +
  • A C-based application programming interface (API) which facilitates the integration of AMD video transcoding capabilities in proprietary frameworks. This API is provided in the form plugins which can be called from external application using the Xilinx Media Accelerator (XMA) interface.

  • +
  • A suite of card management tools used to perform actions such as programming, resetting, or querying the status of AMD video acceleration cards.

  • +
  • Many examples and tutorials illustrating how to use and make the most of the AMD AMA Video SDK.

  • +
+MA35D Pipeline +
+
+

The AMD MA35D Card

+

The MA35D, which is compatible with AMD AMA Video SDK, is a low-profile, PCI™-based media accelerator card that delivers a high-density real-time transcoding solution for live streaming video service providers, OEMs, and Content Delivery Network (CDNs).

+

The MA35D card is targeted for both real-time and faster than real-time video workloads. It is expected that one or more sources of video input, either from files or from live video streams, are fed into the transcode pipeline. The encoder encodes one or more output streams from each scaled rendition of the input.

+
+

Video Codec Unit

+

The MA35D accelerator card has 2 VPUs, where each VPU is made of 2 video processing slices.

+MA35D VPU +

Functionally, slices are made of specialized decode, scale, GPU, ML, look ahead, pixel processing, and encode units.

+MA35D VPU +

Video Codec Unit (VCU) cores are capable of:

+
    +
  • Video format: YCbCr 4:2:0, 8 or 10-bit per color channel

  • +
  • Multi-standard encoding/decoding support, including:

    +
      +
    • ISO MPEG-4 Part 10: Advanced Video Coding (AVC)/ITU H.264 - Baseline, Constrained Baseline, High, High-10, High-10-Intra up to Level 5.2

    • +
    • ISO MPEG-H Part 2: High Efficiency Video Coding (HEVC)/ITU H.265 - Main, Main-Intra, Main10, Main-10-Intra, up to Level 5.2

    • +
    • AOM AV1: AOMedia Video 1 - Main, High up to Level 5.3

    • +
    +
  • +
  • Supports resolutions from 128x128 to 3840x2160 portrait and landscape

  • +
  • Simultaneous transcoding with a maximum aggregated bandwidth of 4x 4Kp60 per card for AVC or HEVC and 8x 4Kp60 for AV1

  • +
  • Look-ahead driven video quality improvements through temporal adaptive and spatial adaptive quantization

  • +
  • Low latency rate control

  • +
  • Flexible rate control: CBR, VBR, CVBR, and Constant QP

  • +
  • Progressive support for H.264, H.265 and AV1

  • +
  • HDR10/10+: HDR data is automatically populated by the decoder and passed to other accelerators in the transcode pipeline.

    +
      +
    • The following HDR10 SEI are supported:

      +
        +
      • Mastering Display Color Volume (SEI ITU)

      • +
      • Content Light Level (SEI ITU)

      • +
      • Alternative Transfer Charateristics (SEI ITU)

      • +
      +
    • +
    • The following HDR10+ SEI are supported:

      +
        +
      • ST2094_10 (DolbyVision, User defined SEI)

      • +
      • ST2094_40 (Samsung, User defined SEI)

      • +
      +
    • +
    • Behavior for HDR10/10+ SEI is as follows:

      +
        +
      • Static HDR SEI (MDCV, CLL & ATC) will not change in-between IDRs (and even in the video sequence according the HDR standards).

      • +
      • MDCV, CLL & ATC will be written only on IDRs, according to the persistency of MDCV, CLL & ATC SEIs.

      • +
      • ST2094_10 will be written on each access unit as per constraint of section A.2.1 ts_103572v010101p.pdf.

      • +
      • ST2094_40 will be written on IDRs, and whenever the user changes its content, according to the persistency specification in A341S34-1-582r4-A341-Amendment-2094-40.pdf

      • +
      +
    • +
    • JPEG and AV1 AVIF still image encoding, along with JPEG decoding. Note that still image decoders and encoders are not controlled by xrmd and, as such, load balancing and resource allocation must be done manually, e.g., see -slice.

    • +
    +
  • +
+
+
+

Adaptive Bitrate Scaler

+

For streaming applications, video is distributed in different resolutions and bit rates to adapt to varying network bandwidth conditions. All adaptive bitrate (ABR) transcoding systems require an ABR scaler that downscales an input video stream to several different smaller resolutions that are then re-encoded. These smaller resolutions are referred to as an image pyramid or an ABR ladder.

+

The MA35D ABR scaler is an accelerator capable of generating up to 16 lower resolution output images from a single input image. The ABR scaler supports the following features:

+
    +
  • Supports up to 12 taps in both horizontal and vertical direction per stage

  • +
  • High quality polyphase scaling with 64 phases and up to 12 taps in both horizontal and vertical direction per stage

  • +
  • Supports 8 and 10-bit 4:2:0

  • +
  • Luma and Chroma processed in parallel

  • +
  • Supports resolutions from 128x128 to 3840x2160, in multiples of 4

  • +
  • The scaler is tuned for downscaling and expects non-increasing resolutions in an ABR ladder. Increasing resolutions between outputs is supported but will reduce video quality.

  • +
+
+

Note

+

The MA35D ABR scaler is tuned for downscale ratios of up to 3, e.g., from 2160p to 1080p or 720p. For larger ratios, it is recommended to generate intermediary scales, of ratios below 3.

+

As an example, the following FFmpeg command downscales a HEVC 4k content to 540p, by creating an intermediary step, where input is initially scaled from 4k to 1080p:

+

ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v hevc_ama -i <4K INPUT> -filter_complex "[0:v]scaler_ama=outputs=2:out_res=(1920x1080|full)(960x540|full)[n][f]" -map '[f]' -c:v h264_ama -y -f mp4 <540 OUTPUT> -map '[n]' -f null /dev/null

+
+
+

Decoder Downsampler

+

Along with the above dedicated ABR scaler, MA35D's decoder also offers downsampling capabilities, e.g., see -resize. Given that the latter is part the decoding engine, unlike the ABR scaler, there are no bandwidth penalties associated with this downsampler. As such, it's usage is recommended for high throughput use cases, e.g., transcoding 8x4kp60 to 8x1440p60, in single density mode.

+
+
+
+

2D Pixel Processing

+

MA35D offers a rich collection of accelerated 2D pixel processing. These include:

+
    +
  1. Cropping

  2. +
  3. Padding

  4. +
  5. Box drawing

  6. +
  7. Rotate

  8. +
  9. Color space conversion

  10. +
  11. Chroma subsampling

  12. +
  13. Blend

  14. +
  15. Overlay

  16. +
  17. Tiling

  18. +
+

As an example, see 2D Engine for how to use these filters in FFmpeg. Note that the input resolution, to these filters, must be divisible by 4.

+
+
+

Decoding Capacity

+

Each decoder in a MA35D card, where 4 exist per card, is made out of 2 engines. Cores 0 and 1 delineate one engine; whereas, cores 2 and 3 the other. Each engine is capable of 8 and 10 bit 4x4kp60 aggregated throughput. Both engines support AVC, HEVC and VP9 decoding; however, only cores 1 and 2 support AV1 decoding. It is noted that load balancing between the engines is done in a transparent manner and does not require user intervention.

+

As an example, the following command shows a fully loaded decoder, on device 1, where cores 1 and 2 are decoding 16 AV1 streams, while cores 2 and 3 are decoding 16 AVC streams:

+
for i in `seq 1 16`; do \
+ ffmpeg -nostdin -hide_banner -loglevel fatal -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -re -c:v av1_ama -i av1_1080p60.mp4 -f null /dev/null & \
+ ffmpeg -nostdin -hide_banner -loglevel fatal -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -re -c:v h264_ama -i h264_1080p60.mp4 -f null /dev/null & \
+done
+
+
+

The accompanying mautil examine -d all -r utilization shows:

+
===================================================================================================
+1/4 [01:00.0] : MA35 Device
+---------------------------------------------------------------------------------------------------
+Accelerator Utilization Info [01:00.0]
+---------------------------------------------------------------------------------------------------
+Accelerator                    Average     Core-0     Core-1     Core-2     Core-3
+                                   (%)        (%)        (%)        (%)        (%)
+--------------------------   ---------  ---------  ---------  ---------  ---------
+  Decoder                  :       100        100        100        100        100
+  Scaler                   :         0          0          0         --         --
+  Encoder Type-1           :         0          0          0         --         --
+  Encoder Type-2           :         0          0          0         --         --
+  2D GPU                   :         0          0          0         --         --
+  ML NPU                   :         0          0          0          0          0
+
+
+

To demonstrate the auto load balancing feature, the following command shows decoding of 32 AVC streams:

+
for i in `seq 1 32`; do \
+ ffmpeg -nostdin -hide_banner -loglevel fatal -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -re -c:v h264_ama -i h264_1080p60.mp4 -f null /dev/null & \
+done
+
+
+

The accompanying mautil examine -d all -r utilization shows:

+
===================================================================================================
+1/4 [01:00.0] : MA35 Device
+---------------------------------------------------------------------------------------------------
+Accelerator Utilization Info [01:00.0]
+---------------------------------------------------------------------------------------------------
+Accelerator                    Average     Core-0     Core-1     Core-2     Core-3
+                                   (%)        (%)        (%)        (%)        (%)
+--------------------------   ---------  ---------  ---------  ---------  ---------
+  Decoder                  :       100        100        100        100        100
+  Scaler                   :         0          0          0         --         --
+  Encoder Type-1           :         0          0          0         --         --
+  Encoder Type-2           :         0          0          0         --         --
+  2D GPU                   :         0          0          0         --         --
+  ML NPU                   :         0          0          0          0          0
+
+
+

Note that once again decoding engines, on device 1, are fully utilized; however, this time, all the cores are performing AVC decoding.

+
+
+

Video Quality

+

The MA35D card nominally produces video quality (VQ) that is closely correlated to x264 medium, x265 medium and x265 slow presets, with respect to its accelerated AVC, HEVC and AV1 encoders. Furthermore, in case of AV1 encoders, -type-1 AV1 matches a similar VQ as x265 slow; whereas, -type-2 that of x265 medium. This video quality is highly dependent on video content so actual results may vary.

+
+
+

Machine Learning Engine

+

The ML engine in each device is capable of supporting a wide range of vision and AI related tasks. Each engine has built in hardware accelerated instruction sets, which support tensor processing, hardware tiling, and enhanced vision processing. With 11 TOPs processing throughput, per device, MA35D is capable of performing state of art ML encoding as demonstrated in ROI Encoding and in Machine Learning Content Aware Encoding.

+
+
+

Pixel Format

+

While AMA accelerator engines support various pixel formats; however, Interchange Formats (IFs) are the most suitable ones for in-between engine communication, as they offer the smallest memory footprint and the highest throughput. The following table lists the supported pixel formats, including IF ones:

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Supported Pixel Formats

Engine Name

8-Bit

10-Bit

Notes

Decoder

+
nv12-tile (IF)
+
yuv420p (IF)
+
nv12
+
yuv420p
+
rgbp
+
+
+
packed10 (IF)
+
packed10-tile (IF)
+
p010le
+
yuv420p10le
+
+
+
p010le, i.e., P010_10LE is not supported in Gstreamer.
+
+

Scaler

+
nv12-tile (IF)
+
yuv420p (IF)
+
nv12
+
rgbp
+
+
+
packed10 (IF)
+
packed10-tile (IF)
+
p010le
+
yuv420p10le
+
+
+

+
+

Encoder

+
nv12-tile (IF)
+
yuv420p (IF)
+
+
+
packed10 (IF)
+
p010le-tile (IF)
+
yuv420p10le
+
+
+
JPEG encode does not support 10 bit format
+
+

DMA

+
nv12
+
yuv420p
+
bgr0
+
bgra
+
argb
+
rgbp
+
uyv422
+
+
+
packed10
+
p010le
+
yuv420p10le
+
+
+

+
+

2D Engine

+
nv12-tile (IF)
+
yuv420p (IF)
+
nv12
+
yuv420p
+
bgra
+
rgba
+
argb
+
abgr
+
rgbp
+
uyvy422
+
yuyv422
+
+
+
packed10 (IF)
+
p010le-tile (IF)
+
p010le
+
yuv420p10le
+
+
+
yuv420p10le does not support 90/270 rotation
+
rgbp is supported only at the output
+
422, rgba, and abgr formats are not supported in FFmpeg
+
+
+

, where tiles are 4x4 pixels.

+
+
+

Performance Tables

+

The video processing power of the MA35D cards can be harnessed in many different ways, from running a few high-definition jobs to running many low-resolution ones, with or without scaling. The tables below show how many jobs can be run at real-time speed based on the use case and the number of cards available. All these configurations have been tested and validated by AMD and assume normal operating ranges.

+
+

Note

+
    +
  1. In the following tables, density numbers linearly scale to up to 16 devices.

  2. +
  3. It is assumed that per device, host chassis has set aside 8 hyper-threaded cores with 12GB of RAM.

  4. +
+
+
+

Note

+

To meet the following density numbers for 30 FPS pipelines or VP9 decoding, it is recommended to decrease LA depth incrementally, until target density objectives are met. Refer to Automatic Look Ahead Depth Calculation for valid range of LA depth.

+
+

The following tables present density numbers for typical video renditions. However, it should be noted that encode capability of each engine, 4 per device, is best described as aggregated 4kp60. This, among other things, implies that densities of 4x1080p60 or rate of 1x1080p240 can be achieved. The latter implies that a 1080p60 VOD asset can be encoded at 4 times the speed. Furthermore, speed up rate holds linearly for renditions down to 540p30. To encode two Faster Than Real Time (FTRT) jobs on a single device, each job must be assigned to a dedicated slice. See -slice for details.

+

In tables, below, Single Density refers to any combination of AVC, HEVC or AV1 Type-2 encoders, whereas, Double Density refers to any combination of AVC, HEVC or AV1 Type-2 encoders along with AV1 Type-1 encoder.

+

It is noted that with respect to Transcode with Scale Jobs Tables, below, the output of a decoder can be split and encoded with any combination of AMA encoders. This in turn implies that the expected density numbers can vary from reported Single Density to Double Density, depending on encoder selection, for each output of the scaler.

+

To fully utilize all devices on a card and reach the stated densities, device selection needs to be explicitly done in a command line. See -hwaccel and Using Explicit Device IDs for more details. Refer to Full Double Density for an example on how to deploy double density pipelines.

+
+

Performance Tables for 8-bit Color

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode Jobs per Card (8-bit)

Transcode Use Case

Single Density -preset fast

Single Density -preset [ medium | slow ]

Double Density

4kp75 (See -preset fast)

4

0

0

4kp60

4

4

8

4kp30

8

8

16

1080p60

20

16

32

1080p30

40

32

64

720p60

40

32

64

720p30

84

68

136

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode with Scale Jobs per Card (8-bit)

Transcode with Scale Use Case

Single Density

Double Density

4kp60 to 1440p60

4

8

4kp30 to 1440p30

8

16

1080p60 to 720p60

16

32

1080p30 to 720p30

32

64

720p60 to 540p60

32

64

720p30 to 540p30

68

136

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time ABR Ladders (8-bit)

ABR Ladders Use Case

1 Card

2160p60 to 1440p60, 1080p60, 720p30, 480p30, 360p30, 240p30, 144p30

4

2160p30 to 2160p30, 1440p30, 1080p30, 720p30, 480p30, 360p30, 240p30, 144p30

4

1080p60 to 1080p60, 720p60, 720p30, 480p30, 360p30, 160p30

8

1080p60 to 720p60, 720p30, 480p30, 360p30, 160p30

16

1080p30 to 1080p30, 720p30, 480p30, 240p30

16

720p30 to 720p30, 480p30, 240p30

40

+
+
+

Performance Tables for 10-bit Color

+ + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode Jobs per Card (10-bit)

Transcode Use Case

Single Density -preset fast

Single Density -preset [ medium | slow ]

Double Density

4kp75 (See -preset fast)

4

0

0

4kp60

4

4

8

4kp30

8

8

16

1080p60

20

16

32

1080p30

40

32

64

720p60

40

32

64

720p30

84

68

136

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time Transcode with Scale Jobs per Card (10-bit)

Transcode with Scale Use Case

Single Density

Double Density

4kp60 to 1440p60

4

8

4kp30 to 1440p30

8

16

1080p60 to 720p60

16

32

1080p30 to 720p30

32

64

720p60 to 540p60

32

64

720p30 to 540p30

68

136

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
Number of Real-Time ABR Ladders (10-bit)

ABR Ladders Use Case

1 Card

2160p60 to 1440p60, 1080p60, 720p30, 480p30, 360p30, 240p30, 144p30

4

2160p30 to 2160p30, 1440p30, 1080p30, 720p30, 480p30, 360p30, 240p30, 144p30

4

1080p60 to 1080p60, 720p60, 720p30, 480p30, 360p30, 160p30

8

1080p60 to 720p60, 720p30, 480p30, 360p30, 160p30

16

1080p30 to 1080p30, 720p30, 480p30, 240p30

16

720p30 to 720p30, 480p30, 240p30

40

+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/troubleshooting.html b/v1.2/troubleshooting.html new file mode 100644 index 00000000..7e9fc429 --- /dev/null +++ b/v1.2/troubleshooting.html @@ -0,0 +1,399 @@ + + + + + + + + + + + + + + + AMD Advanced Media Acceleration (AMA) Troubleshooting — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • AMD Advanced Media Acceleration (AMA) Troubleshooting
  • +
  • +
  • +
+
+
+
+
+ +
+

AMD Advanced Media Acceleration (AMA) Troubleshooting

+ +
+

Overview

+

This section describes various troubleshooting methods and workarounds for some known issues such as out of memory errors, low frame-rate, etc.

+
+

No Device Showing in lspci

+

If lspci -d 10ee: does not show any of MA35D devices and dmesg has no indication of such devices being detected, then this could indicate issues with:

+
    +
  1. BIOS

  2. +
  3. PCIe slot

  4. +
+
+
Workaround:

Ensure that your BIOS is up to date and properly configured. See BIOS setting.

+

Switch to a known working PCIe slot, to isolate possible PCIe slot issues.

+
+
+
+
+

Single Device per Card

+

If SDK has access to only a single device on a card, i.e.,:

+
lspci -d 10ee:
+
+
+

returns half the expected devices, then bifurication has not been enabled in the BIOS.

+

Workaround: Check your BIOS and enable 4x4 PCIe bifurcation on each slot with a MA35 card.

+
+
+

Memory Usage

+

Messages such as:

+
    +
  • ERROR: from element xxxxx: Internal data stream error.

  • +
  • ERROR [Channel] Cannot create channel: DeviceAllocate failed

  • +
+

...

+

, indicate memory pressure on the accelerator card.

+

Workaround: Other than the obvious over-subscription use-cases, these issues can be resolved by decrementing the lookahead buffer size.

+
+
+

AV1 Slow Playback

+

An AV1 HLS stream may playback at slower than real time speeds.

+

Workaround: Recommend explicitly setting of FPS playback frame rate when using ffplay or use ffplay from FFmpeg 5.1.2 or 6.0.

+
+
+

AV1 MP4 Playback

+

AV1 muxed into an MP4 container may not play back properly.

+

Workaround: Recommend playback of raw video using more recent versions of ffplay (n5.1.2 or later) or more recent versions of media players such as VLC v3.0.17.4. Alternatively, muxing the raw video into an IVF container format is also permitted.

+
+
+

30 FPS Density

+

30 FPS transcodes and below can not run at full density with default lookahead depth.

+

Workaround: Decrease lookahead depth or density. Required decrease is dependent upon resolution/frame rate. See Performance Tables Section for details.

+
+
+

Gstreamer Variable Frame Rate

+

Variable frame rate files are not supported by the Gstreamer AMA plugins.

+

Workaround: Turn XRM off and add a videorate filter and caps filter before the encoder to set a fixed frame rate.

+
+
+

400 Mbps Max Bit Rate

+

Encoders do not support a target or max bitrate above 400 Mbps.

+

Workaround: This issue can be avoided by constraining the bitrate values below to 400 Mbps.

+
+
+

Many Parallel Encodes

+

Encountering Cannot create channel: DeviceAllocate failed error, when running high number of encoding operations in parallel.

+

Workaround: Reduce the memory requirements by lowering the lookahead depth of the encoding operation. This can be controlled with the -lookahead_depth argument. Default values depend on the FPS and bitdepth of the input source. The following are some starting points:

+
+

30fps: -lookahead_depth 26 (reduce by steps of 2)

+

60fps: -lookahead_depth 46 (reduce by steps of 4)

+
+
+
+

HDR & spatialAqGain

+

Encoding HDR content with a spatialAqGain of 1 or 2 is not supported.

+

Workaround: Using the default values of spatialAqGain is recommended for best video quality when possible. If it is desirable to reduce the spatialAqGain from the recommended range of 60 - 100, using a value of 3 or greater will avoid this issue.

+
+
+

Nonresponsive Devices

+

It is possible that codec services and utilities may become unavailable, due to crashed SDK driver and as such mamgmt reset will not be able to reset any of the available devices.

+

Workaround: Execute the following commands:

+
sudo rmmod ama_transcoder
+sudo modprobe ama_transcoder
+
+
+

If removal and reloading of the driver does not work, then system reboot is required.

+
+
+

Codec Issues in VM

+

If codec operations are hanging in a VM, while the following sudo dmesg -w output log is observed:

+
...
+[  323.436842] ama_transcoder0 0000:05:00.0 hdma: warning:hdma_link_rc2ep_xfer status is done, c:2,status=0x1,condition=0
+[  323.440802] ama_transcoder0 0000:05:00.0 hdma: dir:rc2ep element_cnt=1 channel:2 link_table_pa:0x160000
+[  323.443387] ama_transcoder0 0000:05:00.0 hdma: ctl:0x01 size:0x4 sh:0x2 sl:0x97e00000 dh:0x0 dl:0x20831000
+[  323.445538] ama_transcoder0 0000:05:00.0 hdma: end ctrl:0x06 rsv:0x0 llp_h:0x0 llp_l:0x160000
+[  323.447257] ama_transcoder0 0000:05:00.0 hdma: rc2ep PF c=2 0x500 = 0x1
+...
+
+
+

, with host reporting IO_PAGE_FAULT in its dmesg logs, then this is an indication of a mis-configured VM.

+

Workaround: Ensure that VM has been properly created as per Virtualization.

+
+
+

Cannot Assign a VF to a VM

+

If passing a VF to a VM fails, this could be due to VF not getting its own IOMMU group. To check this, run the following command:

+
for a in /sys/kernel/iommu_groups/*; do find $a -type l; done | sort --version-sort
+
+
+

, and ensure that VF is assign to a unique group. As an example, the following output shows that VF associated with device 0000:02:00.0 , i.e., 0000:02:00.1, has its own unique group 34:

+
...
+/sys/kernel/iommu_groups/34/devices/0000:02:00.1
+...
+
+
+

Workaround: Ensure that ACS has been enabled in the BIOS.

+
+
+

Cannot Flash the Card

+

While attempting to update the firmware with satellite controller version 9.7.35, the following message may appear:

+
...
+Device: 0000:e2:00.0
+**** ERROR Programming BMC-MSP432.bin of type [SC] SC is accessing flash, pls try FW update after sometime.
+...
+
+
+

Workaround: Wait for 10 minutes and try to flash again.

+
+
+

FFmpeg Unsupported Audio Format Conversion

+

FFmpeg may attempt to automatically convert an audio track to an invalid format, based on the specified container type, e.g., from FLAC to AAC 5.1, for MP4 container. This may leave the transcoded stream with an invalid audio track:

+
...
+[aac @ 0x564a3c67f580] Unsupported channel layout "6 channels"
+...
+
+
+

Workaround: Explicitly specify the audio encoder type, e.g., -c:a copy, -c:a ac3, ... .

+
+
+

LED Red Lights On

+

If LED lights are red, this may be an indication of a hardware issue with the card or with the host chassis. Note that while chassis is in its off-state, the red LED lights are expected.

+

Workaround: Switch to a known working PCIe slot, to isolate possible PCIe slot issues. If issue is not due to chassis's PCIe slot, i.e., a known good slot continues to exhibits the same symptoms, contact AMD support for further instructions.

+
+
+

Ubuntu 20.04 Installation

+

If you are not able to install some of the SDK packages, on Ubuntu 20.04, and are seeing a message similar to the following:

+
Err:10 https://packages.xilinx.com/artifactory/debian-packages focal/main amd64 amd-ama-core amd64 1.2.0-2408071645
+403  Forbidden [IP: 3.162.7.75 443]
+
+
+

This is due to a known bug in apt version of Ubuntu 20.04 release.

+

Workaround: Update your apt version using ppa:gpxbv/apt-urlfix PPA, by following the instructions noted below:

+
    +
  1. sudo apt install software-properties-common

  2. +
  3. sudo add-apt-repository ppa:gpxbv/apt-urlfix

  4. +
  5. sudo apt install apt apt-utils

  6. +
  7. Proceed with the SDK installation

  8. +
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/tuning_pipeline_latency.html b/v1.2/tuning_pipeline_latency.html new file mode 100644 index 00000000..d9df6e47 --- /dev/null +++ b/v1.2/tuning_pipeline_latency.html @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + Tuning Latency — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tuning Latency
  • +
  • +
  • +
+
+
+
+
+ +
+

Tuning Latency

+ +

Latency tuning allows for trade off among end to end delay, video bit rate, GOP composition, etc. Interactive applications that require low latency, can do so by setting relevant parameters in the video pipeline. It is understood that lowering the latency comes at the cost of increased bit rate, for a given visual quality.

+
+

Decoder Latency

+

Decoding latency can be reduced by enabling the -low_latency option, in FFmpeg.

+
+
+

Encoder Latency

+

AMD AMA Video SDK encoder performs multi-objective optimization with set constraints on bit rate, GOP topology, visual quality measures, etc. As such, it may be tuned to achieve a compromise between latency and quality or be specialized to ultra low latency.

+
+

Guidelines on Encoder Latency Configuration

+

Encoding latency can also be reduced by trading off compression rate or visual quality. The following table lists the encoder options which can used to reduce to that effect.

+ ++++ + + + + + + + + + + + + + +

Encode Options

Notes

Look Ahead Depth

+
For best visual quality, it is recommend to let the buffer depth be determined automatically. If it is found that the selected depth adds unacceptable delay, then this option can be set explicitly. Supported range is 0 - 46+number of B frames.
+
+

Number of B frames

+
It is understood that for every inserted B frame there will be a frame period delay.
+
+
+

See Encoding Compatibility Matrix combination of allowable parameters.

+
+
+

Automatic Look Ahead Depth Calculation

+

The default VQ optimized look ahead buffer depths are:

+
+
    +
  1. 800 ms for 8 bit

  2. +
  3. 600 ms for 10 bit

  4. +
+
+
+
+

Ultra Low Latency (ULL) Mode

+

Ultra Low Latency (ULL) encoding is enabled by setting -lookahead_depth flag to 0.

+

Notes

+
    +
  • In ULL encoding mode, frames are always processed in display order. As such, this mode is not compatible with B frames. Furthermore, only Constant Quantization Parameter (CQP) and Constant Bit Rate (CBR) options are allowed. See -control_rate.

  • +
+
+

Latency Adjustment

+

The overall latency can be further tuned by adjusting the -bufsize parameter. This parameter allows for tuning strict and relaxed ULL modes. Both relaxed ULL and strict ULL modes have the lowest achievable encoding latency, in AMD AMA SDK. Strict ULL has lower transmission latency than relaxed ULL, by restricting frame size variations at the expense of lower VQ. Relaxed ULL has better VQ than strict ULL, by allowing larger frame size variations. Such variations may results in higher transmission latency, depending on network bandwidth.

+
+
+
+
+

FFmpeg Latency Measurements

+

Latency measurements can be obtained by configuring Unified Logging. The following example demonstrates how to measure decoder, encoder and end to end latencies:

+
export LOG_AMA_CONFIG="destination=file, location=log.txt, max_size=1000MB | log_level=WARN | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=1"
+export LOG_AMA_FILTER_PERF="*.*=INFO"
+ffmpeg -y -nostdin -hwaccel ama -hwaccel_device /dev/ama_transcoder0   -re -c:v h264_ama  -low_latency 1 -i h264_1080p30.mp4 -c:v av1_ama -lookahead_depth 0 -f null /dev/null
+
+
+

The log file tracks all timing info for all components of the pipeline. To generate a human readable output, use the parse_logs.py utility. This script will generate an output the looks like the following:

+
============================ INSTANCE INFO START ===============================
+
+DEC ::
+     0. h264_ama@0x564cbc07cc40
+             DECODER { PerfBeg, PerfEnd }
+             DECSDK::DWLReserveCmdBuf { PerfBeg, PerfEnd }
+             DECSDK::rsv_osalsubmit { PerfBeg, PerfEnd }
+             DECSDK::rsv_osalwait { PerfBeg, PerfEnd }
+             DECSDK::DWLDMA_RC2EP { PerfBeg, PerfEnd }
+             DECSDK::DWLEnableCmdBuf { PerfBeg, PerfEnd }
+             ...
+ENC_0.ENCODER latency = 33.431 ms (APPLICATION LEVEL)
+      (PerfBeg@av1_ama@0x560d0c196540-ENCODER --> PerfEnd@av1_ama@0x560d0c196540-ENCODER)
+ENC_0.ENCODER::PutFrame latency = 0.057 ms
+      (PerfBeg@av1_ama@0x560d0c196540-ENCODER::PutFrame --> PerfEnd@av1_ama@0x560d0c196540-ENCODER::PutFrame)
+ENC_0.Encoder::SDK latency = 4.442 ms
+      (PerfBeg@av1_ama@0x560d0c196540-Encoder::SDK --> PerfEnd@av1_ama@0x560d0c196540-Encoder::SDK)
+ENC_0.ENCODER::GetPkt latency = 0.009 ms
+     (PerfBeg@av1_ama@0x560d0c196540-ENCODER::GetPkt --> PerfEnd@av1_ama@0x560d0c196540-ENCODER::GetPkt)
+PostDecode_CH1 latency = 33.458 ms
+     (PerfEnd@h264_ama@0x560d0c194980-DECODER --> PerfEnd@av1_ama@0x560d0c196540-ENCODER)
+
+End2End_CH1 latency = 168.958 ms
+     (PerfBeg@h264_ama@0x560d0c194980-DECODER --> PerfEnd@av1_ama@0x560d0c196540-ENCODER))
+
+
+

The above delineates component based and end to end timing information. In this example, the end to end delay is 168.985 [ms] and the encoder delay of 33.431 [ms].

+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/tuning_video_quality.html b/v1.2/tuning_video_quality.html new file mode 100644 index 00000000..a5487fbc --- /dev/null +++ b/v1.2/tuning_video_quality.html @@ -0,0 +1,735 @@ + + + + + + + + + + + + + + + Tuning Video Quality — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Tuning Video Quality
  • +
  • +
  • +
+
+
+
+
+ +
+

Tuning Video Quality

+ +

The quality of encoded video depends on various factors. It is primarily a function of the target bit rate and the type of video content. However, there are some encoder parameters which can be used to adjust the video quality. This document describes the major parameters impacting video quality, as they specifically pertain to AMA SDK compatible devices. These parameters and the underlying concepts are applicable whether using FFmpeg or the C example programs.

+

Currently, there are 3 significant parameters that effect the visual quality of the video:

+
    +
  1. Metric, which is specified by -tune_metrics

  2. +
  3. Latency, which is specified by -lookahead_depth

  4. +
  5. Preset, which is specified by -preset

  6. +
+

Sections below will describe each of these parameters in detail.

+

Various examples illustrating the effect of these settings can be found here:

+ +
+

Metrics

+

This parameters defines means of scoring the observed video quality, for both subjective and objective measures. To control this parameter, set -tune_metrics to its desired target value. It is important to note that the encode engine has specific optimizations per mode, e.g., while setting the -tune_metrics parameter to 1, will optimize the visual quality, it may not necessarily provide the best PSNR, SSIM or VMAF scores.

+
+
+

Latency

+

Through this parameter one has the ability to control the end to end delay, within a transcode pipeline. See Tuning Latency of Transcode Pipeline for more details. It is understood that typically allowing for more delay in a pipeline, results in a better visual quality, e.g., increasing the depth of the look ahead buffer, results in a higher score, for a given bit rate. This parameter is controlled -lookahead_depth. See FFmpeg Video Quality for example usage. Note that look ahead depth can be reduced to 15 frames with (limited) impact to video quality.

+
+
+

Preset

+

Speed preset determines the amount of time that is spent in encoding the incoming bit stream. This time in turn is determined by the number of encode optimization tools deployed, during the encoding process. Specifically, for this release, motion vector search range, Rate-Distortion Optimized Quantization (RDOQ) and other such tools are used to enhance the visual quality, at the expense of processing time. For example, -preset slow provides about 2% improvement, in terms of BD Rate, for AVC encoding, while decreasing the throughput by 20%. It should be noted that slow preset also increases the ULL mode latency, by 25%. See FFmpeg quality analysis examples for example usage. Note that the specific values noted in these example are the only ones that are recommended for usage.

+
+
+

Content Adaptive Bit Rate (CABR)

+

CABR, -cabr, opportunistically lowers bitrate for easy contents, without causing any noticeable visual quality degradation. Given that the threshold for noticeable visual degradation is around VMAF 90, CABR is set such that it targets the VMAF-90 point. CABR operates by lowering bitrate in sections of the content that exceed the VMAF-90 point. vq_offset allows for fine tuning CABR. Specifically, a positive value will decrease the encoded bit rate, but will also lower the maximum VQ. Similarly, a negative value will increase the encoded bit rate, but will increase the maximum VQ. CABR modifier is applicable to all rate control, metrics, and preset modes.

+
+
+

GOP Composition

+

By default, the GOP structure of all AMD AMA encoders is configured to ensure optimal VQ. This implies that GOP topologies among different encoders may not be the same or the GOP itself may not have a homogeneous structure. As an example, while both AVC and HEVC encoders use hierarchical B frames, to further enhance AVC's VQ measure, unidirectional B frames that only reference prior anchor frames are also used. See -no_bll for how to turn this option off.

+
+
+

ROI

+

AMA SDK allows for further enhancement, in subjective VQ, by utilizing ML driven encoding. This is achieved by encoding regions with high probability of face and text classes, with lower QP values. Such improvements are most visible, when encoding high resolution video streams with low bit rates. As such, video conferencing applications, where faces do not occupy the majority of the frame area and are larger than 5x5 pixels, are most amenable to ROI based encoding. ROI model sensitivity, i.e., its probability mapping to QP gain, can be tuned by strength parameter. It should be noted, as with all subjective improvements, the resulting objective measures, e.g., SSIM, VMAF, etc. may not reflect such improvements. See Video Machine Learing and examples therein for sample usage.

+
+
+

AV1 Type Selection

+

AMD AMA Video SDK offers 2 flavors of AV1 encoding: the default type 1 and type 2. For most use-cases, it is recommended to stay with the default value, as it not only provides better visual quality, but also provides per frame objective stats. However, given that these 2 encoders employ 2 independent pipelines if the primary concern is to increase the number of encoded streams, then addition of type 2 AV1 will increase the channel density.

+
+
+

Dynamic Encoder Parameters

+

Dynamic parameters are parameters which can be changed during runtime. This is useful to optimize video quality and compression rate for different segments of the video. This capability is supported for FFmpeg and GStreamer.

+

The following encoder parameters can be dynamically modified:

+
    +
  • Number of B frames (0 to 4)

  • +
  • Min/Max bitrate (0 to INT_MAX)

  • +
  • Bitrate (0 to INT_MAX) (Should be in Min-Max bit rates range)

  • +
  • Temporal AQ mode (0 to 1)

  • +
  • Temporal AQ gain (0 to 255)

  • +
  • Spatial AQ mode (0 to 1)

  • +
  • Spatial AQ gain (0 to 255)

  • +
  • Min/Max QP (See QP Ranges)

  • +
  • QP (See QP Ranges) (Should be in Min and Max QP range)

  • +
  • QP I frame offset (See QP Ranges) (Should be in Min and Max QP range)

  • +
  • QP B frame offset (See QP Ranges) (Should be in Min and Max QP range)

  • +
+
+

Note

+

AVC and HEVC QP ranges are 0-51

+

AV1 QP range is 0-255

+
+

When using FFmpeg or GStreamer, the encoder parameters which should be changed are specified in a configuration file as key-value pairs. This means that these key-value pairs must be known ahead of time.

+

Dynamic Parameters Considerations

+
    +
  • Recommended settings for dynamic B frames are:

    +
      +
    • 0 for gaming clips with fast motion, camera pan/rotation scenes

    • +
    • 2 for static or slow moving scenes, talking heads, or video conferencing type of content

    • +
    • 1 for all medium motion and all other content

    • +
    +
  • +
  • B frames changes do not happen at the exact frame number specified. Instead, the change comes into effect one or two frames from the actual frame number specified in the config file.

  • +
  • The maximum value for the number of B frames is the value configured at initilization

  • +
  • The configuration files for dynamic parameters must comply with the format specified above. Ill-formed files may result in unexpected behavior.

  • +
+

The following table shows supported combinations of rate control modes and dynamic parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Valid Rate Control Modes and Dynamic Parameters Combinations

Parameter

CQP

CBR

VBR

CVBR

CRF

CABR

Temporal AQ Mode

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

Temporal AQ Gain

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

Spatial AQ Mode

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

Spatial AQ Gain

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

Bit Rate

+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
Y
+
+

Min Bit Rate

+
N
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+
+
N
+
+

Max Bit Rate

+
Y
+
+
+
N
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
N
+
+

Number of B Frames

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

Min QP

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

Max QP

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

QP

+
Y
+
+
+
N
+
+
+
N
+
+
+
N
+
+
+
Y
+
+
+
N
+
+

QP I Offset

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+

QP B Offset

+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+
Y
+
+
+

FFmpeg

+

Encoder parameters which should be changed dynamically are specified as key-value pairs in a configuration file. This configuration file is provided to FFmpeg using the -dynamic_params_file encoder option.

+

The -dynamic_params_file option is specific to an encoded output. For use cases with multiple encoded outputs (such as ABR ladders), each output can have its own -dynamic_params_file option and associated configuration file.

+

The configuration file should contain one line for each frame where one or more parameters are changed. Each line should start with the frame number followed by a list of key-value pairs for all the modified parameters:

+
<frameNumberN1>:<key1>=<value1>
+<frameNumberN2>:<key2>=<value2>,<key3>=<value3>
+
+
+

Below is a table listing the parameters which can be changed at runtime, the corresponding key and valid values.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Dynamic Parameter

Key

Valid Values

Number of B frames

NumB=<int>

0 to 4

Min/Max bit rate

MinBRkbps=<int>

0 to INT_MAX

Max bit rate

MaxBRkbps=<int>

0 to INT_MAX

Bitrate (in bits per second)

BRkbps=<int>

0 to INT_MAX

Temporal AQ mode

tAQ=<int>

0 to 1

Temporal AQ gain

tAQGain=<int>

0 to 255

Spatial AQ mode

sAQ=<int>

0 to 1

Spatial AQ gain

sAQGain=<int>

0 to 255

Min/Max QP

MinQP=<int>,MaxQP=<int>

See QP Ranges

QP

QP=<int>

See QP Ranges

QP I frame offset

QPOffsetI

See QP Ranges

QP B frame offset

QPOffsetB

See QP Ranges

+

Sample FFmpeg encode command:

+
ffmpeg -hwaccel ama -re -f lavfi -i testsrc=duration=60:size=1920x1080:rate=60,format=yuv420p -f rawvideo  -vf "hwupload" -c:v hevc_ama -b:v 5M  -dynamic_params_file ./param.txt -y -f rawvideo  output.h265
+
+
+

Sample configuration file for dynamic parameters:

+
300:NumB=1
+600:BRkbps=6000
+1200:sAQ=1,sAQGain=50
+1800:tAQ=1,tAQGain=50
+2400:NumB=0,BRkbps=10000,sAQ=0,sAQGain=50,tAQ=0
+5000:MinQP=30,MaxQP=35
+
+
+

GStreamer

+

Gstreamer uses the same formated configuration file as FFmpeg:

+
gst-launch-1.0 fakesrc sizetype=fixed sizemax=4147200 num-buffers=4000 ! capsfilter caps='video/x-raw' ! rawvideoparse width=1920 height=1080 format=i420 framerate=60/1 ! ama_upload ! ama_h265enc encoding-params-file=./param1.txt ! fakesink
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/unified_logging.html b/v1.2/unified_logging.html new file mode 100644 index 00000000..d04b1b7b --- /dev/null +++ b/v1.2/unified_logging.html @@ -0,0 +1,419 @@ + + + + + + + + + + + + + + + Unified Logging — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Unified Logging
  • +
  • +
  • +
+
+
+
+
+ +
+

Unified Logging

+ +

Unified Logging (UL) utility is aimed at providing an identical logging output, configuration and interaction for different video frameworks provided by AMD AMA Video SDK. Three environmental variables LOG_AMA_CONFIG, LOG_AMA_FILTER and LOG_AMA_FILTER_PERF control interactions with UL. LOG_AMA_CONFIG variable controls the global setting of logging, which includes log destination, max size, log source info, and log levels. LOG_AMA_FILTER variable filters the global configuration and narrows down the logging output to specific software layer, accelerator type or level. LOG_AMA_FILTER_PERF variable controls the flow of performance related logs. The following sections describe the configuration parameters of each variable.

+
+

LOG_AMA_CONFIG

+

LOG_AMA_CONFIG is utilized as follows:

+
export LOG_AMA_CONFIG="[key=value | ...]"
+
+
+

, where key and value are defined as:

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key

value

Description

destination

console, file, syslog, release_preset or debug_preset

Determines the target destination of output logs.

+

console: Terminal output

+

file: Defaults to "async=1, max_size=10MB, location=log_ama_<pid>_<timestamp>.txt"

+

syslog: Defaults to "async=1, location=localhost, facility=LOCAL0"

+

release_preset: Shortcut for "destination=syslog, async=1 | log_level = WARN| perf_log=0 | debug_file_name=0 | debug_thread = 0 | debug_pid=0 | debug_time_stamp=0"

+

debug_preset: Shortcut for "destination=file, max_size=1GB | log_level = DEBUG | async=1 | perf_log=1 | debug_file_name=1 | debug_thread = 1 | debug_pid=1 | debug_time_stamp=1"

+

async refers to asynchronous mode of write operation

+

location refers to output path of logs

+

log_level

FATAL, ERROR, WARN, INFO, DEBUG, TRACE or ALL

Determines the log level.

+

Defaults to WARN

+

perf_log

0 or 1

Enables or disables performance measurements. If enabled, minimal information log level is set. Otherwise, log level is set by log_level.

+

Defaults to 0

+

debug_file_name

0 or 1

Enables or disables addition of log file names.

+

Defaults to 0

+

debug_file_line

0 or 1

Enables or disables inclusion of log line numbers.

+

Defaults to 0

+

debug_time_stamp

0 or 1

Enables or disables addition of timestamps.

+

Defaults to 0

+

debug_pid

0 or 1

Enables or disables reporting of process id.

+

Defaults to 0

+

debug_thread

0 or 1

Enables or disables reporting of thread id.

+

Defaults to 0

+
+
+
+

LOG_AMA_FILTER

+

LOG_AMA_FILTER is utilized as follows:

+
export LOG_AMA_FILTER="[LAYER.ACCEL=log_level | ...]"
+
+
+

, where LAYER and ACCEL are defined as:

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

LAYER

Description

SDK

Any user space library

VPI

Video processing plugins

XMA

XMA library

FFMPEG

FFmpeg plugins

GST

Gstreamer plugins

GEN

General and common layers

XRM

XRM library

+ ++++ + + + + + + + + + + + + + + + + + + + +

ACCEL

Description

ABR

ABR ladder

DEC

Decoder

ENC

Encoder

GEN

General hardware logs

+
+
+

LOG_AMA_FILTER_PERF

+

LOG_AMA_FILTER_PERF is utilized as follows:

+
export LOG_AMA_FILTER_PERF="[LAYER.ACCEL=log_level | ...]"
+
+
+

, where LAYER and ACCEL are defined as above.

+
+
+

Examples

+
    +
  1. Send output to log_ama_<pid>_<timestamp>.txt file, and set log_level to warning:

    +
    export LOG_AMA_CONFIG="destination=file | log_level=WARN | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  2. +
  3. Send output to /tmp/log_ama.txt file, and set log_level to info:

    +
    export LOG_AMA_CONFIG="destination=file, location=/tmp/log_ama.txt | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  4. +
  5. Send output to /tmp/log_ama.txt file, and set log_level to info, with max log file size equal to 100MB:

    +
    export LOG_AMA_CONFIG="destination=file, max_size=100MB, location=/tmp/log_ama.txt | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  6. +
  7. Get output on console, with log_level set to info:

    +
    export LOG_AMA_CONFIG="destination=console | log_level=INFO | debug_file_line=1 | debug_time_stamp=1 | debug_pid=1 | debug_thread=1 | perf_log=0"
    +
    +
    +
  8. +
  9. Assume log_level was WARN in LOG_AMA_CONFIG, the following filter will additionally enable TRACE log level of VPI layer for ABR plugins:

    +
    export LOG_AMA_FILTER=" VPI.ABR=TRACE"
    +
    +
    +
  10. +
  11. If we want all layers logs for ABR:

    +
    export LOG_AMA_FILTER=" *.ABR=TRACE"
    +
    +
    +
  12. +
  13. If we want all layers logs for ABR & ENC:

    +
    export LOG_AMA_FILTER=" *.ABR=TRACE | *.ENC=TRACE"
    +
    +
    +
  14. +
  15. Force all logs to ERROR, and generate debug logs from SDK for ABR type:

    +
    export LOG_AMA_FILTER=" *.*=ERROR | *.ABR=DEBUG"
    +
    +
    +
  16. +
  17. Set performance logs to info level:

    +
    export LOG_AMA_CONFIG="destination=file, location=log_ama_perf.txt | log_level=WARN | perf_log=1"
    +
    +
    +
  18. +
  19. Set performance log level to DEBUG for ABR at SDK layer:

    +
    export LOG_AMA_FILTER_PERF="SDK.ABR=DEBUG"
    +
    +
    +
  20. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/using_ffmpeg.html b/v1.2/using_ffmpeg.html new file mode 100644 index 00000000..c87aa764 --- /dev/null +++ b/v1.2/using_ffmpeg.html @@ -0,0 +1,1689 @@ + + + + + + + + + + + + + + + Using FFmpeg — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Using FFmpeg
  • +
  • +
  • +
+
+
+
+
+ +
+

Using FFmpeg

+

This page documents how to use FFmpeg with the AMD AMA Video SDK.

+ +
+

+
+
+

Introduction

+

FFmpeg is an industry standard, open source, widely used utility for handling video. FFmpeg has many capabilities, including encoding and decoding of all video compression formats, encoding and decoding of audio, encapsulating, and extracting audio, and video from transport streams, and many more. The AMD AMA Video SDK includes an enhanced version of FFmpeg, version n4.4, which communicates with the hardware accelerated transcode pipeline.

+

It is not within the scope of this document to provide an exhaustive guide on the usage of FFmpeg. Various resources can be found online, for example:

+ +

The following sections describe the options used with FFmpeg to configure the various hardware accelerators available on an MA35 device.

+
+

+
+
+

Example Commands

+

To obtain the FFmpeg version used in this SDK, issue the following command:

+
ffmpeg -version
+
+
+

A simple FFmpeg command for accelerated transcoding with the AMD AMA Video SDK will look like the following:

+
ffmpeg -hwaccel ama -hwaccel_device /dev/ama_transcoder0 -c:v h264_ama -i infile.mp4 -c:v hevc_ama -b:v 1000K -r 60 -f mp4 -y transcoded.mp4
+
+
+

There are many other ways in which FFmpeg can be used to leverage the video transcoding features of an MA35 device. Examples illustrating how to run FFmpeg for encoding, decoding, and transcoding with or without ABR scaling, video composition and ML are included in FFmpeg tutorials.

+

To

+
+
+

General FFmpeg Options

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
General FFmpeg Options

Options

Descriptions

+
+-i
+
+ +
+
Input video URI.
+
+
+
+-c:v
+
+ +
+
Specify video or image codec
+
This option must be set for any input processed on an MA35 device.
+
Valid video decode values are vp9_ama, h264_ama, hevc_ama, and av1_ama for VP9, H.264, HEVC, and AV1, respectively.
+
Valid video encode values are h264_ama, hevc_ama, and av1_ama for H.264, HEVC, and AV1, respectively.
+
Valid image decode value is jpeg_ama for JPEG images.
+
Valid image encode values are jpeg_ama, ljpeg_ama, and av1_ama for JPEG, lossless JPEG and AV1 images. See Image Encoding Options for details.
+
+
+
+-s
+
+ +
+
The frame size (WidthxHeight). For example 1920x1080 or 3840x2160.
+
+
+
+-f
+
+ +
+
The container format.
+
+
+
+-r
+
+ +
+
The frame rate in fps (Hz).
+
+
+
+-filter_complex
+
+ +
+
Used for frame filtering operation.
+
+
+
+-hwaccel
+
+ +
+
Global option used to specify on which MA35 device the FFmpeg job should run. Consult Using Explicit Device IDs for more details on how to use this option. Valid values are positive integers in [0..N-1] range. Default is device 0.
+
+
+
+-vf
+
+ +
+
Used for simple filtering operations, e.g., hwdownload and hwupload, for DMA transfer of data to and from the host, respectively. Note that transaction directions are with respect to the host.
+
+
+
+

Note

+

Detailed help for encoder, decoder and scaler is obtained through FFmpeg extended help, e.g. ffmpeg -h encoder=h264_ama, ffmpeg -h decoder=hevc_ama or ffmpeg -h filter=scaler_ama.

+
+
+

Note

+

Using -stream_loop option along with jpeg_ama, results in the following benign error message:

+
[ERROR] AMA.VPI.DEC.jpeg_ama@0x5555b71aa980:{492302} Can't find valid pts info
+
+
+
+

The following conventions are used in the following tables:

+
    +
  1. When parameters can be specified as both numerical and string values, they are noted as:

    +
    (<number>) <string>
    +
    +
    +

    Conversely, when this is not the case, options are noted with Roman numerals as:

    +
    <Roman numeral>) <option>
    +
    +
    +
  2. +
  3. auto or -1 note that values are selected by the SDK to optimally meet the specified constraints.

  4. +
+
+

+
+
+
+
+

Video Decoding

+

For the complete list of features and capabilities of the AMD AMA Video SDK decoder, refer to Release Notes chapter of the documentation.

+

The table below describes all the options for the AMD AMA Video SDK decoder.

+ + ++++ + + + + + + + + + + + + + + + + +
Video Decoding Options

Options

Descriptions

+
+-resize
+
+ +
+
Decoder down scaler
+
Valid global values are of the for WidthxHeight.
+
Note that this parameter must be specified before the intended input.
+
+
+
+-out_fmt
+
+ +
+
Decoder output pixel format
+
Valid global values for pixel format: nv12, p010le, packed10, rgbp, yuv420p, and yuv420p10le.
+
Note that an identical pixel format must be specified as value to format option, within -vf. See Decode Only for an example.
+
+
+
+-low_latency
+
+ +
+
Enable/Disable single frame level decode
+
When enabled, the decoding latency of streams not containing any B frames is reduced. This option has no impact on streams that include B frames.
+
Valid values: 0 or 1. (default is 0)
+
+
(0) disable - default
+
(1) enable
+
+
+
+
+

+
+
+
+

Video Encoding

+

For the complete list of features and capabilities of the AMD AMA Video SDK encoder, refer to Release Notes chapter of the documentation.

+

The table below describes all the options for the AMD AMA Video SDK encoder.

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Video Encoding Options

Options

Descriptions

+
+-b:v
+
+ +
+
Specify the video bitrate
+
You can specify this in Mb or Kb. For example -b:v 1M or -b:v 1000K.
+
+
+
+-max_bitrate
+
+ +
+
Maximum bitrate
+
Valid values: 0 to 3.5e+10
+
You may want to use this to limit encoding bitrate if you have not specified a -b:v bitrate
+
Default value -1 implies unspecified.
+
+
+
+-g
+
+ +
+
GOP size
+
Valid values: 0 to UINT32_MAX
+
Default value is -1, implying 2[s] gop duration, i.e., twice the frame rate
+
+
+
+-level
+
+ +
+
Encoding level restriction
+
Valid values for H.264: 1, 1.1, 1.2, 1.3, 2, 2.1, 2.2, 3, 3.1, 3.2, 4, 4.1, 4.2, 5, 5.1, 5.2 6, 6.1, 6.2
+
Valid values for HEVC: 1, 2, 2.1, 3, 3.1, 4, 4.1, 5, 5.1,5.2, 6, 6.1, 6.2
+
Valid values for AV1: 2, 2.1, 3, 4, 4.1, 5, 5.1, 5.2, 5.3 6, 6.1, 6.2, 6.3
+
Default value is auto.
+
+
+
+-profile
+
+ +
+
Set the encoding profile
+
Valid values for H.264: baseline, main, high
+
Valid values for HEVC: main, main-intra, main-10 and main-10-intra
+
Valid values for AV1: main
+
Default value is auto.
+
+
+
+-tier
+
+ +
+
Set the encoding tier (AV1 and HEVC only)
+
Valid values: -1, 0, 1
+
+
(-1) auto
+
(0) main
+
(1) high
+
+
Default value is auto
+
+
+
+-bufsize
+
+ +
+
Rate control (VBV) buffer size
+
Valid values: -1, 400M [bits] (default is -1)
+
+
(-1) For auto selection
+
+
This option is ignored unless:
+
+
1) lookahead_depth is 0 (ULL)
+
2) control_rate is CBR
+
3) Encoder is set to one of h264_ama, hevc_ama or av1_ama Type 2
+
+
Value 0 implies strict ULL, whereas, larger values imply relaxed ULL. See Latency Adjustment.
+
+
+
+-crf
+
+ +
+
Constant Rate Factor
+
Valid values: -1 to 63
+
+
(-1) disable
+
+
This option uses -qp for its quality assignment.
+
Note that this option ignores all other options that may impose restrictions on qp values. These include -min_qp, -max_qp, -b:v, and -control_mode.
+
+
+
+-qp
+
+ +
+
Quantization Parameter
+
Valid values for H.264 and HEVC 0-51
+
Valid values for AV1 0-255
+
Default value -1 implies not used. Note that if this option is used, it implies Constant QP for -control_rate option.
+
+
+
+-bf
+
+ +
+
Number of B frames
+
Valid values for H.264, HEVC and type-2 AV1: 0-3
+
Valid values for type-1 AV1: 0-7
+
Default auto selection value is -1.
+
+
+
+-lookahead_depth
+
+ +
+
Number of frames to lookahead for qp maps
+
Valid values: -1 to 47+Maximum number of B frames -bf
+
Lookahead depth of 0 implies ULL mode
+
Default auto selection value, based on frame rate, is -1.
+
+
+
+-spatial_aq
+
+ +
+
Enable spatial AQ
+
Valid values: auto, disable or enable
+
+
(-1) auto
+
(0) disable
+
(1) enable
+
+
Default value is auto.
+
When qp_mode is uniform, this parameter is ignored and treated as disable.
+
+
+
+-spatial_aq_gain
+
+ +
+
Scale for spatial AQ gain
+
Valid values: 0 to 255
+
+
(255) For auto selection
+
+
Default value for H264, HEVC and AV1 is 64
+
Default value for type-1 AV1 is 72
+
+
+
+-temporal_aq
+
+ +
+
Enable temporal AQ
+
Valid values: auto, disable or enable
+
+
(-1) auto
+
(0) disable
+
(1) enable
+
+
Default value is auto.
+
+
When qp_mode is uniform, this parameter is ignored and treated as disable.
+
+
+
+
+-temporal_aq_gain
+
+ +
+
Scale for temporal AQ gain
+
Valid values: 0 to 255
+
+
(255) For auto selection
+
+
Default value for H264, HEVC and AV1 is 80
+
Default value for type-1 AV1 is 0
+
+
+
+-qp_mode
+
+ +
+
QP control mode
+
Valid values: auto, relative_load and uniform.
+
+
(0) auto for best VQ
+
(1) relative_load implying both spatial and temporal AQ
+
(2) uniform meaning no AQ
+
+
Default value is auto.
+
+
+
+-control_rate
+
+ +
+
Set the rate control mode
+
Valid values: -1 to 4
+
+
(-1) auto
+
(0) const_qp for Constant QP
+
(1) cbr for Constant Bitrate
+
(2) vbr for Variable Bitrate
+
(3) cvbr for Capped Variable Bitrate
+
See RC Mode Table for details.
+
+
Default value is auto.
+
+
+
+-cabr
+
+ +
+
CABR parameters
+
Valid values:
+
+
i) enable
+
ii) disbale
+
iii) auto - The same as disable
+
iv) vq_offset =x, where x is in -63 - 63 range. If not specified, vq_offset =0.
+
+
See CABR for details.
+
+
+
+-min_qp
+
+ +
+
Minimum QP value allowed for rate control
+
Valid values for H264 and HEVC: 0 to 51
+
Valid values for AV1: 0 to 255
+
Default auto selection value is -1.
+
This option has no effect when -control_rate is set to Constant QP (0).
+
+
+
+-max_qp
+
+ +
+
Maximum QP value allowed for rate control
+
Valid values for H264 and HEVC: 0 to 51
+
Valid values for AV1: 0 to 255
+
Default auto selection value is -1.
+
+
+
+-qp_i_offset
+
+ +
+
QP Offset for I Frames
+
Valid values: -51 to 51
+
Auto selection mode is -1.
+
Default 0.
+
+
+
+-qp_b_offset
+
+ +
+
QP Offset for B or P Frames
+
Valid values: -51 to 51
+
Auto selection mode is -1.
+
Default 0.
+
This option has no effect when -control_rate is set to Constant QP (0).
+
+
+
+-forced_idr
+
+ +
+
Force insertion of IDR frames
+
Valid values: 0, 1 (default is 1)
+
+
(0) disable
+
(1) enable - default
+
+
Encodes all the intra frames as IDR
+
+
+
+-slice
+
+ +
+
Select a slice to run an encode job
+
Valid values if xrmd is not used are: 0, 1 (default is 0). If xrmd is active and this option is not set, xrmd will make the slice selection.
+
+
+
+-tune_metrics
+
+ +
+
Enable tuning video quality for the best objective metrics
+
This option optimizes the encoder for the selected tuning metric. See Tuning Video Quality for details.
+
Valid values: 1 to 4 (default is 1)
+
+
(1) vq - default
+
(2) psnr
+
(3) ssim
+
(4) vmaf
+
+
+
+
+-type
+
+ +
+
Applicable to AV1 encoders only
+
Valid values: 1 or 2.
+
+
i) 1 - default
+
ii) 2
+
+
Default value is 1.
+
Consult the AV1 Selection section for more details on how to use this option.
+
+
+
+-preset
+
+ +
+
Encoder VQ-Density preset
+
Valid values: fast, medium or slow. (default is medium)
+
+
(fast) Allows for increase in total throughput from 4kp60 to 4kp75 , when 2 or more channels are used. Does not apply to AV1 -type 1 encoding. Not applicable under ULL setting. Note lower VQ than medium preset is to be expected.
+
(medium) Full density with medium VQ - default
+
(slow) High VQ at lower density. Applicable to 10 bit contents only.
+
+
Consult the Tuning Video Quality section for more details on how to use this option.
+
+
+
+-dynamic_gop
+
+ +
+
Enable dynamic GOP
+
Valid values: -1, 0 or 1.
+
+
(-1) auto
+
(0) disabled
+
(1) enable
+
+
Default value is auto.
+
+
+
+-dynamic_params_file
+
+ +
+
Dynamic configuration file
+
Path to dynamic file location (default is empty)
+
Consult the Dynamic Encoder Parameters section for more details on how to use this option.
+
+
+
+-cores
+
+ +
+
AV1 Type 1 Cores
+
Valid values: 1 or 2
+
+
i) 1 - default, with minimum resolution of 176x144 or 144x176, and aggregate rate of 4kp60
+
ii) 2 - minimum resolution of 720x720, with with aggregate rate of 4kp120
+
+
+
+
+-latency_ms
+
+ +
+
Look ahead depth in milliseconds
+
Valid values: 0 to 60000
+
Default auto selection value, based on frame rate, is -1.
+
+
+
+-no_bll
+
+ +
+
Disable low latency B frames
+
Valid value: 1
+
Value 1 ensures that the generated GOP has a homogeneous structure. See GOP Composition.
+
+
+

The following table describes relevant parameters that are applicable to each RC mode

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + +
RC Mode Options

RC Mode

Allowed Options

const_qp

+
Constant QP
+
+
-qp <QP>
+
+
+

cbr

+
Constant Bit Rate
+
+
-b:v <Bit Rate> (ABR mode)
+
-b:v <Bit Rate> -max_bitrate <Bit Rate> (CBR mode)
+
-b:v <Bit Rate> -bufsize 0 ULL mode
+
+
+

vbr

+
Variable Bit Rate
+
+
-b:v <Bit Rate>
+
+
+

cvbr

+
Constrained Variable Bit Rate
+
+
-b:v <Bit Rate> [-min_qp <QP> | -max_qp <QP> | -max_bitrate <max_bitrate>]
+
+
+

crf

+
Constant Rate Factor
+
+
-crf <Value>
+
+
+
+

The table below describes all the options for the AMD AMA Video SDK encoder that are applicable to images only.

+ + ++++ + + + + + + + + + + + + + + + + +
Image Encoding Options

Options

Descriptions

-slice

+
See -slice
+
+
+
+-quality
+
+ +
+
Specify JPEG encoding quality
+
Valid values: 1 to 100. Larger values indicate higher quality.
+
Default 80.
+
+
+
+still-picture
+
+ +
+
Specify AV1image format AV1IF
+
Valid value: 1
+
+
+
+

+
+
+
+

2D Engines

+

This section describes different hardware accelerated 2D processing engines that are available in AMA SDK. These processing engines are leveraged in FFmpeg by using the FFmpeg filter graph syntax.

+

In the following table, it is assumed:

+
    +
  1. 0,0 coordinates refer to top-left.

  2. +
  3. Each engine can execute on either of core 0 or 1, within each device, which is specified through core_id [0|1] option, where default is 0.

  4. +
  5. Where applicable, output video rendition resolution can be specified by w and h parameters, which are in 0 to 7680 range. Exceptions are scaler_ama, where w and h are not applicable, and drawbox_ama, where w and h are as noted below.

  6. +
  7. [Video 1] ... [Video N] sequence refers to each one of the N video inputs, e.g., [0:v].

  8. +
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
2D Accelerator Engines

Engine Name

Description

Options

+
+scaler_ama
+
+ +
+
ABR multiscaler
+
Takes one input and generates up to 16 output streams.
+
+
+
outputs specifies the number of scaler outputs.
+
Valid values are integers between 1 and desired number of outputs.
+
out_res specifies ABR ladder rungs <1>*<16>(WxH|Rate|Format).
+
List of up to 16 tuples of form (Resolution|Rate|Pixel Format). Note that no spaces are allowed before or after |.
+
Valid values for resolution: 176x144 to 3840x2160 - default 1920x1080
+
Valid values for frame rate: half and full - default full, where full refers to the incoming frame rate and half to the half of the incoming frame rate. Note that the first entry in this option must be full rate.
+
Valid global values for pixel format: nv12, p010le, packed10, rgbp, yuv420p, and yuv420p10le
+
This plugin can be combined with other plugins, without any degradation in pixel throughput.
+
+
+
+crop_ama
+
+ +
+
Video crop
+
Takes size, coordinates and rendition resolution.
+
+
+
b_left sets the crop box x min co-ordinates (from 0 to INT_MAX) (default 0)
+
b_top sets the crop box y min co-ordinates (from 0 to INT_MAX) (default 0)
+
b_w sets the crop box width (from 10 to INT_MAX) (default 10)
+
b_h sets the crop box height (from 10 to INT_MAX) (default 10)
+
+
+
+pad_ama
+
+ +
+
Video pad
+
Takes size, coordinates, rendition resolution and pad color.
+
+
+
p_left sets the pad box x min co-ordinates (from 0 to INT_MAX) (default 0)
+
p_top sets the pad box y min co-ordinates (from 0 to INT_MAX) (default 0)
+
p_w sets the pad box width (from 10 to INT_MAX) (default 10)
+
p_h sets the pad box height (from 10 to INT_MAX) (default 10)
+
color sets the color of the box (default "black")
+
+
+
+drawbox_ama
+
+ +
+
Draw box
+
Takes size, coordinates, line thickness and color.
+
+
+
color sets the color of the box (default "black")
+
thickness sets box thickness (from 2 to 16) (default 2)
+
x sets box x min co-ordinates (from 0 to INT_MAX) (default 0)
+
y sets box y min co-ordinates (from 0 to INT_MAX) (default 0)
+
w sets box width (from 0 to INT_MAX) (default 10)
+
h sets box height (from 0 to INT_MAX) (default 10)
+
+
+
+rotate_ama
+
+ +
+
Rotate frame
+
Takes angle, and rendition resolution.
+
+
+
angle one of 0, 90, 180 or 270
+
+
+
+colorspace_ama
+
+ +
+
Color space conversion
+
Converts between RGB and YUV.
+
+
+
csc
+
+
i) rgb2yuv converts from rgb input to yuv420p
+
ii) yuv2rgb converts from yuv420p input to rgb
+
+
+
+
+subsample_ama
+
+ +
+
Chroma subsampling
+
Converts from 422 to 420
+
+
+

+
+
+
+overlay_ama
+
+ +
+
Video overlay
+
Overlays 1 picture over another
+
Inputs are specified as [Background][Overlay]overlay_ama
+
+
+
shortest forces termination when the shortest input terminates (default false)
+
x overlay's x_position (from 0 to INT_MAX) (default 0)
+
y overlay's y_position (from 0 to INT_MAX) (default 0)
+
out_fmt sets the YUV output format [optional] (default ""). See -out_fmt.
+
src_alpha sets src alpha value (from 0 to 1) (default 1)
+
dst_alpha sets dst alpha value (from 0 to 1) (default 1)
+
+
+
+tile_ama
+
+ +
+
Video tile
+
Maps input streams to specified layout
+
Inputs are specified as [Video 1]...[Video N]tile_ama, in raster order.
+
+
+
inputs sets number of inputs (from 1 to 32) (default 2)
+
shortest forces termination when the shortest input terminates (default false)
+
layout sets grid size [Max 32 inputs] (default "2x2")
+
+
+
+compositor_ama
+
+ +
+
Video compositions
+
Composites inputs together
+
The compositor supports up to 64 inputs. Each input will be "blit" in a user defined z order on top of a solid background color with specified output width and height.
+
The compositor supports dynamic changes to any of the input properties, as well as allowing inputs to be enabled/disabled.
+
The dynamic behavior has been implemented in FFmpeg using the sendcmd option which allows passing in a file that can script the dynamic behavior.
+
For asynchronous property changes, commands can also be send through a message queue. See Composition for usage sample.
+
+
+
inputs_enabled sets the inputs to enable / disable (mask) (from 0 to 1.84467e+19) (default 4895412794951729152)
+
inputs sets number of inputs (from 1 to 64) (default 1)
+
input_params sets input parameter initial values. Example: input_params=(res=1920x1080|ypos=1080|alpha=0.8)
+
input sets current input to which parameters apply.
+
in_x input's x position
+
in_y input's y position
+
out_res dsestination's resolution (such as 1920x1080)
+
out_x destination's x position
+
out_y destination's y position
+
alpha Alpha blend value
+
zorder zorder of the input
+
angle one of 0, 90, 180, 270
+
flip flip the input. Values: v, h (vertical, horizonal)
+
border_color the color of the border in A8R8G8B8 format
+
border_inner_size the inside border thickness in pixels
+
border_outer_size the outside border thickness in pixels
+
eof_action the action to take when an input encounters EOF (from 0 to 2) (default repeat)
+
+
(0) disable disables inputs that reach EOF. End once all input have reached EOF
+
(1) repeat repeats the last frame of the input that reaches EOF
+
(2) endall ends the output stream once the first input reaches EOF
+
+
out_res sets the output resolution
+
format color space conversion
+
+
i) rgb RGB format
+
ii) 420 YUV 420 format
+
iii) 420-tile YUV 420 tiled format
+
+
enable_background enables / disables the background (default false)
+
background sets the background color (default "black")
+
+
+
+

Note

+

For plugins that accept multiple video streams, i.e., compositor_ama, tile_ama, and overlay_ama, only a single audio track can be added the each output video stream. To select the desired audio, use the -map x:a -c:a copy syntax, where x refers to the selected audio stream number, e.g., -map 1:a -c:a copy.

+
+
+

+
+
+
+

Video Machine Learning

+

This section describes various video ML complex filters of AMA SDK that are utilized using FFmpeg filter graph syntax. Note that supported ROI models are 1080p in landscape mode, 720p in both landscape and portrait modes.

+
+

Inference Engine

+

The AMD AMA Video SDK ML inference engine is leveraged in FFmpeg by using the ml_ama complex filter.

+
+
+ml_ama
+

Filter implementing the AMD AMA Video SDK ML inference engine that executes against a supplied rgbp input and detects face or text classes. Its output is used by downstream components in the pipeline.

+
+ + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
Inference Engine Options

Options

Descriptions

+
+model
+
+ +
+
Specify engine model
+
Valid value roi
+
+
+
+model_args
+
+ +
+
Model specific arguments
+
Valid values for roi: type=face and type=text
+
+
i) type=text - for text detection VQ improvements
+
ii) type=face - for face detection VQ improvements
+
+
+
+
+core_id
+
+ +
+
Specify engine number
+
Valid values: range -1 to 3 or none
+
i) If xrmd is enabled, this will be selected automatically
+
ii) If xrmd is disabled, and core_id is set to -1, then one of 0 to 3 cores will be selected
+
ii) Otherwise, value in 0-3 range will be selected
+
+
+
+nb_inputs
+
+ +
+
Specify number of inputs
+
Valid value: 1
+
Default 1
+
+
+
+inference_period
+
+ +
+
Specify frame skip period
+
Valid value: 1-64
+
Default 1
+
+
+
+
+

ROI Scaler

+

The AMD AMA Video SDK ROI scaler is leveraged in FFmpeg by using software plugin roi_scale_ama complex filter.

+
+
+roi_scale_ama
+

Filter implementing the AMD AMA Video SDK ROI scaler engine that applies ml_ama ROI map to the input video. This engine generates metadata used by downstream encoder within the pipeline.

+
+ + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
Scaler Options

Options

Descriptions

+
+cutoff
+
+ +
+
Specify cutoff threshold
+
Valid value range 0-100000
+
Default 5000
+
0-100% range is mapped to 0-100000, e.g., 5.67% is represented as 5670, and is used as shut off threshold for detected ROI regions. That is, if the percentages of detected ROI regions is above cutoff, then ROI directed encoding is disabled..
+
+
+
+strength
+
+ +
+
Specify probability-to-QP conversion gain factor
+
Valid values are low, normal, and high
+
Default is normal
+
Providing high value generates higher QP modulation that signals to encoder to spend more bits on the associated block.
+
+
+
+nb_inputs
+
+ +
+
Specify number of inputs
+
Valid values: range 2 to 4
+
Default 2
+
+
+
+roi_map_type
+
+ +
+
Specify probability-to-QP mapping
+
Valid values are dqp, roi, dqp_and_roi
+
Default dqp
+
+
+
+static_map_file
+
+ +
+
Specify static map file
+
Valid value is the path to rgbp map file.
+
The size of this file is ceil of width and height of incoming video divided by 16, in each dimension.
+
This file contains values in 0-255 range, for each channel, and servers as the lower boundary of probability-to-QP mapping, i.e., maximum of values in this file and ml_ama is used for QP mapping
+
+
+
+
+

ROI Overlay

+

The AMD AMA Video SDK ROI overlay is leveraged in FFmpeg by using software plugin roi_overlay_ama complex filter.

+
+
+roi_overlay_ama
+

Filter implementing the AMD AMA Video SDK ROI overlay that overlays shaded probability rectangles on detected classes.

+
+ + + ++++ + + + + + + + + + + + + + +
Overlay Options

Options

Descriptions

+
+skip_frames
+
+ +
+
Specify overlay period
+
Valid value range 0-255
+
The value toggles overlay rectangles after the specified number of frames.
+
+
+
+highlight_threshold
+
+ +
+
Specify activation threshold
+
Valid value range 0-255
+
Default 128
+
+
+

See ML Based Face ROI and ML Based Text ROI for sample usage.

+
+

+
+
+
+
+

Other AMA Filters

+ + +++++ + + + + + + + + + + + + + + + + +
Other AMA Filters

Filter Name

Description

Options

+
+hwupload_ama
+
+ +
+
AMA device upload
+
Takes the target device number as an argument and upload data to it.
+
+
+
device specifies the device number.
+
Valid values are integers between 0 and available number of devices minus 1.
+
+
+
+hwdownload_ama
+
+ +
+
AMA host download
+
Takes a argument to enable or disable pipelining
+
+
+
pipeline enables pipelining
+
Note that while enabling pipelining increases the throughput; however, it introduces 2 frames worth of latency.
+
+
+
+

+
+
+
+

Rebuilding FFmpeg

+

Obtain the zipped version of SDK's FFmpeg source code, from ma35d_sdk_v1.2.0_ffmpeg.zip. Unzip this file into ma35_ffmpeg folder. This folder contains the entire source code for the FFmpeg executable, which is a fork of the main FFmpeg GitHub (release 6.1.1) with AMD plugins patches applied. Due to licensing restrictions, the FFmpeg executable included in the Video SDK is enabled with the AMD AMA Video SDK plugins only.

+

You can rebuild the FFmpeg executable with optional plugins by following the instructions below. Additionally, comprehensive instructions for compiling FFmpeg can be found on the FFmpeg wiki page.

+
    +
  1. Make sure libhugetlbfs-dev, nasm and yasm are installed on your machine.

  2. +
  3. Unzip the downloaded zip file:

    +
    unzip ma35d_sdk_v1.2.0_ffmpeg.zip
    +
    +
    +
  4. +
+
+

and navigate to root folder of the unzipped file.

+
+
    +
  1. Execute the following:

    +
    ./configure --disable-alsa --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --disable-libxcb-shape --disable-xlib --disable-libmfx --disable-vaapi --disable-vulkan --prefix=$PWD --disable-stripping --enable-shared --enable-vpe --enable-libxrm --extra-libs="-L/opt/amd/ama/ma35/lib -lvpi -lroi_scale -llog_ama -lxrm -lxrm_interface -lhugetlbfs -lpthread -lstdc++ -lm -ldl -lrt  /opt/amd/ama/ma35/lib/libxrm.so.1.6.0" --extra-cflags="-I/usr/include -I$PWD -I/opt/amd/ama/ma35/include/xrm_interface/ -I/opt/amd/ama/ma35/include/xrm/ -DSUPPORT_OSAL" --extra-ldflags="-Wl,-rpath=$PWD/libavutil:$PWD/libavfilter:$PWD/libavcodec:$PWD/libavformat:$PWD/libavdevice:$PWD/libswscale:$PWD/libswresample:$PWD:/opt/amd/ama/ma35/lib/"
    +
    +
    +
  2. +
  3. Add any other plugins such as libx264 to the above configure line. (See FFmpeg Compilation Guide for details.) A list of configure options is printed by running configure --help.

  4. +
  5. Type make -j to build FFmpeg. GNU Make 3.81 or later is required.

  6. +
  7. To build the example folder, type make examples.

  8. +
  9. Type make install to install all binaries and libraries you built.

  10. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/using_gstreamer.html b/v1.2/using_gstreamer.html new file mode 100644 index 00000000..fb39a62e --- /dev/null +++ b/v1.2/using_gstreamer.html @@ -0,0 +1,1509 @@ + + + + + + + + + + + + + + + Using GStreamer — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Using GStreamer
  • +
  • +
  • +
+
+
+
+
+ +
+

Using GStreamer

+ +
+

Introduction

+

GStreamer is a pipeline-based multimedia framework that links together a wide variety of media processing systems to complete complex workflows. The pipeline design serves as a base to create many types of multimedia applications such as video editors, transcoders, streaming media broadcasters and media players. The AMD AMA Video SDK includes an enhanced version of GStreamer which can communicate with the hardware accelerated transcode pipeline in AMD devices.

+

It is not within the scope of this document to provide an exhaustive guide on the usage of GStreamer. Various resources can be found online, for example:

+ +
+

Overview of the GStreamer Plugins

+

The AMD AMA Video SDK provides the following GStreamer plugins for building hardware-accelerated video pipelines using AMA compatible devices:

+
    +
  • ama_av1dec av1 decoder

  • +
  • ama_av1enc av1 encoder

  • +
  • ama_h264dec h264 decoder

  • +
  • ama_h264enc h264 encoder

  • +
  • ama_h265dec h264 decoder

  • +
  • ama_h264enc h265 encoder

  • +
  • ama_vp9dec VP9 decoder

  • +
  • ama_scaler hardware accelerated scaler and cropper

  • +
  • ama_download data downloader, from device to host

  • +
  • ama_upload data uploader, from host to device

  • +
  • ama_compositor feature rich compositor

  • +
  • ama_jpegdec JPEG decoder

  • +
  • ama_jpegenc JPEG encoder

  • +
  • ama_ljpegenc Lossless JPEG encoder

  • +
  • ama_videoconvert accelerated pixel converter

  • +
+

The following sections describe the options used with GStreamer to configure and use the various hardware accelerators available on AMA compatible devices.

+
+

+
+
+
+
+

Decoder Plugin

+

The ama_av1dec, ama_h264dec, ama_h265dec, and ama_vp9dec plugins provide support for hardware-accelerated decoding using AMA compatible devices, for AV1, AVC, HEVC and VP9.

+

SDK also supports JPEG decoding through ama_jpegdec plugin.

+
+

Decoder Inputs and Outputs

+

Video Decoders:

+
    +
  • Input: 8 or 10 bits AV1, AVC, HEVC and VP9 encoded stream, in OBU format for AV1, byte-stream format for AVC or HEVC, or VP9 stream format for VP9.

  • +
  • Output: One of NV12_4L4, NV12, I420, NV12_10LE32, P010_10E, I420_10LE, RGBP, or NV12_10LE_4L4 formats

  • +
+

JPEG Decoder:

+
    +
  • Input: Standard JPEG file

  • +
  • Output: One of NV12_4L4, NV12,I420, or RGBP

  • +
+
+
+

Decoder Parameters

+ ++++ + + + + + + + + + + + + + + + + + + + +

Property Name

Description

+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Default: -1 (auto)
+
Range -1 to 2147483647
+
+
+
+low-latency
+
+ +
+
Whether to enable low latency decoding
+
Type: Boolean
+
Default: false
+
+
+
+latency-logging
+
+ +
+
Log latency info to syslog
+
Type: Boolean
+
Default: false
+
+
+
+allow-downscaling
+
+ +
+
Downscale through decoder
+
Allow the decoder to downscale the output if negotiated with downstream. When FALSE, the decoder always outputs video in its native resolution. Scaling RGBP format isn't supported. | Type: Boolean
+
Default: false
+
+
+
+
+

Decoder Example Pipelines

+

Refer to the Decoder Pipeline example for an illustration of how to use this plugin.

+
+
+
+

Encoder Plugin

+

The ama_av1enc, ama_h264enc and ama_h265enc plugins provide support for hardware-accelerated encoding using AMA compatible devices, for AV1, AVC and HEVC.

+
+

Encoder Inputs and Outputs

+
    +
  • Input: NV12_4L4, I420, NV12_10LE32, P010_10LE, I420_10LE, or NV12_10LE_4L4

  • +
  • Output: One of AV1, AVC or HEVC 8-bit/10-bit encoded stream, in OBU format for AV1 and byte-stream for AVC and HEVC

  • +
+
+
+

Encoder Parameters

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Property Name

Description

+
+b-frames
+
+ +
+
Number of B-frames between two consecutive P-frames
+
Type: Integer
+
Range: -1 - 7, for AV1
+
Range: -1 - 3, for AVC and HEVC
+
Default: -1 (auto)
+
+
+
+bitrate
+
+ +
+
Fixed output bitrate in bits per second
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 5000000
+
+
+
+crf
+
+ +
+
If specified, enable CRF mode
+
Type: Boolean
+
Default: False
+
+
+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+dynamic-gop
+
+ +
+
Enable Dynamic B Frame Insertion
+
Type: Integer
+
Range: -1 - 1
+
Default: -1 (auto)
+
+
+
+device-type
+
+ +
+
AV1 device type to use
+
Type: Enum
+
+
(0): any
+
(1): Type 1
+
(2): Type 2
+
+
Default: 1
+
+
+
+forced-idr
+
+ +
+
Encode all intra frames as IDR
+
Type: Boolean
+
Default: True
+
+
+
+gop-length
+
+ +
+
Maximum distance between two consecutive I frames
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+idr-interval
+
+ +
+
The periodicity of IDR frames
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 4294967295
+
+
+
+lookahead-depth
+
+ +
+
Number of frames in the future of the currently encoded frame that the encoder will analyze and take into account
+
Type: Integer
+
Range: 0 - 47+Maximum number of B frames b-frames
+
Default: -1 (auto)
+
+
+
+max-bitrate
+
+ +
+
Use to limit encoding bitrate if you have not specified bitrate parameter
+
Type: Integer
+
Range: 0 - 35000000000
+
Default: -1 (auto)
+
+
+
+max-qp
+
+ +
+
Maximum QP value allowed for the rate control
+
Type: Integer
+
Range: 0 - 51, for AVC and HEVC
+
Range: 0 - 255, for AV1
+
Default: 51, for AVC and HEVC
+
Default: 255, for AV1
+
+
+
+min-qp
+
+ +
+
Minimum QP value allowed for the rate control
+
Type: Integer
+
Range: 0 - 51, for AVC and HEVC
+
Range: 0 - 255, for AV1
+
Default: 0
+
+
+
+qp
+
+ +
+
Fixed quantization value. When constant quality is enabled, bitrate must be set to 0
+
Type: Integer
+
Range: -1 - 255
+
Default: -1 (disable)
+
+
+
+qp-b-offset
+
+ +
+
FQuantization offset value - P/B
+
Type: Integer
+
Range: -51 - 51
+
Auto selection mode is -1.
+
Default: 0
+
+
+
+qp-i-offset
+
+ +
+
FQuantization offset value - I
+
Type: Integer
+
Range: -51 - 51
+
Auto selection mode is -1.
+
Default: 0
+
+
+
+qp-mode
+
+ +
+
QP control mode.
+
Type: Enum
+
+
(0): auto - Auto
+
(1): relative-load - Relative load (spatial AQ + temporal AQ)
+
(2): uniform - Uniform (AQ off)
+
+
+
+
+rate-control
+
+ +
+
Rate control mode to use for encoding
+
Type: Enum
+
+
(-1): auto - Auto
+
(0): cqp - Constant QP
+
(1): cbr - Constant bitrate
+
(2): vbr - Variable bitrate
+
(3): cvbr - Constrained variable bitrate
+
+
+
+
+slice
+
+ +
+
Which slice of the XMA device to use
+
Type: Integer
+
Range: -1 - 1
+
Default: -1
+
+
+
+spatial-aq
+
+ +
+
Enable spatial AQ
+
Type: Boolean
+
Default: True
+
+
+
+spatial-aq-gain
+
+ +
+
Spatial AQ gain scale factor
+
Type: Integer
+
Range: 0 -255
+
Default: 255
+
+
+
+temporall-aq
+
+ +
+
Enable temporal AQ
+
Type: Boolean
+
Default: True
+
+
+
+temporal-aq-gain
+
+ +
+
Temporal AQ gain scale factor
+
Type: Integer
+
Range: 0 -255
+
Default: 255
+
Default: 1
+
+
+
+tier
+
+ +
+
Tier
+
Type: Boolean
+
+
(-1): auto - Auto
+
(0): main - Main
+
(1): high - High
+
+
+
+
+preset
+
+ +
+
Encoder VQ-Density preset
+
Valid values: medium or slow. (default is medium)
+
+
(medium) Full density with medium VQ - default
+
(fast) Allows for increase in total throughput from 4kp60 to 4kp75 , when 2 or more channels are used. Does not apply to AV1 device-type 1 encoding. Not applicable under ULL setting. Note lower VQ than medium preset is to be expected.
+
(slow) High VQ at lower density
+
+
Consult the Tuning Video Quality section for more details on how to use this option.
+
Note that this option has no effects on AV1 device-type 1 encoding.
+
+
+
+tune-metrics
+
+ +
+
Tune VQ for objective metrics
+
Type: Enum
+
+
(1): vq - Best visual quality
+
(2): psnr - Best PSNR
+
(3): ssim - Best SSIM
+
(4): vmaf - Best VMA
+
+
+
+
+encoding-params-file
+
+ +
+
Dynamic Configuration File
+
Path to dynamic file location (default is empty)
+
Consult the Dynamic Encoder Parameters section for more details on how to use this option.
+
+
+
+latency-ms
+
+ +
+
Encoder latency in milliseconds that the encoder will analyze and take into account
+
Type: Integer
+
Range: -1 - 60000
+
Default: -1 (auto)
+
+
+
+no-bll
+
+ +
+
No low latency B Frames
+
Type: Integer
+
Range: -1 - 1
+
Default: -1 (auto)
+
+
+
+
+

Encoder Example Pipelines

+

Refer to the Encoder Pipeline example for an illustration of how to use this plugin.

+
+
+
+

Scaler Plugin

+

The ama_scaler plugin provides support for hardware-accelerated resizing.

+
+

Scaler Inputs and Outputs

+
    +
  • Input: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
  • Output: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
+
+
+

Scaler Parameters

+ + ++++ + + + + + + + + + + +
Sink Pad

Property Name

Description

+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+

The output width, height and frame rate are set through the succeeding cap filter.

+ ++++ + + + + + + + + + + + + + + + + +

Pad Property

Description

width

+
Output width
+
Type: Integer
+
Range: 144 - 7580
+
+

height

+
Output height
+
Type: Integer
+
Range: 144 - 7580
+
+

framerate

+
Output frame rate
+
Type: Enum
+
Range: -1 - 1
+
+
(-1): auto - Full rate
+
(0): full - Full rate
+
(1): half - Half rate
+
+
+
+
+
+

Scaler Example Pipelines

+

Refer to the Transcode with Multiple-Resolution Outputs example for an illustration of how to use this plugin.

+
+
+
+

2D Engines

+

This section describes different hardware accelerated 2D processing engines that are available in AMA SDK. The following plugins may take core-id and device as configuration parameters to specify the target core and device, respectively.

+
+

Inputs and Outputs

+
    +
  • Input: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
  • Output: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
+
+
+

2D Plugins

+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
2D Accelerator Engines

Engine Name

Description

Options

+
+ama_videocrop
+
+ +
+
Video crop
+
Takes coordinates.
+
+
+
bottom Pixels to crop at the bottom (from 0 to 2147483647) (default 0)
+
top Pixels to crop at the top (from 0 to 2147483647) (default 0)
+
left Pixels to crop on the left (from 0 to 2147483647) (default 0)
+
right Pixels to crop on the right (from 0 to 2147483647) (default 0)
+
+
+
+ama_videopad
+
+ +
+
Video pad
+
Takes size, coordinates, and pad color.
+
+
+
bottom Pixels to add at the bottom (from 0 to 2147483647) (default 0)
+
top Pixels to add at the top (from 0 to 2147483647) (default 0)
+
left Pixels to add on the left (from 0 to 2147483647) (default 0)
+
right Pixels to add on the right (from 0 to 2147483647) (default 0)
+
color Padded area color in ARGB format (e.g. 0xFF000000 for black)
+
+
+
+ama_drawbox
+
+ +
+
Draw box
+
Takes size, coordinates, and pad color.
+
+
+
height Height of the box (from 0 to 2147483647) (default 10)
+
width Width of the box (from 0 to 2147483647) (default 10)
+
top Number of pixels from the top of the video to the top of the box (from 0 to 2147483647) (default 0)
+
left Number of pixels from the left side of the video to the left side of the box (from 0 to 2147483647) (default 0)
+
thickness Box line thickness (from 2 to 16) (default 2)
+
color Box line color in ARGB format (e.g. 0xFF000000 for black)
+
+
+
+ama_rotate
+
+ +
+
Rotate frame
+
Takes an angle.
+
+
+
angle one of 0, 90, 180 or 270 (default 0)
+
+
+
+ama_videoconvert
+
+ +
+
Color space conversion ans subsampling
+
Converts between RGB and YUV.
+
Converts from I422 to I420
+
+
+

+
+
+
+ama_overlay
+
+ +
+
Video overlay
+
Overlays 1 picture over another
+
+
+
alpha-blend Enable alpha blend (Boolean) default false
+
offset-x Horizontal offset of the overlay in pixels from the left of the main video (from 0 to 2147483647) (default 0)
+
offset-y Vertical offset of the overlay in pixels from the top of the main video (from 0 to 2147483647) (default 0)
+
+
+
+ama_tile
+
+ +
+
Video tile
+
Maps input streams to specified layout
+
+
+
grid-x Number of video tiles per line of the grid (from 1 to 16) (default 2)
+
grid-y Number of lines in the video grid (from 1 to 16) (default 2)
+
+
+
+
+
+

Compositor Plugin

+

The ama_compositor plugin provides support for hardware-accelerated video composition operations such as alpha-belding, rotation, drawbox, etc.

+
+

Compositor Inputs and Outputs

+
    +
  • Input: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
  • Output: NV12_4L4, NV12, I420, NV12_10LE32, P010_10LE, I420_10LE, I420_10BE, RGBP, ARGB, ABGR, RGBA, BGRA, RGB, BGR, and NV12_10LE_4L4

  • +
+
+
+

Compositor Parameters

+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Sink Pad

Property Name

Description

+
+alpha
+
+ +
+
Alpha blending of the picture.
+
Type: float
+
Rang: 0 - 1
+
Default: 1
+
+
+
+border-color
+
+ +
+
Border color of the picture encoded as 0x00RRGGBB
+
Type: Integer
+
Range: 0 - 16777215
+
Default: 0
+
+
+
+border-inner-width
+
+ +
+
Inner width of the picture's border in pixels
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+border-outer-width
+
+ +
+
Outer width of the picture's border in pixels
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+border-outer-width
+
+ +
+
Outer width of the picture's border in pixels
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+crop-bottom
+
+ +
+
Pixels to crop at the bottom
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+crop-left
+
+ +
+
Pixels to crop on the left
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+crop-right
+
+ +
+
Pixels to crop on the right
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+crop-top
+
+ +
+
Pixels to crop at the top
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+height
+
+ +
+
Height of the picture
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+video-direction
+
+ +
+
Video direction's rotation and flip
+
Type: Enum
+
+
(0): identity - No rotation
+
(1): 90r - Rotate clockwise 90 degrees
+
(2): 180 - 180 degrees
+
(3): 90l - Rotate counter-clockwise 90 degrees
+
(4): horiz - Horzontal flip
+
(5): vert - Vertical flip
+
(6): ul-lr - Flip across upper left/lower right diagonal
+
(7): ur-ll - Flip across upper right/lower left diagonal
+
(8): auto - Select flip method based on image-orientation tag
+
(9): custom - Current status depends on plugin internal setup
+
+
+
+
+width
+
+ +
+
Width of the picture
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+xpos
+
+ +
+
X Position of the picture
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+ypos
+
+ +
+
Y Position of the picture
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+
+zorder
+
+ +
+
Z Order of the picture
+
Type: Integer
+
Range: 0 - 4294967295
+
Default: 0
+
+
+ + ++++ + + + + + + + + + + + + + + + + + + + +
Source Pad

Property Name

Description

+
+background
+
+ +
+
Background type
+
Type: Enum
+
+
(0) transparent - Transparent Background to enable further compositing
+
(0) color - Solid Color Background
+
+
+
+
+background-color
+
+ +
+
Color of the composition's background encoded as 0x00RRGGBB
+
Type: Unsigned Integer
+
Range: 0 - 16777215
+
Default: 0
+
+
+
+core-id
+
+ +
+
ID of the device core to use
+
Type: Integer
+
Range: 0 - 1
+
Default: 0
+
+
+
+device
+
+ +
+
Numeric ID of an XMA device (-1 = unspecified)
+
Type: Integer.
+
Range: -1 - 2147483647
+
Default: -1
+
+
+
+
+
+

Hardware Down and Up Loads

+

The ama_download and ama_upload plugins provide support for DMA transfer of data to and from the host, respectively. Note that transaction directions are with respect to the host.

+
+

Inputs and Outputs

+
    +
  • Input: I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, BGR

  • +
  • Output: I420, NV12, I420_10LE, I420_10BE, ARGB, ABGR, RGBA, BGRA, RGB, BGR

  • +
+
+
+

DMA Parameters

+ ++++ + + + + + + + + + + +

Property Name

Description

+
+device
+
+ +
+
Numeric ID of an XMA device
+
Type: Integer
+
Range: -1 - 2147483647
+
Default: -1 (auto)
+
+
+
+
+
+

Moving Data through the Pipeline

+

The GStreamer plugins included in the AMD AMA Video SDK take care of efficiently moving data through the video processing pipeline. For optimal performance, video buffers will be moved between the host and the appropriate device only if needed by plugins in the pipeline. This is known as "zero-copy".

+
    +
  • The decoder plugin will only copy the output buffer from the device to the host if a downstream element (e.g. filesink) running on the host needs to access the decoded frame. This allows downstream hardware-accelerated plugins (e.g. scaler, encoder) running on the same AMD device to process the decoded frames without unnecessary data transfers.

  • +
  • The encoder plugin will only copy the input buffer from host to the device if it is allocated in user-space memory on the host or in a different device. This allows the encoder to process frames produced by upstream hardware-accelerated plugins (e.g. decoder, scaler) running on the same AMD device without unnecessary data transfers.

  • +
+
+
+

Working with Multiple Devices

+

By default, if no device identifier is specified, a job is submitted to device 0. When running large jobs or multiple jobs in parallel, device 0 is bound to run out of resources and additional jobs will error out due to insufficient resources. +By using the device option of the GStreamer plugins, included in the AMD AMA Video SDK, different functionalities such as decode, scale, etc. of a pipeline can be individually submitted to a specific device. This allows for an easy and straightforward way to leverage the entire video acceleration capacity of your system.

+
+
+

Rebuilding GStreamer

+

Obtain the zipped version of SDK's Gstreamer code from ma35d_sdk_v1.2.0_gstreamer.zip. Unzip this file into ma35_gstreamer folder. This folder will contain the source code for AMA SDK plugins and a patch for Gstreamer.

+

You can rebuild the Gstreamer executable with optional plugins by following the instructions below.

+
    +
  1. Install the prerequisite packages:

    +
    sudo apt install ninja-build flex bison python3-pip unzip pkg-config libjansson-dev uuid-dev
    +sudo snap install cmake --classic
    +sudo pip3 install meson ninja
    +
    +
    +
  2. +
  3. Unzip the downloaded zip file:

    +
    unzip ma35d_sdk_v1.2.0_gstreamer.zip -d ma35_gstreamer
    +
    +
    +
  4. +
  5. Get Gstreamer:

    +
    git clone https://github.com/GStreamer/gstreamer.git
    +cd gstreamer
    +git checkout f6e672f27fcac06af58d7ac995551893d36944ce
    +
    +
    +
  6. +
  7. Apply the patch to Gstreamer:

    +
    cp ../ma35_gstreamer/ama_gstreamer.patch .
    +git apply ama_gstreamer.patch
    +
    +
    +
  8. +
  9. Build Gstreamer and AMA SDK plugins:

    +
    cd ../ma35_gstreamer
    +ln -s ../gstreamer/subprojects ./
    +export C_INCLUDE_PATH=/opt/amd/ama/ma35/include/xma/:/opt/amd/ama/ma35/include/xrm/:/opt/amd/ama/ma35/include/xrm_interface/:$C_INCLUDE_PATH
    +export LIBRARY_PATH=/opt/amd/ama/ma35/lib/:$LIBRARY_PATH
    +meson setup build
    +cd build
    +ninja
    +
    +
    +
  10. +
  11. Install Gstreamer and plugins:

    +
    ninja install
    +
    +
    +
  12. +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/v1.2/virtualization.html b/v1.2/virtualization.html new file mode 100644 index 00000000..85af2a18 --- /dev/null +++ b/v1.2/virtualization.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + Virtualization — AMD AMA 1.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • »
  • +
  • Virtualization
  • +
  • +
  • +
+
+
+
+
+ +
+

Virtualization

+ +
+

SR-IOV

+

AMA virtualization support allows for isolated interaction of clients' operating systems with AMA compatible cards, in Linux. Specifically, isolation is achieved by relying on I/O Memory Management Unit (IOMMU) and Single Root I/O virtualization (SR-IOV) technologies. As such, AMA virtualization support provides an efficient interaction path between client applications and AMA compatible cards. This section describes Linux virtualization setup.

+
+

Linux Host

+
    +
  1. Ensure that host system is setup as per On Premises.

  2. +
  3. Install CPU checker and KVM packages on the host. For an Ubuntu host, do the following:

    +
    sudo apt install -y cpu-checker qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
    +
    +
    +
  4. +
  5. Ensure that virtualization is enabled on the host:

    +
    lscpu | grep Virtualization
    +Virtualization:                  AMD-V
    +$ kvm-ok
    +INFO: /dev/kvm exists
    +KVM acceleration can be used
    +
    +
    +
  6. +
  7. If /etc/modules-load.d/ama_transcoder.conf doesn't exists, execute the following:

    +
    echo ama_transcoder | sudo tee /etc/modules-load.d/ama_transcoder.conf
    +
    +
    +
  8. +
  9. If /etc/modprobe.d/ama_transcoder.conf doesn't exists, execute the following:

    +
    echo 'install ama_transcoder /sbin/modprobe --ignore-install ama_transcoder && /opt/amd/ama/ma35/bin/mamgmt --force -d <DBDF> numvfs -v 1 && <REPEAT>' | sudo tee /etc/modprobe.d/ama_transcoder.conf
    +echo 'remove ama_transcoder /sbin/modprobe -r --ignore-install ama_transcoder; /opt/amd/ama/ma35/bin/mamgmt --force -d <DBDF> numvfs -v 0; <REPEAT>' | sudo tee -a /etc/modprobe.d/ama_transcoder.conf
    +
    +
    +

    , where DBDF is PCIe Domain:Bus:Device.Function designation of the device(s) and REPEAT indicates that the /opt/amd/ama/ma35/bin/mamgmt commands are to be repeated for all devices that are meant to be passed to a VM.

    +

    As an example, in a system with 2 cards:

    +
    lspci -d 10ee:
    +01:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +02:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +03:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +04:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +
    +
    +

    , in order to make one device, of each card, available to 2 distinct VMs, /etc/modprobe.d/ama_transcoder.conf will have the following content:

    +
    install ama_transcoder /sbin/modprobe --ignore-install ama_transcoder && /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:02:00.0 numvfs -v 1 && /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:04:00.0 numvfs -v 1
    +remove  ama_transcoder /sbin/modprobe --ignore-install ama_transcoder;   /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:02:00.0 numvfs -v 0;   /opt/amd/ama/ma35/bin/mamgmt --force -d 0000:04:00.0 numvfs -v 0
    +
    +
    +
  10. +
  11. Reboot the host. After reboot execute and confirm the following:

    +
    lsmod | grep ama_transcoder
    +  ama_transcoder        831488  0
    +
    +
    +

    If the above returns empty, then insert the module manually, by sudo modprobe ama_transcoder. Otherwise, confirm that driver is properly configured:

    +
    cat /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
    +1
    +
    +$ lspci -d 10ee:
    +01:00.0 Multimedia controller: Xilinx Corporation Device 5070
    +01:00.1 Multimedia controller: Xilinx Corporation Device 5071
    +...
    +
    +
    +

    The first command confirms that VM guest's Virtual Function (VF) that is associated with host's Physical Function (PF) is enabled and the second one confirms its creation. Note that this snippet assumes target device is 01.00.0.

    +
  12. +
  13. Setup KVM on the host and confirm that it is running:

    +
    sudo systemctl enable libvirtd
    +sudo systemctl start libvirtd
    +systemctl status libvirtd
    +libvirtd.service - Virtualization daemon
    +   Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
    +   Active: active (running) since Wed 2023-06-07 09:19:44 PDT; 7h ago
    +   ...
    +
    +
    +
  14. +
  15. Obtain Ubuntu 20.04 server image, from Ubuntu Focal Fossa.

  16. +
  17. Instantiate the VM guest, by allocating it at least 8 CPU cores and 12GB of RAM.

    +

    Check virt-install version:

    +
    virt-install --version
    +
    +
    +

    If it is 4.0.0 or above, execute the following:

    +
    sudo virt-install --name <VM name> \
    +--ram 12288 --vcpu 8 --virt-type kvm --machine q35 \
    +--disk path=<Path to qcow2 disk file>,size=128 \
    +--os-type linux --os-variant ubuntu20.04 --network network:default --graphics none --console pty,target_type=serial --extra-args "console=ttyS0" \
    +--location <Path to Ubuntu 20.04 ISO file>,kernel=casper/vmlinuz,initrd=casper/initrd \
    +--force --debug --features  apic=on,ioapic.driver=qemu --iommu model=intel,driver.intremap=on,driver.eim=on,driver.caching_mode=on --memorybacking hugepages.page.size=2,hugepages.page.unit=M,nosharepages=1,locked=1 \
    +--hostdev 0<xx>:00.1,driver.name=vfio
    +
    +
    +

    , where VM name is the name of the VM image and Path to qcow2 disk file is the path to VM's disk storage, which will be created. Note that this file will be owned by libvirt-qemu user and kvm group. Also, Path to Ubuntu 20.04 ISO file is the path to the downloaded ISO image and xx is part of DBDF designation as described above. Repeat this step for as many VMs that have been defined in /etc/modprobe.d/ama_transcoder.conf.

    +

    Otherwise, first create the VM without ioapic.driver and --iommu parameters:

    +
    sudo virt-install --name <VM name> \
    +--ram 12288 --vcpu 8 --virt-type kvm --machine q35 \
    +--disk path=<Path to qcow2 disk file>,size=128 \
    +--os-type linux --os-variant ubuntu20.04 --network network:default --graphics none --console pty,target_type=serial --extra-args "console=ttyS0" \
    +--location <Path to Ubuntu 20.04 ISO file>,kernel=casper/vmlinuz,initrd=casper/initrd \
    +--force --debug --hostdev 0<xx>:00.1,driver.name=vfio
    +
    +
    +

    and after VM creation add ioapic.driver and --iommu parameters, via virsh edit:

    +
    virsh edit <VM name>
    +<domain type='kvm'>
    +   ...
    +   <memoryBacking>
    +    <hugepages>
    +      <page size='2048' unit='KiB'/>
    +    </hugepages>
    +    <nosharepages/>
    +    <locked/>
    +  </memoryBacking>
    +   ...
    +   <features>
    +     <acpi/>
    +     <apic/>
    +     <vmport state='off'/>
    +     <ioapic driver='qemu'/>
    +   </features>
    + ...
    +   </rng>
    +   <iommu model='intel'>
    +     <driver intremap='on' caching_mode='on'/>
    +   </iommu>
    + </devices>
    +</domain>
    +
    +
    +

    During or after creation of a VM, it is helpful to install ssh server on the guest VM, in order to be able to connect to the instance:

    +
    sudo apt-get install openssh-server
    +
    +
    +

    (To find the IP address of the running VM, run sudo virsh net-dhcp-leases default or attach to the instance virsh --connect qemu:///system console <VM name> and issue the ip a command)

    +
  18. +
+
+
+

Linux VM Guest

+

On the running VM instance execute the following:

+
+
    +
  1. Set the huge table pages to 6GB, plus an extra 96 pages, i.e. 3072+96:

    +
    sudo sh -c "echo 'vm.nr_hugepages=3168' >> /etc/sysctl.conf"
    +
    +
    +
  2. +
  3. Note that if you are running 20.04 Server edition, you may need to install generic kernel 5.15, dkms and gcc-11:

  4. +
+
+
+
+
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
+sudo apt install -y gcc-11 linux-image-5.15.0-60-generic dkms build-essential linux-headers-5.15.0-60-generic
+
+
+
+
    +
  1. Reboot the VM

  2. +
  3. Install the AMD AMA Video SDK and run through Tutorials and Examples

  4. +
+
+
+
+
+

PCIe Passthrough

+

Unlike the procedure delineated in SR-IOV, where administrative tasks can only be performed through the host, PCIe passthrough allows for complete control of assigned devices, within the guest VM. That is to say, for all intent and purposes, the guest VM behaves as the host bare-metal. However, note that nested VMs are not supported. As an example, the following steps create a Ubuntu Focal Fossa VM guest, with a single assigned device:

+
    +
  1. Proceed by following Steps 1-7 of Chassis Setup (Enabling SR-IOV is optional.)

  2. +
  3. Ensure virtualization is enabled and relevant packages are installed, by following Steps 2 & 3 of Linux Host

  4. +
  5. Execute the following command: (KVM 4.0.0 or higher is assumed.)

    +
    sudo virt-install --name vsdk_vm_passthrough --ram 12288 --vcpu 8 --virt-type kvm \
    +--machine q35 --disk path=<Path to qcow2 disk file>,size=128 \
    +--os-type linux --os-variant ubuntu20.04  --network network:default --graphics none \
    +--console pty,target_type=serial \
    +--features  apic=on,ioapic.driver=qemu --iommu model=intel,driver.intremap=on,driver.eim=on,driver.caching_mode=on \
    +--memorybacking hugepages.page.size=2,hugepages.page.unit=M,nosharepages=1,locked=1 \
    +--hostdev <xx>:00.0 --location <Path to Ubuntu 20.04 ISO file> \
    +--extra-args "console=ttyS0" --force --debug
    +
    +
    +
  6. +
+

, where Path to Ubuntu 20.04 ISO file is the path to the downloaded ISO image. Customize the installation packages as needed. It is useful to include development packages and ssh server.

+
    +
  1. Set huge pages as per Step 1 of Linux VM Guest.

  2. +
  3. Proceed by following Steps 3 & 4 of Linux VM Guest.

  4. +
+
+

Note

+

Ignore messages pertaining to sriov_drivers_autoprobe file not found .

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + + + \ No newline at end of file