]> granicus.if.org Git - handbrake/commitdiff
QSV: initial libhb infrastructure to query QSV availability and capabilities.
authorRodeo <tdskywalker@gmail.com>
Tue, 2 Apr 2013 17:04:05 +0000 (17:04 +0000)
committerRodeo <tdskywalker@gmail.com>
Tue, 2 Apr 2013 17:04:05 +0000 (17:04 +0000)
Querying is done in libhb during hb_init(), and can be used by the UIs later using a dedicated info struct.

git-svn-id: svn://svn.handbrake.fr/HandBrake/branches/qsv@5375 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/hb.c
libhb/hb.h
test/test.c

index fef9ab8762ad8555a500eb5565959bc33ead08dc..e562ec9bf1f9059ae380987e1a0001e5fd1d5c28 100644 (file)
@@ -67,6 +67,11 @@ struct hb_handle_s
     // 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;
@@ -338,6 +343,60 @@ void hb_ff_set_sample_fmt(AVCodecContext *context, AVCodec *codec,
     }
 }
 
+/* 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.
@@ -476,7 +535,8 @@ hb_handle_t * hb_init( int verbose, int update_check )
        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 );
@@ -580,7 +640,8 @@ hb_handle_t * hb_init_dl( int verbose, int update_check )
        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 );
index e23a0dfd4b428185b80500b3e9d19faab53f8130..d3a7e60f01f04b8a83d128d74f8a1d0e38247ad5 100644 (file)
@@ -18,6 +18,10 @@ extern "C" {
 #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) */
@@ -131,6 +135,33 @@ void          hb_global_close();
    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
index 4dc9d12c1e58aceaf09be0ffda31474be57769d0..304308d39acb5c0a10081b5d3051d1afaa38fd7d 100644 (file)
@@ -242,16 +242,6 @@ int main( int argc, char ** argv )
     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 );
 
@@ -680,6 +670,36 @@ static int HandleEvents( hb_handle_t * h )
                 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 */