1
0
mirror of https://github.com/immich-app/immich.git synced 2025-08-09 23:17:29 +02:00

Add AV1 transcoding support (#8491)

* Add AV1 transcoding support

- AV1 encoding on CPU via SVT-AV1 (libsvtav1 in ffmpeg)
- Supports CRF and optionally capped CRF (max bitrate)
- Tested playback successfully in Chrome Win+Android, Firefox Win+Linux, Android app

* AV1: Add support for encoding threads option

* Revert previous commit; specifying params multiple times is bad

We need to specify all svtav1-params at once, so putting the thread option into getThreadOptions is not possible.

* AV1: Override VAAPI getSupportedCodecs as it does not yet support AV1 unlike nvenc, qsv, amf

* Change BaseHWConfig supported codecs to only H264/HEVC

Configs that support VP9 and/or AV1 need to override getSupportedCodecs()

* Set SVT-AV1 threads with svtav1-params, remove duplicate block in NVENCConfig

* AV1Config: Fix empty svtav1-params array being added to options

* add tests

* update api

* allow crf-based two-pass mode

* formatting

* suggest 35

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
This commit is contained in:
N00MKRAD
2024-04-11 07:26:27 +02:00
committed by GitHub
parent ad5d115abe
commit f1ca1794a1
9 changed files with 215 additions and 6 deletions

View File

@@ -26,12 +26,14 @@ class VideoCodec {
static const h264 = VideoCodec._(r'h264');
static const hevc = VideoCodec._(r'hevc');
static const vp9 = VideoCodec._(r'vp9');
static const av1 = VideoCodec._(r'av1');
/// List of all possible values in this [enum][VideoCodec].
static const values = <VideoCodec>[
h264,
hevc,
vp9,
av1,
];
static VideoCodec? fromJson(dynamic value) => VideoCodecTypeTransformer().decode(value);
@@ -73,6 +75,7 @@ class VideoCodecTypeTransformer {
case r'h264': return VideoCodec.h264;
case r'hevc': return VideoCodec.hevc;
case r'vp9': return VideoCodec.vp9;
case r'av1': return VideoCodec.av1;
default:
if (!allowNull) {
throw ArgumentError('Unknown enum value to decode: $data');