virgl/video: Add support for mpeg12 decoding

Implement for mpeg12 virgl video decoding.

Signed-off-by: Honglei Huang <honglei1.huang@amd.com>
Reviewed-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Boyuan Zhang <boyuan.zhang@amd.com>
Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com>
Reviewed-by: Feng Jiang <jiangfeng@kylinos.cn>
Signed-off-by: Huang Rui <ray.huang@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22108>
This commit is contained in:
Honglei Huang 2023-01-12 17:46:12 +08:00 committed by Marge Bot
parent 61a90c2968
commit deafeab1ee
3 changed files with 67 additions and 1 deletions

View file

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

View file

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

View file

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