[Libva] [Libva-intel-driver PATCH V2 3/3] Encoding: Add one hook callback function to detect encoding capabilitiy on Haswell

Zhao Yakui yakui.zhao at intel.com
Thu Sep 11 19:20:15 PDT 2014


Some Haswell machine doesn't support the encoding. So it should be disabled.
Otherwise the driver can't report the supported capability correctly.

V1->V2: Minor update based on comment from Gwenole Beauchesne. For example: 
use the bool tye and remove the hardcoded value

Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
---
 src/i965_device_info.c |  107 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 107 insertions(+)

diff --git a/src/i965_device_info.c b/src/i965_device_info.c
index c9bcfde..5ebea2a 100755
--- a/src/i965_device_info.c
+++ b/src/i965_device_info.c
@@ -27,6 +27,10 @@
 #include <stdlib.h>
 #include "i965_drv_video.h"
 
+#include <string.h>
+#include <strings.h>
+#include <errno.h>
+
 /* Extra set of chroma formats supported for H.264 decoding (beyond YUV 4:2:0) */
 #define EXTRA_H264_DEC_CHROMA_FORMATS \
     (VA_RT_FORMAT_YUV400)
@@ -156,6 +160,8 @@ static struct hw_codec_info ivb_hw_codec_info = {
     },
 };
 
+static void hsw_hw_codec_preinit(VADriverContextP ctx, struct hw_codec_info *codec_info);
+
 extern struct hw_context *gen75_dec_hw_context_init(VADriverContextP, struct object_config *);
 extern struct hw_context *gen75_enc_hw_context_init(VADriverContextP, struct object_config *);
 extern struct hw_context *gen75_proc_context_init(VADriverContextP, struct object_config *);
@@ -165,6 +171,7 @@ static struct hw_codec_info hsw_hw_codec_info = {
     .proc_hw_context_init = gen75_proc_context_init,
     .render_init = genx_render_init,
     .post_processing_context_init = i965_post_processing_context_init,
+    .preinit_hw_codec = hsw_hw_codec_preinit,
 
     .max_width = 4096,
     .max_height = 4096,
@@ -370,3 +377,103 @@ i965_get_device_info(int devid)
         return NULL;
     }
 }
+
+static int intel_driver_detect_cpustring(char *model_id)
+{
+    FILE *fp;
+    size_t line_length;
+    ssize_t read_length;
+    char *line_string, *model_ptr;
+    bool found;
+
+    if (model_id == NULL)
+        return -EINVAL;
+
+    fp = fopen("/proc/cpuinfo", "r");
+    if (fp == NULL) {
+        fprintf(stderr, "no permission to access /proc/cpuinfo\n");
+        return -EACCES;
+    }
+    line_string = NULL;
+    found = false;
+
+    while((read_length = getline(&line_string, &line_length, fp)) != -1) {
+        if (strstr(line_string, "model name")) {
+            model_ptr = strstr(line_string, ": ");
+            model_ptr += 2;
+            found = true;
+            strncpy(model_id, model_ptr, strlen(model_ptr));
+            break;
+        }
+    }
+    fclose(fp);
+
+    if (line_string)
+        free(line_string);
+
+    if (found)
+        return 0;
+    else
+        return -EINVAL;
+}
+
+/*
+ * the hook_list for HSW.
+ * It is captured by /proc/cpuinfo and the space character is stripped.
+ */
+const static char *hsw_cpu_hook_list[] =  {
+"Intel(R)Pentium(R)3556U",
+"Intel(R)Pentium(R)3560Y",
+"Intel(R)Pentium(R)3550M",
+"Intel(R)Celeron(R)2980U",
+"Intel(R)Celeron(R)2955U",
+"Intel(R)Celeron(R)2950M",
+};
+
+static void hsw_hw_codec_preinit(VADriverContextP ctx, struct hw_codec_info *codec_info)
+{
+    char model_string[64], model_id[64];
+    char *model_ptr, *tmp_ptr;
+    int i, model_len, list_len;
+    bool found;
+
+    memset(model_string, 0, sizeof(model_string));
+    memset(model_id, 0, sizeof(model_id));
+
+    /* If it can't detect cpu model_string, leave it alone */
+    if (intel_driver_detect_cpustring(model_string))
+        return;
+
+    /* strip the cpufreq info */
+    model_ptr = model_string;
+    tmp_ptr = strstr(model_ptr, "@");
+    *tmp_ptr = '\0';
+
+    /* strip the space character and convert to the lower case */
+    model_ptr = model_id;
+    model_len = strlen(model_string);
+    for (i = 0; i < model_len; i++) {
+         if (model_string[i] != ' ') {
+             *model_ptr = model_string[i];
+             model_ptr++;
+         }
+    }
+    *model_ptr = '\0';
+
+    found = false;
+    list_len = sizeof(hsw_cpu_hook_list) / sizeof(char *);
+    for (i = 0; i < list_len; i++) {
+        model_ptr = (char *)hsw_cpu_hook_list[i];
+        if (strcasecmp(model_id, model_ptr) == 0) {
+            found = true;
+            break;
+	}
+    }
+
+    if (found) {
+	codec_info->has_h264_encoding = 0;
+	codec_info->has_h264_mvc_encoding = 0;
+	codec_info->has_mpeg2_encoding = 0;
+    }
+    return;
+}
-- 
1.7.10.1



More information about the Libva mailing list