diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/virgl/virgl_screen.c | 3 | ||||
-rw-r--r-- | src/gallium/drivers/virgl/virgl_video.c | 40 |
2 files changed, 42 insertions, 1 deletions
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; } |