Skip to content

Commit 7fd9508

Browse files
authored
Merge pull request #23 from yajrendrag/pr-video_transcoder
[video_transcoder] 0.1.18
2 parents 741dcf1 + daa6fc3 commit 7fd9508

4 files changed

Lines changed: 64 additions & 5 deletions

File tree

changelog.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11

2+
**<span style="color:#56adda">0.1.18</span>**
3+
- adds similar logic for qsv and vaapi as was done for nvenc in 0.1.17
4+
- adds new qsv_safe_decode and vaapi_safe_decode options to the respective encoders
5+
- adds new paths in their respective define_filtergraph functions to move the frames off the GPU to avoid h/w accel failure due to midstream colorspace changes
6+
- adds '-reinit_filter 0' option to the ffmpeg command line when the x_safe_option is enabled so that ffmpeg can ignore the filter change that would have resulted from the colorspace change
7+
- the combination of these allows ffmpeg to successfully process the file rather than failing
8+
29
**<span style="color:#56adda">0.1.17</span>**
310
- adds nvenc_safe_decode option to allow plugin to avoid an error caused by colorspace changes in the file
411
- adds new path in the define_filtergraph function to move the frames off the GPU to avoid h/w accel failure due to midstream colorspace changes

info.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@
1212
"on_worker_process": 1
1313
},
1414
"tags": "video,ffmpeg",
15-
"version": "0.1.17"
15+
"version": "0.1.18"
1616
}

lib/encoders/qsv.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ def provides(self):
150150
def options(self):
151151
return {
152152
"qsv_decoding_method": "cpu",
153+
"qsv_safe_decode": False,
153154
"qsv_preset": "slow",
154155
"qsv_encoder_ratecontrol_method": "LA_ICQ",
155156
"qsv_constant_quantizer_scale": "25",
@@ -176,6 +177,10 @@ def generate_default_args(self):
176177
"-hwaccel": "qsv",
177178
"-hwaccel_output_format": "qsv",
178179
})
180+
181+
if self.settings.get_setting('qsv_safe_decode'):
182+
generic_kwargs["-reinit_filter"] = "0"
183+
179184
return generic_kwargs, advanced_kwargs
180185

