summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/va/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/state_trackers/va/config.c')
-rw-r--r--src/gallium/state_trackers/va/config.c78
1 files changed, 74 insertions, 4 deletions
diff --git a/src/gallium/state_trackers/va/config.c b/src/gallium/state_trackers/va/config.c
index d548780957e..cfb0b25b71f 100644
--- a/src/gallium/state_trackers/va/config.c
+++ b/src/gallium/state_trackers/va/config.c
@@ -26,16 +26,32 @@
*
**************************************************************************/
+#include "pipe/p_screen.h"
+
+#include "vl/vl_winsys.h"
+
#include "va_private.h"
VAStatus
vlVaQueryConfigProfiles(VADriverContextP ctx, VAProfile *profile_list, int *num_profiles)
{
+ struct pipe_screen *pscreen;
+ enum pipe_video_profile p;
+ VAProfile vap;
+
if (!ctx)
return VA_STATUS_ERROR_INVALID_CONTEXT;
*num_profiles = 0;
+ pscreen = VL_VA_PSCREEN(ctx);
+ for (p = PIPE_VIDEO_PROFILE_MPEG2_SIMPLE; p <= PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH; ++p)
+ if (pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_BITSTREAM, PIPE_VIDEO_CAP_SUPPORTED)) {
+ vap = PipeToProfile(p);
+ if (vap != VAProfileNone)
+ profile_list[(*num_profiles)++] = vap;
+ }
+
return VA_STATUS_SUCCESS;
}
@@ -43,11 +59,24 @@ VAStatus
vlVaQueryConfigEntrypoints(VADriverContextP ctx, VAProfile profile,
VAEntrypoint *entrypoint_list, int *num_entrypoints)
{
+ struct pipe_screen *pscreen;
+ enum pipe_video_profile p;
+
if (!ctx)
return VA_STATUS_ERROR_INVALID_CONTEXT;
*num_entrypoints = 0;
+ p = ProfileToPipe(profile);
+ if (p == PIPE_VIDEO_PROFILE_UNKNOWN)
+ return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+
+ pscreen = VL_VA_PSCREEN(ctx);
+ if (!pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_BITSTREAM, PIPE_VIDEO_CAP_SUPPORTED))
+ return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+
+ entrypoint_list[(*num_entrypoints)++] = VAEntrypointVLD;
+
return VA_STATUS_SUCCESS;
}
@@ -55,20 +84,54 @@ VAStatus
vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint,
VAConfigAttrib *attrib_list, int num_attribs)
{
+ int i;
+
if (!ctx)
return VA_STATUS_ERROR_INVALID_CONTEXT;
- return VA_STATUS_ERROR_UNIMPLEMENTED;
+ for (i = 0; i < num_attribs; ++i) {
+ unsigned int value;
+ switch (attrib_list[i].type) {
+ case VAConfigAttribRTFormat:
+ value = VA_RT_FORMAT_YUV420;
+ break;
+ case VAConfigAttribRateControl:
+ value = VA_RC_NONE;
+ break;
+ default:
+ value = VA_ATTRIB_NOT_SUPPORTED;
+ break;
+ }
+ attrib_list[i].value = value;
+ }
+
+ return VA_STATUS_SUCCESS;
}
VAStatus
vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint,
VAConfigAttrib *attrib_list, int num_attribs, VAConfigID *config_id)
{
+ struct pipe_screen *pscreen;
+ enum pipe_video_profile p;
+
if (!ctx)
return VA_STATUS_ERROR_INVALID_CONTEXT;
- return VA_STATUS_ERROR_UNIMPLEMENTED;
+ p = ProfileToPipe(profile);
+ if (p == PIPE_VIDEO_PROFILE_UNKNOWN)
+ return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+
+ pscreen = VL_VA_PSCREEN(ctx);
+ if (!pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_BITSTREAM, PIPE_VIDEO_CAP_SUPPORTED))
+ return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
+
+ if (entrypoint != VAEntrypointVLD)
+ return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
+
+ *config_id = p;
+
+ return VA_STATUS_SUCCESS;
}
VAStatus
@@ -77,7 +140,7 @@ vlVaDestroyConfig(VADriverContextP ctx, VAConfigID config_id)
if (!ctx)
return VA_STATUS_ERROR_INVALID_CONTEXT;
- return VA_STATUS_ERROR_UNIMPLEMENTED;
+ return VA_STATUS_SUCCESS;
}
VAStatus
@@ -87,5 +150,12 @@ vlVaQueryConfigAttributes(VADriverContextP ctx, VAConfigID config_id, VAProfile
if (!ctx)
return VA_STATUS_ERROR_INVALID_CONTEXT;
- return VA_STATUS_ERROR_UNIMPLEMENTED;
+ *profile = PipeToProfile(config_id);
+ *entrypoint = VAEntrypointVLD;
+
+ *num_attribs = 1;
+ attrib_list[0].type = VAConfigAttribRTFormat;
+ attrib_list[0].value = VA_RT_FORMAT_YUV420;
+
+ return VA_STATUS_SUCCESS;
}