From ec53e519c31255291f68c66ea2eb0dc84b3eb991 Mon Sep 17 00:00:00 2001 From: Thong Thai Date: Tue, 13 Jul 2021 11:51:08 -0400 Subject: [PATCH] frontends/va: handle h264 num_temporal_layers for SVC encoding Allows for the number of temporal layers to be specified when encoding Scalable Video Coding (SVC) H.264 videos. Signed-off-by: Thong Thai Reviewed-by: Boyuan Zhang Part-of: --- src/gallium/frontends/va/picture.c | 24 +++++++++++++++++++++ src/gallium/frontends/va/picture_h264_enc.c | 10 +++++++++ src/gallium/frontends/va/va_private.h | 1 + 3 files changed, 35 insertions(+) diff --git a/src/gallium/frontends/va/picture.c b/src/gallium/frontends/va/picture.c index b66d80cee1c..044c267eeff 100644 --- a/src/gallium/frontends/va/picture.c +++ b/src/gallium/frontends/va/picture.c @@ -398,6 +398,26 @@ handleVAEncMiscParameterTypeFrameRate(vlVaContext *context, VAEncMiscParameterBu return status; } +static VAStatus +handleVAEncMiscParameterTypeTemporalLayer(vlVaContext *context, VAEncMiscParameterBuffer *misc) +{ + VAStatus status = VA_STATUS_SUCCESS; + + switch (u_reduce_video_profile(context->templat.profile)) { + case PIPE_VIDEO_FORMAT_MPEG4_AVC: + status = vlVaHandleVAEncMiscParameterTypeTemporalLayerH264(context, misc); + break; + + case PIPE_VIDEO_FORMAT_HEVC: + break; + + default: + break; + } + + return status; +} + static VAStatus handleVAEncSequenceParameterBufferType(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf) { @@ -435,6 +455,10 @@ handleVAEncMiscParameterBufferType(vlVaContext *context, vlVaBuffer *buf) vaStatus = handleVAEncMiscParameterTypeFrameRate(context, misc); break; + case VAEncMiscParameterTypeTemporalLayerStructure: + vaStatus = handleVAEncMiscParameterTypeTemporalLayer(context, misc); + break; + default: break; } diff --git a/src/gallium/frontends/va/picture_h264_enc.c b/src/gallium/frontends/va/picture_h264_enc.c index 4dfeecccef7..6bcc926f27e 100644 --- a/src/gallium/frontends/va/picture_h264_enc.c +++ b/src/gallium/frontends/va/picture_h264_enc.c @@ -170,6 +170,16 @@ vlVaHandleVAEncMiscParameterTypeFrameRateH264(vlVaContext *context, VAEncMiscPar return VA_STATUS_SUCCESS; } +VAStatus +vlVaHandleVAEncMiscParameterTypeTemporalLayerH264(vlVaContext *context, VAEncMiscParameterBuffer *misc) +{ + VAEncMiscParameterTemporalLayerStructure *tl = (VAEncMiscParameterTemporalLayerStructure *)misc->data; + + context->desc.h264enc.num_temporal_layers = tl->number_of_layers; + + return VA_STATUS_SUCCESS; +} + void getEncParamPresetH264(vlVaContext *context) { //motion estimation preset diff --git a/src/gallium/frontends/va/va_private.h b/src/gallium/frontends/va/va_private.h index a25e24592a1..67fc6ffdaf9 100644 --- a/src/gallium/frontends/va/va_private.h +++ b/src/gallium/frontends/va/va_private.h @@ -460,6 +460,7 @@ VAStatus vlVaHandleVAEncSliceParameterBufferTypeH264(vlVaDriver *drv, vlVaContex VAStatus vlVaHandleVAEncSequenceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf); VAStatus vlVaHandleVAEncMiscParameterTypeRateControlH264(vlVaContext *context, VAEncMiscParameterBuffer *buf); VAStatus vlVaHandleVAEncMiscParameterTypeFrameRateH264(vlVaContext *context, VAEncMiscParameterBuffer *buf); +VAStatus vlVaHandleVAEncMiscParameterTypeTemporalLayerH264(vlVaContext *context, VAEncMiscParameterBuffer *buf); VAStatus vlVaHandleVAEncPictureParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf); VAStatus vlVaHandleVAEncSliceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf); VAStatus vlVaHandleVAEncSequenceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);