static int hb_opencl_device_is_supported(hb_opencl_device_t* device) { // we only support OpenCL on GPUs for now // Ivy Bridge supports OpenCL on GPU, but it's too slow to be usable // FIXME: disable on NVIDIA to to a bug if ((device != NULL) && (device->type & CL_DEVICE_TYPE_GPU) && (device->ocl_vendor != HB_OCL_VENDOR_NVIDIA) && (device->ocl_vendor != HB_OCL_VENDOR_INTEL || hb_get_cpu_platform() != HB_CPU_PLATFORM_INTEL_IVB)) { int major, minor; // check OpenCL version: // OpenCL<space><major_version.minor_version><space><vendor-specific information> if (sscanf(device->version, "OpenCL %d.%d", &major, &minor) != 2) { return 0; } return (major > HB_OCL_MINVERSION_MAJOR) || (major == HB_OCL_MINVERSION_MAJOR && minor >= HB_OCL_MINVERSION_MINOR); } return 0; }
int hb_qsv_info_init() { static int init_done = 0; if (init_done) return (hb_qsv_info == NULL); init_done = 1; hb_qsv_info = calloc(1, sizeof(*hb_qsv_info)); if (hb_qsv_info == NULL) { hb_error("hb_qsv_info_init: alloc failure"); return -1; } mfxSession session; qsv_minimum_version.Major = HB_QSV_MINVERSION_MAJOR; qsv_minimum_version.Minor = HB_QSV_MINVERSION_MINOR; // check for software fallback if (MFXInit(MFX_IMPL_SOFTWARE, &qsv_minimum_version, &session) == MFX_ERR_NONE) { qsv_software_available = 1; preferred_implementation = MFX_IMPL_SOFTWARE; // our minimum is supported, but query the actual version MFXQueryVersion(session, &qsv_software_version); MFXClose(session); } // check for actual hardware support if (MFXInit(MFX_IMPL_HARDWARE_ANY|MFX_IMPL_VIA_ANY, &qsv_minimum_version, &session) == MFX_ERR_NONE) { qsv_hardware_available = 1; preferred_implementation = MFX_IMPL_HARDWARE_ANY|MFX_IMPL_VIA_ANY; // our minimum is supported, but query the actual version MFXQueryVersion(session, &qsv_hardware_version); MFXClose(session); } // check for version-specific or hardware-specific capabilities // we only use software as a fallback, so check hardware first if (qsv_hardware_available) { if (HB_CHECK_MFX_VERSION(qsv_hardware_version, 1, 6)) { hb_qsv_info->capabilities |= HB_QSV_CAP_OPTION2_BRC; hb_qsv_info->capabilities |= HB_QSV_CAP_MSDK_API_1_6; } if (hb_get_cpu_platform() == HB_CPU_PLATFORM_INTEL_HSW) { if (HB_CHECK_MFX_VERSION(qsv_hardware_version, 1, 7)) { hb_qsv_info->capabilities |= HB_QSV_CAP_OPTION2_TRELLIS; hb_qsv_info->capabilities |= HB_QSV_CAP_OPTION2_LOOKAHEAD; } hb_qsv_info->capabilities |= HB_QSV_CAP_H264_BPYRAMID; } } else if (qsv_software_available) { if (HB_CHECK_MFX_VERSION(qsv_software_version, 1, 6)) { hb_qsv_info->capabilities |= HB_QSV_CAP_MSDK_API_1_6; hb_qsv_info->capabilities |= HB_QSV_CAP_H264_BPYRAMID; } } // note: we pass a pointer to MFXInit but it never gets modified // let's make sure of it just to be safe though if (qsv_minimum_version.Major != HB_QSV_MINVERSION_MAJOR || qsv_minimum_version.Minor != HB_QSV_MINVERSION_MINOR) { hb_error("hb_qsv_info_init: minimum version (%d.%d) was modified", qsv_minimum_version.Major, qsv_minimum_version.Minor); } // success return 0; }