181186
def generate_filtergraphs(self, current_filter_args, smart_filters, encoder_name):
@@ -238,13 +243,22 @@ def generate_filtergraphs(self, current_filter_args, smart_filters, encoder_name
238243
# Upload to hw frames at the end of the filter
239244
end_chain = start_chain + ["hwupload=extra_hw_frames=64", "format=qsv", f"vpp_qsv=format={target_fmt}"]
240245
end_filter_args.append(",".join(end_chain))
246+
elif self.settings.get_setting('qsv_safe_decode'):
247+
# HW decode + safe mode: force SW frames to avoid hwaccel reconfigure
248+
generic_kwargs['-hwaccel_output_format'] = target_fmt
249+
start_chain = [f"format={target_fmt}"]
250+
if enc_supports_hdr and target_color_config.get('apply_color_params'):
251+
start_chain.append(target_color_config['setparams_filter'])
252+
start_filter_args.append(",".join(start_chain))
253+
end_chain = start_chain + ["hwupload=extra_hw_frames=64", "format=qsv", f"vpp_qsv=format={target_fmt}"]
254+
end_filter_args.append(",".join(end_chain))
241255
else:
242-
# Add hwupload filter that can handle when the frame was decoded in software or hardware
256+
# Pure HW path - frames stay in QSV memory
243257
chain = [f"format={target_fmt}|qsv",
244258
"hwupload=extra_hw_frames=64",
245259
"format=qsv", f"vpp_qsv=format={target_fmt}"]
246260
end_filter_args.append(",".join(chain))
247-
261+
248262
# Add the smart filters to the end
249263
end_filter_args += hw_smart_filters
250264

@@ -415,6 +429,18 @@ def get_qsv_decoding_method_form_settings(self):
415429
values["display"] = "hidden"
416430
return values
417431

432+
def get_qsv_safe_decode_form_settings(self):
433+
values = {
434+
"label": "Safe decode mode",
435+
"description": "Forces CPU-side frame handling to prevent failures on files with "
436+
"inconsistent color space metadata (common in WEBDL sources).\n"
437+
"Slightly slower due to GPU->CPU->GPU round-trip per frame.",
438+
"sub_setting": True,
439+
}
440+
if self.settings.get_setting('mode') not in ['standard'] or self.settings.get_setting('qsv_decoding_method') != "qsv":
441+
values["display"] = "hidden"
442+
return values
443+
418444
def get_qsv_preset_form_settings(self):
419445
values = {
420446
"label": "Encoder quality preset",

lib/encoders/vaapi.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
#!/usr/bin/env python3
23
# -*- coding: utf-8 -*-
34

@@ -89,6 +90,7 @@ def options(self):
8990
return {
9091
"vaapi_device": "none",
9192
"vaapi_decoding_method": "cpu",
93+
"vaapi_safe_decode": False,
9294
"vaapi_encoder_ratecontrol_method": "ICQ",
9395
"vaapi_constant_quantizer_scale": "25",
9496
"vaapi_constant_quality_scale": "23",
@@ -141,6 +143,9 @@ def generate_default_args(self):
141143
}
142144
advanced_kwargs = {}
143145

146+
if self.settings.get_setting('vaapi_safe_decode'):
147+
generic_kwargs["-reinit_filter"] = "0"
148+
144149
return generic_kwargs, advanced_kwargs
145150

146151
def generate_filtergraphs(self, current_filter_args, smart_filters, encoder_name):
@@ -203,11 +208,20 @@ def generate_filtergraphs(self, current_filter_args, smart_filters, encoder_name
203208
# Upload to hw frames at the end of the filter
204209
end_chain = start_chain + ["hwupload"]
205210
end_filter_args.append(",".join(end_chain))
211+
elif self.settings.get_setting('vaapi_safe_decode'):
212+
# HW decode + safe mode: force SW frames to avoid hwaccel reconfigure
213+
generic_kwargs['-hwaccel_output_format'] = target_fmt
214+
start_chain = [f"format={target_fmt}"]
215+
if enc_supports_hdr and target_color_config.get('apply_color_params'):
216+
start_chain.append(target_color_config['setparams_filter'])
217+
start_filter_args.append(",".join(start_chain))
218+
end_chain = start_chain + ["hwupload"]
219+
end_filter_args.append(",".join(end_chain))
206220
else:
207-
# Add hwupload filter that can handle when the frame was decoded in software or hardware
221+
# Pure HW path - frames stay in VAAPI memory
208222
chain = [f"format={target_fmt}|vaapi", "hwupload"]
209223
end_filter_args.append(",".join(chain))
210-
224+
211225
# Add the smart filters to the end
212226
end_filter_args += hw_smart_filters
213227

@@ -382,6 +396,18 @@ def get_vaapi_decoding_method_form_settings(self):
382396
values["display"] = "hidden"
383397
return values
384398

399+
def get_vaapi_safe_decode_form_settings(self):
400+
values = {
401+
"label": "Safe decode mode",
402+
"description": "Forces CPU-side frame handling to prevent failures on files with "
403+
"inconsistent color space metadata (common in WEBDL sources).\n"
404+
"Slightly slower due to GPU->CPU->GPU round-trip per frame.",
405+
"sub_setting": True,
406+
}
407+
if self.settings.get_setting('mode') not in ['standard'] or self.settings.get_setting('vaapi_decoding_method') != "vaapi":
408+
values["display"] = "hidden"
409+
return values
410+
385411
def get_vaapi_encoder_ratecontrol_method_form_settings(self):
386412
values = {
387413
"label": "Encoder ratecontrol method",

0 commit comments

Comments
 (0)