[Mesa-dev] [PATCH 1/5] vl: use a template for create_video_decoder

Christian König deathsimple at vodafone.de
Fri Aug 16 02:08:00 PDT 2013


From: Christian König <christian.koenig at amd.com>

Signed-off-by: Christian König <christian.koenig at amd.com>
---
 src/gallium/auxiliary/vl/vl_decoder.c        |   23 ++++++-------
 src/gallium/auxiliary/vl/vl_decoder.h        |    6 +---
 src/gallium/auxiliary/vl/vl_mpeg12_decoder.c |   24 ++++----------
 src/gallium/auxiliary/vl/vl_mpeg12_decoder.h |    7 +---
 src/gallium/drivers/ilo/ilo_video.c          |    9 ++----
 src/gallium/drivers/nouveau/nouveau_video.c  |   36 +++++++--------------
 src/gallium/drivers/nv50/nv50_context.h      |   14 ++------
 src/gallium/drivers/nv50/nv84_video.c        |   40 ++++++++---------------
 src/gallium/drivers/nv50/nv98_video.c        |   45 ++++++++++----------------
 src/gallium/drivers/nvc0/nvc0_context.h      |    7 +---
 src/gallium/drivers/nvc0/nvc0_video.c        |   45 ++++++++++----------------
 src/gallium/drivers/r600/r600_pipe.h         |    6 +---
 src/gallium/drivers/r600/r600_uvd.c          |   10 ++----
 src/gallium/drivers/radeon/radeon_uvd.c      |   35 +++++++-------------
 src/gallium/drivers/radeon/radeon_uvd.h      |    6 +---
 src/gallium/drivers/radeonsi/radeonsi_pipe.h |    6 +---
 src/gallium/drivers/radeonsi/radeonsi_uvd.c  |   10 ++----
 src/gallium/include/pipe/p_context.h         |    6 +---
 src/gallium/include/pipe/p_video_decoder.h   |    1 +
 src/gallium/state_trackers/vdpau/decode.c    |   23 +++++++------
 src/gallium/state_trackers/xvmc/context.c    |   18 ++++++-----
 21 files changed, 125 insertions(+), 252 deletions(-)

