Enforce our own hardware acceleration attempts order.
This commit is contained in:
		
							parent
							
								
									dd9e317257
								
							
						
					
					
						commit
						27d9f78566
					
				
					 1 changed files with 37 additions and 10 deletions
				
			
		| 
						 | 
					@ -112,14 +112,38 @@ void PremultiplyLine(uchar *dst, const uchar *src, int intsCount) {
 | 
				
			||||||
[[nodiscard]] enum AVPixelFormat GetHwFormat(
 | 
					[[nodiscard]] enum AVPixelFormat GetHwFormat(
 | 
				
			||||||
		AVCodecContext *context,
 | 
							AVCodecContext *context,
 | 
				
			||||||
		const enum AVPixelFormat *formats) {
 | 
							const enum AVPixelFormat *formats) {
 | 
				
			||||||
 | 
						const auto has = [&](enum AVPixelFormat format) {
 | 
				
			||||||
		const enum AVPixelFormat *p = nullptr;
 | 
							const enum AVPixelFormat *p = nullptr;
 | 
				
			||||||
		for (p = formats; *p != AV_PIX_FMT_NONE; p++) {
 | 
							for (p = formats; *p != AV_PIX_FMT_NONE; p++) {
 | 
				
			||||||
 | 
								if (*p == format) {
 | 
				
			||||||
 | 
									return true;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						const auto list = std::array{
 | 
				
			||||||
 | 
					#ifdef Q_OS_WIN
 | 
				
			||||||
 | 
							AV_PIX_FMT_D3D11,
 | 
				
			||||||
 | 
							AV_PIX_FMT_DXVA2_VLD,
 | 
				
			||||||
 | 
							AV_PIX_FMT_CUDA,
 | 
				
			||||||
 | 
					#elif defined Q_OS_MAC // Q_OS_WIN
 | 
				
			||||||
 | 
							AV_PIX_FMT_VIDEOTOOLBOX,
 | 
				
			||||||
 | 
					#else // Q_OS_WIN || Q_OS_MAC
 | 
				
			||||||
 | 
							AV_PIX_FMT_VAAPI,
 | 
				
			||||||
 | 
							AV_PIX_FMT_VDPAU,
 | 
				
			||||||
 | 
							AV_PIX_FMT_CUDA,
 | 
				
			||||||
 | 
					#endif // Q_OS_WIN || Q_OS_MAC
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						for (const auto format : list) {
 | 
				
			||||||
 | 
							if (!has(format)) {
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		const auto type = [&] {
 | 
							const auto type = [&] {
 | 
				
			||||||
			switch (*p) {
 | 
								switch (format) {
 | 
				
			||||||
#ifdef Q_OS_WIN
 | 
					#ifdef Q_OS_WIN
 | 
				
			||||||
			case AV_PIX_FMT_D3D11: return AV_HWDEVICE_TYPE_D3D11VA;
 | 
								case AV_PIX_FMT_D3D11: return AV_HWDEVICE_TYPE_D3D11VA;
 | 
				
			||||||
			case AV_PIX_FMT_DXVA2_VLD: return AV_HWDEVICE_TYPE_DXVA2;
 | 
								case AV_PIX_FMT_DXVA2_VLD: return AV_HWDEVICE_TYPE_DXVA2;
 | 
				
			||||||
			case AV_PIX_FMT_D3D11VA_VLD: return AV_HWDEVICE_TYPE_D3D11VA;
 | 
								case AV_PIX_FMT_CUDA: return AV_HWDEVICE_TYPE_CUDA;
 | 
				
			||||||
#elif defined Q_OS_MAC // Q_OS_WIN
 | 
					#elif defined Q_OS_MAC // Q_OS_WIN
 | 
				
			||||||
			case AV_PIX_FMT_VIDEOTOOLBOX:
 | 
								case AV_PIX_FMT_VIDEOTOOLBOX:
 | 
				
			||||||
				return AV_HWDEVICE_TYPE_VIDEOTOOLBOX;
 | 
									return AV_HWDEVICE_TYPE_VIDEOTOOLBOX;
 | 
				
			||||||
| 
						 | 
					@ -127,18 +151,21 @@ void PremultiplyLine(uchar *dst, const uchar *src, int intsCount) {
 | 
				
			||||||
			case AV_PIX_FMT_VAAPI: return AV_HWDEVICE_TYPE_VAAPI;
 | 
								case AV_PIX_FMT_VAAPI: return AV_HWDEVICE_TYPE_VAAPI;
 | 
				
			||||||
			case AV_PIX_FMT_VDPAU: return AV_HWDEVICE_TYPE_VDPAU;
 | 
								case AV_PIX_FMT_VDPAU: return AV_HWDEVICE_TYPE_VDPAU;
 | 
				
			||||||
#endif // Q_OS_WIN || Q_OS_MAC
 | 
					#endif // Q_OS_WIN || Q_OS_MAC
 | 
				
			||||||
			case AV_PIX_FMT_CUDA: return AV_HWDEVICE_TYPE_CUDA;
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return AV_HWDEVICE_TYPE_NONE;
 | 
								return AV_HWDEVICE_TYPE_NONE;
 | 
				
			||||||
		}();
 | 
							}();
 | 
				
			||||||
		if (type != AV_HWDEVICE_TYPE_NONE && !InitHw(context, type)) {
 | 
							if (type == AV_HWDEVICE_TYPE_NONE && context->hw_device_ctx) {
 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		} else if (type == AV_HWDEVICE_TYPE_NONE && context->hw_device_ctx) {
 | 
					 | 
				
			||||||
			av_buffer_unref(&context->hw_device_ctx);
 | 
								av_buffer_unref(&context->hw_device_ctx);
 | 
				
			||||||
 | 
							} else if (type != AV_HWDEVICE_TYPE_NONE && !InitHw(context, type)) {
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return *p;
 | 
							return format;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return AV_PIX_FMT_NONE;
 | 
						enum AVPixelFormat result = AV_PIX_FMT_NONE;
 | 
				
			||||||
 | 
						for (const enum AVPixelFormat *p = formats; *p != AV_PIX_FMT_NONE; p++) {
 | 
				
			||||||
 | 
							result = *p;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <AVPixelFormat Required>
 | 
					template <AVPixelFormat Required>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue