Add VA profile abstraction.
authorgb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Tue, 20 Apr 2010 13:36:04 +0000 (13:36 +0000)
committergb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Tue, 20 Apr 2010 13:36:04 +0000 (13:36 +0000)
docs/reference/libs/libs-docs.xml.in
docs/reference/libs/libs-sections.txt
gst-libs/gst/vaapi/Makefile.am
gst-libs/gst/vaapi/gstvaapidisplay.c
gst-libs/gst/vaapi/gstvaapidisplay.h
gst-libs/gst/vaapi/gstvaapidisplay_priv.h
gst-libs/gst/vaapi/gstvaapiprofile.c [new file with mode: 0644]
gst-libs/gst/vaapi/gstvaapiprofile.h [new file with mode: 0644]
tests/test-display.c

index 53e6741..1fc8b46 100644 (file)
@@ -23,6 +23,7 @@
     <xi:include href="xml/gstvaapiimageformat.xml"/>
     <xi:include href="xml/gstvaapisubpicture.xml"/>
     <xi:include href="xml/gstvaapitexture.xml"/>
+    <xi:include href="xml/gstvaapiprofile.xml"/>
     <xi:include href="xml/gstvaapivideopool.xml"/>
     <xi:include href="xml/gstvaapisurfacepool.xml"/>
     <xi:include href="xml/gstvaapiimagepool.xml"/>
index 7a8414d..0f2389d 100644 (file)
@@ -142,7 +142,10 @@ gst_vaapi_display_get_width
 gst_vaapi_display_get_height
 gst_vaapi_display_get_size
 gst_vaapi_display_get_pixel_aspect_ratio
-gst_vaapi_display_has_profile
+gst_vaapi_display_get_decode_caps
+gst_vaapi_display_has_decoder
+gst_vaapi_display_get_encode_caps
+gst_vaapi_display_has_encoder
 gst_vaapi_display_get_image_caps
 gst_vaapi_display_has_image_format
 gst_vaapi_display_get_subpicture_caps
@@ -370,6 +373,18 @@ gst_vaapi_image_format_get_score
 </SECTION>
 
 <SECTION>
+<FILE>gstvaapiprofile</FILE>
+<TITLE>GstVaapiProfile</TITLE>
+GstVaapiCodec
+GstVaapiProfile
+gst_vaapi_profile
+gst_vaapi_profile_from_caps
+gst_vaapi_profile_get_va_profile
+gst_vaapi_profile_get_caps
+gst_vaapi_profile_get_codec
+</SECTION>
+
+<SECTION>
 <FILE>gstvaapitexture</FILE>
 <TITLE>GstVaapiTexture</TITLE>
 GstVaapiTexture
index 6809431..f8c59de 100644 (file)
@@ -18,6 +18,7 @@ libgstvaapi_source_c =                                \
        gstvaapimarshal.c                       \
        gstvaapiobject.c                        \
        gstvaapiparamspecs.c                    \
+       gstvaapiprofile.c                       \
        gstvaapisubpicture.c                    \
        gstvaapisurface.c                       \
        gstvaapisurfacepool.c                   \
@@ -36,6 +37,7 @@ libgstvaapi_source_h =                                \
        gstvaapiimagepool.h                     \
        gstvaapiobject.h                        \
        gstvaapiparamspecs.h                    \
+       gstvaapiprofile.h                       \
        gstvaapisubpicture.h                    \
        gstvaapisurface.h                       \
        gstvaapisurfacepool.h                   \
index d879a18..bb4694e 100644 (file)
@@ -126,16 +126,37 @@ compare_rgb_formats(gconstpointer a, gconstpointer b)
 
 /* Check if profiles array contains profile */
 static inline gboolean
-find_profile(GArray *profiles, VAProfile profile)
+find_profile(GArray *profiles, GstVaapiProfile profile)
 {
     guint i;
 
     for (i = 0; i < profiles->len; i++)
-        if (g_array_index(profiles, VAProfile, i) == profile)
+        if (g_array_index(profiles, GstVaapiProfile, i) == profile)
             return TRUE;
     return FALSE;
 }
 
