From 9e9d55f96135d301e2859d3d4624887ab9e9536c Mon Sep 17 00:00:00 2001
From: Zhao Halley <halley.zhao@intel.com>
Date: Wed, 3 Jul 2013 15:04:10 +0800
Subject: [PATCH 1/2] calculate decoder caps from driver capability

this avoid late failure of some unspported codecs,
for example mpeg4 decoder on Gen platform
---
 gst-libs/gst/vaapi/gstvaapidisplay.c |   50 ++++++++++++++++++++++++++-
 gst-libs/gst/vaapi/gstvaapiprofile.c |   62 ---------------------------------
 gst-libs/gst/vaapi/gstvaapiprofile.h |   63 ++++++++++++++++++++++++++++++++++
 3 files changed, 112 insertions(+), 63 deletions(-)

diff --git a/gst-libs/gst/vaapi/gstvaapidisplay.c b/gst-libs/gst/vaapi/gstvaapidisplay.c
index 919f24b..01c4d55 100644
--- a/gst-libs/gst/vaapi/gstvaapidisplay.c
+++ b/gst-libs/gst/vaapi/gstvaapidisplay.c
@@ -1263,9 +1263,57 @@ gst_vaapi_display_get_pixel_aspect_ratio(
 GstCaps *
 gst_vaapi_display_get_decode_caps(GstVaapiDisplay *display)
 {
+    VADisplay va_dpy;
+    VAStatus va_status;
+    GstCaps *out_caps = NULL;
+    VAProfile profile;
+
     g_return_val_if_fail(display != NULL, NULL);
 
-    return get_profile_caps(GST_VAAPI_DISPLAY_GET_PRIVATE(display)->decoders);
+    va_dpy = gst_vaapi_display_get_display(display);
+
+    out_caps = gst_caps_new_empty();
+    if (!out_caps)
+        return NULL;
+
+    for (profile = VAProfileNone; profile <= VAProfileH264ConstrainedBaseline; profile++) {
+        VAEntrypoint entrypoint, entrypoints[10];
+        int num_entrypoint;
+        GstCaps *caps = NULL;
+        const GstVaapiProfileMap *m;
+        gboolean support_vld_entrypoint = FALSE;
+
+        va_status = vaQueryConfigEntrypoints(va_dpy, profile, entrypoints,  &num_entrypoint);
+        if (va_status != VA_STATUS_SUCCESS)
+            continue;
+
+        for (entrypoint = 0; entrypoint < num_entrypoint; entrypoint++) {
+            if (entrypoint == VAEntrypointVLD) {
+                support_vld_entrypoint = TRUE;
+            }
+        }
+        if (!support_vld_entrypoint) continue;
+
+        for (m = gst_vaapi_profiles; m->profile; m++) {
+            if (m->va_profile != profile)
+                continue;
+            caps = gst_caps_from_string(m->caps_str);
+            if (!caps)
+                break;
+            gst_caps_set_simple(
+                caps,
+                "profile", G_TYPE_STRING, m->profile_str,
+                NULL
+            );
+            break;
+        }
+
+        if (caps) {
+            out_caps = gst_caps_merge(out_caps, caps);
+            caps = NULL;
+        }
+    }
+    return out_caps;
 }
 
 /**
diff --git a/gst-libs/gst/vaapi/gstvaapiprofile.c b/gst-libs/gst/vaapi/gstvaapiprofile.c
index 1c5c515..f69869f 100644
--- a/gst-libs/gst/vaapi/gstvaapiprofile.c
+++ b/gst-libs/gst/vaapi/gstvaapiprofile.c
@@ -32,75 +32,13 @@
 #include "gstvaapiprofile.h"
 #include "gstvaapiworkarounds.h"
 
-typedef struct _GstVaapiProfileMap              GstVaapiProfileMap;
 typedef struct _GstVaapiEntrypointMap           GstVaapiEntrypointMap;
 
-struct _GstVaapiProfileMap {
-    GstVaapiProfile             profile;
-    VAProfile                   va_profile;
-    const char                 *caps_str;
-    const gchar                *profile_str;
-};
-
 struct _GstVaapiEntrypointMap {
     GstVaapiEntrypoint          entrypoint;
     VAEntrypoint                va_entrypoint;
 };
 
-/* Profiles */
-static const GstVaapiProfileMap gst_vaapi_profiles[] = {
-    { GST_VAAPI_PROFILE_MPEG2_SIMPLE, VAProfileMPEG2Simple,
-      "video/mpeg, mpegversion=2", "simple"
-    },
-    { GST_VAAPI_PROFILE_MPEG2_MAIN, VAProfileMPEG2Main,
-      "video/mpeg, mpegversion=2", "main"
-    },
-    { GST_VAAPI_PROFILE_MPEG4_SIMPLE, VAProfileMPEG4Simple,
-      "video/mpeg, mpegversion=4", "simple"
-    },
-    { GST_VAAPI_PROFILE_MPEG4_ADVANCED_SIMPLE, VAProfileMPEG4AdvancedSimple,
-      "video/mpeg, mpegversion=4", "advanced-simple"
-    },
-    { GST_VAAPI_PROFILE_MPEG4_MAIN, VAProfileMPEG4Main,
-      "video/mpeg, mpegversion=4", "main"
-    },
-    { GST_VAAPI_PROFILE_MPEG4_ADVANCED_SIMPLE, VAProfileMPEG4AdvancedSimple,
-      "video/x-divx, divxversion=5", "advanced-simple"
-    },
-    { GST_VAAPI_PROFILE_MPEG4_ADVANCED_SIMPLE, VAProfileMPEG4AdvancedSimple,
-      "video/x-xvid", "advanced-simple"
-    },
-#if VA_CHECK_VERSION(0,30,0)
-    { GST_VAAPI_PROFILE_H263_BASELINE, VAProfileH263Baseline,
-      "video/x-h263, variant=itu, h263version=h263", "baseline"
-    },
-#endif
-    { GST_VAAPI_PROFILE_H264_BASELINE, VAProfileH264Baseline,
-      "video/x-h264", "baseline"
-    },
-    { GST_VAAPI_PROFILE_H264_MAIN, VAProfileH264Main,
-      "video/x-h264", "main"
-    },
-    { GST_VAAPI_PROFILE_H264_HIGH, VAProfileH264High,
-      "video/x-h264", "high"
-    },
-    { GST_VAAPI_PROFILE_VC1_SIMPLE, VAProfileVC1Simple,
-      "video/x-wmv, wmvversion=3", "simple"
-    },
-    { GST_VAAPI_PROFILE_VC1_MAIN, VAProfileVC1Main,
-      "video/x-wmv, wmvversion=3", "main"
-    },
-    { GST_VAAPI_PROFILE_VC1_ADVANCED, VAProfileVC1Advanced,
-      "video/x-wmv, wmvversion=3, " GST_MAKE_FORMAT_STRING(WVC1), "advanced"
-    },
-#if VA_CHECK_VERSION(0,32,0)
-    { GST_VAAPI_PROFILE_JPEG_BASELINE, VAProfileJPEGBaseline,
-      "image/jpeg", "baseline"
-    },
-#endif
-    { 0, }
-};
-
 /* Entry-points */
 static const GstVaapiEntrypointMap gst_vaapi_entrypoints[] = {
     { GST_VAAPI_ENTRYPOINT_VLD,          VAEntrypointVLD        },
diff --git a/gst-libs/gst/vaapi/gstvaapiprofile.h b/gst-libs/gst/vaapi/gstvaapiprofile.h
index 8663029..da03ead 100644
--- a/gst-libs/gst/vaapi/gstvaapiprofile.h
+++ b/gst-libs/gst/vaapi/gstvaapiprofile.h
@@ -23,7 +23,9 @@
 #ifndef GST_VAAPI_PROFILE_H
 #define GST_VAAPI_PROFILE_H
 
+#include "sysdeps.h"
 #include <gst/gstvalue.h>
+#include "gstvaapicompat.h"
 
 G_BEGIN_DECLS
 
@@ -134,6 +136,67 @@ typedef enum {
     GST_VAAPI_ENTRYPOINT_SLICE_ENCODE
 } GstVaapiEntrypoint;
 
+struct _GstVaapiProfileMap {
+    GstVaapiProfile             profile;
+    VAProfile                   va_profile;
+    const char                 *caps_str;
+    const gchar                *profile_str;
+};
+typedef struct _GstVaapiProfileMap              GstVaapiProfileMap;
+
+/* Profiles */
+static const GstVaapiProfileMap gst_vaapi_profiles[] = {
+    { GST_VAAPI_PROFILE_MPEG2_SIMPLE, VAProfileMPEG2Simple,
+      "video/mpeg, mpegversion=2", "simple"
+    },
+    { GST_VAAPI_PROFILE_MPEG2_MAIN, VAProfileMPEG2Main,
+      "video/mpeg, mpegversion=2", "main"
+    },
+    { GST_VAAPI_PROFILE_MPEG4_SIMPLE, VAProfileMPEG4Simple,
+      "video/mpeg, mpegversion=4", "simple"
+    },
+    { GST_VAAPI_PROFILE_MPEG4_ADVANCED_SIMPLE, VAProfileMPEG4AdvancedSimple,
+      "video/mpeg, mpegversion=4", "advanced-simple"
+    },
+    { GST_VAAPI_PROFILE_MPEG4_MAIN, VAProfileMPEG4Main,
+      "video/mpeg, mpegversion=4", "main"
+    },
+    { GST_VAAPI_PROFILE_MPEG4_ADVANCED_SIMPLE, VAProfileMPEG4AdvancedSimple,
+      "video/x-divx, divxversion=5", "advanced-simple"
+    },
+    { GST_VAAPI_PROFILE_MPEG4_ADVANCED_SIMPLE, VAProfileMPEG4AdvancedSimple,
+      "video/x-xvid", "advanced-simple"
+    },
+#if VA_CHECK_VERSION(0,30,0)
+    { GST_VAAPI_PROFILE_H263_BASELINE, VAProfileH263Baseline,
+      "video/x-h263, variant=itu, h263version=h263", "baseline"
+    },
+#endif
+    { GST_VAAPI_PROFILE_H264_BASELINE, VAProfileH264Baseline,
+      "video/x-h264", "baseline"
+    },
+    { GST_VAAPI_PROFILE_H264_MAIN, VAProfileH264Main,
+      "video/x-h264", "main"
+    },
+    { GST_VAAPI_PROFILE_H264_HIGH, VAProfileH264High,
+      "video/x-h264", "high"
+    },
+    { GST_VAAPI_PROFILE_VC1_SIMPLE, VAProfileVC1Simple,
+      "video/x-wmv, wmvversion=3", "simple"
+    },
+    { GST_VAAPI_PROFILE_VC1_MAIN, VAProfileVC1Main,
+      "video/x-wmv, wmvversion=3", "main"
+    },
+    { GST_VAAPI_PROFILE_VC1_ADVANCED, VAProfileVC1Advanced,
+      "video/x-wmv, wmvversion=3, " GST_MAKE_FORMAT_STRING(WVC1), "advanced"
+    },
+#if VA_CHECK_VERSION(0,32,0)
+    { GST_VAAPI_PROFILE_JPEG_BASELINE, VAProfileJPEGBaseline,
+      "image/jpeg", "baseline"
+    },
+#endif
+    { 0, }
+};
 GstVaapiProfile
 gst_vaapi_profile(VAProfile profile);
 
-- 
1.7.9.5

