virgl/video: Add support for jpeg decoding

Implement for virgl jpeg decoding.

Signed-off-by: Honglei Huang <honghuan@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
2022-12-15 15:54:47 +08:00
committed by Marge Bot
parent dad4b79ee0
commit e1b8e4d7fc
3 changed files with 123 additions and 1 deletions
+1
View File
@@ -500,6 +500,7 @@ virgl_get_video_param(struct pipe_screen *screen,
break;
case PIPE_VIDEO_FORMAT_MPEG12:
case PIPE_VIDEO_FORMAT_VC1:
case PIPE_VIDEO_FORMAT_JPEG:
drv_supported = (entrypoint == PIPE_VIDEO_ENTRYPOINT_BITSTREAM);
break;
default:
+58 -1
View File
@@ -639,6 +639,60 @@ static int fill_vc1_picture_desc(const struct pipe_picture_desc *desc,
return 0;
}
static int fill_mjpeg_picture_desc(const struct pipe_picture_desc *desc,
union virgl_picture_desc *vdsc)
{
unsigned i;
struct virgl_mjpeg_picture_desc *vmjpeg = &vdsc->mjpeg;
struct pipe_mjpeg_picture_desc *mjpeg = (struct pipe_mjpeg_picture_desc *)desc;
fill_base_picture_desc(desc, &vmjpeg->base);
ITEM_SET(&vmjpeg->picture_parameter, &mjpeg->picture_parameter, picture_width);
ITEM_SET(&vmjpeg->picture_parameter, &mjpeg->picture_parameter, picture_height);
ITEM_SET(&vmjpeg->picture_parameter, &mjpeg->picture_parameter, crop_x);
ITEM_SET(&vmjpeg->picture_parameter, &mjpeg->picture_parameter, crop_y);
ITEM_SET(&vmjpeg->picture_parameter, &mjpeg->picture_parameter, crop_width);
ITEM_SET(&vmjpeg->picture_parameter, &mjpeg->picture_parameter, crop_height);
ITEM_SET(&vmjpeg->picture_parameter, &mjpeg->picture_parameter, num_components);
for (i = 0; i < mjpeg->picture_parameter.num_components; ++i) {
ITEM_SET(&vmjpeg->picture_parameter.components[i], &mjpeg->picture_parameter.components[i], component_id);
ITEM_SET(&vmjpeg->picture_parameter.components[i], &mjpeg->picture_parameter.components[i], h_sampling_factor);
ITEM_SET(&vmjpeg->picture_parameter.components[i], &mjpeg->picture_parameter.components[i], v_sampling_factor);
ITEM_SET(&vmjpeg->picture_parameter.components[i], &mjpeg->picture_parameter.components[i], quantiser_table_selector);
}
ITEM_SET(&vmjpeg->slice_parameter, &mjpeg->slice_parameter, slice_data_size);
ITEM_SET(&vmjpeg->slice_parameter, &mjpeg->slice_parameter, slice_data_offset);
ITEM_SET(&vmjpeg->slice_parameter, &mjpeg->slice_parameter, slice_data_flag);
ITEM_SET(&vmjpeg->slice_parameter, &mjpeg->slice_parameter, slice_horizontal_position);
ITEM_SET(&vmjpeg->slice_parameter, &mjpeg->slice_parameter, slice_vertical_position);
ITEM_SET(&vmjpeg->slice_parameter, &mjpeg->slice_parameter, num_components);
for (i = 0; i < mjpeg->slice_parameter.num_components; ++i) {
ITEM_SET(&vmjpeg->slice_parameter.components[i], &mjpeg->slice_parameter.components[i], component_selector);
ITEM_SET(&vmjpeg->slice_parameter.components[i], &mjpeg->slice_parameter.components[i], dc_table_selector);
ITEM_SET(&vmjpeg->slice_parameter.components[i], &mjpeg->slice_parameter.components[i], ac_table_selector);
}
ITEM_SET(&vmjpeg->slice_parameter, &mjpeg->slice_parameter, restart_interval);
ITEM_SET(&vmjpeg->slice_parameter, &mjpeg->slice_parameter, num_mcus);
ITEM_CPY(&vmjpeg->quantization_table, &mjpeg->quantization_table, load_quantiser_table);
ITEM_CPY(&vmjpeg->quantization_table, &mjpeg->quantization_table, quantiser_table);
for (i = 0; i < 2; ++i) {
ITEM_SET(&vmjpeg->huffman_table, &mjpeg->huffman_table, load_huffman_table[i]);
ITEM_CPY(&vmjpeg->huffman_table.table[i], &mjpeg->huffman_table.table[i], num_dc_codes);
ITEM_CPY(&vmjpeg->huffman_table.table[i], &mjpeg->huffman_table.table[i], dc_values);
ITEM_CPY(&vmjpeg->huffman_table.table[i], &mjpeg->huffman_table.table[i], num_ac_codes);
ITEM_CPY(&vmjpeg->huffman_table.table[i], &mjpeg->huffman_table.table[i], ac_values);
ITEM_CPY(&vmjpeg->huffman_table.table[i], &mjpeg->huffman_table.table[i], pad);
}
return 0;
}
#undef ITEM_SET
#undef ITEM_CPY
@@ -656,6 +710,8 @@ static int fill_picture_desc(const struct pipe_picture_desc *desc,
return fill_mpeg12_picture_desc(desc, vdsc);
case PIPE_VIDEO_FORMAT_VC1:
return fill_vc1_picture_desc(desc, vdsc);
case PIPE_VIDEO_FORMAT_JPEG:
return fill_mjpeg_picture_desc(desc, vdsc);
default:
return -1;
}
@@ -910,7 +966,8 @@ virgl_video_create_codec(struct pipe_context *ctx,
break;
case PIPE_VIDEO_FORMAT_HEVC:
case PIPE_VIDEO_FORMAT_MPEG12:
case PIPE_VIDEO_FORMAT_VC1: /* fall through */
case PIPE_VIDEO_FORMAT_VC1:
case PIPE_VIDEO_FORMAT_JPEG: /* fall through */
default:
break;
}
+64
View File
@@ -619,6 +619,69 @@ struct virgl_vc1_picture_desc
uint32_t ref[2];
};
struct virgl_mjpeg_picture_desc
{
struct virgl_base_picture_desc base;
struct
{
uint16_t picture_width;
uint16_t picture_height;
struct {
uint8_t component_id;
uint8_t h_sampling_factor;
uint8_t v_sampling_factor;
uint8_t quantiser_table_selector;
} components[255];
uint8_t num_components;
uint16_t crop_x;
uint16_t crop_y;
uint16_t crop_width;
uint16_t crop_height;
} picture_parameter;
struct
{
uint8_t load_quantiser_table[4];
uint8_t quantiser_table[4][64];
} quantization_table;
struct
{
uint8_t load_huffman_table[2];
struct {
uint8_t num_dc_codes[16];
uint8_t dc_values[12];
uint8_t num_ac_codes[16];
uint8_t ac_values[162];
uint8_t pad[2];
} table[2];
} huffman_table;
struct
{
unsigned slice_data_size;
unsigned slice_data_offset;
unsigned slice_data_flag;
unsigned slice_horizontal_position;
unsigned slice_vertical_position;
struct {
uint8_t component_selector;
uint8_t dc_table_selector;
uint8_t ac_table_selector;
} components[4];
uint8_t num_components;
uint16_t restart_interval;
unsigned num_mcus;
} slice_parameter;
};
union virgl_picture_desc {
struct virgl_base_picture_desc base;
struct virgl_h264_picture_desc h264;
@@ -626,6 +689,7 @@ union virgl_picture_desc {
struct virgl_mpeg4_picture_desc mpeg4;
struct virgl_mpeg12_picture_desc mpeg12;
struct virgl_vc1_picture_desc vc1;
struct virgl_mjpeg_picture_desc mjpeg;
struct virgl_h264_enc_picture_desc h264_enc;
struct virgl_h265_enc_picture_desc h265_enc;
};