vl: call decode_bitstream only once
authorChristian König <deathsimple@vodafone.de>
Thu, 22 Dec 2011 14:24:46 +0000 (15:24 +0100)
committerChristian König <deathsimple@vodafone.de>
Mon, 26 Dec 2011 15:37:47 +0000 (16:37 +0100)
Submit all bitstreams at once to decode_bitstream.

Signed-off-by: Christian König <deathsimple@vodafone.de>
Signed-off-by: Maarten Lankhorst <m.b.lankhorst@gmail.com>
src/gallium/auxiliary/vl/vl_mpeg12_bitstream.c
src/gallium/auxiliary/vl/vl_mpeg12_bitstream.h
src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
src/gallium/include/pipe/p_video_decoder.h
src/gallium/state_trackers/vdpau/decode.c

index 7e20d7177e425705cbf9ebab41734f2a387fa9cc..bd1f091cd055fe8438715c52cd1807e805df2e83 100644 (file)
@@ -958,11 +958,12 @@ vl_mpg12_bs_set_picture_desc(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_
 }
 
 void
-vl_mpg12_bs_decode(struct vl_mpg12_bs *bs, unsigned num_bytes, const uint8_t *buffer)
+vl_mpg12_bs_decode(struct vl_mpg12_bs *bs, unsigned num_buffers,
+                   const void * const *buffers, const unsigned *sizes)
 {
    assert(bs);
 
-   vl_vlc_init(&bs->vlc, 1, (const void * const *)&buffer, &num_bytes);
+   vl_vlc_init(&bs->vlc, num_buffers, buffers, sizes);
    while (vl_vlc_bits_left(&bs->vlc) > 32) {
       uint32_t code = vl_vlc_peekbits(&bs->vlc, 32);
 
index c3f14a1793276b55de986e46e53d4e6d9d254123..0ba7f4303e569dec047e2bccf1d9a314852fbc7a 100644 (file)
@@ -49,6 +49,7 @@ void
 vl_mpg12_bs_set_picture_desc(struct vl_mpg12_bs *bs, struct pipe_mpeg12_picture_desc *picture);
 
 void
-vl_mpg12_bs_decode(struct vl_mpg12_bs *bs, unsigned num_bytes, const uint8_t *buffer);
+vl_mpg12_bs_decode(struct vl_mpg12_bs *bs, unsigned num_buffers,
+                   const void * const *buffers, const unsigned *sizes);
 
 #endif /* vl_mpeg12_bitstream_h */
index 2442d784ecbab9a1cbf285f8293b0ddc9ab8ce26..e502fc626f50dbd9701543ccfedc99685c2bf1fc 100644 (file)
@@ -690,7 +690,9 @@ vl_mpeg12_decode_macroblock(struct pipe_video_decoder *decoder,
 
 static void
 vl_mpeg12_decode_bitstream(struct pipe_video_decoder *decoder,
-                           unsigned num_bytes, const void *data)
+                           unsigned num_buffers,
+                           const void * const *buffers,
+                           const unsigned *sizes)
 {
    struct vl_mpeg12_decoder *dec = (struct vl_mpeg12_decoder *)decoder;
    struct vl_mpeg12_buffer *buf;
@@ -706,7 +708,7 @@ vl_mpeg12_decode_bitstream(struct pipe_video_decoder *decoder,
       vl_zscan_set_layout(&buf->zscan[i], dec->picture_desc.alternate_scan ?
                           dec->zscan_alternate : dec->zscan_normal);
 
-   vl_mpg12_bs_decode(&buf->bs, num_bytes, data);
+   vl_mpg12_bs_decode(&buf->bs, num_buffers, buffers, sizes);
 }
 
 static void
index 40b7dcdb3cf4d87882e38eafc82c0d3457f02b33..aa535898f2d1c32dca374324ff59489974021cbe 100644 (file)
@@ -116,7 +116,9 @@ struct pipe_video_decoder
     * decode a bitstream
     */
    void (*decode_bitstream)(struct pipe_video_decoder *decoder,
-                            unsigned num_bytes, const void *data);
+                            unsigned num_buffers,
+                            const void * const *buffers,
+                            const unsigned *sizes);
 
    /**
     * end decoding of the current frame
index 47212e348ed6c7130967bb1cc58de014b3da9850..a5a01fb21a39f0268228133321bebd8e584e5ee6 100644 (file)
@@ -322,7 +322,6 @@ vlVdpDecoderRenderVC1(struct pipe_video_decoder *decoder,
 {
    struct pipe_vc1_picture_desc picture;
    struct pipe_video_buffer *ref_frames[2] = {};
-   unsigned i;
 
    VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding VC-1\n");
 
@@ -385,6 +384,8 @@ vlVdpDecoderRender(VdpDecoder decoder,
                    uint32_t bitstream_buffer_count,
                    VdpBitstreamBuffer const *bitstream_buffers)
 {
+   const void * buffers[bitstream_buffer_count];
+   unsigned sizes[bitstream_buffer_count];
    vlVdpDecoder *vldecoder;
    vlVdpSurface *vlsurf;
    VdpStatus ret;
@@ -435,9 +436,11 @@ vlVdpDecoderRender(VdpDecoder decoder,
       return ret;
 
    dec->begin_frame(dec);
-   for (i = 0; i < bitstream_buffer_count; ++i)
-      dec->decode_bitstream(dec, bitstream_buffers[i].bitstream_bytes,
-                                           bitstream_buffers[i].bitstream);
+   for (i = 0; i < bitstream_buffer_count; ++i) {
+      buffers[i] = bitstream_buffers[i].bitstream;
+      sizes[i] = bitstream_buffers[i].bitstream_bytes;
+   }
+   dec->decode_bitstream(dec, bitstream_buffer_count, buffers, sizes);
    dec->end_frame(dec);
    return ret;
 }