diff --git a/src/gallium/auxiliary/vl/vl_decoder.c b/src/gallium/auxiliary/vl/vl_decoder.c
index 16f09b5..dcbb77c 100644
--- a/src/gallium/auxiliary/vl/vl_decoder.c
+++ b/src/gallium/auxiliary/vl/vl_decoder.c
@@ -61,13 +61,10 @@ vl_level_supported(struct pipe_screen *screen, enum pipe_video_profile profile)
 
 struct pipe_video_decoder *
 vl_create_decoder(struct pipe_context *pipe,
-                  enum pipe_video_profile profile,
-                  enum pipe_video_entrypoint entrypoint,
-                  enum pipe_video_chroma_format chroma_format,
-                  unsigned width, unsigned height, unsigned max_references,
-                  bool expect_chunked_decode)
+                  const struct pipe_video_decoder *templat)
 {
-   unsigned buffer_width, buffer_height;
+   unsigned width = templat->width, height = templat->height;
+   struct pipe_video_decoder temp;
    bool pot_buffers;
 
    assert(pipe);
@@ -76,18 +73,18 @@ vl_create_decoder(struct pipe_context *pipe,
    pot_buffers = !pipe->screen->get_video_param
    (
       pipe->screen,
-      profile,
+      templat->profile,
       PIPE_VIDEO_CAP_NPOT_TEXTURES
    );
 
-   buffer_width = pot_buffers ? util_next_power_of_two(width) : align(width, VL_MACROBLOCK_WIDTH);
-   buffer_height = pot_buffers ? util_next_power_of_two(height) : align(height, VL_MACROBLOCK_HEIGHT);
+   temp = *templat;
+   temp.width = pot_buffers ? util_next_power_of_two(width) : align(width, VL_MACROBLOCK_WIDTH);
+   temp.height = pot_buffers ? util_next_power_of_two(height) : align(height, VL_MACROBLOCK_HEIGHT);
 
-   switch (u_reduce_video_profile(profile)) {
+   switch (u_reduce_video_profile(temp.profile)) {
       case PIPE_VIDEO_CODEC_MPEG12:
-         return vl_create_mpeg12_decoder(pipe, profile, entrypoint, chroma_format,
-                                         buffer_width, buffer_height, max_references,
-                                         expect_chunked_decode);
+         return vl_create_mpeg12_decoder(pipe, &temp);
+
       default:
          return NULL;
    }
diff --git a/src/gallium/auxiliary/vl/vl_decoder.h b/src/gallium/auxiliary/vl/vl_decoder.h
index b0b4161..64a1b14 100644
--- a/src/gallium/auxiliary/vl/vl_decoder.h
+++ b/src/gallium/auxiliary/vl/vl_decoder.h
@@ -48,10 +48,6 @@ vl_level_supported(struct pipe_screen *screen, enum pipe_video_profile profile);
  */
 struct pipe_video_decoder *
 vl_create_decoder(struct pipe_context *pipe,
-                  enum pipe_video_profile profile,
-                  enum pipe_video_entrypoint entrypoint,
-                  enum pipe_video_chroma_format chroma_format,
-                  unsigned width, unsigned height, unsigned max_references,
-                  bool expect_chunked_decode);
+                  const struct pipe_video_decoder *templat);
 
 #endif /* vl_decoder_h */
diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
index 1eb9708..48661cf 100644
--- a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
+++ b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
@@ -480,7 +480,7 @@ vl_mpeg12_get_decode_buffer(struct vl_mpeg12_decoder *dec, struct pipe_video_buf
    if (dec->base.entrypoint == PIPE_VIDEO_ENTRYPOINT_BITSTREAM)
       vl_mpg12_bs_init(&buffer->bs, &dec->base);
 
-   if (dec->expect_chunked_decode)
+   if (dec->base.expect_chunked_decode)
       vl_video_buffer_set_associated_data(target, &dec->base,
                                           buffer, vl_mpeg12_destroy_buffer);
    else
@@ -1018,30 +1018,21 @@ mc_frag_shader_callback(void *priv, struct vl_mc *mc,
 
 struct pipe_video_decoder *
 vl_create_mpeg12_decoder(struct pipe_context *context,
-                         enum pipe_video_profile profile,
-                         enum pipe_video_entrypoint entrypoint,
-                         enum pipe_video_chroma_format chroma_format,
-                         unsigned width, unsigned height, unsigned max_references,
-                         bool expect_chunked_decode)
+                         const struct pipe_video_decoder *templat)
 {
    const unsigned block_size_pixels = VL_BLOCK_WIDTH * VL_BLOCK_HEIGHT;
    const struct format_config *format_config;
    struct vl_mpeg12_decoder *dec;
 
-   assert(u_reduce_video_profile(profile) == PIPE_VIDEO_CODEC_MPEG12);
+   assert(u_reduce_video_profile(templat->profile) == PIPE_VIDEO_CODEC_MPEG12);
 
    dec = CALLOC_STRUCT(vl_mpeg12_decoder);
 
    if (!dec)
       return NULL;
 
+   dec->base = *templat;
    dec->base.context = context;
-   dec->base.profile = profile;
-   dec->base.entrypoint = entrypoint;
-   dec->base.chroma_format = chroma_format;
-   dec->base.width = width;
-   dec->base.height = height;
-   dec->base.max_references = max_references;
 
    dec->base.destroy = vl_mpeg12_destroy;
    dec->base.begin_frame = vl_mpeg12_begin_frame;
@@ -1053,7 +1044,6 @@ vl_create_mpeg12_decoder(struct pipe_context *context,
    dec->blocks_per_line = MAX2(util_next_power_of_two(dec->base.width) / block_size_pixels, 4);
    dec->num_blocks = (dec->base.width * dec->base.height) / block_size_pixels;
    dec->width_in_macroblocks = align(dec->base.width, VL_MACROBLOCK_WIDTH) / VL_MACROBLOCK_WIDTH;
-   dec->expect_chunked_decode = expect_chunked_decode;
 
    /* TODO: Implement 422, 444 */
    assert(dec->base.chroma_format == PIPE_VIDEO_CHROMA_FORMAT_420);
@@ -1082,7 +1072,7 @@ vl_create_mpeg12_decoder(struct pipe_context *context,
    dec->ves_ycbcr = vl_vb_get_ves_ycbcr(dec->base.context);
    dec->ves_mv = vl_vb_get_ves_mv(dec->base.context);
 
-   switch (entrypoint) {
+   switch (templat->entrypoint) {
    case PIPE_VIDEO_ENTRYPOINT_BITSTREAM:
       format_config = find_format_config(dec, bitstream_format_config, num_bitstream_format_configs);
       break;
@@ -1109,7 +1099,7 @@ vl_create_mpeg12_decoder(struct pipe_context *context,
    if (!init_zscan(dec, format_config))
       goto error_zscan;
 
-   if (entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT) {
+   if (templat->entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT) {
       if (!init_idct(dec, format_config))
          goto error_sources;
    } else {
@@ -1140,7 +1130,7 @@ error_mc_c:
    vl_mc_cleanup(&dec->mc_y);
 
 error_mc_y:
-   if (entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT) {
+   if (templat->entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT) {
       vl_idct_cleanup(&dec->idct_y);
       vl_idct_cleanup(&dec->idct_c);
       dec->idct_source->destroy(dec->idct_source);
diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.h b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.h
index 3b2d5f9..dd284ee 100644
--- a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.h
+++ b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.h
@@ -50,7 +50,6 @@ struct vl_mpeg12_decoder
    unsigned blocks_per_line;
    unsigned num_blocks;
    unsigned width_in_macroblocks;
-   bool expect_chunked_decode;
 
    enum pipe_format zscan_source_format;
 
@@ -105,10 +104,6 @@ struct vl_mpeg12_buffer
  */
 struct pipe_video_decoder *
 vl_create_mpeg12_decoder(struct pipe_context *pipe,
-                         enum pipe_video_profile profile,
-                         enum pipe_video_entrypoint entrypoint,
-                         enum pipe_video_chroma_format chroma_format,
-                         unsigned width, unsigned height, unsigned max_references,
-                         bool expect_chunked_decode);
+                         const struct pipe_video_decoder *templat);
 
 #endif /* vl_mpeg12_decoder_h */
diff --git a/src/gallium/drivers/ilo/ilo_video.c b/src/gallium/drivers/ilo/ilo_video.c
index 6d3d0a1..95305db 100644
--- a/src/gallium/drivers/ilo/ilo_video.c
+++ b/src/gallium/drivers/ilo/ilo_video.c
@@ -37,14 +37,9 @@
 
 static struct pipe_video_decoder *
 ilo_create_video_decoder(struct pipe_context *pipe,
-                         enum pipe_video_profile profile,
-                         enum pipe_video_entrypoint entrypoint,
-                         enum pipe_video_chroma_format chroma_format,
-                         unsigned width, unsigned height, unsigned max_references,
-                         bool expect_chunked_decode)
+                         const struct pipe_video_decoder *templ)
 {
-   return vl_create_decoder(pipe, profile, entrypoint, chroma_format,
-         width, height, max_references, expect_chunked_decode);
+   return vl_create_decoder(pipe, templ);
 }
 
 static struct pipe_video_buffer *
diff --git a/src/gallium/drivers/nouveau/nouveau_video.c b/src/gallium/drivers/nouveau/nouveau_video.c
index 0fdc3ce..d6ca13f 100644
--- a/src/gallium/drivers/nouveau/nouveau_video.c
+++ b/src/gallium/drivers/nouveau/nouveau_video.c
@@ -499,26 +499,23 @@ nouveau_decoder_destroy(struct pipe_video_decoder *decoder)
 
 static struct pipe_video_decoder *
 nouveau_create_decoder(struct pipe_context *context,
-                       struct nouveau_screen *screen,
-                       enum pipe_video_profile profile,
-                       enum pipe_video_entrypoint entrypoint,
-                       enum pipe_video_chroma_format chroma_format,
-                       unsigned width, unsigned height,
-                       unsigned max_references, bool expect_chunked_decode)
+                       const struct pipe_video_decoder *templ,
+                       struct nouveau_screen *screen)
 {
    struct nv04_fifo nv04_data = { .vram = 0xbeef0201, .gart = 0xbeef0202 };
+   unsigned width = templ->width, height = templ->height;
    struct nouveau_object *mpeg = NULL;
    struct nouveau_decoder *dec;
    struct nouveau_pushbuf *push;
    int ret;
    bool is8274 = screen->device->chipset > 0x80;
 
-   debug_printf("Acceleration level: %s\n", entrypoint <= PIPE_VIDEO_ENTRYPOINT_BITSTREAM ? "bit":
-                                            entrypoint == PIPE_VIDEO_ENTRYPOINT_IDCT ? "IDCT" : "MC");
+   debug_printf("Acceleration level: %s\n", templ->entrypoint <= PIPE_VIDEO_ENTRYPOINT_BITSTREAM ? "bit":
+                                            templ->entrypoint == PIPE_VIDEO_ENTRYPOINT_IDCT ? "IDCT" : "MC");
 
    if (getenv("XVMC_VL"))
       goto vl;
-   if (u_reduce_video_profile(profile) != PIPE_VIDEO_CODEC_MPEG12)
+   if (u_reduce_video_profile(templ->profile) != PIPE_VIDEO_CODEC_MPEG12)
       goto vl;
    if (screen->device->chipset >= 0x98 && screen->device->chipset != 0xa0)
       goto vl;
@@ -560,13 +557,10 @@ nouveau_create_decoder(struct pipe_context *context,
    }
 
    dec->mpeg = mpeg;
+   dec->base = *templ;
    dec->base.context = context;
-   dec->base.profile = profile;
-   dec->base.entrypoint = entrypoint;
-   dec->base.chroma_format = chroma_format;
    dec->base.width = width;
    dec->base.height = height;
-   dec->base.max_references = max_references;
    dec->base.destroy = nouveau_decoder_destroy;
    dec->base.begin_frame = nouveau_decoder_begin_frame;
    dec->base.decode_macroblock = nouveau_decoder_decode_macroblock;
@@ -616,7 +610,7 @@ nouveau_create_decoder(struct pipe_context *context,
 
    BEGIN_NV04(push, NV31_MPEG(FORMAT), 2);
    PUSH_DATA (push, 0);
-   switch (entrypoint) {
+   switch (templ->entrypoint) {
       case PIPE_VIDEO_ENTRYPOINT_BITSTREAM: PUSH_DATA (push, 0x100); break;
       case PIPE_VIDEO_ENTRYPOINT_IDCT: PUSH_DATA (push, 1); break;
       case PIPE_VIDEO_ENTRYPOINT_MC: PUSH_DATA (push, 0); break;
@@ -645,9 +639,7 @@ fail:
 
 vl:
    debug_printf("Using g3dvl renderer\n");
-   return vl_create_decoder(context, profile, entrypoint,
-                            chroma_format, width, height,
-                            max_references, expect_chunked_decode);
+   return vl_create_decoder(context, templ);
 }
 
 static struct pipe_sampler_view **
@@ -877,16 +869,10 @@ nouveau_screen_init_vdec(struct nouveau_screen *screen)
 
 static struct pipe_video_decoder *
 nouveau_context_create_decoder(struct pipe_context *context,
-                               enum pipe_video_profile profile,
-                               enum pipe_video_entrypoint entrypoint,
-                               enum pipe_video_chroma_format chroma_format,
-                               unsigned width, unsigned height,
-                               unsigned max_references, bool expect_chunked_decode)
+                               const struct pipe_video_decoder *templ)
 {
    struct nouveau_screen *screen = nouveau_context(context)->screen;
-   return nouveau_create_decoder(context, screen, profile, entrypoint,
-                                 chroma_format, width, height,
-                                 max_references, expect_chunked_decode);
+   return nouveau_create_decoder(context, templ, screen);
 }
 
 static struct pipe_video_buffer *
diff --git a/src/gallium/drivers/nv50/nv50_context.h b/src/gallium/drivers/nv50/nv50_context.h
index 52a1aa5..3c24546 100644
--- a/src/gallium/drivers/nv50/nv50_context.h
+++ b/src/gallium/drivers/nv50/nv50_context.h
@@ -292,12 +292,7 @@ void nv50_push_vbo(struct nv50_context *, const struct pipe_draw_info *);
 /* nv84_video.c */
 struct pipe_video_decoder *
 nv84_create_decoder(struct pipe_context *context,
-                    enum pipe_video_profile profile,
-                    enum pipe_video_entrypoint entrypoint,
-                    enum pipe_video_chroma_format chroma_format,
-                    unsigned width, unsigned height,
-                    unsigned max_references,
-                    bool expect_chunked_decode);
+                    const struct pipe_video_decoder *templ);
 
 struct pipe_video_buffer *
 nv84_video_buffer_create(struct pipe_context *pipe,
@@ -316,12 +311,7 @@ nv84_screen_video_supported(struct pipe_screen *screen,
 /* nv98_video.c */
 struct pipe_video_decoder *
 nv98_create_decoder(struct pipe_context *context,
-                    enum pipe_video_profile profile,
-                    enum pipe_video_entrypoint entrypoint,
-                    enum pipe_video_chroma_format chroma_format,
-                    unsigned width, unsigned height,
-                    unsigned max_references,
-                    bool expect_chunked_decode);
+                    const struct pipe_video_decoder *templ);
 
 struct pipe_video_buffer *
 nv98_video_buffer_create(struct pipe_context *pipe,
diff --git a/src/gallium/drivers/nv50/nv84_video.c b/src/gallium/drivers/nv50/nv84_video.c
index 2167b02..a9c9ab1 100644
--- a/src/gallium/drivers/nv50/nv84_video.c
+++ b/src/gallium/drivers/nv50/nv84_video.c
@@ -263,12 +263,7 @@ nv84_decoder_destroy(struct pipe_video_decoder *decoder)
 
 struct pipe_video_decoder *
 nv84_create_decoder(struct pipe_context *context,
-                    enum pipe_video_profile profile,
-                    enum pipe_video_entrypoint entrypoint,
-                    enum pipe_video_chroma_format chroma_format,
-                    unsigned width, unsigned height,
-                    unsigned max_references,
-                    bool chunked_decode)
+                    const struct pipe_video_decoder *templ)
 {
    struct nv50_context *nv50 = (struct nv50_context *)context;
    struct nouveau_screen *screen = &nv50->screen->base;
@@ -279,22 +274,20 @@ nv84_create_decoder(struct pipe_context *context,
    union pipe_color_union color;
    struct nv04_fifo nv04_data = { .vram = 0xbeef0201, .gart = 0xbeef0202 };
    int ret, i;
-   int is_h264 = u_reduce_video_profile(profile) == PIPE_VIDEO_CODEC_MPEG4_AVC;
-   int is_mpeg12 = u_reduce_video_profile(profile) == PIPE_VIDEO_CODEC_MPEG12;
+   int is_h264 = u_reduce_video_profile(templ->profile) == PIPE_VIDEO_CODEC_MPEG4_AVC;
+   int is_mpeg12 = u_reduce_video_profile(templ->profile) == PIPE_VIDEO_CODEC_MPEG12;
 
    if (getenv("XVMC_VL"))
-      return vl_create_decoder(context, profile, entrypoint,
-                               chroma_format, width, height,
-                               max_references, chunked_decode);
+      return vl_create_decoder(context, templ);
 
-   if ((is_h264 && entrypoint != PIPE_VIDEO_ENTRYPOINT_BITSTREAM) ||
-       (is_mpeg12 && entrypoint > PIPE_VIDEO_ENTRYPOINT_IDCT)) {
-      debug_printf("%x\n", entrypoint);
+   if ((is_h264 && templ->entrypoint != PIPE_VIDEO_ENTRYPOINT_BITSTREAM) ||
+       (is_mpeg12 && templ->entrypoint > PIPE_VIDEO_ENTRYPOINT_IDCT)) {
+      debug_printf("%x\n", templ->entrypoint);
       return NULL;
    }
 
    if (!is_h264 && !is_mpeg12) {
-      debug_printf("invalid profile: %x\n", profile);
+      debug_printf("invalid profile: %x\n", templ->profile);
       return NULL;
    }
 
@@ -302,13 +295,8 @@ nv84_create_decoder(struct pipe_context *context,
    if (!dec)
       return NULL;
 
+   dec->base = *templ;
    dec->base.context = context;
-   dec->base.profile = profile;
-   dec->base.entrypoint = entrypoint;
-   dec->base.chroma_format = chroma_format;
-   dec->base.width = width;
-   dec->base.height = height;
-   dec->base.max_references = max_references;
    dec->base.destroy = nv84_decoder_destroy;
    dec->base.flush = nv84_decoder_flush;
    if (is_h264) {
@@ -326,7 +314,7 @@ nv84_create_decoder(struct pipe_context *context,
       dec->base.begin_frame = nv84_decoder_begin_frame_mpeg12;
       dec->base.end_frame = nv84_decoder_end_frame_mpeg12;
 
-      if (entrypoint == PIPE_VIDEO_ENTRYPOINT_BITSTREAM) {
+      if (templ->entrypoint == PIPE_VIDEO_ENTRYPOINT_BITSTREAM) {
          dec->mpeg12_bs = CALLOC_STRUCT(vl_mpg12_bs);
          if (!dec->mpeg12_bs)
             goto fail;
@@ -409,7 +397,7 @@ nv84_create_decoder(struct pipe_context *context,
          goto fail;
       ret = nouveau_bo_new(screen->device, NOUVEAU_BO_VRAM | NOUVEAU_BO_NOSNOOP,
                            0,
-                           (max_references + 1) * dec->frame_mbs * 0x40 +
+                           (templ->max_references + 1) * dec->frame_mbs * 0x40 +
                            dec->frame_size + 0x2000,
                            NULL, &dec->mbring);
       if (ret)
@@ -433,8 +421,8 @@ nv84_create_decoder(struct pipe_context *context,
    if (is_mpeg12) {
       ret = nouveau_bo_new(screen->device, NOUVEAU_BO_GART,
                            0,
-                           align(0x20 * mb(width) * mb(height), 0x100) +
-                           (6 * 64 * 8) * mb(width) * mb(height) + 0x100,
+                           align(0x20 * mb(templ->width) * mb(templ->height), 0x100) +
+                           (6 * 64 * 8) * mb(templ->width) * mb(templ->height) + 0x100,
                            NULL, &dec->mpeg12_bo);
       if (ret)
          goto fail;
@@ -485,7 +473,7 @@ nv84_create_decoder(struct pipe_context *context,
       color.f[0] = color.f[1] = color.f[2] = color.f[3] = 0;
       surf.offset = dec->frame_size;
       surf.width = 64;
-      surf.height = (max_references + 1) * dec->frame_mbs / 4;
+      surf.height = (templ->max_references + 1) * dec->frame_mbs / 4;
       surf.depth = 1;
       surf.base.format = PIPE_FORMAT_B8G8R8A8_UNORM;
       surf.base.u.tex.level = 0;
diff --git a/src/gallium/drivers/nv50/nv98_video.c b/src/gallium/drivers/nv50/nv98_video.c
index f16fbd0..60bc79b 100644
--- a/src/gallium/drivers/nv50/nv98_video.c
+++ b/src/gallium/drivers/nv50/nv98_video.c
@@ -58,11 +58,7 @@ nv98_decoder_decode_bitstream(struct pipe_video_decoder *decoder,
 
 struct pipe_video_decoder *
 nv98_create_decoder(struct pipe_context *context,
-                    enum pipe_video_profile profile,
-                    enum pipe_video_entrypoint entrypoint,
-                    enum pipe_video_chroma_format chroma_format,
-                    unsigned width, unsigned height, unsigned max_references,
-                    bool chunked_decode)
+                    const struct pipe_video_decoder *templ)
 {
    struct nouveau_screen *screen = &((struct nv50_context *)context)->screen->base;
    struct nouveau_vp3_decoder *dec;
@@ -79,12 +75,10 @@ nv98_create_decoder(struct pipe_context *context,
    u32 tmp_size = 0;
 
    if (getenv("XVMC_VL"))
-       return vl_create_decoder(context, profile, entrypoint,
-                                chroma_format, width, height,
-                                max_references, chunked_decode);
+       return vl_create_decoder(context, templ);
 
-   if (entrypoint != PIPE_VIDEO_ENTRYPOINT_BITSTREAM) {
-      debug_printf("%x\n", entrypoint);
+   if (templ->entrypoint != PIPE_VIDEO_ENTRYPOINT_BITSTREAM) {
+      debug_printf("%x\n", templ->entrypoint);
       return NULL;
    }
 
@@ -142,13 +136,8 @@ nv98_create_decoder(struct pipe_context *context,
    for (i = 0; i < 5; i++)
       PUSH_DATA (push[2], nv04_data.vram);
 
+   dec->base = *templ;
    dec->base.context = context;
-   dec->base.profile = profile;
-   dec->base.entrypoint = entrypoint;
-   dec->base.chroma_format = chroma_format;
-   dec->base.width = width;
-   dec->base.height = height;
-   dec->base.max_references = max_references;
    dec->base.decode_bitstream = nv98_decoder_decode_bitstream;
 
    for (i = 0; i < NOUVEAU_VP3_VIDEO_QDEPTH && !ret; ++i)
@@ -162,29 +151,29 @@ nv98_create_decoder(struct pipe_context *context,
    if (ret)
       goto fail;
 
-   switch (u_reduce_video_profile(profile)) {
+   switch (u_reduce_video_profile(templ->profile)) {
    case PIPE_VIDEO_CODEC_MPEG12: {
       codec = 1;
-      assert(max_references <= 2);
+      assert(templ->max_references <= 2);
       break;
    }
    case PIPE_VIDEO_CODEC_MPEG4: {
       codec = 4;
-      tmp_size = mb(height)*16 * mb(width)*16;
-      assert(max_references <= 2);
+      tmp_size = mb(templ->height)*16 * mb(templ->width)*16;
+      assert(templ->max_references <= 2);
       break;
    }
    case PIPE_VIDEO_CODEC_VC1: {
       ppp_codec = codec = 2;
-      tmp_size = mb(height)*16 * mb(width)*16;
-      assert(max_references <= 2);
+      tmp_size = mb(templ->height)*16 * mb(templ->width)*16;
+      assert(templ->max_references <= 2);
       break;
    }
    case PIPE_VIDEO_CODEC_MPEG4_AVC: {
       codec = 3;
-      dec->tmp_stride = 16 * mb_half(width) * nouveau_vp3_video_align(height) * 3 / 2;
-      tmp_size = dec->tmp_stride * (max_references + 1);
-      assert(max_references <= 16);
+      dec->tmp_stride = 16 * mb_half(templ->width) * nouveau_vp3_video_align(templ->height) * 3 / 2;
+      tmp_size = dec->tmp_stride * (templ->max_references + 1);
+      assert(templ->max_references <= 16);
       break;
    }
    default:
@@ -197,7 +186,7 @@ nv98_create_decoder(struct pipe_context *context,
    if (ret)
       goto fail;
 
-   ret = nouveau_vp3_load_firmware(dec, profile, screen->device->chipset);
+   ret = nouveau_vp3_load_firmware(dec, templ->profile, screen->device->chipset);
    if (ret)
       goto fw_fail;
 
@@ -208,9 +197,9 @@ nv98_create_decoder(struct pipe_context *context,
          goto fail;
    }
 
-   dec->ref_stride = mb(width)*16 * (mb_half(height)*32 + nouveau_vp3_video_align(height)/2);
+   dec->ref_stride = mb(templ->width)*16 * (mb_half(templ->height)*32 + nouveau_vp3_video_align(templ->height)/2);
    ret = nouveau_bo_new(screen->device, NOUVEAU_BO_VRAM, 0,
-                        dec->ref_stride * (max_references+2) + tmp_size,
+                        dec->ref_stride * (templ->max_references+2) + tmp_size,
                         &cfg, &dec->ref_bo);
    if (ret)
       goto fail;
diff --git a/src/gallium/drivers/nvc0/nvc0_context.h b/src/gallium/drivers/nvc0/nvc0_context.h
index db6bb10..d976de6 100644
--- a/src/gallium/drivers/nvc0/nvc0_context.h
+++ b/src/gallium/drivers/nvc0/nvc0_context.h
@@ -335,12 +335,7 @@ void nvc0_idxbuf_validate(struct nvc0_context *);
 /* nvc0_video.c */
 struct pipe_video_decoder *
 nvc0_create_decoder(struct pipe_context *context,
-                    enum pipe_video_profile profile,
-                    enum pipe_video_entrypoint entrypoint,
-                    enum pipe_video_chroma_format chroma_format,
-                    unsigned width, unsigned height,
-                    unsigned max_references,
-                    bool expect_chunked_decode);
+                    const struct pipe_video_decoder *templ);
 
 struct pipe_video_buffer *
 nvc0_video_buffer_create(struct pipe_context *pipe,
diff --git a/src/gallium/drivers/nvc0/nvc0_video.c b/src/gallium/drivers/nvc0/nvc0_video.c
index 5891f09..1b2dcd1 100644
--- a/src/gallium/drivers/nvc0/nvc0_video.c
+++ b/src/gallium/drivers/nvc0/nvc0_video.c
@@ -58,11 +58,7 @@ nvc0_decoder_decode_bitstream(struct pipe_video_decoder *decoder,
 
 struct pipe_video_decoder *
 nvc0_create_decoder(struct pipe_context *context,
-                    enum pipe_video_profile profile,
-                    enum pipe_video_entrypoint entrypoint,
-                    enum pipe_video_chroma_format chroma_format,
-                    unsigned width, unsigned height, unsigned max_references,
-                    bool chunked_decode)
+                    const struct pipe_video_decoder *templ)
 {
    struct nouveau_screen *screen = &((struct nvc0_context *)context)->screen->base;
    struct nouveau_vp3_decoder *dec;
@@ -79,12 +75,10 @@ nvc0_create_decoder(struct pipe_context *context,
    u32 tmp_size = 0;
 
    if (getenv("XVMC_VL"))
-       return vl_create_decoder(context, profile, entrypoint,
-                                chroma_format, width, height,
-                                max_references, chunked_decode);
+       return vl_create_decoder(context, templ);
 
-   if (entrypoint != PIPE_VIDEO_ENTRYPOINT_BITSTREAM) {
-      debug_printf("%x\n", entrypoint);
+   if (templ->entrypoint != PIPE_VIDEO_ENTRYPOINT_BITSTREAM) {
+      debug_printf("%x\n", templ->entrypoint);
       return NULL;
    }
 
@@ -168,13 +162,8 @@ nvc0_create_decoder(struct pipe_context *context,
    BEGIN_NVC0(push[2], SUBC_PPP(NV01_SUBCHAN_OBJECT), 1);
    PUSH_DATA (push[2], dec->ppp->handle);
 
+   dec->base = *templ;
    dec->base.context = context;
-   dec->base.profile = profile;
-   dec->base.entrypoint = entrypoint;
-   dec->base.chroma_format = chroma_format;
-   dec->base.width = width;
-   dec->base.height = height;
-   dec->base.max_references = max_references;
    dec->base.decode_bitstream = nvc0_decoder_decode_bitstream;
 
    for (i = 0; i < NOUVEAU_VP3_VIDEO_QDEPTH && !ret; ++i)
@@ -194,29 +183,29 @@ nvc0_create_decoder(struct pipe_context *context,
    if (ret)
       goto fail;
 
-   switch (u_reduce_video_profile(profile)) {
+   switch (u_reduce_video_profile(templ->profile)) {
    case PIPE_VIDEO_CODEC_MPEG12: {
       codec = 1;
-      assert(max_references <= 2);
+      assert(templ->max_references <= 2);
       break;
    }
    case PIPE_VIDEO_CODEC_MPEG4: {
       codec = 4;
-      tmp_size = mb(height)*16 * mb(width)*16;
-      assert(max_references <= 2);
+      tmp_size = mb(templ->height)*16 * mb(templ->width)*16;
+      assert(templ->max_references <= 2);
       break;
    }
    case PIPE_VIDEO_CODEC_VC1: {
       ppp_codec = codec = 2;
-      tmp_size = mb(height)*16 * mb(width)*16;
-      assert(max_references <= 2);
+      tmp_size = mb(templ->height)*16 * mb(templ->width)*16;
+      assert(templ->max_references <= 2);
       break;
    }
    case PIPE_VIDEO_CODEC_MPEG4_AVC: {
       codec = 3;
-      dec->tmp_stride = 16 * mb_half(width) * nouveau_vp3_video_align(height) * 3 / 2;
-      tmp_size = dec->tmp_stride * (max_references + 1);
-      assert(max_references <= 16);
+      dec->tmp_stride = 16 * mb_half(templ->width) * nouveau_vp3_video_align(templ->height) * 3 / 2;
+      tmp_size = dec->tmp_stride * (templ->max_references + 1);
+      assert(templ->max_references <= 16);
       break;
    }
    default:
@@ -230,7 +219,7 @@ nvc0_create_decoder(struct pipe_context *context,
       if (ret)
          goto fail;
 
-      ret = nouveau_vp3_load_firmware(dec, profile, screen->device->chipset);
+      ret = nouveau_vp3_load_firmware(dec, templ->profile, screen->device->chipset);
       if (ret)
          goto fw_fail;
    }
@@ -242,9 +231,9 @@ nvc0_create_decoder(struct pipe_context *context,
          goto fail;
    }
 
-   dec->ref_stride = mb(width)*16 * (mb_half(height)*32 + nouveau_vp3_video_align(height)/2);
+   dec->ref_stride = mb(templ->width)*16 * (mb_half(templ->height)*32 + nouveau_vp3_video_align(templ->height)/2);
    ret = nouveau_bo_new(screen->device, NOUVEAU_BO_VRAM, 0,
-                        dec->ref_stride * (max_references+2) + tmp_size,
+                        dec->ref_stride * (templ->max_references+2) + tmp_size,
                         &cfg, &dec->ref_bo);
    if (ret)
       goto fail;
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index 349a6cb..eaef920 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -891,11 +891,7 @@ bool sampler_state_needs_border_color(const struct pipe_sampler_state *state);
 
 /* r600_uvd.c */
 struct pipe_video_decoder *r600_uvd_create_decoder(struct pipe_context *context,
-                                                   enum pipe_video_profile profile,
-                                                   enum pipe_video_entrypoint entrypoint,
-                                                   enum pipe_video_chroma_format chroma_format,
-                                                   unsigned width, unsigned height,
-						   unsigned max_references, bool expect_chunked_decode);
+						   const struct pipe_video_decoder *decoder);
 
 struct pipe_video_buffer *r600_video_buffer_create(struct pipe_context *pipe,
 						   const struct pipe_video_buffer *tmpl);
diff --git a/src/gallium/drivers/r600/r600_uvd.c b/src/gallium/drivers/r600/r600_uvd.c
index 3b4aa84..62c8e52 100644
--- a/src/gallium/drivers/r600/r600_uvd.c
+++ b/src/gallium/drivers/r600/r600_uvd.c
@@ -165,17 +165,11 @@ static struct radeon_winsys_cs_handle* r600_uvd_set_dtb(struct ruvd_msg *msg, st
 
 /* create decoder */
 struct pipe_video_decoder *r600_uvd_create_decoder(struct pipe_context *context,
-						   enum pipe_video_profile profile,
-						   enum pipe_video_entrypoint entrypoint,
-						   enum pipe_video_chroma_format chroma_format,
-						   unsigned width, unsigned height,
-						   unsigned max_references, bool expect_chunked_decode)
+						   const struct pipe_video_decoder *templat)
 {
 	struct r600_context *ctx = (struct r600_context *)context;
 
-	return ruvd_create_decoder(context, profile, entrypoint, chroma_format,
-			 	   width, height, max_references, expect_chunked_decode,
-				   ctx->ws, r600_uvd_set_dtb);
+	return ruvd_create_decoder(context, templat, ctx->ws, r600_uvd_set_dtb);
 }
 
 int r600_uvd_get_video_param(struct pipe_screen *screen,
diff --git a/src/gallium/drivers/radeon/radeon_uvd.c b/src/gallium/drivers/radeon/radeon_uvd.c
index e3c3dd6..55aca41 100644
--- a/src/gallium/drivers/radeon/radeon_uvd.c
+++ b/src/gallium/drivers/radeon/radeon_uvd.c
@@ -262,18 +262,16 @@ static uint32_t profile2stream_type(enum pipe_video_profile profile)
 }
 
 /* calculate size of reference picture buffer */
-static unsigned calc_dpb_size(enum pipe_video_profile profile,
-			      unsigned width, unsigned height,
-			      unsigned max_references)
+static unsigned calc_dpb_size(const struct pipe_video_decoder *templ)
 {
 	unsigned width_in_mb, height_in_mb, image_size, dpb_size;
 
 	// always align them to MB size for dpb calculation
-	width = align(width, VL_MACROBLOCK_WIDTH);
-	height = align(height, VL_MACROBLOCK_HEIGHT);
+	unsigned width = align(templ->width, VL_MACROBLOCK_WIDTH);
+	unsigned height = align(templ->height, VL_MACROBLOCK_HEIGHT);
 
 	// always one more for currently decoded picture
-	max_references += 1;
+	unsigned max_references = templ->max_references + 1;
 
 	// aligned size of a single frame
 	image_size = width * height;
@@ -284,7 +282,7 @@ static unsigned calc_dpb_size(enum pipe_video_profile profile,
 	width_in_mb = width / VL_MACROBLOCK_WIDTH;
 	height_in_mb = align(height / VL_MACROBLOCK_HEIGHT, 2);
 
-	switch (u_reduce_video_profile(profile)) {
+	switch (u_reduce_video_profile(templ->profile)) {
 	case PIPE_VIDEO_CODEC_MPEG4_AVC:
 		// the firmware seems to allways assume a minimum of ref frames
 		max_references = MAX2(NUM_H264_REFS, max_references);
@@ -819,15 +817,12 @@ static void ruvd_flush(struct pipe_video_decoder *decoder)
  * create and UVD decoder
  */
 struct pipe_video_decoder *ruvd_create_decoder(struct pipe_context *context,
-					       enum pipe_video_profile profile,
-					       enum pipe_video_entrypoint entrypoint,
-					       enum pipe_video_chroma_format chroma_format,
-					       unsigned width, unsigned height,
-					       unsigned max_references, bool expect_chunked_decode,
+					       const struct pipe_video_decoder *templ,
 					       struct radeon_winsys* ws,
 					       ruvd_set_dtb set_dtb)
 {
-	unsigned dpb_size = calc_dpb_size(profile, width, height, max_references);
+	unsigned dpb_size = calc_dpb_size(templ);
+	unsigned width = templ->width, height = templ->height;
 	struct radeon_info info;
 	struct ruvd_decoder *dec;
 	struct ruvd_msg msg;
@@ -835,12 +830,10 @@ struct pipe_video_decoder *ruvd_create_decoder(struct pipe_context *context,
 
 	ws->query_info(ws, &info);
 
-	switch(u_reduce_video_profile(profile)) {
+	switch(u_reduce_video_profile(templ->profile)) {
 	case PIPE_VIDEO_CODEC_MPEG12:
-		if (entrypoint > PIPE_VIDEO_ENTRYPOINT_BITSTREAM || info.family < CHIP_PALM)
-			return vl_create_mpeg12_decoder(context, profile, entrypoint,
-							chroma_format, width,
-							height, max_references, expect_chunked_decode);
+		if (templ->entrypoint > PIPE_VIDEO_ENTRYPOINT_BITSTREAM || info.family < CHIP_PALM)
+			return vl_create_mpeg12_decoder(context, templ);
 
 		/* fall through */
 	case PIPE_VIDEO_CODEC_MPEG4:
@@ -859,12 +852,8 @@ struct pipe_video_decoder *ruvd_create_decoder(struct pipe_context *context,
 	if (!dec)
 		return NULL;
 
+	dec->base = *templ;
 	dec->base.context = context;
-	dec->base.profile = profile;
-	dec->base.entrypoint = entrypoint;
-	dec->base.chroma_format = chroma_format;
-	dec->base.width = width;
-	dec->base.height = height;
 
 	dec->base.destroy = ruvd_destroy;
 	dec->base.begin_frame = ruvd_begin_frame;
diff --git a/src/gallium/drivers/radeon/radeon_uvd.h b/src/gallium/drivers/radeon/radeon_uvd.h
index 1e97425..82fbda4 100644
--- a/src/gallium/drivers/radeon/radeon_uvd.h
+++ b/src/gallium/drivers/radeon/radeon_uvd.h
@@ -346,11 +346,7 @@ typedef struct radeon_winsys_cs_handle* (*ruvd_set_dtb)
 
 /* create an UVD decode */
 struct pipe_video_decoder *ruvd_create_decoder(struct pipe_context *context,
-					       enum pipe_video_profile profile,
-					       enum pipe_video_entrypoint entrypoint,
-					       enum pipe_video_chroma_format chroma_format,
-					       unsigned width, unsigned height,
-					       unsigned max_references, bool expect_chunked_decode,
+					       const struct pipe_video_decoder *templat,
 					       struct radeon_winsys* ws,
 					       ruvd_set_dtb set_dtb);
 
diff --git a/src/gallium/drivers/radeonsi/radeonsi_pipe.h b/src/gallium/drivers/radeonsi/radeonsi_pipe.h
index 6fbe653..fa9e621 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_pipe.h
+++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.h
@@ -259,11 +259,7 @@ void si_init_compute_functions(struct r600_context *rctx);
 
 /* radeonsi_uvd.c */
 struct pipe_video_decoder *radeonsi_uvd_create_decoder(struct pipe_context *context,
-						       enum pipe_video_profile profile,
-						       enum pipe_video_entrypoint entrypoint,
-						       enum pipe_video_chroma_format chroma_format,
-						       unsigned width, unsigned height,
-						       unsigned max_references, bool expect_chunked_decode);
+                                                       const struct pipe_video_decoder *templ);
 
 struct pipe_video_buffer *radeonsi_video_buffer_create(struct pipe_context *pipe,
 						       const struct pipe_video_buffer *tmpl);
diff --git a/src/gallium/drivers/radeonsi/radeonsi_uvd.c b/src/gallium/drivers/radeonsi/radeonsi_uvd.c
index 015445e..d19bf33 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_uvd.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_uvd.c
@@ -147,15 +147,9 @@ static struct radeon_winsys_cs_handle* radeonsi_uvd_set_dtb(struct ruvd_msg *msg
  * creates an UVD compatible decoder
  */
 struct pipe_video_decoder *radeonsi_uvd_create_decoder(struct pipe_context *context,
-						       enum pipe_video_profile profile,
-						       enum pipe_video_entrypoint entrypoint,
-						       enum pipe_video_chroma_format chroma_format,
-						       unsigned width, unsigned height,
-						       unsigned max_references, bool expect_chunked_decode)
+						       const struct pipe_video_decoder *templ)
 {
 	struct r600_context *ctx = (struct r600_context *)context;
 
-	return ruvd_create_decoder(context, profile, entrypoint, chroma_format,
-				   width, height, max_references, expect_chunked_decode,
-				   ctx->ws, radeonsi_uvd_set_dtb);
+	return ruvd_create_decoder(context, templ, ctx->ws, radeonsi_uvd_set_dtb);
 }
diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
index aa18cbf..0ca57f4 100644
--- a/src/gallium/include/pipe/p_context.h
+++ b/src/gallium/include/pipe/p_context.h
@@ -433,11 +433,7 @@ struct pipe_context {
     * Creates a video decoder for a specific video codec/profile
     */
    struct pipe_video_decoder *(*create_video_decoder)( struct pipe_context *context,
-                                                       enum pipe_video_profile profile,
-                                                       enum pipe_video_entrypoint entrypoint,
-                                                       enum pipe_video_chroma_format chroma_format,
-                                                       unsigned width, unsigned height, unsigned max_references,
-                                                       bool expect_chunked_decode);
+                                                       const struct pipe_video_decoder *templat );
 
    /**
     * Creates a video buffer as decoding target
diff --git a/src/gallium/include/pipe/p_video_decoder.h b/src/gallium/include/pipe/p_video_decoder.h
index 5499ffa..6c9a748 100644
--- a/src/gallium/include/pipe/p_video_decoder.h
+++ b/src/gallium/include/pipe/p_video_decoder.h
@@ -53,6 +53,7 @@ struct pipe_video_decoder
    unsigned width;
    unsigned height;
    unsigned max_references;
+   bool expect_chunked_decode;
 
    /**
     * destroy this video decoder
diff --git a/src/gallium/state_trackers/vdpau/decode.c b/src/gallium/state_trackers/vdpau/decode.c
index 2ffd8dd..c0af83b 100644
--- a/src/gallium/state_trackers/vdpau/decode.c
+++ b/src/gallium/state_trackers/vdpau/decode.c
@@ -44,7 +44,7 @@ vlVdpDecoderCreate(VdpDevice device,
                    uint32_t max_references,
                    VdpDecoder *decoder)
 {
-   enum pipe_video_profile p_profile;
+   struct pipe_video_decoder templat = {};
    struct pipe_context *pipe;
    struct pipe_screen *screen;
    vlVdpDevice *dev;
@@ -59,8 +59,8 @@ vlVdpDecoderCreate(VdpDevice device,
    if (!(width && height))
       return VDP_STATUS_INVALID_VALUE;
 
-   p_profile = ProfileToPipe(profile);
-   if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN)
+   templat.profile = ProfileToPipe(profile);
+   if (templat.profile == PIPE_VIDEO_PROFILE_UNKNOWN)
       return VDP_STATUS_INVALID_DECODER_PROFILE;
 
    dev = vlGetDataHTAB(device);
@@ -75,7 +75,7 @@ vlVdpDecoderCreate(VdpDevice device,
    supported = screen->get_video_param
    (
       screen,
-      p_profile,
+      templat.profile,
       PIPE_VIDEO_CAP_SUPPORTED
    );
    if (!supported) {
@@ -91,14 +91,13 @@ vlVdpDecoderCreate(VdpDevice device,
 
    vldecoder->device = dev;
 
-   vldecoder->decoder = pipe->create_video_decoder
-   (
-      pipe, p_profile,
-      PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
-      PIPE_VIDEO_CHROMA_FORMAT_420,
-      width, height, max_references,
-      false
-   );
+   templat.entrypoint = PIPE_VIDEO_ENTRYPOINT_BITSTREAM;
+   templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
+   templat.width = width;
+   templat.height = height;
+   templat.max_references = max_references;
+
+   vldecoder->decoder = pipe->create_video_decoder(pipe, &templat);
 
    if (!vldecoder->decoder) {
       ret = VDP_STATUS_ERROR;
diff --git a/src/gallium/state_trackers/xvmc/context.c b/src/gallium/state_trackers/xvmc/context.c
index 23f9d10..d630133 100644
--- a/src/gallium/state_trackers/xvmc/context.c
+++ b/src/gallium/state_trackers/xvmc/context.c
@@ -191,6 +191,7 @@ Status XvMCCreateContext(Display *dpy, XvPortID port, int surface_type_id,
    Status ret;
    struct vl_screen *vscreen;
    struct pipe_context *pipe;
+   struct pipe_video_decoder templat = {};
    XvMCContextPrivate *context_priv;
    vl_csc_matrix csc;
 
@@ -244,14 +245,15 @@ Status XvMCCreateContext(Display *dpy, XvPortID port, int surface_type_id,
       return BadAlloc;
    }
 
-   context_priv->decoder = pipe->create_video_decoder
-   (
-      pipe, ProfileToPipe(mc_type),
-      (mc_type & XVMC_IDCT) ? PIPE_VIDEO_ENTRYPOINT_IDCT : PIPE_VIDEO_ENTRYPOINT_MC,
-      FormatToPipe(chroma_format),
-      width, height, 2,
-      true
-   );
+   templat.profile = ProfileToPipe(mc_type);
+   templat.entrypoint = (mc_type & XVMC_IDCT) ? PIPE_VIDEO_ENTRYPOINT_IDCT : PIPE_VIDEO_ENTRYPOINT_MC;
+   templat.chroma_format = FormatToPipe(chroma_format);
+   templat.width = width;
+   templat.height = height;
+   templat.max_references = 2;
+   templat.expect_chunked_decode = true;
+
+   context_priv->decoder = pipe->create_video_decoder(pipe, &templat);
 
    if (!context_priv->decoder) {
       XVMC_MSG(XVMC_ERR, "[XvMC] Could not create VL decoder.\n");
-- 
1.7.9.5



More information about the mesa-dev mailing list