g3dvl: Rework the decoder interface part 5/5
authorChristian König <deathsimple@vodafone.de>
Fri, 12 Aug 2011 11:29:00 +0000 (13:29 +0200)
committerChristian König <deathsimple@vodafone.de>
Fri, 26 Aug 2011 10:10:34 +0000 (12:10 +0200)
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>
src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
src/gallium/include/pipe/p_video_decoder.h
src/gallium/include/pipe/p_video_state.h
src/gallium/state_trackers/vdpau/decode.c
src/gallium/state_trackers/xorg/xvmc/surface.c

index 805a22151338d5a651d8dda6d2585131ed832c82..8100f80665a2022f19fdc74059266049ede61464 100644 (file)
@@ -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:
index c7f5877858deaf95bfa5738000b208be6cbd6ed8..2aa4001c1798a7f95e10b6dde71dd059470e4acd 100644 (file)
@@ -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
index 8e68f27cbdbaf69410b56e6626aec15ab8945e10..8166ac76b632b9f291672e4d2bee72f32abd65f8 100644 (file)
@@ -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;
index 5ca40f71efee8ca23a6dce5efd4cca40dd99e7fe..50d63ea3f736f505e89a08acb8e09645e66b1565 100644 (file)
@@ -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);
 
index fd7d228c996ea2f082c2a55a8b494b4b343275e0..79bd9c618ceb5b9abeb7e122f65ec67bc76ff6de 100644 (file)
@@ -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,