<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"/>
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
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>
gstvaapimarshal.c \
gstvaapiobject.c \
gstvaapiparamspecs.c \
+ gstvaapiprofile.c \
gstvaapisubpicture.c \
gstvaapisurface.c \
gstvaapisurfacepool.c \
gstvaapiimagepool.h \
gstvaapiobject.h \
gstvaapiparamspecs.h \
+ gstvaapiprofile.h \
gstvaapisubpicture.h \
gstvaapisurface.h \
gstvaapisurfacepool.h \
/* 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)
/* Convert formats array to GstCaps */
static GstCaps *
-get_caps(GArray *formats)
+get_format_caps(GArray *formats)
{
GstVaapiImageFormat format;
GstCaps *out_caps, *caps;
{
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) {
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) {
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;
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));
has_errors = FALSE;
end:
g_free(profiles);
+ g_free(entrypoints);
g_free(formats);
g_free(flags);
return !has_errors;
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;
}
/**
- * 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);
}
/**
{
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);
}
/**
{
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);
}
/**
#include <gst/gst.h>
#include <gst/vaapi/gstvaapiimageformat.h>
+#include <gst/vaapi/gstvaapiprofile.h>
G_BEGIN_DECLS
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);
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;
--- /dev/null
+/*
+ * 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);
+}
--- /dev/null
+/*
+ * 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 */
#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);
{
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);
}