Re: [Mesa-dev] [PATCH 5/5] st/va: enable h264 VAAPI encode
On 15 June 2016 at 14:07, Christian König wrote: > Please split that up into multiple parts. E.g. adding the config > structure, new image format support etc.. > > Julien, can you take a look as well if you have time and work a bit with > Boyuan to get this cleaned up? > Hi, I'll be happy to do that, I can find some time next week I think. Cheers Julien > > Thanks in advance, > Christian. > > > Am 14.06.2016 um 22:14 schrieb Boyuan Zhang: > >> Signed-off-by: Boyuan Zhang >> --- >> src/gallium/state_trackers/va/buffer.c | 6 ++ >> src/gallium/state_trackers/va/config.c | 104 +++--- >> src/gallium/state_trackers/va/context.c| 72 - >> src/gallium/state_trackers/va/image.c | 126 +++--- >> src/gallium/state_trackers/va/picture.c| 165 >> - >> src/gallium/state_trackers/va/surface.c| 16 ++- >> src/gallium/state_trackers/va/va_private.h | 9 ++ >> 7 files changed, 441 insertions(+), 57 deletions(-) >> >> diff --git a/src/gallium/state_trackers/va/buffer.c >> b/src/gallium/state_trackers/va/buffer.c >> index 7d3167b..dfcebbe 100644 >> --- a/src/gallium/state_trackers/va/buffer.c >> +++ b/src/gallium/state_trackers/va/buffer.c >> @@ -133,6 +133,12 @@ vlVaMapBuffer(VADriverContextP ctx, VABufferID >> buf_id, void **pbuff) >> if (!buf->derived_surface.transfer || !*pbuff) >>return VA_STATUS_ERROR_INVALID_BUFFER; >> + if (buf->type == VAEncCodedBufferType) { >> + ((VACodedBufferSegment*)buf->data)->buf = *pbuff; >> + ((VACodedBufferSegment*)buf->data)->size = buf->coded_size; >> + ((VACodedBufferSegment*)buf->data)->next = NULL; >> + *pbuff = buf->data; >> + } >> } else { >> pipe_mutex_unlock(drv->mutex); >> *pbuff = buf->data; >> diff --git a/src/gallium/state_trackers/va/config.c >> b/src/gallium/state_trackers/va/config.c >> index 9ca0aa8..04d214d 100644 >> --- a/src/gallium/state_trackers/va/config.c >> +++ b/src/gallium/state_trackers/va/config.c >> @@ -34,6 +34,8 @@ >> #include "va_private.h" >> +#include "util/u_handle_table.h" >> + >> DEBUG_GET_ONCE_BOOL_OPTION(mpeg4, "VAAPI_MPEG4_ENABLED", false) >> VAStatus >> @@ -72,6 +74,7 @@ vlVaQueryConfigEntrypoints(VADriverContextP ctx, >> VAProfile profile, >> { >> struct pipe_screen *pscreen; >> enum pipe_video_profile p; >> + int va_status = VA_STATUS_ERROR_UNSUPPORTED_PROFILE; >>if (!ctx) >> return VA_STATUS_ERROR_INVALID_CONTEXT; >> @@ -88,12 +91,18 @@ vlVaQueryConfigEntrypoints(VADriverContextP ctx, >> VAProfile profile, >> 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; >> + if (pscreen->get_video_param(pscreen, p, >> PIPE_VIDEO_ENTRYPOINT_BITSTREAM, PIPE_VIDEO_CAP_SUPPORTED)) { >> + entrypoint_list[(*num_entrypoints)++] = VAEntrypointVLD; >> + va_status = VA_STATUS_SUCCESS; >> + } >> + if (pscreen->get_video_param(pscreen, p, >> PIPE_VIDEO_ENTRYPOINT_ENCODE, PIPE_VIDEO_CAP_SUPPORTED) && >> + p == PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE) { >> + entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncSlice; >> + entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncPicture; >> + va_status = VA_STATUS_SUCCESS; >> + } >> - return VA_STATUS_SUCCESS; >> + return va_status; >> } >> VAStatus >> @@ -112,7 +121,7 @@ vlVaGetConfigAttributes(VADriverContextP ctx, >> VAProfile profile, VAEntrypoint en >>value = VA_RT_FORMAT_YUV420; >>break; >> case VAConfigAttribRateControl: >> - value = VA_RC_NONE; >> + value = VA_RC_CQP | VA_RC_CBR; >>break; >> default: >>value = VA_ATTRIB_NOT_SUPPORTED; >> @@ -128,14 +137,27 @@ VAStatus >> vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint >> entrypoint, >>VAConfigAttrib *attrib_list, int num_attribs, >> VAConfigID *config_id) >> { >> + vlVaDriver *drv; >> + vlVaConfig *config; >> struct pipe_screen *pscreen; >> enum pipe_video_profile p; >>if (!ctx) >> return VA_STATUS_ERROR_INVALID_CONTEXT; >> + drv = VL_VA_DRIVER(ctx); >> + >> + if (!drv) >> + return VA_STATUS_ERROR_INVALID_CONTEXT; >> + >> + config = CALLOC(1, sizeof(vlVaConfig)); >> + if (!config) >> + return VA_STATUS_ERROR_ALLOCATION_FAILED; >> + >> if (profile == VAProfileNone && entrypoint == VAEntrypointVideoProc) >> { >> - *config_id = PIPE_VIDEO_PROFILE_UNKNOWN; >> + config->entrypoint = VAEntrypointVideoProc; >> + config->profile = PIPE_VIDEO_PROFILE_UNKNOWN; >> + *config_id = handle_table_add(drv->htab, config); >>
Re: [Mesa-dev] [PATCH 5/5] st/va: enable h264 VAAPI encode
Please split that up into multiple parts. E.g. adding the config structure, new image format support etc.. Julien, can you take a look as well if you have time and work a bit with Boyuan to get this cleaned up? Thanks in advance, Christian. Am 14.06.2016 um 22:14 schrieb Boyuan Zhang: Signed-off-by: Boyuan Zhang --- src/gallium/state_trackers/va/buffer.c | 6 ++ src/gallium/state_trackers/va/config.c | 104 +++--- src/gallium/state_trackers/va/context.c| 72 - src/gallium/state_trackers/va/image.c | 126 +++--- src/gallium/state_trackers/va/picture.c| 165 - src/gallium/state_trackers/va/surface.c| 16 ++- src/gallium/state_trackers/va/va_private.h | 9 ++ 7 files changed, 441 insertions(+), 57 deletions(-) diff --git a/src/gallium/state_trackers/va/buffer.c b/src/gallium/state_trackers/va/buffer.c index 7d3167b..dfcebbe 100644 --- a/src/gallium/state_trackers/va/buffer.c +++ b/src/gallium/state_trackers/va/buffer.c @@ -133,6 +133,12 @@ vlVaMapBuffer(VADriverContextP ctx, VABufferID buf_id, void **pbuff) if (!buf->derived_surface.transfer || !*pbuff) return VA_STATUS_ERROR_INVALID_BUFFER; + if (buf->type == VAEncCodedBufferType) { + ((VACodedBufferSegment*)buf->data)->buf = *pbuff; + ((VACodedBufferSegment*)buf->data)->size = buf->coded_size; + ((VACodedBufferSegment*)buf->data)->next = NULL; + *pbuff = buf->data; + } } else { pipe_mutex_unlock(drv->mutex); *pbuff = buf->data; diff --git a/src/gallium/state_trackers/va/config.c b/src/gallium/state_trackers/va/config.c index 9ca0aa8..04d214d 100644 --- a/src/gallium/state_trackers/va/config.c +++ b/src/gallium/state_trackers/va/config.c @@ -34,6 +34,8 @@ #include "va_private.h" +#include "util/u_handle_table.h" + DEBUG_GET_ONCE_BOOL_OPTION(mpeg4, "VAAPI_MPEG4_ENABLED", false) VAStatus @@ -72,6 +74,7 @@ vlVaQueryConfigEntrypoints(VADriverContextP ctx, VAProfile profile, { struct pipe_screen *pscreen; enum pipe_video_profile p; + int va_status = VA_STATUS_ERROR_UNSUPPORTED_PROFILE; if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; @@ -88,12 +91,18 @@ vlVaQueryConfigEntrypoints(VADriverContextP ctx, VAProfile profile, 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; + if (pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_BITSTREAM, PIPE_VIDEO_CAP_SUPPORTED)) { + entrypoint_list[(*num_entrypoints)++] = VAEntrypointVLD; + va_status = VA_STATUS_SUCCESS; + } + if (pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_ENCODE, PIPE_VIDEO_CAP_SUPPORTED) && + p == PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE) { + entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncSlice; + entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncPicture; + va_status = VA_STATUS_SUCCESS; + } - return VA_STATUS_SUCCESS; + return va_status; } VAStatus @@ -112,7 +121,7 @@ vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint en value = VA_RT_FORMAT_YUV420; break; case VAConfigAttribRateControl: - value = VA_RC_NONE; + value = VA_RC_CQP | VA_RC_CBR; break; default: value = VA_ATTRIB_NOT_SUPPORTED; @@ -128,14 +137,27 @@ VAStatus vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint, VAConfigAttrib *attrib_list, int num_attribs, VAConfigID *config_id) { + vlVaDriver *drv; + vlVaConfig *config; struct pipe_screen *pscreen; enum pipe_video_profile p; if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; + drv = VL_VA_DRIVER(ctx); + + if (!drv) + return VA_STATUS_ERROR_INVALID_CONTEXT; + + config = CALLOC(1, sizeof(vlVaConfig)); + if (!config) + return VA_STATUS_ERROR_ALLOCATION_FAILED; + if (profile == VAProfileNone && entrypoint == VAEntrypointVideoProc) { - *config_id = PIPE_VIDEO_PROFILE_UNKNOWN; + config->entrypoint = VAEntrypointVideoProc; + config->profile = PIPE_VIDEO_PROFILE_UNKNOWN; + *config_id = handle_table_add(drv->htab, config); return VA_STATUS_SUCCESS; } @@ -144,13 +166,36 @@ vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoin 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) + if (entrypoint == VA
[Mesa-dev] [PATCH 5/5] st/va: enable h264 VAAPI encode
Signed-off-by: Boyuan Zhang --- src/gallium/state_trackers/va/buffer.c | 6 ++ src/gallium/state_trackers/va/config.c | 104 +++--- src/gallium/state_trackers/va/context.c| 72 - src/gallium/state_trackers/va/image.c | 126 +++--- src/gallium/state_trackers/va/picture.c| 165 - src/gallium/state_trackers/va/surface.c| 16 ++- src/gallium/state_trackers/va/va_private.h | 9 ++ 7 files changed, 441 insertions(+), 57 deletions(-) diff --git a/src/gallium/state_trackers/va/buffer.c b/src/gallium/state_trackers/va/buffer.c index 7d3167b..dfcebbe 100644 --- a/src/gallium/state_trackers/va/buffer.c +++ b/src/gallium/state_trackers/va/buffer.c @@ -133,6 +133,12 @@ vlVaMapBuffer(VADriverContextP ctx, VABufferID buf_id, void **pbuff) if (!buf->derived_surface.transfer || !*pbuff) return VA_STATUS_ERROR_INVALID_BUFFER; + if (buf->type == VAEncCodedBufferType) { + ((VACodedBufferSegment*)buf->data)->buf = *pbuff; + ((VACodedBufferSegment*)buf->data)->size = buf->coded_size; + ((VACodedBufferSegment*)buf->data)->next = NULL; + *pbuff = buf->data; + } } else { pipe_mutex_unlock(drv->mutex); *pbuff = buf->data; diff --git a/src/gallium/state_trackers/va/config.c b/src/gallium/state_trackers/va/config.c index 9ca0aa8..04d214d 100644 --- a/src/gallium/state_trackers/va/config.c +++ b/src/gallium/state_trackers/va/config.c @@ -34,6 +34,8 @@ #include "va_private.h" +#include "util/u_handle_table.h" + DEBUG_GET_ONCE_BOOL_OPTION(mpeg4, "VAAPI_MPEG4_ENABLED", false) VAStatus @@ -72,6 +74,7 @@ vlVaQueryConfigEntrypoints(VADriverContextP ctx, VAProfile profile, { struct pipe_screen *pscreen; enum pipe_video_profile p; + int va_status = VA_STATUS_ERROR_UNSUPPORTED_PROFILE; if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; @@ -88,12 +91,18 @@ vlVaQueryConfigEntrypoints(VADriverContextP ctx, VAProfile profile, 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; + if (pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_BITSTREAM, PIPE_VIDEO_CAP_SUPPORTED)) { + entrypoint_list[(*num_entrypoints)++] = VAEntrypointVLD; + va_status = VA_STATUS_SUCCESS; + } + if (pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_ENCODE, PIPE_VIDEO_CAP_SUPPORTED) && + p == PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE) { + entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncSlice; + entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncPicture; + va_status = VA_STATUS_SUCCESS; + } - return VA_STATUS_SUCCESS; + return va_status; } VAStatus @@ -112,7 +121,7 @@ vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint en value = VA_RT_FORMAT_YUV420; break; case VAConfigAttribRateControl: - value = VA_RC_NONE; + value = VA_RC_CQP | VA_RC_CBR; break; default: value = VA_ATTRIB_NOT_SUPPORTED; @@ -128,14 +137,27 @@ VAStatus vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint, VAConfigAttrib *attrib_list, int num_attribs, VAConfigID *config_id) { + vlVaDriver *drv; + vlVaConfig *config; struct pipe_screen *pscreen; enum pipe_video_profile p; if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; + drv = VL_VA_DRIVER(ctx); + + if (!drv) + return VA_STATUS_ERROR_INVALID_CONTEXT; + + config = CALLOC(1, sizeof(vlVaConfig)); + if (!config) + return VA_STATUS_ERROR_ALLOCATION_FAILED; + if (profile == VAProfileNone && entrypoint == VAEntrypointVideoProc) { - *config_id = PIPE_VIDEO_PROFILE_UNKNOWN; + config->entrypoint = VAEntrypointVideoProc; + config->profile = PIPE_VIDEO_PROFILE_UNKNOWN; + *config_id = handle_table_add(drv->htab, config); return VA_STATUS_SUCCESS; } @@ -144,13 +166,36 @@ vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoin 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) + if (entrypoint == VAEntrypointVLD) { + if (!pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_BITSTREAM, PIPE_VIDEO_CAP_SUPPORTED)) + return VA_STATUS_ERROR_UNSUPPORTED_PROFILE; + } + else if (entrypoint == VAEntrypointEncSlice) { + if (!pscreen->get_video_param(pscreen, p, PIPE_VIDEO_ENTRYPOINT_ENCODE, PIPE_VIDEO_CAP_SUPPORTED)) + retu