2727import os
2828import stat
2929import re
30+ import subprocess
31+ from pathlib import Path
32+
3033from configparser import NoSectionError , NoOptionError
3134
3235from unmanic .libs .unplugins .settings import PluginSettings
@@ -202,6 +205,43 @@ def comskip_config_file(settings):
202205
203206 return comskip_config_file
204207
208+ def get_render_vendor ():
209+ render_root = Path ('/dev/dri' )
210+ render_dev = [render_device for render_device in render_root .glob ("render*" )]
211+ #if render_dev is not empty, render devices were found
212+
213+ render_names = [dev .name for dev in render_dev ]
214+ for rdev in render_names :
215+ if os .path .exists (os .path .join ("/sys/class/drm" , render_names [0 ], "device/vendor" )):
216+ vendor = Path (os .path .join ("/sys/class/drm" , render_names [0 ], "device/vendor" ))
217+ vendor_text = vendor .read_text ()
218+ if "0x8086" in vendor_text :
219+ return rdev
220+ return ""
221+
222+ def get_gpu ():
223+ command = '[[ $(compgen -G /dev/nvidia*) != "" ]] && [[ $(command -v nvidia-smi) != "" ]] && echo "nvidia_gpu_and_driver_installed"'
224+ result = subprocess .run (["bash" , "-c" , command ], capture_output = True , text = True , check = False )
225+ if "nvidia_gpu_and_driver_installed" in result .stdout :
226+ logger .info (f"nvidia GPU detected in container and driver installed" )
227+ decoder = "--cuvid"
228+ else :
229+ logger .info (f"nvidia GPU not detected in container or driver not installed" )
230+ decoder = ""
231+
232+ if get_render_vendor () == '' :
233+ logger .info (f"QSV capable GPU not detected in container" )
234+ else :
235+ command = '[[ $(vainfo --display drm --device "$INTEL_NODE" 2>/dev/null) ]] && echo "intel driver installed"'
236+ result = subprocess .run (["bash" , "-c" , command ], capture_output = True , text = True , check = False )
237+ if "intel driver installed" in result .stdout :
238+ logger .info (f"QSV GPU driver detected as installed in container" )
239+ if decoder == "--cuvid" :
240+ decoder += "+ --qsv"
241+ else :
242+ decoder = "--qsv"
243+ # if cuvid nor qsv is detected, decoder should be "" here
244+ return decoder
205245
206246def build_comskip_args (abspath , settings ):
207247 config_file = comskip_config_file (settings )
@@ -210,15 +250,24 @@ def build_comskip_args(abspath, settings):
210250 file_ext = os .path .splitext (abspath )[1 ]
211251 use_hw = settings .get_setting ('use_hw' )
212252 comskip_args = ['comskip' ,'--ini={}' .format (config_file ),'--output={}' .format (file_dirname ),'--output-filename={}' .format (file_sans_ext ),abspath ]
253+ if use_hw :
254+ decoder = get_gpu ()
255+ if decoder == "--cuvid + --qsv" :
256+ logger .info (f"Can use either cuvid or qsv - picking cuvid" )
257+ decoder == '--cuvid'
258+ elif decoder == "" :
259+ use_hw = False
260+ logger .info (f"h/w decoding was configured but no nvidia or qsv decoder was found - falling back to cpu based decoding" )
261+
213262 if (not use_hw ) & (file_ext == '.ts' ):
214263 comskip_args .insert (1 , '-t' )
215264
216265 if use_hw & (file_ext != '.ts' ):
217- comskip_args .insert (1 , '--cuvid' )
266+ comskip_args .insert (1 , decoder )
218267
219268 if use_hw & (file_ext == '.ts' ):
220269 comskip_args .insert (1 , '-t' )
221- comskip_args .insert (2 , '--cuvid' )
270+ comskip_args .insert (2 , decoder )
222271
223272 return comskip_args
224273
@@ -230,6 +279,15 @@ def build_comchap_args(abspath, file_out, settings):
230279 st = os .stat (comchap_path )
231280 os .chmod (comchap_path , st .st_mode | stat .S_IEXEC )
232281 use_hw = settings .get_setting ('use_hw' )
282+ if use_hw :
283+ decoder = get_gpu ()
284+ if decoder == "--cuvid + --qsv" :
285+ logger .info (f"For comchap - can use either cuvid or qsv - picking cuvid" )
286+ decoder == '--cuvid'
287+ elif decoder == "" :
288+ use_hw = False
289+ logger .info (f"for comchap - h/w decoding was configured but no nvidia or qsv decoder was found - falling back to cpu based decoding" )
290+
233291 if not use_hw :
234292 args = [
235293 comchap_path ,
@@ -244,7 +302,7 @@ def build_comchap_args(abspath, file_out, settings):
244302 args = [
245303 comchap_path ,
246304 '--comskip-ini={}' .format (config_file ),
247- '--use-hw' ,
305+ decoder ,
248306 '--keep-edl' ,
249307 '--keep-meta' ,
250308 '--verbose' ,
@@ -261,6 +319,15 @@ def build_comcut_args(abspath, file_out, settings):
261319 st = os .stat (comcut_path )
262320 os .chmod (comcut_path , st .st_mode | stat .S_IEXEC )
263321 use_hw = settings .get_setting ('use_hw' )
322+ if use_hw :
323+ decoder = get_gpu ()
324+ if decoder == "--cuvid + --qsv" :
325+ logger .info (f"For comcut - can use either cuvid or qsv - picking cuvid" )
326+ decoder == '--cuvid'
327+ elif decoder == "" :
328+ use_hw = False
329+ logger .info (f"for comcut - h/w decoding was configured but no nvidia or qsv decoder was found - falling back to cpu based decoding" )
330+
264331 if not use_hw :
265332 args = [
266333 comcut_path ,
@@ -274,7 +341,7 @@ def build_comcut_args(abspath, file_out, settings):
274341 args = [
275342 comcut_path ,
276343 '--comskip-ini={}' .format (config_file ),
277- '--use-hw' ,
344+ decoder ,
278345 '--keep-edl' ,
279346 '--keep-meta' ,
280347 abspath ,
0 commit comments