st/va: implement vlVa(Create|Destroy|Query|Get)Config
authorChristian König <christian.koenig@amd.com>
Tue, 28 May 2013 16:02:58 +0000 (18:02 +0200)
committerLeo Liu <leo.liu@amd.com>
Wed, 1 Oct 2014 17:21:36 +0000 (13:21 -0400)
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 <michael.varga@amd.com>
Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Leo Liu <leo.liu@amd.com>
src/gallium/state_trackers/va/config.c
src/gallium/state_trackers/va/context.c
src/gallium/state_trackers/va/va_private.h

index d548780957e085ddf93db0bdbd6aa5ac992e4955..cfb0b25b71f70225d8792703d013254de64c2e2f 100644 (file)
  *
  **************************************************************************/
 
+#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;
 }
index 71651aa75b9a86af63a58d65717d03003a5be825..048c3f2d8cd4383f34a0e3682f17714c4a71650c 100644 (file)
@@ -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;
index 2e87311a7e733504bcee118276d2521d0d45e0e6..130d2dff1a02ecd08f9ca4dd8d7c4fa1387a2492 100644 (file)
 #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;