Add VA entrypoint abstraction.

This commit is contained in:
gb 2010-04-21 15:02:23 +00:00
parent 508edba9a0
commit 30fbcb1ee8
2 changed files with 94 additions and 7 deletions

View file

@ -29,6 +29,7 @@
#include "gstvaapiprofile.h" #include "gstvaapiprofile.h"
typedef struct _GstVaapiProfileMap GstVaapiProfileMap; typedef struct _GstVaapiProfileMap GstVaapiProfileMap;
typedef struct _GstVaapiEntrypointMap GstVaapiEntrypointMap;
struct _GstVaapiProfileMap { struct _GstVaapiProfileMap {
GstVaapiProfile profile; GstVaapiProfile profile;
@ -36,6 +37,11 @@ struct _GstVaapiProfileMap {
const char *caps_str; const char *caps_str;
}; };
struct _GstVaapiEntrypointMap {
GstVaapiEntrypoint entrypoint;
VAEntrypoint va_entrypoint;
};
/* Profiles */ /* Profiles */
static const GstVaapiProfileMap gst_vaapi_profiles[] = { static const GstVaapiProfileMap gst_vaapi_profiles[] = {
{ GST_VAAPI_PROFILE_MPEG2_SIMPLE, VAProfileMPEG2Simple, { GST_VAAPI_PROFILE_MPEG2_SIMPLE, VAProfileMPEG2Simple,
@ -79,8 +85,16 @@ static const GstVaapiProfileMap gst_vaapi_profiles[] = {
{ 0, } { 0, }
}; };
/* Entry-points */
static const GstVaapiEntrypointMap gst_vaapi_entrypoints[] = {
{ GST_VAAPI_ENTRYPOINT_VLD, VAEntrypointVLD },
{ GST_VAAPI_ENTRYPOINT_IDCT, VAEntrypointIDCT },
{ GST_VAAPI_ENTRYPOINT_MOCO, VAEntrypointMoComp },
{ 0, }
};
static const GstVaapiProfileMap * static const GstVaapiProfileMap *
get_map(GstVaapiProfile profile) get_profiles_map(GstVaapiProfile profile)
{ {
const GstVaapiProfileMap *m; const GstVaapiProfileMap *m;
@ -90,13 +104,26 @@ get_map(GstVaapiProfile profile)
return NULL; return NULL;
} }
static const GstVaapiEntrypointMap *
get_entrypoints_map(GstVaapiEntrypoint entrypoint)
{
const GstVaapiEntrypointMap *m;
for (m = gst_vaapi_entrypoints; m->entrypoint; m++)
if (m->entrypoint == entrypoint)
return m;
return NULL;
}
/** /**
* gst_vaapi_profile: * gst_vaapi_profile:
* @va_profile: a #VAProfile * @profile: a #VAProfile
* *
* Converts a VA profile into the corresponding #GstVaapiProfile. If the profile cannot be represented by #GstVaapiProfile, then zero is returned. * 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 * Return value: the #GstVaapiProfile describing the @profile
*/ */
GstVaapiProfile GstVaapiProfile
gst_vaapi_profile(VAProfile profile) gst_vaapi_profile(VAProfile profile)
@ -163,7 +190,7 @@ gst_vaapi_profile_from_caps(GstCaps *caps)
VAProfile VAProfile
gst_vaapi_profile_get_va_profile(GstVaapiProfile profile) gst_vaapi_profile_get_va_profile(GstVaapiProfile profile)
{ {
const GstVaapiProfileMap * const m = get_map(profile); const GstVaapiProfileMap * const m = get_profiles_map(profile);
return m ? m->va_profile : (VAProfile)-1; return m ? m->va_profile : (VAProfile)-1;
} }
@ -180,7 +207,7 @@ gst_vaapi_profile_get_va_profile(GstVaapiProfile profile)
GstCaps * GstCaps *
gst_vaapi_profile_get_caps(GstVaapiProfile profile) gst_vaapi_profile_get_caps(GstVaapiProfile profile)
{ {
const GstVaapiProfileMap * const m = get_map(profile); const GstVaapiProfileMap * const m = get_profiles_map(profile);
return m ? gst_caps_from_string(m->caps_str) : NULL; return m ? gst_caps_from_string(m->caps_str) : NULL;
} }
@ -198,3 +225,42 @@ gst_vaapi_profile_get_codec(GstVaapiProfile profile)
{ {
return (GstVaapiCodec)(((guint32)profile) & 0xffffff00); return (GstVaapiCodec)(((guint32)profile) & 0xffffff00);
} }
/**
* gst_vaapi_entrypoint:
* @entryprofile: a #VAEntrypoint
*
* Converts a VA entry-point into the corresponding #GstVaapiEntrypoint.
* If the entry-point cannot be represented by #GstVaapiEntrypoint,
* then zero is returned.
*
* Return value: the #GstVaapiEntrypoint describing the @entrypoint
*/
GstVaapiEntrypoint
gst_vaapi_entrypoint(VAEntrypoint entrypoint)
{
const GstVaapiEntrypointMap *m;
for (m = gst_vaapi_entrypoints; m->entrypoint; m++)
if (m->va_entrypoint == entrypoint)
return m->entrypoint;
return 0;
}
/**
* gst_vaapi_entrypoint_get_va_entrypoint:
* @entrypoint: a #GstVaapiEntrypoint
*
* Converts a #GstVaapiEntrypoint into the corresponding VA
* entry-point. If no matching VA entry-point was found, -1 is
* returned and this error must be reported to be fixed.
*
* Return value: the VA entry-point, or -1 if none was found
*/
VAEntrypoint
gst_vaapi_entrypoint_get_va_entrypoint(GstVaapiEntrypoint entrypoint)
{
const GstVaapiEntrypointMap * const m = get_entrypoints_map(entrypoint);
return m ? m->va_entrypoint : (VAEntrypoint)-1;
}

View file

@ -27,6 +27,7 @@ G_BEGIN_DECLS
typedef enum _GstVaapiCodec GstVaapiCodec; typedef enum _GstVaapiCodec GstVaapiCodec;
typedef enum _GstVaapiProfile GstVaapiProfile; typedef enum _GstVaapiProfile GstVaapiProfile;
typedef enum _GstVaapiEntrypoint GstVaapiEntrypoint;
/** /**
* GstVaapiCodec: * GstVaapiCodec:
@ -77,7 +78,7 @@ enum _GstVaapiCodec {
* @GST_VAAPI_PROFILE_VC1_ADVANCED: * @GST_VAAPI_PROFILE_VC1_ADVANCED:
* VC-1 advanced profile * VC-1 advanced profile
* *
* The set of all profile for #GstVaapiProfile. * The set of all profiles for #GstVaapiProfile.
*/ */
enum _GstVaapiProfile { enum _GstVaapiProfile {
GST_VAAPI_PROFILE_MPEG1 = GST_VAAPI_CODEC_MPEG1|1, GST_VAAPI_PROFILE_MPEG1 = GST_VAAPI_CODEC_MPEG1|1,
@ -95,6 +96,20 @@ enum _GstVaapiProfile {
GST_VAAPI_PROFILE_VC1_ADVANCED = GST_VAAPI_CODEC_VC1|3, GST_VAAPI_PROFILE_VC1_ADVANCED = GST_VAAPI_CODEC_VC1|3,
}; };
/**
* GstVaapiEntrypoint:
* @GST_VAAPI_ENTRYPOINT_VLD: Variable Length Decoding
* @GST_VAAPI_ENTRYPOINT_IDCT: Inverse Decrete Cosine Transform
* @GST_VAAPI_ENTRYPOINT_MOCO: Motion Compensation
*
* The set of all entrypoints for #GstVaapiEntrypoint
*/
enum _GstVaapiEntrypoint {
GST_VAAPI_ENTRYPOINT_VLD = 1,
GST_VAAPI_ENTRYPOINT_IDCT,
GST_VAAPI_ENTRYPOINT_MOCO
};
GstVaapiProfile GstVaapiProfile
gst_vaapi_profile(VAProfile profile); gst_vaapi_profile(VAProfile profile);
@ -110,6 +125,12 @@ gst_vaapi_profile_get_caps(GstVaapiProfile profile);
GstVaapiCodec GstVaapiCodec
gst_vaapi_profile_get_codec(GstVaapiProfile profile); gst_vaapi_profile_get_codec(GstVaapiProfile profile);
GstVaapiEntrypoint
gst_vaapi_entrypoint(VAEntrypoint entrypoint);
VAEntrypoint
gst_vaapi_entrypoint_get_va_entrypoint(GstVaapiEntrypoint entrypoint);
G_END_DECLS G_END_DECLS
#endif /* GST_GST_VAAPI_IMAGE_H */ #endif /* GST_GST_VAAPI_IMAGE_H */