aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/va
diff options
context:
space:
mode:
authorChristian König <[email protected]>2013-05-28 18:02:58 +0200
committerLeo Liu <[email protected]>2014-10-01 13:21:36 -0400
commit2825ef3abf29b152b12faef8cd5a373c71b9fbaf (patch)
treedc305a6a893c5a5aefe8bbca270dc6bb6c8f9ffe /src/gallium/state_trackers/va
parent3867933ecbc34ed1f68d735282580ca1e4eedea1 (diff)
st/va: implement vlVa(Create|Destroy|Query|Get)Config
This patch is for application to query configuration, such as profiles, entrypoints, and attributes v2: fix missing profile with query Signed-off-by: Michael Varga <[email protected]> Signed-off-by: Christian König <[email protected]> Signed-off-by: Leo Liu <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers/va')
-rw-r--r--src/gallium/state_trackers/va/config.c78
-rw-r--r--src/gallium/state_trackers/va/context.c2
-rw-r--r--src/gallium/state_trackers/va/va_private.h68
3 files changed, 143 insertions, 5 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;
}
diff --git a/src/gallium/state_trackers/va/context.c b/src/gallium/state_trackers/va/context.c
index 71651aa75b9..048c3f2d8cd 100644
--- a/src/gallium/state_trackers/va/context.c
+++ b/src/gallium/state_trackers/va/context.c
@@ -104,7 +104,7 @@ VA_DRIVER_INIT_FUNC(VADriverContextP ctx)
ctx->version_major = 0;
ctx->version_minor = 1;
*ctx->vtable = vtable;
- ctx->max_profiles = 1;
+ ctx->max_profiles = PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH - PIPE_VIDEO_PROFILE_UNKNOWN;
ctx->max_entrypoints = 1;
ctx->max_attributes = 1;
ctx->max_image_formats = 1;
diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h
index 2e87311a7e7..130d2dff1a0 100644
--- a/src/gallium/state_trackers/va/va_private.h
+++ b/src/gallium/state_trackers/va/va_private.h
@@ -29,9 +29,77 @@
#ifndef VA_PRIVATE_H
#define VA_PRIVATE_H
+#include <assert.h>
+
#include <va/va.h>
#include <va/va_backend.h>
+#include "pipe/p_video_enums.h"
+
+#define VL_VA_DRIVER(ctx) ((vlVaDriver *)ctx->pDriverData)
+#define VL_VA_PSCREEN(ctx) (VL_VA_DRIVER(ctx)->vscreen->pscreen)
+
+static inline VAProfile
+PipeToProfile(enum pipe_video_profile profile)
+{
+ switch (profile) {
+ case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
+ return VAProfileMPEG2Simple;
+ case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
+ return VAProfileMPEG2Main;
+ case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE:
+ return VAProfileMPEG4Simple;
+ case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE:
+ return VAProfileMPEG4AdvancedSimple;
+ case PIPE_VIDEO_PROFILE_VC1_SIMPLE:
+ return VAProfileVC1Simple;
+ case PIPE_VIDEO_PROFILE_VC1_MAIN:
+ return VAProfileVC1Main;
+ case PIPE_VIDEO_PROFILE_VC1_ADVANCED:
+ return VAProfileVC1Advanced;
+ case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
+ return VAProfileH264Baseline;
+ case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
+ return VAProfileH264Main;
+ case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
+ return VAProfileH264High;
+ case PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED:
+ return VAProfileNone;
+ default:
+ assert(0);
+ return -1;
+ }
+}
+
+static inline enum pipe_video_profile
+ProfileToPipe(VAProfile profile)
+{
+ switch (profile) {
+ case VAProfileMPEG2Simple:
+ return PIPE_VIDEO_PROFILE_MPEG2_SIMPLE;
+ case VAProfileMPEG2Main:
+ return PIPE_VIDEO_PROFILE_MPEG2_MAIN;
+ case VAProfileMPEG4Simple:
+ return PIPE_VIDEO_PROFILE_MPEG4_SIMPLE;
+ case VAProfileMPEG4AdvancedSimple:
+ return PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE;
+ case VAProfileVC1Simple:
+ return PIPE_VIDEO_PROFILE_VC1_SIMPLE;
+ case VAProfileVC1Main:
+ return PIPE_VIDEO_PROFILE_VC1_MAIN;
+ case VAProfileVC1Advanced:
+ return PIPE_VIDEO_PROFILE_VC1_ADVANCED;
+ case VAProfileH264Baseline:
+ return PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE;
+ case VAProfileH264Main:
+ return PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN;
+ case VAProfileH264High:
+ return PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH;
+ default:
+ return PIPE_VIDEO_PROFILE_UNKNOWN;
+ }
+}
+
typedef struct {
struct vl_screen *vscreen;
} vlVaDriver;