feat(playback): add ArtCNN shader presets

close #924
This commit is contained in:
edde746
2026-04-26 20:29:38 +02:00
parent 3433dcb21c
commit 19a0128363
43 changed files with 16362 additions and 3 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+3
View File
@@ -821,6 +821,9 @@
"title": "Shadere",
"noShaderDescription": "Ingen videoforbedring",
"nvscalerDescription": "NVIDIA-billedskalering for skarpere video",
"artcnnVariantNeutral": "Neutral",
"artcnnVariantDenoise": "Støjreduktion",
"artcnnVariantDenoiseSharpen": "Støjreduktion + skarphed",
"qualityFast": "Hurtig",
"qualityHQ": "Høj kvalitet",
"mode": "Tilstand",
+3
View File
@@ -821,6 +821,9 @@
"title": "Shader",
"noShaderDescription": "Keine Videoverbesserung",
"nvscalerDescription": "NVIDIA-Bildskalierung für schärferes Video",
"artcnnVariantNeutral": "Neutral",
"artcnnVariantDenoise": "Rauschreduzierung",
"artcnnVariantDenoiseSharpen": "Rauschreduzierung + Schärfen",
"qualityFast": "Schnell",
"qualityHQ": "Hohe Qualität",
"mode": "Modus",
+3
View File
@@ -821,6 +821,9 @@
"title": "Shaders",
"noShaderDescription": "No video enhancement",
"nvscalerDescription": "NVIDIA image scaling for sharper video",
"artcnnVariantNeutral": "Neutral",
"artcnnVariantDenoise": "Denoise",
"artcnnVariantDenoiseSharpen": "Denoise + Sharpen",
"qualityFast": "Fast",
"qualityHQ": "High Quality",
"mode": "Mode",
+3
View File
@@ -821,6 +821,9 @@
"title": "Shaders",
"noShaderDescription": "Sin mejora de video",
"nvscalerDescription": "Escalado de imagen NVIDIA para un video más nítido",
"artcnnVariantNeutral": "Neutral",
"artcnnVariantDenoise": "Reducción de ruido",
"artcnnVariantDenoiseSharpen": "Reducción de ruido + enfoque",
"qualityFast": "Rápido",
"qualityHQ": "Alta Calidad",
"mode": "Modo",
+3
View File
@@ -821,6 +821,9 @@
"title": "Shaders",
"noShaderDescription": "Aucune amélioration vidéo",
"nvscalerDescription": "Mise à l'échelle NVIDIA pour une vidéo plus nette",
"artcnnVariantNeutral": "Neutre",
"artcnnVariantDenoise": "Réduction du bruit",
"artcnnVariantDenoiseSharpen": "Réduction du bruit + netteté",
"qualityFast": "Rapide",
"qualityHQ": "Haute qualité",
"mode": "Mode",
+3
View File
@@ -821,6 +821,9 @@
"title": "Shader",
"noShaderDescription": "Nessun miglioramento video",
"nvscalerDescription": "Ridimensionamento NVIDIA per video più nitido",
"artcnnVariantNeutral": "Neutro",
"artcnnVariantDenoise": "Riduzione rumore",
"artcnnVariantDenoiseSharpen": "Riduzione rumore + nitidezza",
"qualityFast": "Veloce",
"qualityHQ": "Alta qualità",
"mode": "Modalità",
+3
View File
@@ -821,6 +821,9 @@
"title": "シェーダー",
"noShaderDescription": "映像補正なし",
"nvscalerDescription": "よりシャープな映像のためのNVIDIA画像スケーリング",
"artcnnVariantNeutral": "ニュートラル",
"artcnnVariantDenoise": "ノイズ除去",
"artcnnVariantDenoiseSharpen": "ノイズ除去 + シャープ",
"qualityFast": "高速",
"qualityHQ": "高品質",
"mode": "モード",
+3
View File
@@ -821,6 +821,9 @@
"title": "셰이더",
"noShaderDescription": "비디오 향상 없음",
"nvscalerDescription": "더 선명한 비디오를 위한 NVIDIA 이미지 스케일링",
"artcnnVariantNeutral": "중립",
"artcnnVariantDenoise": "노이즈 제거",
"artcnnVariantDenoiseSharpen": "노이즈 제거 + 선명화",
"qualityFast": "빠름",
"qualityHQ": "고품질",
"mode": "모드",
+3
View File
@@ -821,6 +821,9 @@
"title": "Shadere",
"noShaderDescription": "Ingen videoforbedring",
"nvscalerDescription": "NVIDIA bildeskalering for skarpere video",
"artcnnVariantNeutral": "Nøytral",
"artcnnVariantDenoise": "Støyreduksjon",
"artcnnVariantDenoiseSharpen": "Støyreduksjon + skarphet",
"qualityFast": "Rask",
"qualityHQ": "Høy kvalitet",
"mode": "Modus",
+3
View File
@@ -821,6 +821,9 @@
"title": "Shaders",
"noShaderDescription": "Geen videoverbetering",
"nvscalerDescription": "NVIDIA-beeldschaling voor scherpere video",
"artcnnVariantNeutral": "Neutraal",
"artcnnVariantDenoise": "Ruisonderdrukking",
"artcnnVariantDenoiseSharpen": "Ruisonderdrukking + verscherpen",
"qualityFast": "Snel",
"qualityHQ": "Hoge kwaliteit",
"mode": "Modus",
+3
View File
@@ -821,6 +821,9 @@
"title": "Shadery",
"noShaderDescription": "Bez ulepszenia wideo",
"nvscalerDescription": "Skalowanie obrazu NVIDIA dla ostrzejszego wideo",
"artcnnVariantNeutral": "Neutralny",
"artcnnVariantDenoise": "Odszumianie",
"artcnnVariantDenoiseSharpen": "Odszumianie + wyostrzanie",
"qualityFast": "Szybki",
"qualityHQ": "Wysoka jakość",
"mode": "Tryb",
+3
View File
@@ -821,6 +821,9 @@
"title": "Shaders",
"noShaderDescription": "Sem aprimoramento de vídeo",
"nvscalerDescription": "Escalonamento de imagem NVIDIA para vídeo mais nítido",
"artcnnVariantNeutral": "Neutro",
"artcnnVariantDenoise": "Redução de ruído",
"artcnnVariantDenoiseSharpen": "Redução de ruído + nitidez",
"qualityFast": "Rápido",
"qualityHQ": "Alta Qualidade",
"mode": "Modo",
+3
View File
@@ -821,6 +821,9 @@
"title": "Шейдеры",
"noShaderDescription": "Без улучшения видео",
"nvscalerDescription": "Масштабирование NVIDIA для более чёткого видео",
"artcnnVariantNeutral": "Нейтральный",
"artcnnVariantDenoise": "Шумоподавление",
"artcnnVariantDenoiseSharpen": "Шумоподавление + резкость",
"qualityFast": "Быстрый",
"qualityHQ": "Высокое качество",
"mode": "Режим",
+2 -2
View File
@@ -4,9 +4,9 @@
/// To regenerate, run: `dart run slang`
///
/// Locales: 15
/// Strings: 14550 (970 per locale)
/// Strings: 14595 (973 per locale)
///
/// Built on 2026-04-26 at 10:32 UTC
/// Built on 2026-04-26 at 18:24 UTC
// coverage:ignore-file
// ignore_for_file: type=lint, unused_import
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersDa implements TranslationsShadersEn {
@override String get title => 'Shadere';
@override String get noShaderDescription => 'Ingen videoforbedring';
@override String get nvscalerDescription => 'NVIDIA-billedskalering for skarpere video';
@override String get artcnnVariantNeutral => 'Neutral';
@override String get artcnnVariantDenoise => 'Støjreduktion';
@override String get artcnnVariantDenoiseSharpen => 'Støjreduktion + skarphed';
@override String get qualityFast => 'Hurtig';
@override String get qualityHQ => 'Høj kvalitet';
@override String get mode => 'Tilstand';
@@ -2288,6 +2291,9 @@ extension on TranslationsDa {
'shaders.title' => 'Shadere',
'shaders.noShaderDescription' => 'Ingen videoforbedring',
'shaders.nvscalerDescription' => 'NVIDIA-billedskalering for skarpere video',
'shaders.artcnnVariantNeutral' => 'Neutral',
'shaders.artcnnVariantDenoise' => 'Støjreduktion',
'shaders.artcnnVariantDenoiseSharpen' => 'Støjreduktion + skarphed',
'shaders.qualityFast' => 'Hurtig',
'shaders.qualityHQ' => 'Høj kvalitet',
'shaders.mode' => 'Tilstand',
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersDe implements TranslationsShadersEn {
@override String get title => 'Shader';
@override String get noShaderDescription => 'Keine Videoverbesserung';
@override String get nvscalerDescription => 'NVIDIA-Bildskalierung für schärferes Video';
@override String get artcnnVariantNeutral => 'Neutral';
@override String get artcnnVariantDenoise => 'Rauschreduzierung';
@override String get artcnnVariantDenoiseSharpen => 'Rauschreduzierung + Schärfen';
@override String get qualityFast => 'Schnell';
@override String get qualityHQ => 'Hohe Qualität';
@override String get mode => 'Modus';
@@ -2288,6 +2291,9 @@ extension on TranslationsDe {
'shaders.title' => 'Shader',
'shaders.noShaderDescription' => 'Keine Videoverbesserung',
'shaders.nvscalerDescription' => 'NVIDIA-Bildskalierung für schärferes Video',
'shaders.artcnnVariantNeutral' => 'Neutral',
'shaders.artcnnVariantDenoise' => 'Rauschreduzierung',
'shaders.artcnnVariantDenoiseSharpen' => 'Rauschreduzierung + Schärfen',
'shaders.qualityFast' => 'Schnell',
'shaders.qualityHQ' => 'Hohe Qualität',
'shaders.mode' => 'Modus',
+12
View File
@@ -2516,6 +2516,15 @@ class TranslationsShadersEn {
/// en: 'NVIDIA image scaling for sharper video'
String get nvscalerDescription => 'NVIDIA image scaling for sharper video';
/// en: 'Neutral'
String get artcnnVariantNeutral => 'Neutral';
/// en: 'Denoise'
String get artcnnVariantDenoise => 'Denoise';
/// en: 'Denoise + Sharpen'
String get artcnnVariantDenoiseSharpen => 'Denoise + Sharpen';
/// en: 'Fast'
String get qualityFast => 'Fast';
@@ -4236,6 +4245,9 @@ extension on Translations {
'shaders.title' => 'Shaders',
'shaders.noShaderDescription' => 'No video enhancement',
'shaders.nvscalerDescription' => 'NVIDIA image scaling for sharper video',
'shaders.artcnnVariantNeutral' => 'Neutral',
'shaders.artcnnVariantDenoise' => 'Denoise',
'shaders.artcnnVariantDenoiseSharpen' => 'Denoise + Sharpen',
'shaders.qualityFast' => 'Fast',
'shaders.qualityHQ' => 'High Quality',
'shaders.mode' => 'Mode',
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersEs implements TranslationsShadersEn {
@override String get title => 'Shaders';
@override String get noShaderDescription => 'Sin mejora de video';
@override String get nvscalerDescription => 'Escalado de imagen NVIDIA para un video más nítido';
@override String get artcnnVariantNeutral => 'Neutral';
@override String get artcnnVariantDenoise => 'Reducción de ruido';
@override String get artcnnVariantDenoiseSharpen => 'Reducción de ruido + enfoque';
@override String get qualityFast => 'Rápido';
@override String get qualityHQ => 'Alta Calidad';
@override String get mode => 'Modo';
@@ -2288,6 +2291,9 @@ extension on TranslationsEs {
'shaders.title' => 'Shaders',
'shaders.noShaderDescription' => 'Sin mejora de video',
'shaders.nvscalerDescription' => 'Escalado de imagen NVIDIA para un video más nítido',
'shaders.artcnnVariantNeutral' => 'Neutral',
'shaders.artcnnVariantDenoise' => 'Reducción de ruido',
'shaders.artcnnVariantDenoiseSharpen' => 'Reducción de ruido + enfoque',
'shaders.qualityFast' => 'Rápido',
'shaders.qualityHQ' => 'Alta Calidad',
'shaders.mode' => 'Modo',
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersFr implements TranslationsShadersEn {
@override String get title => 'Shaders';
@override String get noShaderDescription => 'Aucune amélioration vidéo';
@override String get nvscalerDescription => 'Mise à l\'échelle NVIDIA pour une vidéo plus nette';
@override String get artcnnVariantNeutral => 'Neutre';
@override String get artcnnVariantDenoise => 'Réduction du bruit';
@override String get artcnnVariantDenoiseSharpen => 'Réduction du bruit + netteté';
@override String get qualityFast => 'Rapide';
@override String get qualityHQ => 'Haute qualité';
@override String get mode => 'Mode';
@@ -2288,6 +2291,9 @@ extension on TranslationsFr {
'shaders.title' => 'Shaders',
'shaders.noShaderDescription' => 'Aucune amélioration vidéo',
'shaders.nvscalerDescription' => 'Mise à l\'échelle NVIDIA pour une vidéo plus nette',
'shaders.artcnnVariantNeutral' => 'Neutre',
'shaders.artcnnVariantDenoise' => 'Réduction du bruit',
'shaders.artcnnVariantDenoiseSharpen' => 'Réduction du bruit + netteté',
'shaders.qualityFast' => 'Rapide',
'shaders.qualityHQ' => 'Haute qualité',
'shaders.mode' => 'Mode',
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersIt implements TranslationsShadersEn {
@override String get title => 'Shader';
@override String get noShaderDescription => 'Nessun miglioramento video';
@override String get nvscalerDescription => 'Ridimensionamento NVIDIA per video più nitido';
@override String get artcnnVariantNeutral => 'Neutro';
@override String get artcnnVariantDenoise => 'Riduzione rumore';
@override String get artcnnVariantDenoiseSharpen => 'Riduzione rumore + nitidezza';
@override String get qualityFast => 'Veloce';
@override String get qualityHQ => 'Alta qualità';
@override String get mode => 'Modalità';
@@ -2288,6 +2291,9 @@ extension on TranslationsIt {
'shaders.title' => 'Shader',
'shaders.noShaderDescription' => 'Nessun miglioramento video',
'shaders.nvscalerDescription' => 'Ridimensionamento NVIDIA per video più nitido',
'shaders.artcnnVariantNeutral' => 'Neutro',
'shaders.artcnnVariantDenoise' => 'Riduzione rumore',
'shaders.artcnnVariantDenoiseSharpen' => 'Riduzione rumore + nitidezza',
'shaders.qualityFast' => 'Veloce',
'shaders.qualityHQ' => 'Alta qualità',
'shaders.mode' => 'Modalità',
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersJa implements TranslationsShadersEn {
@override String get title => 'シェーダー';
@override String get noShaderDescription => '映像補正なし';
@override String get nvscalerDescription => 'よりシャープな映像のためのNVIDIA画像スケーリング';
@override String get artcnnVariantNeutral => 'ニュートラル';
@override String get artcnnVariantDenoise => 'ノイズ除去';
@override String get artcnnVariantDenoiseSharpen => 'ノイズ除去 + シャープ';
@override String get qualityFast => '高速';
@override String get qualityHQ => '高品質';
@override String get mode => 'モード';
@@ -2288,6 +2291,9 @@ extension on TranslationsJa {
'shaders.title' => 'シェーダー',
'shaders.noShaderDescription' => '映像補正なし',
'shaders.nvscalerDescription' => 'よりシャープな映像のためのNVIDIA画像スケーリング',
'shaders.artcnnVariantNeutral' => 'ニュートラル',
'shaders.artcnnVariantDenoise' => 'ノイズ除去',
'shaders.artcnnVariantDenoiseSharpen' => 'ノイズ除去 + シャープ',
'shaders.qualityFast' => '高速',
'shaders.qualityHQ' => '高品質',
'shaders.mode' => 'モード',
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersKo implements TranslationsShadersEn {
@override String get title => '셰이더';
@override String get noShaderDescription => '비디오 향상 없음';
@override String get nvscalerDescription => '더 선명한 비디오를 위한 NVIDIA 이미지 스케일링';
@override String get artcnnVariantNeutral => '중립';
@override String get artcnnVariantDenoise => '노이즈 제거';
@override String get artcnnVariantDenoiseSharpen => '노이즈 제거 + 선명화';
@override String get qualityFast => '빠름';
@override String get qualityHQ => '고품질';
@override String get mode => '모드';
@@ -2288,6 +2291,9 @@ extension on TranslationsKo {
'shaders.title' => '셰이더',
'shaders.noShaderDescription' => '비디오 향상 없음',
'shaders.nvscalerDescription' => '더 선명한 비디오를 위한 NVIDIA 이미지 스케일링',
'shaders.artcnnVariantNeutral' => '중립',
'shaders.artcnnVariantDenoise' => '노이즈 제거',
'shaders.artcnnVariantDenoiseSharpen' => '노이즈 제거 + 선명화',
'shaders.qualityFast' => '빠름',
'shaders.qualityHQ' => '고품질',
'shaders.mode' => '모드',
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersNb implements TranslationsShadersEn {
@override String get title => 'Shadere';
@override String get noShaderDescription => 'Ingen videoforbedring';
@override String get nvscalerDescription => 'NVIDIA bildeskalering for skarpere video';
@override String get artcnnVariantNeutral => 'Nøytral';
@override String get artcnnVariantDenoise => 'Støyreduksjon';
@override String get artcnnVariantDenoiseSharpen => 'Støyreduksjon + skarphet';
@override String get qualityFast => 'Rask';
@override String get qualityHQ => 'Høy kvalitet';
@override String get mode => 'Modus';
@@ -2288,6 +2291,9 @@ extension on TranslationsNb {
'shaders.title' => 'Shadere',
'shaders.noShaderDescription' => 'Ingen videoforbedring',
'shaders.nvscalerDescription' => 'NVIDIA bildeskalering for skarpere video',
'shaders.artcnnVariantNeutral' => 'Nøytral',
'shaders.artcnnVariantDenoise' => 'Støyreduksjon',
'shaders.artcnnVariantDenoiseSharpen' => 'Støyreduksjon + skarphet',
'shaders.qualityFast' => 'Rask',
'shaders.qualityHQ' => 'Høy kvalitet',
'shaders.mode' => 'Modus',
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersNl implements TranslationsShadersEn {
@override String get title => 'Shaders';
@override String get noShaderDescription => 'Geen videoverbetering';
@override String get nvscalerDescription => 'NVIDIA-beeldschaling voor scherpere video';
@override String get artcnnVariantNeutral => 'Neutraal';
@override String get artcnnVariantDenoise => 'Ruisonderdrukking';
@override String get artcnnVariantDenoiseSharpen => 'Ruisonderdrukking + verscherpen';
@override String get qualityFast => 'Snel';
@override String get qualityHQ => 'Hoge kwaliteit';
@override String get mode => 'Modus';
@@ -2288,6 +2291,9 @@ extension on TranslationsNl {
'shaders.title' => 'Shaders',
'shaders.noShaderDescription' => 'Geen videoverbetering',
'shaders.nvscalerDescription' => 'NVIDIA-beeldschaling voor scherpere video',
'shaders.artcnnVariantNeutral' => 'Neutraal',
'shaders.artcnnVariantDenoise' => 'Ruisonderdrukking',
'shaders.artcnnVariantDenoiseSharpen' => 'Ruisonderdrukking + verscherpen',
'shaders.qualityFast' => 'Snel',
'shaders.qualityHQ' => 'Hoge kwaliteit',
'shaders.mode' => 'Modus',
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersPl implements TranslationsShadersEn {
@override String get title => 'Shadery';
@override String get noShaderDescription => 'Bez ulepszenia wideo';
@override String get nvscalerDescription => 'Skalowanie obrazu NVIDIA dla ostrzejszego wideo';
@override String get artcnnVariantNeutral => 'Neutralny';
@override String get artcnnVariantDenoise => 'Odszumianie';
@override String get artcnnVariantDenoiseSharpen => 'Odszumianie + wyostrzanie';
@override String get qualityFast => 'Szybki';
@override String get qualityHQ => 'Wysoka jakość';
@override String get mode => 'Tryb';
@@ -2288,6 +2291,9 @@ extension on TranslationsPl {
'shaders.title' => 'Shadery',
'shaders.noShaderDescription' => 'Bez ulepszenia wideo',
'shaders.nvscalerDescription' => 'Skalowanie obrazu NVIDIA dla ostrzejszego wideo',
'shaders.artcnnVariantNeutral' => 'Neutralny',
'shaders.artcnnVariantDenoise' => 'Odszumianie',
'shaders.artcnnVariantDenoiseSharpen' => 'Odszumianie + wyostrzanie',
'shaders.qualityFast' => 'Szybki',
'shaders.qualityHQ' => 'Wysoka jakość',
'shaders.mode' => 'Tryb',
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersPt implements TranslationsShadersEn {
@override String get title => 'Shaders';
@override String get noShaderDescription => 'Sem aprimoramento de vídeo';
@override String get nvscalerDescription => 'Escalonamento de imagem NVIDIA para vídeo mais nítido';
@override String get artcnnVariantNeutral => 'Neutro';
@override String get artcnnVariantDenoise => 'Redução de ruído';
@override String get artcnnVariantDenoiseSharpen => 'Redução de ruído + nitidez';
@override String get qualityFast => 'Rápido';
@override String get qualityHQ => 'Alta Qualidade';
@override String get mode => 'Modo';
@@ -2288,6 +2291,9 @@ extension on TranslationsPt {
'shaders.title' => 'Shaders',
'shaders.noShaderDescription' => 'Sem aprimoramento de vídeo',
'shaders.nvscalerDescription' => 'Escalonamento de imagem NVIDIA para vídeo mais nítido',
'shaders.artcnnVariantNeutral' => 'Neutro',
'shaders.artcnnVariantDenoise' => 'Redução de ruído',
'shaders.artcnnVariantDenoiseSharpen' => 'Redução de ruído + nitidez',
'shaders.qualityFast' => 'Rápido',
'shaders.qualityHQ' => 'Alta Qualidade',
'shaders.mode' => 'Modo',
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersRu implements TranslationsShadersEn {
@override String get title => 'Шейдеры';
@override String get noShaderDescription => 'Без улучшения видео';
@override String get nvscalerDescription => 'Масштабирование NVIDIA для более чёткого видео';
@override String get artcnnVariantNeutral => 'Нейтральный';
@override String get artcnnVariantDenoise => 'Шумоподавление';
@override String get artcnnVariantDenoiseSharpen => 'Шумоподавление + резкость';
@override String get qualityFast => 'Быстрый';
@override String get qualityHQ => 'Высокое качество';
@override String get mode => 'Режим';
@@ -2288,6 +2291,9 @@ extension on TranslationsRu {
'shaders.title' => 'Шейдеры',
'shaders.noShaderDescription' => 'Без улучшения видео',
'shaders.nvscalerDescription' => 'Масштабирование NVIDIA для более чёткого видео',
'shaders.artcnnVariantNeutral' => 'Нейтральный',
'shaders.artcnnVariantDenoise' => 'Шумоподавление',
'shaders.artcnnVariantDenoiseSharpen' => 'Шумоподавление + резкость',
'shaders.qualityFast' => 'Быстрый',
'shaders.qualityHQ' => 'Высокое качество',
'shaders.mode' => 'Режим',
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersSv implements TranslationsShadersEn {
@override String get title => 'Shaders';
@override String get noShaderDescription => 'Ingen videoförbättring';
@override String get nvscalerDescription => 'NVIDIA-bildskalning för skarpare video';
@override String get artcnnVariantNeutral => 'Neutral';
@override String get artcnnVariantDenoise => 'Brusreducering';
@override String get artcnnVariantDenoiseSharpen => 'Brusreducering + skärpa';
@override String get qualityFast => 'Snabb';
@override String get qualityHQ => 'Hög kvalitet';
@override String get mode => 'Läge';
@@ -2288,6 +2291,9 @@ extension on TranslationsSv {
'shaders.title' => 'Shaders',
'shaders.noShaderDescription' => 'Ingen videoförbättring',
'shaders.nvscalerDescription' => 'NVIDIA-bildskalning för skarpare video',
'shaders.artcnnVariantNeutral' => 'Neutral',
'shaders.artcnnVariantDenoise' => 'Brusreducering',
'shaders.artcnnVariantDenoiseSharpen' => 'Brusreducering + skärpa',
'shaders.qualityFast' => 'Snabb',
'shaders.qualityHQ' => 'Hög kvalitet',
'shaders.mode' => 'Läge',
+6
View File
@@ -1089,6 +1089,9 @@ class _TranslationsShadersZh implements TranslationsShadersEn {
@override String get title => '着色器';
@override String get noShaderDescription => '无视频增强';
@override String get nvscalerDescription => 'NVIDIA 图像缩放,使视频更清晰';
@override String get artcnnVariantNeutral => '中性';
@override String get artcnnVariantDenoise => '降噪';
@override String get artcnnVariantDenoiseSharpen => '降噪 + 锐化';
@override String get qualityFast => '快速';
@override String get qualityHQ => '高质量';
@override String get mode => '模式';
@@ -2288,6 +2291,9 @@ extension on TranslationsZh {
'shaders.title' => '着色器',
'shaders.noShaderDescription' => '无视频增强',
'shaders.nvscalerDescription' => 'NVIDIA 图像缩放,使视频更清晰',
'shaders.artcnnVariantNeutral' => '中性',
'shaders.artcnnVariantDenoise' => '降噪',
'shaders.artcnnVariantDenoiseSharpen' => '降噪 + 锐化',
'shaders.qualityFast' => '快速',
'shaders.qualityHQ' => '高质量',
'shaders.mode' => '模式',
+3
View File
@@ -821,6 +821,9 @@
"title": "Shaders",
"noShaderDescription": "Ingen videoförbättring",
"nvscalerDescription": "NVIDIA-bildskalning för skarpare video",
"artcnnVariantNeutral": "Neutral",
"artcnnVariantDenoise": "Brusreducering",
"artcnnVariantDenoiseSharpen": "Brusreducering + skärpa",
"qualityFast": "Snabb",
"qualityHQ": "Hög kvalitet",
"mode": "Läge",
+3
View File
@@ -821,6 +821,9 @@
"title": "着色器",
"noShaderDescription": "无视频增强",
"nvscalerDescription": "NVIDIA 图像缩放,使视频更清晰",
"artcnnVariantNeutral": "中性",
"artcnnVariantDenoise": "降噪",
"artcnnVariantDenoiseSharpen": "降噪 + 锐化",
"qualityFast": "快速",
"qualityHQ": "高质量",
"mode": "模式",
+112 -1
View File
@@ -1,5 +1,26 @@
/// Shader preset types available in the app
enum ShaderPresetType { none, nvscaler, anime4k, custom }
enum ShaderPresetType { none, nvscaler, artcnn, anime4k, custom }
/// ArtCNN real-time model sizes.
enum ArtCNNModel {
/// Lightweight real-time model
c4f16,
/// Higher-quality real-time model
c4f32,
}
/// ArtCNN luma doubler variants.
enum ArtCNNVariant {
/// Neutral luma doubler
neutral,
/// Denoise and soften
denoise,
/// Denoise and sharpen
denoiseSharpen,
}
/// Quality tiers for Anime4K presets
enum Anime4KQuality {
@@ -57,6 +78,32 @@ class Anime4KConfig {
}
}
/// Configuration for ArtCNN preset
class ArtCNNConfig {
final ArtCNNModel model;
final ArtCNNVariant variant;
const ArtCNNConfig({required this.model, required this.variant});
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is ArtCNNConfig && other.model == model && other.variant == variant;
}
@override
int get hashCode => model.hashCode ^ variant.hashCode;
Map<String, dynamic> toJson() => {'model': model.name, 'variant': variant.name};
factory ArtCNNConfig.fromJson(Map<String, dynamic> json) {
return ArtCNNConfig(
model: ArtCNNModel.values.asNameMap()[json['model']] ?? ArtCNNModel.c4f16,
variant: ArtCNNVariant.values.asNameMap()[json['variant']] ?? ArtCNNVariant.neutral,
);
}
}
/// Configuration for NVScaler preset
class NVScalerConfig {
/// Whether to automatically skip NVScaler on HDR content
@@ -85,6 +132,7 @@ class ShaderPreset {
final String id;
final String name;
final ShaderPresetType type;
final ArtCNNConfig? artcnnConfig;
final Anime4KConfig? anime4kConfig;
final NVScalerConfig? nvscalerConfig;
@@ -95,6 +143,7 @@ class ShaderPreset {
required this.id,
required this.name,
required this.type,
this.artcnnConfig,
this.anime4kConfig,
this.nvscalerConfig,
this.fileName,
@@ -111,6 +160,20 @@ class ShaderPreset {
nvscalerConfig: NVScalerConfig(),
);
/// Create an ArtCNN preset with the specified model and variant
static ShaderPreset artcnnPreset(ArtCNNModel model, ArtCNNVariant variant) {
final modelName = _getArtCNNModelName(model);
final variantName = _getArtCNNVariantName(variant);
final variantId = _getArtCNNVariantId(variant);
return ShaderPreset(
id: 'artcnn_${model.name}_$variantId',
name: variant == ArtCNNVariant.neutral ? 'ArtCNN $modelName' : 'ArtCNN $modelName $variantName',
type: ShaderPresetType.artcnn,
artcnnConfig: ArtCNNConfig(model: model, variant: variant),
);
}
/// Create an Anime4K preset with the specified quality and mode
static ShaderPreset anime4kPreset(Anime4KQuality quality, Anime4KMode mode) {
final qualityName = quality == Anime4KQuality.fast ? 'Fast' : 'HQ';
@@ -141,6 +204,37 @@ class ShaderPreset {
}
}
static String _getArtCNNModelName(ArtCNNModel model) {
switch (model) {
case ArtCNNModel.c4f16:
return 'C4F16';
case ArtCNNModel.c4f32:
return 'C4F32';
}
}
static String _getArtCNNVariantName(ArtCNNVariant variant) {
switch (variant) {
case ArtCNNVariant.neutral:
return 'Neutral';
case ArtCNNVariant.denoise:
return 'Denoise';
case ArtCNNVariant.denoiseSharpen:
return 'Denoise + Sharpen';
}
}
static String _getArtCNNVariantId(ArtCNNVariant variant) {
switch (variant) {
case ArtCNNVariant.neutral:
return 'neutral';
case ArtCNNVariant.denoise:
return 'dn';
case ArtCNNVariant.denoiseSharpen:
return 'ds';
}
}
/// Get display name for the mode
String get modeDisplayName {
if (anime4kConfig != null) {
@@ -149,11 +243,26 @@ class ShaderPreset {
return '';
}
/// Get display name for the ArtCNN model
String get artcnnModelDisplayName {
if (artcnnConfig != null) {
return _getArtCNNModelName(artcnnConfig!.model);
}
return '';
}
/// Get all available preset options
static List<ShaderPreset> get allPresets {
return [
none,
nvscalerDefault,
// ArtCNN presets
artcnnPreset(ArtCNNModel.c4f16, ArtCNNVariant.neutral),
artcnnPreset(ArtCNNModel.c4f16, ArtCNNVariant.denoise),
artcnnPreset(ArtCNNModel.c4f16, ArtCNNVariant.denoiseSharpen),
artcnnPreset(ArtCNNModel.c4f32, ArtCNNVariant.neutral),
artcnnPreset(ArtCNNModel.c4f32, ArtCNNVariant.denoise),
artcnnPreset(ArtCNNModel.c4f32, ArtCNNVariant.denoiseSharpen),
// Anime4K Fast presets
anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeA),
anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeB),
@@ -195,6 +304,7 @@ class ShaderPreset {
'id': id,
'name': name,
'type': type.name,
if (artcnnConfig != null) 'artcnnConfig': artcnnConfig!.toJson(),
if (anime4kConfig != null) 'anime4kConfig': anime4kConfig!.toJson(),
if (nvscalerConfig != null) 'nvscalerConfig': nvscalerConfig!.toJson(),
if (fileName != null) 'fileName': fileName,
@@ -213,6 +323,7 @@ class ShaderPreset {
id: id ?? 'custom',
name: json['name'] as String? ?? 'Custom',
type: ShaderPresetType.values.asNameMap()[json['type']] ?? ShaderPresetType.none,
artcnnConfig: json['artcnnConfig'] != null ? ArtCNNConfig.fromJson(json['artcnnConfig']) : null,
anime4kConfig: json['anime4kConfig'] != null ? Anime4KConfig.fromJson(json['anime4kConfig']) : null,
nvscalerConfig: json['nvscalerConfig'] != null ? NVScalerConfig.fromJson(json['nvscalerConfig']) : null,
fileName: json['fileName'] as String?,
+31
View File
@@ -18,6 +18,16 @@ class ShaderAssetLoader {
/// NVScaler shader file
static const String _nvscalerShader = 'nvscaler/NVScaler.glsl';
/// ArtCNN shader files organized by preset model and variant.
static const Map<String, String> _artcnnShaders = {
'c4f16_neutral': 'artcnn/ArtCNN_C4F16.glsl',
'c4f16_dn': 'artcnn/ArtCNN_C4F16_DN.glsl',
'c4f16_ds': 'artcnn/ArtCNN_C4F16_DS.glsl',
'c4f32_neutral': 'artcnn/ArtCNN_C4F32.glsl',
'c4f32_dn': 'artcnn/ArtCNN_C4F32_DN.glsl',
'c4f32_ds': 'artcnn/ArtCNN_C4F32_DS.glsl',
};
/// Anime4K shader files organized by function
static const Map<String, String> _anime4kShaders = {
'clamp': 'anime4k/Anime4K_Clamp_Highlights.glsl',
@@ -84,6 +94,19 @@ class ShaderAssetLoader {
return [shaderPath];
}
/// Get the shader file path for an ArtCNN preset.
/// Returns a list containing exactly one ArtCNN shader path.
static Future<List<String>> getArtCNNShaders(ArtCNNConfig config) async {
final variantId = switch (config.variant) {
ArtCNNVariant.neutral => 'neutral',
ArtCNNVariant.denoise => 'dn',
ArtCNNVariant.denoiseSharpen => 'ds',
};
final shaderPath = await _extractShader(_artcnnShaders['${config.model.name}_$variantId']!);
if (shaderPath == null) return [];
return [shaderPath];
}
/// Get the shader file paths for an Anime4K preset.
/// Returns a list of shader paths in the correct order for MPV.
static Future<List<String>> getAnime4KShaders(Anime4KConfig config) async {
@@ -221,6 +244,9 @@ class ShaderAssetLoader {
return [];
case ShaderPresetType.nvscaler:
return getNVScalerShaders();
case ShaderPresetType.artcnn:
if (preset.artcnnConfig == null) return [];
return getArtCNNShaders(preset.artcnnConfig!);
case ShaderPresetType.anime4k:
if (preset.anime4kConfig == null) return [];
return getAnime4KShaders(preset.anime4kConfig!);
@@ -239,6 +265,11 @@ class ShaderAssetLoader {
// Extract NVScaler
await _extractShader(_nvscalerShader);
// Extract all ArtCNN shaders
for (final shaderPath in _artcnnShaders.values) {
await _extractShader(shaderPath);
}
// Extract all Anime4K shaders
for (final shaderPath in _anime4kShaders.values) {
await _extractShader(shaderPath);
@@ -798,6 +798,16 @@ class _VideoSettingsSheetState extends State<VideoSettingsSheet> {
return t.shaders.noShaderDescription;
case ShaderPresetType.nvscaler:
return t.shaders.nvscalerDescription;
case ShaderPresetType.artcnn:
if (preset.artcnnConfig != null) {
final variant = switch (preset.artcnnConfig!.variant) {
ArtCNNVariant.neutral => t.shaders.artcnnVariantNeutral,
ArtCNNVariant.denoise => t.shaders.artcnnVariantDenoise,
ArtCNNVariant.denoiseSharpen => t.shaders.artcnnVariantDenoiseSharpen,
};
return '${preset.artcnnModelDisplayName} - $variant';
}
return null;
case ShaderPresetType.anime4k:
if (preset.anime4kConfig != null) {
final quality = preset.anime4kConfig!.quality == Anime4KQuality.fast
+1
View File
@@ -125,6 +125,7 @@ flutter:
- assets/simkl_mark.svg
- assets/go-noto-current-regular.ttf
- assets/shaders/nvscaler/
- assets/shaders/artcnn/
- assets/shaders/anime4k/
- assets/player_icons/
- assets/rating_icons/
+57
View File
@@ -0,0 +1,57 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:plezy/models/shader_preset.dart';
void main() {
group('ShaderPreset ArtCNN presets', () {
test('exposes stable built-in preset ids in the expected order', () {
final ids = ShaderPreset.allPresets.map((preset) => preset.id).toList();
expect(ids.take(8), [
ShaderPreset.none.id,
ShaderPreset.nvscalerDefault.id,
'artcnn_c4f16_neutral',
'artcnn_c4f16_dn',
'artcnn_c4f16_ds',
'artcnn_c4f32_neutral',
'artcnn_c4f32_dn',
'artcnn_c4f32_ds',
]);
});
test('creates ArtCNN presets with names, type, and config', () {
final neutral = ShaderPreset.artcnnPreset(ArtCNNModel.c4f16, ArtCNNVariant.neutral);
final denoise = ShaderPreset.artcnnPreset(ArtCNNModel.c4f32, ArtCNNVariant.denoise);
final sharpen = ShaderPreset.artcnnPreset(ArtCNNModel.c4f32, ArtCNNVariant.denoiseSharpen);
expect(neutral.id, 'artcnn_c4f16_neutral');
expect(neutral.name, 'ArtCNN C4F16');
expect(neutral.type, ShaderPresetType.artcnn);
expect(neutral.artcnnConfig, const ArtCNNConfig(model: ArtCNNModel.c4f16, variant: ArtCNNVariant.neutral));
expect(neutral.artcnnModelDisplayName, 'C4F16');
expect(denoise.id, 'artcnn_c4f32_dn');
expect(denoise.name, 'ArtCNN C4F32 Denoise');
expect(denoise.artcnnConfig, const ArtCNNConfig(model: ArtCNNModel.c4f32, variant: ArtCNNVariant.denoise));
expect(sharpen.id, 'artcnn_c4f32_ds');
expect(sharpen.name, 'ArtCNN C4F32 Denoise + Sharpen');
expect(sharpen.artcnnConfig, const ArtCNNConfig(model: ArtCNNModel.c4f32, variant: ArtCNNVariant.denoiseSharpen));
});
test('finds ArtCNN presets by id', () {
final preset = ShaderPreset.fromId('artcnn_c4f32_ds');
expect(preset, isNotNull);
expect(preset!.type, ShaderPresetType.artcnn);
expect(preset.artcnnConfig, const ArtCNNConfig(model: ArtCNNModel.c4f32, variant: ArtCNNVariant.denoiseSharpen));
});
test('round-trips ArtCNN config through json', () {
final preset = ShaderPreset.artcnnPreset(ArtCNNModel.c4f16, ArtCNNVariant.denoise);
final decoded = ShaderPreset.fromJson(preset.toJson());
expect(decoded, preset);
expect(decoded.artcnnConfig, preset.artcnnConfig);
});
});
}
+6
View File
@@ -33,6 +33,12 @@ void main() {
final ids = p.allPresets.map((preset) => preset.id).toList();
expect(ids, contains(ShaderPreset.none.id));
expect(ids, contains(ShaderPreset.nvscalerDefault.id));
expect(ids, contains('artcnn_c4f16_neutral'));
expect(ids, contains('artcnn_c4f16_dn'));
expect(ids, contains('artcnn_c4f16_ds'));
expect(ids, contains('artcnn_c4f32_neutral'));
expect(ids, contains('artcnn_c4f32_dn'));
expect(ids, contains('artcnn_c4f32_ds'));
expect(p.allPresets.length, ShaderPreset.allPresets.length);
p.dispose();