Mesa (master): frontends/va: Handle dynamic resolution/SVC for VP9

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jun 29 13:07:53 UTC 2020


Module: Mesa
Branch: master
Commit: c425ca5566a6bd22fe4d38e7b46d82582ce29de9
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c425ca5566a6bd22fe4d38e7b46d82582ce29de9

Author: Satyajit Sahu <satyajit.sahu at amd.com>
Date:   Wed Jun 24 16:19:01 2020 +0530

frontends/va: Handle dynamic resolution/SVC for VP9

VP9 allows frame to use another resolution frame as reference
frames so updating the resolution for decoder when there is a
resolution change.

Signed-off-by: Satyajit Sahu <satyajit.sahu at amd.com>
Reviewed-by: Leo Liu <leo.liu at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5646>

---

 src/gallium/frontends/va/picture.c     | 14 ++++++++++----
 src/gallium/frontends/va/picture_vp9.c |  8 ++++++--
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/gallium/frontends/va/picture.c b/src/gallium/frontends/va/picture.c
index d292594590c..d529a2b2833 100644
--- a/src/gallium/frontends/va/picture.c
+++ b/src/gallium/frontends/va/picture.c
@@ -109,8 +109,10 @@ static VAStatus
 handlePictureParameterBuffer(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
 {
    VAStatus vaStatus = VA_STATUS_SUCCESS;
+   enum pipe_video_format format =
+      u_reduce_video_profile(context->templat.profile);
 
-   switch (u_reduce_video_profile(context->templat.profile)) {
+   switch (format) {
    case PIPE_VIDEO_FORMAT_MPEG12:
       vlVaHandlePictureParameterBufferMPEG12(drv, context, buf);
       break;
@@ -145,9 +147,6 @@ handlePictureParameterBuffer(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *
 
    /* Create the decoder once max_references is known. */
    if (!context->decoder) {
-      enum pipe_video_format format =
-         u_reduce_video_profile(context->templat.profile);
-
       if (!context->target)
          return VA_STATUS_ERROR_INVALID_CONTEXT;
 
@@ -168,6 +167,13 @@ handlePictureParameterBuffer(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *
       context->needs_begin_frame = true;
    }
 
+   if (format == PIPE_VIDEO_FORMAT_VP9) {
+      context->decoder->width =
+         context->desc.vp9.picture_parameter.frame_width;
+      context->decoder->height =
+         context->desc.vp9.picture_parameter.frame_height;
+   }
+
    return vaStatus;
 }
 
diff --git a/src/gallium/frontends/va/picture_vp9.c b/src/gallium/frontends/va/picture_vp9.c
index b5aca9a513c..8ee7f0107da 100644
--- a/src/gallium/frontends/va/picture_vp9.c
+++ b/src/gallium/frontends/va/picture_vp9.c
@@ -81,8 +81,12 @@ void vlVaHandlePictureParameterBufferVP9(vlVaDriver *drv, vlVaContext *context,
 
    context->desc.vp9.picture_parameter.bit_depth = vp9->bit_depth;
 
-   for (i = 0 ; i < NUM_VP9_REFS ; i++)
-      vlVaGetReferenceFrame(drv, vp9->reference_frames[i], &context->desc.vp9.ref[i]);
+   for (i = 0 ; i < NUM_VP9_REFS ; i++) {
+      if (vp9->pic_fields.bits.frame_type == 0)
+         context->desc.vp9.ref[i] = NULL;
+      else
+         vlVaGetReferenceFrame(drv, vp9->reference_frames[i], &context->desc.vp9.ref[i]);
+   }
 
    if (!context->decoder && !context->templat.max_references)
       context->templat.max_references = NUM_VP9_REFS;



More information about the mesa-commit mailing list