Skip to content

Commit bd14e52

Browse files
committed
* Fixing #567 Profiles for WebP did not work (nor GIF dither) (thanks to jpert)
* Fixing #582 BT.2020-10 Color transfer not maintained #582 (thanks to Ryushin)
1 parent c884dfd commit bd14e52

26 files changed

+261
-186
lines changed

CHANGES

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
* Fixing #185 audio channels not being set properly and resetting on encoder change (thanks to Tupsi)
1111
* Fixing #522 add file fails - fixed as of 5.7.0 (thanks to pcl5x2008)
1212
* Fixing #531 list limitation in readme that FFmpeg must support the software encoders listed (thanks to brunoais)
13+
* Fixing #567 Profiles for WebP did not work (nor GIF dither) (thanks to jpert)
14+
* Fixing #582 BT.2020-10 Color transfer not maintained #582 (thanks to Ryushin)
1315
* Fixing #585 error when trying to return a video from queue that has the video track after audio or subtitiles (thanks to Hankuu)
1416
* Fixing #586 audio channels being set incorrectly (thanks to Hankuu)
1517
* Fixing #588 audio and subtitle dispositions were not set from source (thanks to GeZorTenPlotZ)

fastflix/data/languages.yaml

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -8696,51 +8696,6 @@ Bitrate Mode:
86968696
ukr: Режим бітрейту
86978697
kor: 비트레이트 모드
86988698
ron: Mod Bitrate
8699-
VCEEncC AV1 Encoder is untested!:
8700-
eng: VCEEncC AV1 Encoder is untested!
8701-
deu: VCEEncC AV1 Encoder ist ungetestet!
8702-
fra: VCEEncC AV1 Encoder n'est pas testé !
8703-
ita: VCEEncC AV1 Encoder non è stato testato!
8704-
spa: El codificador VCEEncC AV1 no ha sido probado.
8705-
chs: VCEEncC AV1编码器未经测试!
8706-
jpn: VCEEncC AV1エンコーダは未検証です!
8707-
rus: VCEEncC AV1 Encoder не тестировался!
8708-
por: O codificador VCEEncC AV1 não foi testado!
8709-
swe: VCEEncC AV1 Encoder är otestad!
8710-
pol: VCEEncC AV1 Encoder nie jest testowany!
8711-
ukr: Кодер VCEEncC AV1 неперевірений!
8712-
kor: VCEEncC AV1 인코더는 테스트되지 않았습니다!
8713-
ron: VCEEncC AV1 Encoder nu a fost testat!
8714-
QSVEncC AV1 Encoder is untested!:
8715-
eng: QSVEncC AV1 Encoder is untested!
8716-
deu: QSVEncC AV1 Encoder ist ungetestet!
8717-
fra: QSVEncC AV1 Encoder n'est pas testé !
8718-
ita: Il codificatore QSVEncC AV1 non è stato testato!
8719-
spa: El codificador QSVEncC AV1 no ha sido probado.
8720-
chs: QSVEncC AV1编码器未经测试!
8721-
jpn: QSVEncC AV1 Encoderは未検証です。
8722-
rus: Кодировщик QSVEncC AV1 не тестировался!
8723-
por: O codificador QSVEncC AV1 não foi testado!
8724-
swe: QSVEncC AV1 Encoder är otestad!
8725-
pol: QSVEncC AV1 Encoder nie jest testowany!
8726-
ukr: Кодер QSVEncC AV1 неперевірений!
8727-
kor: QSVEncC AV1 인코더는 테스트되지 않았습니다!
8728-
ron: QSVEncC AV1 Encoder nu a fost testat!
8729-
NVEncC AV1 Encoder is untested!:
8730-
eng: NVEncC AV1 Encoder is untested!
8731-
deu: NVEncC AV1 Encoder ist ungetestet!
8732-
fra: L'encodeur NVEncC AV1 n'est pas testé !
8733-
ita: Il codificatore NVEncC AV1 non è stato testato!
8734-
spa: El codificador NVEncC AV1 no ha sido probado.
8735-
chs: NVEncC AV1编码器未经测试!
8736-
jpn: NVEncC AV1 Encoderは未検証です。
8737-
rus: NVEncC AV1 Encoder не тестировался!
8738-
por: O codificador NVEncC AV1 não foi testado!
8739-
swe: NVEncC AV1 Encoder är otestad!
8740-
pol: NVEncC AV1 Encoder nie jest testowany!
8741-
ukr: Кодер NVEncC AV1 неперевірений!
8742-
kor: NVEncC AV1 인코더는 테스트되지 않았습니다!
8743-
ron: NVEncC AV1 Encoder nu este testat!
87448699
Load Directory:
87458700
eng: Load Directory
87468701
deu: Verzeichnis laden

