Partial AV1 support
Build / build (push) Successful in 1m52s

This commit is contained in:
2025-08-17 14:48:15 +07:00
parent f51ca2127a
commit 209168dbf3
11 changed files with 363 additions and 83 deletions
@@ -0,0 +1,122 @@
import {
DEFAULT_BITRATE,
type CodecInfo,
type FFmpegParams,
} from "@/util/ffmpeg";
import { os } from "@neutralinojs/lib";
import BreezeIcon from "@/components/BreezeIcon";
import { createEffect, createSignal, Show } from "solid-js";
const DEFAULT_CRF = 23;
function LibaomOptions(props: {
codec: CodecInfo | undefined;
params: FFmpegParams;
onParamChanged: (key: string, value: any) => void;
}) {
const [rateControlMode, setRateControlMode] = createSignal("Constant");
createEffect(() => {
const mode = rateControlMode();
props.onParamChanged("twopass", mode === "2PassABR");
switch (mode) {
case "Constant":
props.onParamChanged("crf", props.params.crf ?? DEFAULT_CRF);
props.onParamChanged("vbitrate", undefined);
break;
case "Constrained":
props.onParamChanged("crf", props.params.crf ?? DEFAULT_CRF);
props.onParamChanged(
"vbitrate",
props.params.vbitrate ?? DEFAULT_BITRATE,
);
break;
case "2PassABR":
case "ABR":
props.onParamChanged("crf", undefined);
props.onParamChanged(
"vbitrate",
props.params.vbitrate ?? DEFAULT_BITRATE,
);
break;
}
});
return (
<section id="encoderOptions">
<div class="row flex-col align-items-center">
<h3 class="k-form-section-title">Encoder Options</h3>
</div>
<div class="k-form">
<label>Help</label>
<div>
<button
class="icon-button"
onclick={() =>
os.open(
"https://trac.ffmpeg.org/wiki/Encode/AV1#libaom",
)
}
title="Click to view the documentation for this encoder."
>
<BreezeIcon icon="help-about" alt="Help" />
</button>
</div>
<label>Rate-control modes</label>
<select
class="k-dropdown"
onchange={(e) => setRateControlMode(e.target.value)}
>
<option value="Constant">Constant Quality</option>
<option value="Constrained">Constrained Quality</option>
<option value="2PassABR">2-Pass Average Bitrate</option>
<option value="ABR">1-Pass Average Bitrate</option>
</select>
<Show
when={
rateControlMode() === "Constant" ||
rateControlMode() === "Constrained"
}
>
<label>CRF</label>
<input
type="number"
name="crf"
id="crf"
min="1"
max="63"
value={props.params.crf ?? DEFAULT_CRF}
oninput={(e) => {
props.onParamChanged(
"crf",
parseInt(e.target.value),
);
}}
/>
</Show>
<Show when={rateControlMode() !== "Constant"}>
<label>Bitrate</label>
<div class="row gap2">
<input
type="number"
name="bitrate"
id="bitrate"
value={props.params.vbitrate ?? DEFAULT_BITRATE}
oninput={(e) => {
props.onParamChanged(
"vbitrate",
parseInt(e.target.value),
);
}}
/>
<span>Kbps</span>
</div>
</Show>
</div>
</section>
);
}
export default LibaomOptions;