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

Author: Honglei Huang <[email protected]>
Date:   Thu Jan 12 17:46:12 2023 +0800

virgl/video: Add support for mpeg12 decoding

Implement for mpeg12 virgl video decoding.

Signed-off-by: Honglei Huang <[email protected]>
Reviewed-by: Leo Liu <[email protected]>
Reviewed-by: Boyuan Zhang <[email protected]>
Reviewed-by: Daniel Almeida <[email protected]>
Reviewed-by: Feng Jiang <[email protected]>
Signed-off-by: Huang Rui <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22108>

---

 src/gallium/drivers/virgl/virgl_screen.c |  3 +++
 src/gallium/drivers/virgl/virgl_video.c  | 40 +++++++++++++++++++++++++++++++-
 src/virtio/virtio-gpu/virgl_video_hw.h   | 25 ++++++++++++++++++++
 3 files changed, 67 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/virgl/virgl_screen.c 
b/src/gallium/drivers/virgl/virgl_screen.c
index 2431236f102..b3b7aa44e7a 100644
--- a/src/gallium/drivers/virgl/virgl_screen.c
+++ b/src/gallium/drivers/virgl/virgl_screen.c
@@ -498,6 +498,9 @@ virgl_get_video_param(struct pipe_screen *screen,
        drv_supported = (entrypoint == PIPE_VIDEO_ENTRYPOINT_BITSTREAM ||
                         entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE);
        break;
+   case PIPE_VIDEO_FORMAT_MPEG12:
+      drv_supported = (entrypoint == PIPE_VIDEO_ENTRYPOINT_BITSTREAM);
+      break;
    default:
        drv_supported = false;
        break;
diff --git a/src/gallium/drivers/virgl/virgl_video.c 
b/src/gallium/drivers/virgl/virgl_video.c
index 1924288e443..8ab51fd3728 100644
--- a/src/gallium/drivers/virgl/virgl_video.c
+++ b/src/gallium/drivers/virgl/virgl_video.c
@@ -559,6 +559,41 @@ static int fill_mpeg4_picture_desc(const struct 
pipe_picture_desc *desc,
     return 0;
 }
 
+static int fill_mpeg12_picture_desc(const struct pipe_picture_desc *desc,
+                                    union virgl_picture_desc *vdsc)
+{
+    unsigned i;
+    struct virgl_video_buffer *vbuf;
+    struct virgl_mpeg12_picture_desc *vmpeg12 = &vdsc->mpeg12;
+    struct pipe_mpeg12_picture_desc *mpeg12 = (struct pipe_mpeg12_picture_desc 
*)desc;
+
+    fill_base_picture_desc(desc, &vmpeg12->base);
+
+    for (i = 0; i < 2; i++) {
+        vbuf = virgl_video_buffer(mpeg12->ref[i]);
+        vmpeg12->ref[i] = vbuf ? vbuf->handle : 0;
+    }
+
+    memcpy(vmpeg12->intra_matrix, mpeg12->intra_matrix, 64);
+    memcpy(vmpeg12->non_intra_matrix, mpeg12->non_intra_matrix, 64);
+
+    ITEM_SET(vmpeg12, mpeg12, picture_coding_type);
+    vmpeg12->f_code[0][0]  = mpeg12->f_code[0][0] ;
+    vmpeg12->f_code[0][1]  = mpeg12->f_code[0][1] ;
+    vmpeg12->f_code[1][0]  = mpeg12->f_code[1][0] ;
+    vmpeg12->f_code[1][1]  = mpeg12->f_code[1][1] ;
+    ITEM_SET(vmpeg12, mpeg12, intra_dc_precision);
+    ITEM_SET(vmpeg12, mpeg12, picture_structure);
+    ITEM_SET(vmpeg12, mpeg12, top_field_first);
+    ITEM_SET(vmpeg12, mpeg12, frame_pred_frame_dct);
+    ITEM_SET(vmpeg12, mpeg12, concealment_motion_vectors);
+    ITEM_SET(vmpeg12, mpeg12, q_scale_type);
+    ITEM_SET(vmpeg12, mpeg12, intra_vlc_format);
+    ITEM_SET(vmpeg12, mpeg12, alternate_scan);
+    return 0;
+}
+
+
 #undef ITEM_SET
 #undef ITEM_CPY
 
@@ -572,6 +607,8 @@ static int fill_picture_desc(const struct pipe_picture_desc 
*desc,
         return fill_h264_picture_desc(desc, vdsc);
     case PIPE_VIDEO_FORMAT_HEVC:
         return fill_h265_picture_desc(desc, vdsc);
+    case PIPE_VIDEO_FORMAT_MPEG12:
+        return fill_mpeg12_picture_desc(desc, vdsc);
     default:
         return -1;
     }
@@ -824,7 +861,8 @@ virgl_video_create_codec(struct pipe_context *ctx,
         width = align(width, VL_MACROBLOCK_WIDTH);
         height = align(height, VL_MACROBLOCK_HEIGHT);
         break;
-    case PIPE_VIDEO_FORMAT_HEVC: /* fall through */
+    case PIPE_VIDEO_FORMAT_HEVC: 
+    case PIPE_VIDEO_FORMAT_MPEG12: /* fall through */
     default:
         break;
     }
diff --git a/src/virtio/virtio-gpu/virgl_video_hw.h 
b/src/virtio/virtio-gpu/virgl_video_hw.h
index 2f50f969da3..0e9ebbb8467 100644
--- a/src/virtio/virtio-gpu/virgl_video_hw.h
+++ b/src/virtio/virtio-gpu/virgl_video_hw.h
@@ -558,11 +558,36 @@ struct virgl_mpeg4_picture_desc
    uint32_t ref[2];
 };
 
+struct virgl_mpeg12_picture_desc
+{
+    struct virgl_base_picture_desc base;
+
+    unsigned picture_coding_type;
+    unsigned picture_structure;
+    unsigned frame_pred_frame_dct;
+    unsigned q_scale_type;
+    unsigned alternate_scan;
+    unsigned intra_vlc_format;
+    unsigned concealment_motion_vectors;
+    unsigned intra_dc_precision;
+    unsigned f_code[2][2];
+    unsigned top_field_first;
+    unsigned full_pel_forward_vector;
+    unsigned full_pel_backward_vector;
+    unsigned num_slices;
+
+    uint8_t intra_matrix[64];
+    uint8_t non_intra_matrix[64];
+
+    uint32_t ref[2];
+};
+
 union virgl_picture_desc {
     struct virgl_base_picture_desc base;
     struct virgl_h264_picture_desc h264;
     struct virgl_h265_picture_desc h265;
     struct virgl_mpeg4_picture_desc mpeg4;
+    struct virgl_mpeg12_picture_desc mpeg12;
     struct virgl_h264_enc_picture_desc h264_enc;
     struct virgl_h265_enc_picture_desc h265_enc;
 };

Reply via email to