mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 04:20:08 +01:00
g3dvl: Rework the decoder interface part 5/5
Make setting the quant matrixes a generic interface. Also removes setting the quant matrix from the XvMC interface Signed-off-by: Christian König <deathsimple@vodafone.de> Reviewed-by: Younes Manton <younes.m@gmail.com>
This commit is contained in:
parent
835ea8480f
commit
2e62b30826
5 changed files with 34 additions and 22 deletions
|
|
@ -513,15 +513,16 @@ vl_mpeg12_set_picture_parameters(struct pipe_video_decoder *decoder,
|
|||
|
||||
static void
|
||||
vl_mpeg12_set_quant_matrix(struct pipe_video_decoder *decoder,
|
||||
const uint8_t intra_matrix[64],
|
||||
const uint8_t non_intra_matrix[64])
|
||||
const struct pipe_quant_matrix *matrix)
|
||||
{
|
||||
struct vl_mpeg12_decoder *dec = (struct vl_mpeg12_decoder *)decoder;
|
||||
const struct pipe_mpeg12_quant_matrix *m = (const struct pipe_mpeg12_quant_matrix *)matrix;
|
||||
|
||||
assert(dec);
|
||||
assert(matrix->codec == PIPE_VIDEO_CODEC_MPEG12);
|
||||
|
||||
memcpy(dec->intra_matrix, intra_matrix, 64);
|
||||
memcpy(dec->non_intra_matrix, non_intra_matrix, 64);
|
||||
memcpy(dec->intra_matrix, m->intra_matrix, 64);
|
||||
memcpy(dec->non_intra_matrix, m->non_intra_matrix, 64);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -576,6 +577,9 @@ vl_mpeg12_begin_frame(struct pipe_video_decoder *decoder)
|
|||
buf = dec->current_buffer;
|
||||
assert(buf);
|
||||
|
||||
if (dec->base.entrypoint == PIPE_VIDEO_ENTRYPOINT_BITSTREAM)
|
||||
dec->intra_matrix[0] = 1 << (7 - dec->picture_desc.intra_dc_precision);
|
||||
|
||||
for (i = 0; i < VL_MAX_PLANES; ++i) {
|
||||
vl_zscan_upload_quant(&buf->zscan[i], dec->intra_matrix, true);
|
||||
vl_zscan_upload_quant(&buf->zscan[i], dec->non_intra_matrix, false);
|
||||
|
|
@ -1152,6 +1156,9 @@ vl_create_mpeg12_decoder(struct pipe_context *context,
|
|||
if (!init_pipe_state(dec))
|
||||
goto error_pipe_state;
|
||||
|
||||
memset(dec->intra_matrix, 0x10, 64);
|
||||
memset(dec->non_intra_matrix, 0x10, 64);
|
||||
|
||||
return &dec->base;
|
||||
|
||||
error_pipe_state:
|
||||
|
|
|
|||
|
|
@ -84,8 +84,7 @@ struct pipe_video_decoder
|
|||
* set the quantification matrixes
|
||||
*/
|
||||
void (*set_quant_matrix)(struct pipe_video_decoder *decoder,
|
||||
const uint8_t intra_matrix[64],
|
||||
const uint8_t non_intra_matrix[64]);
|
||||
const struct pipe_quant_matrix *matrix);
|
||||
|
||||
/**
|
||||
* set target where video data is decoded to
|
||||
|
|
|
|||
|
|
@ -100,6 +100,11 @@ struct pipe_picture_desc
|
|||
enum pipe_video_profile profile;
|
||||
};
|
||||
|
||||
struct pipe_quant_matrix
|
||||
{
|
||||
enum pipe_video_codec codec;
|
||||
};
|
||||
|
||||
struct pipe_macroblock
|
||||
{
|
||||
enum pipe_video_codec codec;
|
||||
|
|
@ -116,9 +121,18 @@ struct pipe_mpeg12_picture_desc
|
|||
unsigned alternate_scan;
|
||||
unsigned intra_vlc_format;
|
||||
unsigned concealment_motion_vectors;
|
||||
unsigned intra_dc_precision;
|
||||
unsigned f_code[2][2];
|
||||
};
|
||||
|
||||
struct pipe_mpeg12_quant_matrix
|
||||
{
|
||||
struct pipe_quant_matrix base;
|
||||
|
||||
const uint8_t *intra_matrix;
|
||||
const uint8_t *non_intra_matrix;
|
||||
};
|
||||
|
||||
struct pipe_mpeg12_macroblock
|
||||
{
|
||||
struct pipe_macroblock base;
|
||||
|
|
|
|||
|
|
@ -182,8 +182,8 @@ vlVdpDecoderRenderMpeg12(struct pipe_video_decoder *decoder,
|
|||
VdpBitstreamBuffer const *bitstream_buffers)
|
||||
{
|
||||
struct pipe_mpeg12_picture_desc picture;
|
||||
struct pipe_mpeg12_quant_matrix quant;
|
||||
struct pipe_video_buffer *ref_frames[2];
|
||||
uint8_t intra_quantizer_matrix[64];
|
||||
unsigned i;
|
||||
|
||||
VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG2\n");
|
||||
|
|
@ -216,6 +216,7 @@ vlVdpDecoderRenderMpeg12(struct pipe_video_decoder *decoder,
|
|||
picture.alternate_scan = picture_info->alternate_scan;
|
||||
picture.intra_vlc_format = picture_info->intra_vlc_format;
|
||||
picture.concealment_motion_vectors = picture_info->concealment_motion_vectors;
|
||||
picture.intra_dc_precision = picture_info->intra_dc_precision;
|
||||
picture.f_code[0][0] = picture_info->f_code[0][0] - 1;
|
||||
picture.f_code[0][1] = picture_info->f_code[0][1] - 1;
|
||||
picture.f_code[1][0] = picture_info->f_code[1][0] - 1;
|
||||
|
|
@ -223,9 +224,12 @@ vlVdpDecoderRenderMpeg12(struct pipe_video_decoder *decoder,
|
|||
|
||||
decoder->set_picture_parameters(decoder, &picture.base);
|
||||
|
||||
memcpy(intra_quantizer_matrix, picture_info->intra_quantizer_matrix, sizeof(intra_quantizer_matrix));
|
||||
intra_quantizer_matrix[0] = 1 << (7 - picture_info->intra_dc_precision);
|
||||
decoder->set_quant_matrix(decoder, intra_quantizer_matrix, picture_info->non_intra_quantizer_matrix);
|
||||
memset(&quant, 0, sizeof(quant));
|
||||
quant.base.codec = PIPE_VIDEO_CODEC_MPEG12;
|
||||
quant.intra_matrix = picture_info->intra_quantizer_matrix;
|
||||
quant.non_intra_matrix = picture_info->non_intra_quantizer_matrix;
|
||||
|
||||
decoder->set_quant_matrix(decoder, &quant.base);
|
||||
|
||||
decoder->begin_frame(decoder);
|
||||
|
||||
|
|
|
|||
|
|
@ -161,17 +161,6 @@ RecursiveEndFrame(XvMCSurfacePrivate *surface)
|
|||
PUBLIC
|
||||
Status XvMCCreateSurface(Display *dpy, XvMCContext *context, XvMCSurface *surface)
|
||||
{
|
||||
static const uint8_t dummy_quant[64] = {
|
||||
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
|
||||
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
|
||||
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
|
||||
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
|
||||
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
|
||||
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
|
||||
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
|
||||
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10
|
||||
};
|
||||
|
||||
XvMCContextPrivate *context_priv;
|
||||
struct pipe_context *pipe;
|
||||
XvMCSurfacePrivate *surface_priv;
|
||||
|
|
@ -193,7 +182,6 @@ Status XvMCCreateSurface(Display *dpy, XvMCContext *context, XvMCSurface *surfac
|
|||
return BadAlloc;
|
||||
|
||||
surface_priv->decode_buffer = context_priv->decoder->create_buffer(context_priv->decoder);
|
||||
context_priv->decoder->set_quant_matrix(context_priv->decoder, dummy_quant, dummy_quant);
|
||||
surface_priv->video_buffer = pipe->create_video_buffer
|
||||
(
|
||||
pipe, PIPE_FORMAT_NV12, context_priv->decoder->chroma_format,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue