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; };
