frontends/va: Handle dynamic resolution/SVC for VP9
authorSatyajit Sahu <satyajit.sahu@amd.com>
Wed, 24 Jun 2020 10:31:01 +0000 (16:01 +0530)
committerMarge Bot <eric+marge@anholt.net>
Mon, 29 Jun 2020 12:52:40 +0000 (12:52 +0000)
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@amd.com>
Reviewed-by: Leo Liu <leo.liu@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5646>

src/gallium/frontends/va/picture.c
src/gallium/frontends/va/picture_vp9.c

index d292594590c6750351219a55c07930b772551a65..d529a2b28339789c51a34001931ee42ef95837dd 100644 (file)
@@ -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;
 }
 
index b5aca9a513ce717baa2f73ad63fcd905b74bc505..8ee7f0107dad116f8bf229584bb582d79317687d 100644 (file)
@@ -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;