*
**************************************************************************/
+#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;
}
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;
}
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
if (!ctx)
return VA_STATUS_ERROR_INVALID_CONTEXT;
- return VA_STATUS_ERROR_UNIMPLEMENTED;
+ return VA_STATUS_SUCCESS;
}
VAStatus
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;
}
#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;