|  | @@ -1605,7 +1605,7 @@ namespace MediaBrowser.Controller.MediaEncoding
 | 
	
		
			
				|  |  |                  // For VAAPI and CUVID decoder
 | 
	
		
			
				|  |  |                  // these encoders cannot automatically adjust the size of graphical subtitles to fit the output video,
 | 
	
		
			
				|  |  |                  // thus needs to be manually adjusted.
 | 
	
		
			
				|  |  | -                if (string.Equals(options.HardwareAccelerationType, "vaapi", StringComparison.OrdinalIgnoreCase)
 | 
	
		
			
				|  |  | +                if (IsVaapiSupported(state) && string.Equals(options.HardwareAccelerationType, "vaapi", StringComparison.OrdinalIgnoreCase)
 | 
	
		
			
				|  |  |                      || (videoDecoder ?? string.Empty).IndexOf("cuvid", StringComparison.OrdinalIgnoreCase) != -1)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      var videoStream = state.VideoStream;
 | 
	
	
		
			
				|  | @@ -1636,7 +1636,7 @@ namespace MediaBrowser.Controller.MediaEncoding
 | 
	
		
			
				|  |  |              var retStr = " -filter_complex \"[{0}:{1}]{4}[sub];[0:{2}][sub]overlay{3}\"";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // When the input may or may not be hardware VAAPI decodable
 | 
	
		
			
				|  |  | -            if (string.Equals(options.HardwareAccelerationType, "vaapi", StringComparison.OrdinalIgnoreCase) && options.EnableHardwareEncoding)
 | 
	
		
			
				|  |  | +            if (string.Equals(outputVideoCodec, "h264_vaapi", StringComparison.OrdinalIgnoreCase))
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  /*
 | 
	
		
			
				|  |  |                      [base]: HW scaling video to OutputSize
 | 
	
	
		
			
				|  | @@ -1648,7 +1648,8 @@ namespace MediaBrowser.Controller.MediaEncoding
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // If we're hardware VAAPI decoding and software encoding, download frames from the decoder first
 | 
	
		
			
				|  |  | -            else if (string.Equals(options.HardwareAccelerationType, "vaapi", StringComparison.OrdinalIgnoreCase) && !options.EnableHardwareEncoding)
 | 
	
		
			
				|  |  | +            else if (string.Equals(options.HardwareAccelerationType, "vaapi", StringComparison.OrdinalIgnoreCase)
 | 
	
		
			
				|  |  | +                && string.Equals(outputVideoCodec, "libx264", StringComparison.OrdinalIgnoreCase))
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  /*
 | 
	
		
			
				|  |  |                      [base]: SW scaling video to OutputSize
 | 
	
	
		
			
				|  | @@ -1996,14 +1997,14 @@ namespace MediaBrowser.Controller.MediaEncoding
 | 
	
		
			
				|  |  |              var hasTextSubs = state.SubtitleStream != null && state.SubtitleStream.IsTextSubtitleStream && state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // When the input may or may not be hardware VAAPI decodable
 | 
	
		
			
				|  |  | -            if (string.Equals(options.HardwareAccelerationType, "vaapi", StringComparison.OrdinalIgnoreCase) && options.EnableHardwareEncoding)
 | 
	
		
			
				|  |  | +            if (string.Equals(outputVideoCodec, "h264_vaapi", StringComparison.OrdinalIgnoreCase))
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  filters.Add("format=nv12|vaapi");
 | 
	
		
			
				|  |  |                  filters.Add("hwupload");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // When the input may or may not be hardware QSV decodable            
 | 
	
		
			
				|  |  | -            else if (string.Equals(options.HardwareAccelerationType, "qsv", StringComparison.OrdinalIgnoreCase) && options.EnableHardwareEncoding)
 | 
	
		
			
				|  |  | +            else if (string.Equals(outputVideoCodec, "h264_qsv", StringComparison.OrdinalIgnoreCase))
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  if (!hasTextSubs)
 | 
	
		
			
				|  |  |                  {
 | 
	
	
		
			
				|  | @@ -2013,8 +2014,8 @@ namespace MediaBrowser.Controller.MediaEncoding
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // If we're hardware VAAPI decoding and software encoding, download frames from the decoder first
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            else if (string.Equals(options.HardwareAccelerationType, "vaapi", StringComparison.OrdinalIgnoreCase) && !options.EnableHardwareEncoding)
 | 
	
		
			
				|  |  | +            else if (string.Equals(options.HardwareAccelerationType, "vaapi", StringComparison.OrdinalIgnoreCase)
 | 
	
		
			
				|  |  | +                && string.Equals(outputVideoCodec, "libx264", StringComparison.OrdinalIgnoreCase))
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  var codec = videoStream.Codec.ToLowerInvariant();
 | 
	
		
			
				|  |  |                  var pixelFormat = videoStream.PixelFormat.ToLowerInvariant();
 | 
	
	
		
			
				|  | @@ -2077,7 +2078,7 @@ namespace MediaBrowser.Controller.MediaEncoding
 | 
	
		
			
				|  |  |              filters.AddRange(GetScalingFilters(state, inputWidth, inputHeight, threeDFormat, videoDecoder, outputVideoCodec, request.Width, request.Height, request.MaxWidth, request.MaxHeight));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // Add parameters to use VAAPI with burn-in text subttiles (GH issue #642)
 | 
	
		
			
				|  |  | -            if (string.Equals(options.HardwareAccelerationType, "vaapi", StringComparison.OrdinalIgnoreCase) && options.EnableHardwareEncoding)
 | 
	
		
			
				|  |  | +            if (string.Equals(outputVideoCodec, "h264_vaapi", StringComparison.OrdinalIgnoreCase))
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  if (state.SubtitleStream != null
 | 
	
		
			
				|  |  |                      && state.SubtitleStream.IsTextSubtitleStream
 |