fastflix/encoders/common/helpers.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ def generate_all(
269269

270270
filters = None
271271
if not disable_filters:
272-
filter_details = fastflix.current_video.video_settings.dict().copy()
272+
filter_details = fastflix.current_video.video_settings.model_dump().copy()
273273
filter_details.update(filters_extra)
274274
filters = generate_filters(
275275
source=fastflix.current_video.source,
@@ -287,7 +287,7 @@ def generate_all(
287287
cover=attachments,
288288
output_video=fastflix.current_video.video_settings.output_path,
289289
disable_rotate_metadata=encoder == "copy",
290-
**fastflix.current_video.video_settings.dict(),
290+
**fastflix.current_video.video_settings.model_dump(),
291291
)
292292

293293
beginning = generate_ffmpeg_start(
@@ -299,8 +299,8 @@ def generate_all(
299299
enable_opencl=enable_opencl,
300300
ffmpeg_version=fastflix.ffmpeg_version,
301301
start_extra=start_extra,
302-
**fastflix.current_video.video_settings.dict(),
303-
**settings.dict(),
302+
**fastflix.current_video.video_settings.model_dump(),
303+
**settings.model_dump(),
304304
)
305305

306306
return beginning, ending, output_fps

fastflix/encoders/common/setting_panel.py

Lines changed: 68 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
from pathlib import Path
55

66
from box import Box
7-
from PySide6 import QtGui, QtWidgets, QtCore
7+
from PySide6 import QtGui, QtWidgets
88

99
from fastflix.exceptions import FastFlixInternalException
1010
from fastflix.language import t
1111
from fastflix.models.fastflix_app import FastFlixApp
1212
from fastflix.widgets.background_tasks import ExtractHDR10
1313
from fastflix.resources import group_box_style, get_icon
14-
from fastflix.shared import clear_list
14+
1515

1616
logger = logging.getLogger("fastflix")
1717

@@ -96,7 +96,7 @@ def translate_tip(tooltip):
9696
def determine_default(self, widget_name, opt, items: List, raise_error: bool = False):
9797
if widget_name == "pix_fmt":
9898
items = [x.split(":")[1].strip() for x in items]
99-
elif widget_name in ("crf", "qp"):
99+
elif widget_name in ("crf", "qp", "qscale"):
100100
if not opt:
101101
return 6
102102
opt = str(opt)
@@ -152,6 +152,8 @@ def _add_combo_box(
152152
widget_name, self.app.fastflix.config.encoder_opt(self.profile_name, opt), options
153153
)
154154
self.opts[widget_name] = opt
155+
else:
156+
logger.warning("No opt provided for widget %s %s", self.__class__.__name__, widget_name)
155157
self.widgets[widget_name].setCurrentIndex(default or 0)
156158
self.widgets[widget_name].setDisabled(not enabled)
157159
new_width = self.widgets[widget_name].minimumSizeHint().width() + 20
@@ -203,6 +205,9 @@ def _add_text_box(
203205
if opt:
204206
default = str(self.app.fastflix.config.encoder_opt(self.profile_name, opt)) or default
205207
self.opts[widget_name] = opt
208+
else:
209+
logger.warning("No opt provided for widget %s %s", self.__class__.__name__, widget_name)
210+
206211
self.widgets[widget_name].setText(default)
207212
self.widgets[widget_name].setDisabled(not enabled)
208213
if tooltip:
@@ -340,6 +345,7 @@ def _add_modes(
340345
add_qp=True,
341346
disable_custom_qp=False,
342347
show_bitrate_passes=False,
348+
disable_bitrate=False,
343349
):
344350
self.recommended_bitrates = recommended_bitrates
345351
self.recommended_qps = recommended_qps
@@ -353,54 +359,55 @@ def _add_modes(
353359
bitrate_box_layout = QtWidgets.QHBoxLayout()
354360
self.widgets.mode = QtWidgets.QButtonGroup()
355361
self.widgets.mode.buttonClicked.connect(self.set_mode)
356-
357-
self.bitrate_radio = QtWidgets.QRadioButton("Bitrate")
358-
self.bitrate_radio.setFixedWidth(80)
359-
self.widgets.mode.addButton(self.bitrate_radio)
360-
self.widgets.bitrate = QtWidgets.QComboBox()
361-
# self.widgets.bitrate.setFixedWidth(250)
362-
self.widgets.bitrate.addItems(recommended_bitrates)
363-
self.widgets.bitrate_passes = QtWidgets.QComboBox()
364-
self.widgets.bitrate_passes.addItems(["1", "2"])
365-
self.widgets.bitrate_passes.setCurrentIndex(1)
366-
self.widgets.bitrate_passes.currentIndexChanged.connect(lambda: self.mode_update())
367-
config_opt = self.app.fastflix.config.encoder_opt(self.profile_name, "bitrate")
368-
custom_bitrate = False
369-
try:
370-
default_bitrate_index = self.determine_default(
371-
"bitrate", config_opt, recommended_bitrates, raise_error=True
372-
)
373-
except FastFlixInternalException:
374-
custom_bitrate = True
375-
self.widgets.bitrate.setCurrentText("Custom")
376-
else:
377-
self.widgets.bitrate.setCurrentIndex(default_bitrate_index)
378-
self.widgets.bitrate.currentIndexChanged.connect(lambda: self.mode_update())
379-
self.widgets.custom_bitrate = QtWidgets.QLineEdit("3000" if not custom_bitrate else config_opt)
380-
self.widgets.custom_bitrate.setFixedWidth(100)
381-
self.widgets.custom_bitrate.setEnabled(custom_bitrate)
382-
self.widgets.custom_bitrate.textChanged.connect(lambda: self.main.build_commands())
383-
self.widgets.custom_bitrate.setValidator(self.only_int)
384-
bitrate_box_layout.addWidget(self.bitrate_radio)
385-
bitrate_box_layout.addWidget(self.widgets.bitrate, 1)
386-
bitrate_box_layout.addStretch(1)
387-
if show_bitrate_passes:
388-
bitrate_box_layout.addWidget(QtWidgets.QLabel(t("Passes") + ":"))
389-
bitrate_box_layout.addWidget(self.widgets.bitrate_passes)
390-
bitrate_box_layout.addStretch(1)
391-
bitrate_box_layout.addWidget(QtWidgets.QLabel(t("Custom") + ":"))
392-
bitrate_box_layout.addWidget(self.widgets.custom_bitrate)
393-
bitrate_box_layout.addWidget(QtWidgets.QLabel("k"))
394-
395362
qp_help = (
396363
f"{qp_name.upper()} {t('is extremely source dependant')},\n"
397364
f"{t('the resolution-to-')}{qp_name.upper()}{t('are mere suggestions!')}"
398365
)
399-
self.qp_radio = QtWidgets.QRadioButton(qp_name.upper())
400-
self.qp_radio.setChecked(True)
401-
self.qp_radio.setFixedWidth(80)
402-
self.qp_radio.setToolTip(qp_help)
403-
self.widgets.mode.addButton(self.qp_radio)
366+
config_opt = None
367+
if not disable_bitrate:
368+
self.bitrate_radio = QtWidgets.QRadioButton("Bitrate")
369+
self.bitrate_radio.setFixedWidth(80)
370+
self.widgets.mode.addButton(self.bitrate_radio)
371+
self.widgets.bitrate = QtWidgets.QComboBox()
372+
self.widgets.bitrate.addItems(recommended_bitrates)
373+
self.widgets.bitrate_passes = QtWidgets.QComboBox()
374+
self.widgets.bitrate_passes.addItems(["1", "2"])
375+
self.widgets.bitrate_passes.setCurrentIndex(1)
376+
self.widgets.bitrate_passes.currentIndexChanged.connect(lambda: self.mode_update())
377+
config_opt = self.app.fastflix.config.encoder_opt(self.profile_name, "bitrate")
378+
custom_bitrate = False
379+
try:
380+
default_bitrate_index = self.determine_default(
381+
"bitrate", config_opt, recommended_bitrates, raise_error=True
382+
)
383+
except FastFlixInternalException:
384+
custom_bitrate = True
385+
self.widgets.bitrate.setCurrentText("Custom")
386+
else:
387+
self.widgets.bitrate.setCurrentIndex(default_bitrate_index)
388+
self.widgets.bitrate.currentIndexChanged.connect(lambda: self.mode_update())
389+
self.widgets.custom_bitrate = QtWidgets.QLineEdit("3000" if not custom_bitrate else config_opt)
390+
self.widgets.custom_bitrate.setValidator(QtGui.QDoubleValidator())
391+
self.widgets.custom_bitrate.setFixedWidth(100)
392+
self.widgets.custom_bitrate.setEnabled(custom_bitrate)
393+
self.widgets.custom_bitrate.textChanged.connect(lambda: self.main.build_commands())
394+
self.widgets.custom_bitrate.setValidator(self.only_int)
395+
bitrate_box_layout.addWidget(self.bitrate_radio)
396+
bitrate_box_layout.addWidget(self.widgets.bitrate, 1)
397+
bitrate_box_layout.addStretch(1)
398+
if show_bitrate_passes:
399+
bitrate_box_layout.addWidget(QtWidgets.QLabel(t("Passes") + ":"))
400+
bitrate_box_layout.addWidget(self.widgets.bitrate_passes)
401+
bitrate_box_layout.addStretch(1)
402+
bitrate_box_layout.addWidget(QtWidgets.QLabel(t("Custom") + ":"))
403+
bitrate_box_layout.addWidget(self.widgets.custom_bitrate)
404+
bitrate_box_layout.addWidget(QtWidgets.QLabel("k"))
405+
406+
self.qp_radio = QtWidgets.QRadioButton(qp_name.upper())
407+
self.qp_radio.setChecked(True)
408+
self.qp_radio.setFixedWidth(80)
409+
self.qp_radio.setToolTip(qp_help)
410+
self.widgets.mode.addButton(self.qp_radio)
404411

405412
self.widgets[qp_name] = QtWidgets.QComboBox()
406413
self.widgets[qp_name].setToolTip(qp_help)
@@ -421,14 +428,16 @@ def _add_modes(
421428
if not disable_custom_qp:
422429
self.widgets[f"custom_{qp_name}"] = QtWidgets.QLineEdit("30" if not custom_qp else str(qp_value))
423430
self.widgets[f"custom_{qp_name}"].setFixedWidth(100)
431+
self.widgets[f"custom_{qp_name}"].setValidator(QtGui.QDoubleValidator())
424432
self.widgets[f"custom_{qp_name}"].setEnabled(custom_qp)
425433
self.widgets[f"custom_{qp_name}"].textChanged.connect(lambda: self.main.build_commands())
426434

427-
if config_opt:
435+
if not disable_bitrate and config_opt:
428436
self.mode = "Bitrate"
429437
self.qp_radio.setChecked(False)
430438
self.bitrate_radio.setChecked(True)
431-
qp_box_layout.addWidget(self.qp_radio)
439+
if not disable_bitrate:
440+
qp_box_layout.addWidget(self.qp_radio)
432441
qp_box_layout.addWidget(self.widgets[qp_name], 1)
433442
qp_box_layout.addStretch(1)
434443
qp_box_layout.addStretch(1)
@@ -439,11 +448,13 @@ def _add_modes(
439448
qp_box_layout.addWidget(self.widgets[f"custom_{qp_name}"])
440449
qp_box_layout.addWidget(QtWidgets.QLabel(" "))
441450

442-
bitrate_group_box.setLayout(bitrate_box_layout)
451+
if not disable_bitrate:
452+
bitrate_group_box.setLayout(bitrate_box_layout)
443453
qp_group_box.setLayout(qp_box_layout)
444454

445455
layout.addWidget(qp_group_box, 0, 0)
446-
layout.addWidget(bitrate_group_box, 1, 0)
456+
if not disable_bitrate:
457+
layout.addWidget(bitrate_group_box, 1, 0)
447458

448459
if not add_qp:
449460
qp_group_box.hide()
@@ -550,7 +561,7 @@ def reload(self):
550561
if widget_name in ("x265_params", "svtav1_params", "vvc_params"):
551562
data = ":".join(data)
552563
self.widgets[widget_name].setText(str(data) or "")
553-
if getattr(self, "qp_radio", None):
564+
if getattr(self, "mode", None):
554565
bitrate = getattr(self.app.fastflix.current_video.video_settings.video_encoder_settings, "bitrate", None)
555566
if bitrate:
556567
self.mode = "Bitrate"
@@ -565,8 +576,11 @@ def reload(self):
565576
self.widgets.custom_bitrate.setText(bitrate.rstrip("k"))
566577
else:
567578
self.mode = self.qp_name
568-
self.qp_radio.setChecked(True)
569-
self.bitrate_radio.setChecked(False)
579+
try:
580+
self.qp_radio.setChecked(True)
581+
self.bitrate_radio.setChecked(False)
582+
except Exception:
583+
pass
570584
qp = str(getattr(self.app.fastflix.current_video.video_settings.video_encoder_settings, self.qp_name))
571585
for i, rec in enumerate(self.recommended_qps):
572586
if rec.startswith(qp):

fastflix/encoders/gif/command_builder.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ def build(fastflix: FastFlix):
1616
args += f":max_colors={settings.max_colors}"
1717

1818
palletgen_filters = generate_filters(
19-
custom_filters=f"palettegen{args}", **fastflix.current_video.video_settings.dict()
19+
custom_filters=f"palettegen{args}", **fastflix.current_video.video_settings.model_dump()
2020
)
2121

2222
filters = generate_filters(
23-
custom_filters=f"fps={settings.fps:.2f}", raw_filters=True, **fastflix.current_video.video_settings.dict()
23+
custom_filters=f"fps={settings.fps}", raw_filters=True, **fastflix.current_video.video_settings.model_dump()
2424
)
2525

2626
output_video = clean_file_string(fastflix.current_video.video_settings.output_path)
@@ -41,7 +41,7 @@ def build(fastflix: FastFlix):
4141
f'{beginning} {palletgen_filters} {settings.extra if settings.extra_both_passes else ""} -y "{temp_palette}"'
4242
)
4343

44-
gif_filters = f"fps={settings.fps:.2f}"
44+
gif_filters = f"fps={settings.fps}"
4545
if filters:
4646
gif_filters += f",{filters}"
4747

fastflix/encoders/gif/settings_panel.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def init_dither(self):
4242
return self._add_combo_box(
4343
label="Dither",
4444
widget_name="dither",
45+
opt="dither",
4546
tooltip=(
4647
"Dither is an intentionally applied form of noise used to randomize quantization error,\n"
4748
"preventing large-scale patterns such as color banding in images."
@@ -77,7 +78,7 @@ def init_statistics_mode(self):
7778

7879
def update_video_encoder_settings(self):
7980
self.app.fastflix.current_video.video_settings.video_encoder_settings = GIFSettings(
80-
fps=int(self.widgets.fps.currentText()),
81+
fps=self.widgets.fps.currentText(),
8182
dither=self.widgets.dither.currentText(),
8283
extra=self.ffmpeg_extras,
8384
pix_fmt="yuv420p", # hack for thumbnails to show properly
@@ -88,5 +89,3 @@ def update_video_encoder_settings(self):
8889

8990
def new_source(self):
9091
super().new_source()
91-
self.widgets.fps.setCurrentIndex(14)
92-
self.widgets.dither.setCurrentIndex(0)

fastflix/encoders/nvencc_av1/settings_panel.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,6 @@ def __init__(self, parent, main, app: FastFlixApp):
147147
guide_label.setOpenExternalLinks(True)
148148
grid.addWidget(guide_label, 11, 0, 1, 4)
149149
grid.addWidget(warning_label, 11, 4, 1, 1, alignment=QtCore.Qt.AlignRight)
150-
grid.addWidget(QtWidgets.QLabel(t("NVEncC AV1 Encoder is untested!")), 11, 5, 1, 1)
151150

152151
self.setLayout(grid)
153152
self.hide()

fastflix/encoders/qsvencc_av1/settings_panel.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@ def __init__(self, parent, main, app: FastFlixApp):
153153
guide_label.setOpenExternalLinks(True)
154154
grid.addWidget(guide_label, 11, 0, 1, 4)
155155
grid.addWidget(warning_label, 11, 4, 1, 1, alignment=QtCore.Qt.AlignRight)
156-
grid.addWidget(QtWidgets.QLabel(t("QSVEncC AV1 Encoder is untested!")), 11, 5, 1, 1)
157156

158157
self.setLayout(grid)
159158
self.hide()

fastflix/encoders/vceencc_av1/settings_panel.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@ def __init__(self, parent, main, app: FastFlixApp):
134134
guide_label.setOpenExternalLinks(True)
135135
grid.addWidget(guide_label, 12, 0, 1, 4)
136136
grid.addWidget(warning_label, 12, 4, 1, 1, alignment=QtCore.Qt.AlignRight)
137-
grid.addWidget(QtWidgets.QLabel(t("VCEEncC AV1 Encoder is untested!")), 12, 5, 1, 1)
138137

139138
self.setLayout(grid)
140139
self.hide()

fastflix/encoders/webp/command_builder.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ def build(fastflix: FastFlix):
1111

1212
return [
1313
Command(
14-
command=f"{beginning} -lossless {settings.lossless} -compression_level {settings.compression} "
14+
command=f"{beginning} -lossless {'1' if settings.lossless.lower() in ('1', 'yes') else '0'} "
15+
f"-compression_level {settings.compression} "
1516
f"-qscale {settings.qscale} -preset {settings.preset} {settings.extra} {ending}",
1617
name="WebP",
1718
exe="ffmpeg",

0 commit comments

Comments
 (0)