Skip to content

Commit 9359a79

Browse files
committed
* Adding QP mode for FFmpeg Nvenc encoding
* Adding more preview positions * Adding ultra high quality mode for ffmpeg nvenc encoder * Fixing #631 VVC Level can't be set to 0 anymore (thanks to GT500org)
1 parent 4944950 commit 9359a79

File tree

10 files changed

+60
-12
lines changed

10 files changed

+60
-12
lines changed

CHANGES

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## Version 5.9.0
4+
5+
* Adding QP mode for FFmpeg Nvenc encoding
6+
* Adding more preview positions
7+
* Adding ultra high quality mode for ffmpeg nvenc encoder
8+
* Fixing #631 VVC Level can't be set to 0 anymore (thanks to GT500org)
9+
310
## Version 5.8.2
411

512
* Fixing #610 Do not try to divide by zero if HDR metadata has bad values (thanks to Noelle Leigh)

fastflix/encoders/common/helpers.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,18 @@ def generate_ffmpeg_start(
9999
)
100100

101101

102+
def rigaya_data(streams, copy_data=False, **_):
103+
if not copy_data:
104+
return ""
105+
datas = []
106+
for stream in streams:
107+
if stream["codec_type"] == "data":
108+
datas.append(str(stream["index"]))
109+
if not datas:
110+
return ""
111+
return f"--data-copy {','.join(datas)}"
112+
113+
102114
def generate_ending(
103115
audio,
104116
subtitles,
@@ -109,13 +121,15 @@ def generate_ending(
109121
null_ending=False,
110122
output_fps: Union[str, None] = None,
111123
disable_rotate_metadata=False,
124+
copy_data=False,
112125
**_,
113126
):
114127
ending = (
115128
f" {'-map_metadata -1' if remove_metadata else '-map_metadata 0'} "
116129
f"{'-map_chapters 0' if copy_chapters else '-map_chapters -1'} "
117130
f"{f'-r {output_fps}' if output_fps else ''} "
118131
f"{audio} {subtitles} {cover} "
132+
f"{'-map 0:d -c:d copy ' if copy_data else ''}"
119133
)
120134

121135
# In case they use a mp4 container, nix the rotation

fastflix/encoders/ffmpeg_hevc_nvenc/command_builder.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ def build(fastflix: FastFlix):
2525
if settings.level:
2626
beginning += f"-level:v {settings.level} "
2727

28+
if not settings.bitrate:
29+
command = (f"{beginning} -qp:v {settings.qp} -preset:v {settings.preset} " f"{settings.extra}") + ending
30+
return [Command(command=command, name="Single QP encode", exe="ffmpeg")]
31+
2832
pass_log_file = fastflix.current_video.work_path / f"pass_log_file_{secrets.token_hex(10)}"
2933

3034
command_1 = (

fastflix/encoders/ffmpeg_hevc_nvenc/settings_panel.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ def init_tune(self):
134134
return self._add_combo_box(
135135
label="Tune",
136136
widget_name="tune",
137-
tooltip="Tune the settings for a particular type of source or situation\nhq - High Quality, ll - Low Latency, ull - Ultra Low Latency",
138-
options=["hq", "ll", "ull", "lossless"],
137+
tooltip="Tune the settings for a particular type of source or situation\nhq - High Quality, uqh - Ultra High Quality, ll - Low Latency, ull - Ultra Low Latency",
138+
options=["hq", "uhq", "ll", "ull", "lossless"],
139139
opt="tune",
140140
)
141141

@@ -248,10 +248,9 @@ def init_b_ref_mode(self):
248248
return layout
249249

250250
def init_modes(self):
251-
layout = self._add_modes(recommended_bitrates, recommended_crfs, qp_name="qp", add_qp=False)
251+
layout = self._add_modes(recommended_bitrates, recommended_crfs, qp_name="qp")
252252
self.qp_radio.setChecked(False)
253253
self.bitrate_radio.setChecked(True)
254-
self.qp_radio.setDisabled(True)
255254
return layout
256255

257256
def mode_update(self):

fastflix/encoders/vvc/settings_panel.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,13 @@ def init_tier(self):
115115
)
116116

117117
def init_levels(self):
118+
# https://github.com/fraunhoferhhi/vvenc/blob/cf8ba5ed74f8e8c7c9e7b6f81f7fb08bce6241b0/source/Lib/vvenc/vvencCfg.cpp#L159
118119
return self._add_combo_box(
119120
label="IDC Level",
120121
tooltip="Set the IDC level",
121122
widget_name="levelidc",
122123
options=[
123-
"0",
124+
t("auto"),
124125
"1",
125126
"2",
126127
"2.1",
@@ -135,6 +136,7 @@ def init_levels(self):
135136
"6.1",
136137
"6.2",
137138
"6.3",
139+
"15.5",
138140
],
139141
opt="levelidc",
140142
)
@@ -226,12 +228,14 @@ def update_video_encoder_settings(self):
226228

227229
vvc_params_text = self.widgets.vvc_params.text().strip()
228230

231+
level = self.widgets.levelidc.currentText() if self.widgets.levelidc.currentIndex() > 0 else None
232+
229233
settings = VVCSettings(
230234
preset=self.widgets.preset.currentText(),
231235
max_muxing_queue_size=self.widgets.max_mux.currentText(),
232236
pix_fmt=self.widgets.pix_fmt.currentText().split(":")[1].strip(),
233237
tier=self.widgets.tier.currentText(),
234-
levelidc=self.widgets.levelidc.currentText(),
238+
levelidc=level,
235239
vvc_params=vvc_params_text.split(":") if vvc_params_text else [],
236240
extra=self.ffmpeg_extras,
237241
extra_both_passes=self.widgets.extra_both_passes.isChecked(),

fastflix/flix.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,10 @@ def ffprobe_configuration(app, config: Config, **_):
190190

191191

192192
def probe(app: FastFlixApp, file: Path) -> Box:
193-
"""Run FFprobe on a file"""
193+
"""
194+
Run FFprobe on a file
195+
ffprobe -v quiet -loglevel panic -print_format json -show_format -show_streams
196+
"""
194197
command = [
195198
f"{app.fastflix.config.ffprobe}",
196199
"-v",

fastflix/models/video.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ class VideoSettings(BaseModel):
109109
brightness: Optional[str] = None
110110
contrast: Optional[str] = None
111111
saturation: Optional[str] = None
112+
copy_data: bool = False
112113
video_encoder_settings: Optional[
113114
Union[
114115
x265Settings,

fastflix/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
#!/usr/bin/env python
22
# -*- coding: utf-8 -*-
3-
__version__ = "5.8.2"
3+
__version__ = "5.9.0"
44
__author__ = "Chris Griffith"

fastflix/widgets/main.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class MainWidgets(BaseModel):
134134
output_type_combo: QtWidgets.QComboBox = Field(default_factory=QtWidgets.QComboBox)
135135
output_directory_select: QtWidgets.QPushButton = None
136136
model_config = ConfigDict(arbitrary_types_allowed=True)
137+
copy_data: QtWidgets.QCheckBox = None
137138

138139
def items(self):
139140
for key in dir(self):
@@ -394,8 +395,8 @@ def init_thumb_time_selector(self):
394395

395396
self.widgets.thumb_time = QtWidgets.QSlider(QtCore.Qt.Horizontal)
396397
self.widgets.thumb_time.setMinimum(1)
397-
self.widgets.thumb_time.setMaximum(10)
398-
self.widgets.thumb_time.setValue(2)
398+
self.widgets.thumb_time.setMaximum(100)
399+
self.widgets.thumb_time.setValue(25)
399400
self.widgets.thumb_time.setTickPosition(QtWidgets.QSlider.TicksBelow)
400401
self.widgets.thumb_time.setTickInterval(1)
401402
self.widgets.thumb_time.setAutoFillBackground(False)
@@ -572,8 +573,21 @@ def init_checkboxes(self):
572573
extra_details_layout = QtWidgets.QVBoxLayout()
573574
extra_details_layout.addWidget(self.widgets.deinterlace)
574575
extra_details_layout.addWidget(self.widgets.remove_hdr)
575-
576576
transform_layout.addLayout(extra_details_layout)
577+
578+
# another_layout = QtWidgets.QVBoxLayout()
579+
#
580+
# self.widgets.copy_data = QtWidgets.QCheckBox(t("Copy Data"))
581+
# self.widgets.copy_data.setChecked(False)
582+
# self.widgets.copy_data.toggled.connect(self.page_update)
583+
# self.widgets.copy_data.setToolTip(
584+
# f'{t("Copy all data streams from the source file.")}'
585+
# )
586+
#
587+
# another_layout.addWidget(self.widgets.copy_data)
588+
# another_layout.addWidget(QtWidgets.QWidget())
589+
# transform_layout.addLayout(another_layout)
590+
577591
return transform_layout
578592

579593
def init_video_track_select(self):
@@ -1624,7 +1638,7 @@ def remove_hdr(self) -> bool:
16241638

16251639
@property
16261640
def preview_place(self) -> Union[float, int]:
1627-
ticks = self.app.fastflix.current_video.duration / 10
1641+
ticks = self.app.fastflix.current_video.duration / 100
16281642
return (self.widgets.thumb_time.value() - 1) * ticks
16291643

16301644
@reusables.log_exception("fastflix", show_traceback=False)
@@ -1739,6 +1753,7 @@ def get_all_settings(self):
17391753
video_title=self.video_options.advanced.video_title.text(),
17401754
video_track_title=self.video_options.advanced.video_track_title.text(),
17411755
remove_hdr=self.remove_hdr,
1756+
copy_data=self.widgets.copy_data.isChecked(),
17421757
)
17431758

17441759
self.video_options.get_settings()

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ dependencies = [
3838
"python-box[all]>=6.0,<7.0",
3939
"requests>=2.28,<3.0",
4040
"reusables>=0.9.6,<0.10.0",
41+
"setuptools>=75.8",
4142
]
4243

4344
[project.optional-dependencies]

0 commit comments

Comments
 (0)