+/* Convert profiles array to GstCaps */
+static GstCaps *
+get_profile_caps(GArray *profiles)
+{
+    GstVaapiProfile profile;
+    GstCaps *out_caps, *caps;
+    guint i;
+
+    out_caps = gst_caps_new_empty();
+    if (!out_caps)
+        return NULL;
+
+    for (i = 0; i < profiles->len; i++) {
+        profile = g_array_index(profiles, GstVaapiProfile, i);
+        caps    = gst_vaapi_profile_get_caps(profile);
+        if (caps)
+            gst_caps_append(out_caps, caps);
+    }
+    return out_caps;
+}
+
 /* Check if formats array contains format */
 static inline gboolean
 find_format(GArray *formats, GstVaapiImageFormat format)
@@ -150,7 +171,7 @@ find_format(GArray *formats, GstVaapiImageFormat format)
 
 /* Convert formats array to GstCaps */
 static GstCaps *
-get_caps(GArray *formats)
+get_format_caps(GArray *formats)
 {
     GstVaapiImageFormat format;
     GstCaps *out_caps, *caps;
@@ -219,9 +240,14 @@ gst_vaapi_display_destroy(GstVaapiDisplay *display)
 {
     GstVaapiDisplayPrivate * const priv = display->priv;
 
-    if (priv->profiles) {
-        g_array_free(priv->profiles, TRUE);
-        priv->profiles = NULL;
+    if (priv->decoders) {
+        g_array_free(priv->decoders, TRUE);
+        priv->decoders = NULL;
+    }
+
+    if (priv->encoders) {
+        g_array_free(priv->encoders, TRUE);
+        priv->encoders = NULL;
     }
 
     if (priv->image_formats) {
@@ -252,9 +278,10 @@ gst_vaapi_display_create(GstVaapiDisplay *display)
     GstVaapiDisplayPrivate * const priv = display->priv;
     gboolean            has_errors      = TRUE;
     VAProfile          *profiles        = NULL;
+    VAEntrypoint       *entrypoints     = NULL;
     VAImageFormat      *formats         = NULL;
     unsigned int       *flags           = NULL;
-    gint                i, n, major_version, minor_version;
+    gint                i, j, n, num_entrypoints, major_version, minor_version;
     VAStatus            status;
 
     if (!priv->display && priv->create_display) {
@@ -284,6 +311,9 @@ gst_vaapi_display_create(GstVaapiDisplay *display)
     profiles = g_new(VAProfile, vaMaxNumProfiles(priv->display));
     if (!profiles)
         goto end;
+    entrypoints = g_new(VAEntrypoint, vaMaxNumEntrypoints(priv->display));
+    if (!entrypoints)
+        goto end;
     status = vaQueryConfigProfiles(priv->display, profiles, &n);
     if (!vaapi_check_status(status, "vaQueryConfigProfiles()"))
         goto end;
@@ -292,10 +322,50 @@ gst_vaapi_display_create(GstVaapiDisplay *display)
     for (i = 0; i < n; i++)
         GST_DEBUG("  %s", string_of_VAProfile(profiles[i]));
 
-    priv->profiles = g_array_new(FALSE, FALSE, sizeof(VAProfile));
-    if (!priv->profiles)
+    priv->decoders = g_array_new(FALSE, FALSE, sizeof(GstVaapiProfile));
+    if (!priv->decoders)
+        goto end;
+    priv->encoders = g_array_new(FALSE, FALSE, sizeof(GstVaapiProfile));
+    if (!priv->encoders)
         goto end;
-    g_array_append_vals(priv->profiles, profiles, n);
+
+    for (i = 0; i < n; i++) {
+        GstVaapiProfile profile;
+        gboolean has_decoder = FALSE, has_encoder = FALSE;
+
+        profile = gst_vaapi_profile(profiles[i]);
+        if (!profile)
+            continue;
+
+        status = vaQueryConfigEntrypoints(
+            priv->display,
+            profiles[i],
+            entrypoints, &num_entrypoints
+        );
+        if (!vaapi_check_status(status, "vaQueryConfigEntrypoints()"))
+            goto end;
+
+        for (j = 0; j < num_entrypoints; j++) {
+            switch (entrypoints[j]) {
+            case VAEntrypointVLD:
+            case VAEntrypointIZZ:
+            case VAEntrypointIDCT:
+            case VAEntrypointMoComp:
+            case VAEntrypointDeblocking:
+                has_decoder = TRUE;
+                break;
+#if VA_CHECK_VERSION(0,30,0)
+            case VAEntrypointEncSlice:
+                has_encoder = TRUE;
+                break;
+#endif
+            }
+        }
+        if (has_decoder)
+            g_array_append_val(priv->decoders, profile);
+        if (has_encoder)
+            g_array_append_val(priv->encoders, profile);
+    }
 
     /* VA image formats */
     formats = g_new(VAImageFormat, vaMaxNumImageFormats(priv->display));
@@ -340,6 +410,7 @@ gst_vaapi_display_create(GstVaapiDisplay *display)
     has_errors = FALSE;
 end:
     g_free(profiles);
+    g_free(entrypoints);
     g_free(formats);
     g_free(flags);
     return !has_errors;
@@ -485,7 +556,8 @@ gst_vaapi_display_init(GstVaapiDisplay *display)
     priv->height_mm             = 0;
     priv->par_n                 = 1;
     priv->par_d                 = 1;
-    priv->profiles              = NULL;
+    priv->decoders              = NULL;
+    priv->encoders              = NULL;
     priv->image_formats         = NULL;
     priv->subpicture_formats    = NULL;
     priv->create_display        = TRUE;
@@ -689,20 +761,75 @@ gst_vaapi_display_get_pixel_aspect_ratio(
 }
 
 /**
- * gst_vaapi_display_has_profile:
+ * gst_vaapi_display_get_decode_caps:
+ * @display: a #GstVaapiDisplay
+ *
+ * Gets the supported profiles for decoding as #GstCaps capabilities.
+ *
+ * Return value: a newly allocated #GstCaps object, possibly empty
+ */
+GstCaps *
+gst_vaapi_display_get_decode_caps(GstVaapiDisplay *display)
+{
+    g_return_val_if_fail(GST_VAAPI_IS_DISPLAY(display), NULL);
+
+    return get_profile_caps(display->priv->decoders);
+}
+
+/**
+ * gst_vaapi_display_has_decoder:
  * @display: a #GstVaapiDisplay
  * @profile: a #VAProfile
  *
- * Returns whether VA @display supports @profile.
+ * Returns whether VA @display supports @profile for decoding.
  *
- * Return value: %TRUE if VA @display supports @profile
+ * Return value: %TRUE if VA @display supports @profile for decoding.
  */
 gboolean
-gst_vaapi_display_has_profile(GstVaapiDisplay *display, VAProfile profile)
+gst_vaapi_display_has_decoder(
+    GstVaapiDisplay *display,
+    GstVaapiProfile  profile
+)
+{
+    g_return_val_if_fail(GST_VAAPI_IS_DISPLAY(display), FALSE);
+
+    return find_profile(display->priv->decoders, profile);
+}
+
+/**
+ * gst_vaapi_display_get_encode_caps:
+ * @display: a #GstVaapiDisplay
+ *
+ * Gets the supported profiles for decoding as #GstCaps capabilities.
+ *
+ * Return value: a newly allocated #GstCaps object, possibly empty
+ */
+GstCaps *
+gst_vaapi_display_get_encode_caps(GstVaapiDisplay *display)
+{
+    g_return_val_if_fail(GST_VAAPI_IS_DISPLAY(display), NULL);
+
+    return get_profile_caps(display->priv->encoders);
+}
+
+/**
+ * gst_vaapi_display_has_encoder:
+ * @display: a #GstVaapiDisplay
+ * @profile: a #VAProfile
+ *
+ * Returns whether VA @display supports @profile for encoding.
+ *
+ * Return value: %TRUE if VA @display supports @profile for encoding.
+ */
+gboolean
+gst_vaapi_display_has_encoder(
+    GstVaapiDisplay *display,
+    GstVaapiProfile  profile
+)
 {
     g_return_val_if_fail(GST_VAAPI_IS_DISPLAY(display), FALSE);
 
-    return find_profile(display->priv->profiles, profile);
+    return find_profile(display->priv->encoders, profile);
 }
 
 /**
@@ -726,7 +853,7 @@ gst_vaapi_display_get_image_caps(GstVaapiDisplay *display)
 {
     g_return_val_if_fail(GST_VAAPI_IS_DISPLAY(display), NULL);
 
-    return get_caps(display->priv->image_formats);
+    return get_format_caps(display->priv->image_formats);
 }
 
 /**
@@ -768,7 +895,7 @@ gst_vaapi_display_get_subpicture_caps(GstVaapiDisplay *display)
 {
     g_return_val_if_fail(GST_VAAPI_IS_DISPLAY(display), NULL);
 
-    return get_caps(display->priv->subpicture_formats);
+    return get_format_caps(display->priv->subpicture_formats);
 }
 
 /**
index 8f605f8..b66cdf8 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <gst/gst.h>
 #include <gst/vaapi/gstvaapiimageformat.h>
+#include <gst/vaapi/gstvaapiprofile.h>
 
 G_BEGIN_DECLS
 
@@ -141,8 +142,23 @@ gst_vaapi_display_get_pixel_aspect_ratio(
     guint           *par_d
 );
 
+GstCaps *
+gst_vaapi_display_get_decode_caps(GstVaapiDisplay *display);
+
+gboolean
+gst_vaapi_display_has_decoder(
+    GstVaapiDisplay *display,
+    GstVaapiProfile  profile
+);
+
+GstCaps *
+gst_vaapi_display_get_encode_caps(GstVaapiDisplay *display);
+
 gboolean
-gst_vaapi_display_has_profile(GstVaapiDisplay *display, VAProfile profile);
+gst_vaapi_display_has_encoder(
+    GstVaapiDisplay *display,
+    GstVaapiProfile  profile
+);
 
 GstCaps *
 gst_vaapi_display_get_image_caps(GstVaapiDisplay *display);
index 0f8adbd..2427bab 100644 (file)
@@ -77,7 +77,8 @@ struct _GstVaapiDisplayPrivate {
     guint               height_mm;
     guint               par_n;
     guint               par_d;
-    GArray             *profiles;
+    GArray             *decoders;
+    GArray             *encoders;
     GArray             *image_formats;
     GArray             *subpicture_formats;
     guint               create_display  : 1;
diff --git a/gst-libs/gst/vaapi/gstvaapiprofile.c b/gst-libs/gst/vaapi/gstvaapiprofile.c
new file mode 100644 (file)
index 0000000..9421fda
--- /dev/null
@@ -0,0 +1,200 @@
+/*
+ *  gstvaapiprofile.c - VA profile abstraction
+ *
+ *  gstreamer-vaapi (C) 2010 Splitted-Desktop Systems
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+/**
+ * SECTION:gstvaapiprofile
+ * @short_description: VA profile abstraction
+ */
+
+#include "config.h"
+#include <string.h>
+#include "gstvaapicompat.h"
+#include "gstvaapiprofile.h"
+
+typedef struct _GstVaapiProfileMap              GstVaapiProfileMap;
+
+struct _GstVaapiProfileMap {
+    GstVaapiProfile             profile;
+    VAProfile                   va_profile;
+    const char                 *caps_str;
+};
+
+/* Profiles */
+static const GstVaapiProfileMap gst_vaapi_profiles[] = {
+    { GST_VAAPI_PROFILE_MPEG2_SIMPLE, VAProfileMPEG2Simple,
+      "video/mpeg, mpegversion=2, profile=simple"
+    },
+    { GST_VAAPI_PROFILE_MPEG2_MAIN, VAProfileMPEG2Main,
+      "video/mpeg, mpegversion=2, profile=main"
+    },
+    { GST_VAAPI_PROFILE_MPEG4_SIMPLE, VAProfileMPEG4Simple,
+      "video/mpeg, mpegversion=4, profile=simple"
+    },
+    { GST_VAAPI_PROFILE_MPEG4_ADVANCED_SIMPLE, VAProfileMPEG4AdvancedSimple,
+      "video/mpeg, mpegversion=4, profile=advanced-simple"
+    },
+    { GST_VAAPI_PROFILE_MPEG4_MAIN, VAProfileMPEG4Main,
+      "video/mpeg, mpegversion=4, profile=main"
+    },
+#if VA_CHECK_VERSION(0,30,0)
+    { GST_VAAPI_PROFILE_H263_BASELINE, VAProfileH263Baseline,
+      "video/x-h263, variant=itu, h263version=h263, profile=baseline"
+    },
+#endif
+    { GST_VAAPI_PROFILE_H264_BASELINE, VAProfileH264Baseline,
+      "video/x-h264, variant=itu, profile=baseline"
+    },
+    { GST_VAAPI_PROFILE_H264_MAIN, VAProfileH264Main,
+      "video/x-h264, variant=itu, profile=main"
+    },
+    { GST_VAAPI_PROFILE_H264_HIGH, VAProfileH264High,
+      "video/x-h264, variant=itu, profile=high"
+    },
+    { GST_VAAPI_PROFILE_VC1_SIMPLE, VAProfileVC1Simple,
+      "video/x-vc1, profile=simple"
+    },
+    { GST_VAAPI_PROFILE_VC1_MAIN, VAProfileVC1Main,
+      "video/x-vc1, profile=main"
+    },
+    { GST_VAAPI_PROFILE_VC1_ADVANCED, VAProfileVC1Advanced,
+      "video/x-vc1, profile=advanced"
+    },
+    { 0, }
+};
+
+static const GstVaapiProfileMap *
+get_map(GstVaapiProfile profile)
+{
+    const GstVaapiProfileMap *m;
+
+    for (m = gst_vaapi_profiles; m->profile; m++)
+        if (m->profile == profile)
+            return m;
+    return NULL;
+}
+
+/**
+ * gst_vaapi_profile:
+ * @va_profile: a #VAProfile
+ *
+ * Converts a VA profile into the corresponding #GstVaapiProfile. If the profile cannot be represented by #GstVaapiProfile, then zero is returned.
+ *
+ * Return value: the #GstVaapiProfile describing the @va_profile
+ */
+GstVaapiProfile
+gst_vaapi_profile(VAProfile profile)
+{
+    const GstVaapiProfileMap *m;
+
+    for (m = gst_vaapi_profiles; m->profile; m++)
+        if (m->va_profile == profile)
+            return m->profile;
+    return 0;
+}
+
+/**
+ * gst_vaapi_profile_from_caps:
+ * @caps: a #GstCaps
+ *
+ * Converts @caps into the corresponding #GstVaapiProfile. If the
+ * profile cannot be represented by #GstVaapiProfile, then zero is
+ * returned.
+ *
+ * Return value: the #GstVaapiProfile describing the @caps
+ */
+GstVaapiProfile
+gst_vaapi_profile_from_caps(GstCaps *caps)
+{
+    const GstVaapiProfileMap *m;
+    GstCaps *caps_test;
+    GstStructure *structure;
+    const gchar *name;
+    gsize namelen;
+    gboolean found;
+
+    if (!caps)
+        return 0;
+
+    structure = gst_caps_get_structure(caps, 0);
+    if (!structure)
+        return 0;
+
+    name    = gst_structure_get_name(structure);
+    namelen = strlen(name);
+
+    found = FALSE;
+    for (m = gst_vaapi_profiles; !found && m->profile; m++) {
+        if (strncmp(name, m->caps_str, namelen) != 0)
+            continue;
+        caps_test = gst_caps_from_string(m->caps_str);
+        found = gst_caps_is_always_compatible(caps_test, caps);
+        gst_caps_unref(caps_test);
+    }
+    return found ? m->va_profile : 0;
+}
+
+/**
+ * gst_vaapi_profile_get_va_profile:
+ * @profile: a #GstVaapiProfile
+ *
+ * Converts a #GstVaapiProfile into the corresponding VA profile. If
+ * no matching VA profile was found, -1 is returned and this error
+ * must be reported to be fixed.
+ *
+ * Return value: the VA profile, or -1 if none was found
+ */
+VAProfile
+gst_vaapi_profile_get_va_profile(GstVaapiProfile profile)
+{
+    const GstVaapiProfileMap * const m = get_map(profile);
+
+    return m ? m->va_profile : (VAProfile)-1;
+}
+
+/**
+ * gst_vaapi_profile_get_caps:
+ * @profile: a #GstVaapiProfile
+ *
+ * Converts a #GstVaapiProfile into the corresponding #GstCaps. If no
+ * matching caps were found, %NULL is returned.
+ *
+ * Return value: the newly allocated #GstCaps, or %NULL if none was found
+ */
+GstCaps *
+gst_vaapi_profile_get_caps(GstVaapiProfile profile)
+{
+    const GstVaapiProfileMap * const m = get_map(profile);
+
+    return m ? gst_caps_from_string(m->caps_str) : NULL;
+}
+
+/**
+ * gst_vaapi_profile_get_codec:
+ * @profile: a #GstVaapiProfile
+ *
+ * Extracts the #GstVaapiCodec from @profile.
+ *
+ * Return value: the #GstVaapiCodec from @profile
+ */
+GstVaapiCodec
+gst_vaapi_profile_get_codec(GstVaapiProfile profile)
+{
+    return (GstVaapiCodec)(((guint32)profile) & 0xffffff00);
+}
diff --git a/gst-libs/gst/vaapi/gstvaapiprofile.h b/gst-libs/gst/vaapi/gstvaapiprofile.h
new file mode 100644 (file)
index 0000000..62d0ccb
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ *  gstvaapiprofile.h - VA profile abstraction
+ *
+ *  gstreamer-vaapi (C) 2010 Splitted-Desktop Systems
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifndef GST_VAAPI_PROFILE_H
+#define GST_VAAPI_PROFILE_H
+
+#include <gst/gstvalue.h>
+
+G_BEGIN_DECLS
+
+typedef enum _GstVaapiCodec                     GstVaapiCodec;
+typedef enum _GstVaapiProfile                   GstVaapiProfile;
+
+/**
+ * GstVaapiCodec:
+ * @GST_VAAPI_CODEC_MPEG1: MPEG-1 (ISO/IEC 11172)
+ * @GST_VAAPI_CODEC_MPEG2: MPEG-2 (ISO/IEC 13818-2)
+ * @GST_VAAPI_CODEC_MPEG4: MPEG-4 Part 2 (ISO/IEC 14496-2)
+ * @GST_VAAPI_CODEC_H263: H.263
+ * @GST_VAAPI_CODEC_H264: H.264 aka MPEG-4 Part 10 (ISO/IEC 14496-10)
+ * @GST_VAAPI_CODEC_VC1: VC-1 (SMPTE 421M)
+ *
+ * The set of all codecs for #GstVaapiCodec.
+ */
+enum _GstVaapiCodec {
+    GST_VAAPI_CODEC_MPEG1       = GST_MAKE_FOURCC('M','P','1',0),
+    GST_VAAPI_CODEC_MPEG2       = GST_MAKE_FOURCC('M','P','2',0),
+    GST_VAAPI_CODEC_MPEG4       = GST_MAKE_FOURCC('M','P','4',0),
+    GST_VAAPI_CODEC_H263        = GST_MAKE_FOURCC('2','6','3',0),
+    GST_VAAPI_CODEC_H264        = GST_MAKE_FOURCC('2','6','4',0),
+    GST_VAAPI_CODEC_VC1         = GST_MAKE_FOURCC('V','C','1',0),
+};
+
+/**
+ * GstVaapiProfile:
+ * @GST_VAAPI_PROFILE_MPEG1:
+ *   MPEG-1
+ * @GST_VAAPI_PROFILE_MPEG2_SIMPLE:
+ *   MPEG-2 simple profile
+ * @GST_VAAPI_PROFILE_MPEG2_MAIN:
+ *   MPEG-2 main profile
+ * @GST_VAAPI_PROFILE_MPEG4_SIMPLE:
+ *   MPEG-4 Part-2 simple profile
+ * @GST_VAAPI_PROFILE_MPEG4_ADVANCED_SIMPLE:
+ *   MPEG-4 Part-2 advanced simple profile
+ * @GST_VAAPI_PROFILE_MPEG4_MAIN:
+ *   MPEG-4 Part-2 main profile
+ * @GST_VAAPI_PROFILE_H263_BASELINE:
+ *   H.263 baseline profile
+ * @GST_VAAPI_PROFILE_H264_BASELINE:
+ *   H.264 (MPEG-4 Part-10) baseline profile
+ * @GST_VAAPI_PROFILE_H264_MAIN:
+ *   H.264 (MPEG-4 Part-10) main profile
+ * @GST_VAAPI_PROFILE_H264_HIGH:
+ *   H.264 (MPEG-4 Part-10) high profile
+ * @GST_VAAPI_PROFILE_VC1_SIMPLE:
+ *   VC-1 simple profile
+ * @GST_VAAPI_PROFILE_VC1_MAIN:
+ *   VC-1 main profile (WMV3)
+ * @GST_VAAPI_PROFILE_VC1_ADVANCED:
+ *   VC-1 advanced profile
+ *
+ * The set of all profile for #GstVaapiProfile.
+ */
+enum _GstVaapiProfile {
+    GST_VAAPI_PROFILE_MPEG1                     = GST_VAAPI_CODEC_MPEG1|1,
+    GST_VAAPI_PROFILE_MPEG2_SIMPLE              = GST_VAAPI_CODEC_MPEG2|1,
+    GST_VAAPI_PROFILE_MPEG2_MAIN                = GST_VAAPI_CODEC_MPEG2|2,
+    GST_VAAPI_PROFILE_MPEG4_SIMPLE              = GST_VAAPI_CODEC_MPEG4|1,
+    GST_VAAPI_PROFILE_MPEG4_ADVANCED_SIMPLE     = GST_VAAPI_CODEC_MPEG4|2,
+    GST_VAAPI_PROFILE_MPEG4_MAIN                = GST_VAAPI_CODEC_MPEG4|3,
+    GST_VAAPI_PROFILE_H263_BASELINE             = GST_VAAPI_CODEC_H263|1,
+    GST_VAAPI_PROFILE_H264_BASELINE             = GST_VAAPI_CODEC_H264|1,
+    GST_VAAPI_PROFILE_H264_MAIN                 = GST_VAAPI_CODEC_H264|2,
+    GST_VAAPI_PROFILE_H264_HIGH                 = GST_VAAPI_CODEC_H264|3,
+    GST_VAAPI_PROFILE_VC1_SIMPLE                = GST_VAAPI_CODEC_VC1|1,
+    GST_VAAPI_PROFILE_VC1_MAIN                  = GST_VAAPI_CODEC_VC1|2,
+    GST_VAAPI_PROFILE_VC1_ADVANCED              = GST_VAAPI_CODEC_VC1|3,
+};
+
+GstVaapiProfile
+gst_vaapi_profile(VAProfile profile);
+
+GstVaapiProfile
+gst_vaapi_profile_from_caps(GstCaps *caps);
+
+VAProfile
+gst_vaapi_profile_get_va_profile(GstVaapiProfile profile);
+
+GstCaps *
+gst_vaapi_profile_get_caps(GstVaapiProfile profile);
+
+GstVaapiCodec
+gst_vaapi_profile_get_codec(GstVaapiProfile profile);
+
+G_END_DECLS
+
+#endif /* GST_GST_VAAPI_IMAGE_H */
index 54b136e..57972e7 100644 (file)
 #endif
 
 static void
-print_caps(GstCaps *caps, const gchar *name)
+print_profile_caps(GstCaps *caps, const gchar *name)
+{
+    guint i, n_caps = gst_caps_get_size(caps);
+    gint version;
+    const gchar *profile;
+    gboolean has_version;
+
+    g_print("%u %s caps\n", n_caps, name);
+
+    for (i = 0; i < gst_caps_get_size(caps); i++) {
+        GstStructure * const structure = gst_caps_get_structure(caps, i);
+        if (!structure)
+            g_error("could not get caps structure %d", i);
+
+        has_version = (
+            gst_structure_get_int(structure, "version", &version) ||
+            gst_structure_get_int(structure, "mpegversion", &version)
+        );
+
+        g_print("  %s", gst_structure_get_name(structure));
+        if (has_version)
+            g_print("%d", version);
+
+        profile = gst_structure_get_string(structure, "profile");
+        if (!profile)
+            g_error("could not get structure profile");
+        g_print(": %s profile\n", profile);
+    }
+}
+
+static void
+print_format_caps(GstCaps *caps, const gchar *name)
 {
     guint i, n_caps = gst_caps_get_size(caps);
 
@@ -84,18 +115,32 @@ dump_caps(GstVaapiDisplay *display)
 {
     GstCaps *caps;
 
+    caps = gst_vaapi_display_get_decode_caps(display);
+    if (!caps)
+        g_error("could not get VA decode caps");
+
+    print_profile_caps(caps, "decoders");
+    gst_caps_unref(caps);
+
+    caps = gst_vaapi_display_get_encode_caps(display);
+    if (!caps)
+        g_error("could not get VA encode caps");
+
+    print_profile_caps(caps, "encoders");
+    gst_caps_unref(caps);
+
     caps = gst_vaapi_display_get_image_caps(display);
     if (!caps)
         g_error("could not get VA image caps");
 
-    print_caps(caps, "image");
+    print_format_caps(caps, "image");
     gst_caps_unref(caps);
 
     caps = gst_vaapi_display_get_subpicture_caps(display);
     if (!caps)
         g_error("could not get VA subpicture caps");
 
-    print_caps(caps, "subpicture");
+    print_format_caps(caps, "subpicture");
     gst_caps_unref(caps);
 }