// Power Management opaque pointer
// For OSX, it's an IOPMAssertionID*
void * hb_system_sleep_opaque;
+
+#ifdef USE_QSV
+ // detailed information about Intel QSV availability
+ hb_qsv_info_t qsv_info;
+#endif
} ;
hb_work_object_t * hb_objects = NULL;
}
}
+/* Intel Quick Sync Video utilities */
+#ifdef USE_QSV
+hb_qsv_info_t* hb_qsv_info_get(hb_handle_t *h)
+{
+ return &h->qsv_info;
+}
+
+// TODO: move usage of this outside of handle and into global init when possible
+static void hb_qsv_info_init(hb_qsv_info_t *qsv_info)
+{
+ mfxSession session;
+ qsv_info->software_available = qsv_info->hardware_available = 0;
+
+ // minimum supported version (currently 1.3)
+ // let's keep this independent of what Libav can do for decode
+ qsv_info->minimum_version.Major = 1;
+ qsv_info->minimum_version.Minor = 3;
+
+ // check for software fallback
+ if (MFXInit(MFX_IMPL_SOFTWARE, &qsv_info->minimum_version, &session) ==
+ MFX_ERR_NONE)
+ {
+ qsv_info->software_available = 1;
+ // our minimum is supported, but query the actual version
+ MFXQueryVersion(session , &qsv_info->software_version);
+ MFXClose(session);
+ }
+
+ // check for actual hardware support
+ if (MFXInit(MFX_IMPL_HARDWARE, &qsv_info->minimum_version, &session) ==
+ MFX_ERR_NONE)
+ {
+ qsv_info->hardware_available = 1;
+ // our minimum is supported, but query the actual version
+ MFXQueryVersion(session , &qsv_info->hardware_version);
+ MFXClose(session);
+ }
+
+ // support either implementation (at least for now)
+ qsv_info->qsv_available = (qsv_info->hardware_available ||
+ qsv_info->software_available);
+
+ // 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_info->minimum_version.Major != 1 ||
+ qsv_info->minimum_version.Minor != 3)
+ {
+ hb_error("hb_qsv_info_init: minimum version (%d.%d) was modified",
+ qsv_info->minimum_version.Major,
+ qsv_info->minimum_version.Minor);
+ }
+}
+#endif
+
/**
* Registers work objects, by adding the work object to a liked list.
* @param w Handle to hb_work_object_t to register.
hb_register( &hb_encavcodec );
hb_register( &hb_encx264 );
#ifdef USE_QSV
- hb_register( &hb_encqsv );
+ hb_register(&hb_encqsv);
+ hb_qsv_info_init(&h->qsv_info);
#endif
hb_register( &hb_enctheora );
hb_register( &hb_deca52 );
hb_register( &hb_encavcodec );
hb_register( &hb_encx264 );
#ifdef USE_QSV
- hb_register( &hb_encqsv );
+ hb_register(&hb_encqsv);
+ hb_qsv_info_init(&h->qsv_info);
#endif
hb_register( &hb_enctheora );
hb_register( &hb_deca52 );
#include "common.h"
#include "hb_dict.h"
+#ifdef USE_QSV
+#include "msdk/mfxvideo.h"
+#endif
+
/* hb_init()
Initializes a libhb session (launches his own thread, detects CPUs,
etc) */
Return the unique instance id of an libhb instance created by hb_init. */
int hb_get_instance_id( hb_handle_t * h );
+#ifdef USE_QSV
+/*
+ * Get & store all available Intel Quick Sync information:
+ *
+ * - general availability
+ * - available implementations (hardware-accelerated, software fallback, etc.)
+ * - available codecs, filters, etc. for direct access (convenience)
+ * - supported API version
+ * - supported resolutions
+ */
+typedef struct hb_qsv_info_s
+{
+ // availability
+ int qsv_available; // if this is 0, the rest must be ignored
+ int hardware_available, software_available;
+
+ // version information
+ mfxVersion minimum_version, hardware_version, software_version;
+
+ // TODO: add available decoders, filters, encoders,
+ // maximum decode and encode resolution, etc.
+} hb_qsv_info_t;
+
+/* Get Intel QSV information from the handle, outside of hb.c */
+hb_qsv_info_t* hb_qsv_info_get(hb_handle_t*);
+#endif
+
#ifdef __cplusplus
}
#endif
fprintf( stderr, "%d CPU%s detected\n", hb_get_cpu_count(),
hb_get_cpu_count( h ) > 1 ? "s" : "" );
-#ifdef USE_QSV
- mfxIMPL impl = MFX_IMPL_HARDWARE;
-
- //ver.Major = AV_QSV_MSDK_VERSION_MAJOR;
- //ver.Minor = AV_QSV_MSDK_VERSION_MINOR;
- mfxVersion ver = {{AV_QSV_MSDK_VERSION_MINOR, AV_QSV_MSDK_VERSION_MAJOR}};
-
- fprintf( stderr,"HW/Intel QSV acceleration availability %sdetected\n", av_is_qsv_available(impl,&ver) < 0? "is NOT ":"" );
-#endif
-
/* Exit ASAP on Ctrl-C */
signal( SIGINT, SigHandler );
title = hb_list_item( title_set->list_title, 0 );
}
+#ifdef USE_QSV
+ // this is where WinGUI parsing begins
+ hb_qsv_info_t *qsv_info = hb_qsv_info_get(h);
+ // show users (including the WinGUI) whether Quick Sync can be used
+ fprintf(stderr,"+ intel quick sync video support: %s\n",
+ qsv_info->qsv_available ? "yes": "no");
+ // if we have Quick Sync support, also print the details
+ if (qsv_info->qsv_available)
+ {
+ if (qsv_info->hardware_available)
+ {
+ fprintf(stderr,
+ " + hardware version: %d.%d (minimum: %d.%d)\n",
+ qsv_info->hardware_version.Major,
+ qsv_info->hardware_version.Minor,
+ qsv_info->minimum_version.Major,
+ qsv_info->minimum_version.Minor);
+ }
+ if (qsv_info->software_available)
+ {
+ fprintf(stderr,
+ " + software version: %d.%d (minimum: %d.%d)\n",
+ qsv_info->software_version.Major,
+ qsv_info->software_version.Minor,
+ qsv_info->minimum_version.Major,
+ qsv_info->minimum_version.Minor);
+ }
+ }
+#endif
+
if( !titleindex || titlescan )
{
/* Scan-only mode, print infos and exit */