@@ -88,32 +88,52 @@ def generate_default_args(self):
8888 }
8989 return generic_kwargs , advanced_kwargs
9090
91- def generate_filtergraphs (self , settings , software_filters , hw_smart_filters ):
91+ def generate_filtergraphs (self , settings , has_sw_filters , hw_smart_filters , target_fmt = "nv12" ):
9292 """
9393 Generate the required filter for enabling QSV HW acceleration
9494
9595 :return:
9696 """
9797 generic_kwargs = {}
9898 advanced_kwargs = {}
99- filter_args = []
100- # If we are using software filters, then disable qsv surfaces.
101- # Instead, output software frames
102- if software_filters :
103- # If we are decoding with QSV, then output to software frames
104- if settings .get_setting ('qsv_decoding_method' ) in ['qsv' ]:
105- generic_kwargs ['-hwaccel_output_format' ] = 'nv12'
99+ hw_filter_args = []
100+ sw_filter_prefix_args = []
101+ sw_filter_suffix_args = []
102+
103+ # Check if we are decoding with QSV
104+ hw_decode = settings .get_setting ('qsv_decoding_method' ) in ['qsv' ]
105+ # Check software format to use
106+ sw_fmt = "p010le" if target_fmt == "p010" else "nv12"
107+
108+ # If we have SW filters:
109+ if has_sw_filters :
110+ # If we have SW filters and HW decode is enabled, make decoder produce SW frames
111+ if hw_decode :
112+ generic_kwargs ['-hwaccel_output_format' ] = sw_fmt
106113 # Add filter to upload software frames to QSV for QSV filters
107- filter_args .append ('hwupload=extra_hw_frames=64,format=qsv' )
108- # If we have no software filters, but we are decoding in software, then we still need to upload surfaces to QSV
109- elif settings .get_setting ('qsv_decoding_method' ) not in ['qsv' ]:
110- filter_args .append ('hwupload=extra_hw_frames=64,format=qsv' )
114+ # Note, format conversion (if any - eg yuv422p10le -> p010le) happens after the software filters.
115+ # If a user applies a custom software filter that does not support the pix_fmt, then will need to prefix it with 'format=p010le'
116+ sw_filter_suffix_args .append (
117+ f'format={ sw_fmt } |qsv,hwupload=extra_hw_frames=64,format=qsv,vpp_qsv=format={ target_fmt } ' )
118+ # If we have no software filters:
119+ else :
120+ # Add hwupload filter that can handle when the frame was decoded in software or hardware
121+ hw_filter_args .append (f'format={ sw_fmt } |qsv,hwupload=extra_hw_frames=64,format=qsv,vpp_qsv=format={ target_fmt } ' )
122+
111123 # Loop over any HW smart filters to be applied and add them as required.
112124 for smart_filter in hw_smart_filters :
113125 if smart_filter .get ('scale' ):
114126 scale_values = smart_filter .get ('scale' )
115- filter_args .append ('scale_qsv=w={}:h={}' .format (scale_values [0 ], scale_values [1 ]))
116- return generic_kwargs , advanced_kwargs , filter_args
127+ hw_filter_args .append ('scale_qsv=w={}:h=-1' .format (scale_values ["width" ]))
128+
129+ # Return built args
130+ return {
131+ "generic_kwargs" : generic_kwargs ,
132+ "advanced_kwargs" : advanced_kwargs ,
133+ "hw_filter_args" : hw_filter_args ,
134+ "sw_filter_prefix_args" : sw_filter_prefix_args ,
135+ "sw_filter_suffix_args" : sw_filter_suffix_args ,
136+ }
117137
118138 def encoder_details (self , encoder ):
119139 provides = self .provides ()
@@ -196,7 +216,8 @@ def get_qsv_decoding_method_form_settings(self):
196216 "label" : "Enable HW Accelerated Decoding" ,
197217 "description" : "Warning: Ensure your device supports decoding the source video codec or it will fail.\n "
198218 "This enables full hardware transcode with QSV, using only GPU memory for the entire video transcode.\n "
199- "If filters are configured in the plugin, decoder will output NV12 software surfaces which are slightly slower." ,
219+ "If filters are configured in the plugin, decoder will output NV12 or P010LE software surfaces to\n "
220+ "those filters which will be slightly slower." ,
200221 "sub_setting" : True ,
201222 "input_type" : "select" ,
202223 "select_options" : [
0 commit comments