decode.c revision eadbcb221db16af96aa6c3f40d48896d23d9eebc
1c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen/**************************************************************************
2c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen *
3c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * Copyright 2010 Thomas Balling Sørensen.
4c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * All Rights Reserved.
5c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen *
6c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * Permission is hereby granted, free of charge, to any person obtaining a
7c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * copy of this software and associated documentation files (the
8c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * "Software"), to deal in the Software without restriction, including
9c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * without limitation the rights to use, copy, modify, merge, publish,
10c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * distribute, sub license, and/or sell copies of the Software, and to
11c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * permit persons to whom the Software is furnished to do so, subject to
12c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * the following conditions:
13c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen *
14c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * The above copyright notice and this permission notice (including the
15c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * next paragraph) shall be included in all copies or substantial portions
16c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * of the Software.
17c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen *
18c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen *
26c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen **************************************************************************/
27c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen
2828f8ff6b622d63e8ffe322ab2cdf5197941f1a40Kai Wasserbäch#include "util/u_memory.h"
2928f8ff6b622d63e8ffe322ab2cdf5197941f1a40Kai Wasserbäch#include "util/u_math.h"
3028f8ff6b622d63e8ffe322ab2cdf5197941f1a40Kai Wasserbäch#include "util/u_debug.h"
3112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst#include "util/u_video.h"
32c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen
332471acfc4c051d480861265011fa5e77fad02887Christian König#include "vdpau_private.h"
342471acfc4c051d480861265011fa5e77fad02887Christian König
35fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
36fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Create a VdpDecoder.
37fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
38725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
3949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderCreate(VdpDevice device,
4049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpDecoderProfile profile,
4149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   uint32_t width, uint32_t height,
4249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   uint32_t max_references,
4349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpDecoder *decoder)
44725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
452471acfc4c051d480861265011fa5e77fad02887Christian König   enum pipe_video_profile p_profile;
46ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König   struct pipe_context *pipe;
471eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   struct pipe_screen *screen;
482471acfc4c051d480861265011fa5e77fad02887Christian König   vlVdpDevice *dev;
492471acfc4c051d480861265011fa5e77fad02887Christian König   vlVdpDecoder *vldecoder;
502471acfc4c051d480861265011fa5e77fad02887Christian König   VdpStatus ret;
51e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König   unsigned i;
521eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   bool supported;
53b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
5408f3a7cf7e9133f50adf33f800aa3696c909347fChristian König   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Creating decoder\n");
55b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
5649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!decoder)
5749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_POINTER;
581eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   *decoder = 0;
59b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
6049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!(width && height))
6149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_VALUE;
62b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
632471acfc4c051d480861265011fa5e77fad02887Christian König   p_profile = ProfileToPipe(profile);
642471acfc4c051d480861265011fa5e77fad02887Christian König   if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN)
652471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_INVALID_DECODER_PROFILE;
662471acfc4c051d480861265011fa5e77fad02887Christian König
672471acfc4c051d480861265011fa5e77fad02887Christian König   dev = vlGetDataHTAB(device);
682471acfc4c051d480861265011fa5e77fad02887Christian König   if (!dev)
692471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_INVALID_HANDLE;
702471acfc4c051d480861265011fa5e77fad02887Christian König
71ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König   pipe = dev->context->pipe;
721eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   screen = dev->vscreen->pscreen;
731eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   supported = screen->get_video_param
741eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   (
751eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      screen,
761eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      p_profile,
771eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      PIPE_VIDEO_CAP_SUPPORTED
781eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   );
791eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   if (!supported)
801eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      return VDP_STATUS_INVALID_DECODER_PROFILE;
81b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
82725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   vldecoder = CALLOC(1,sizeof(vlVdpDecoder));
832471acfc4c051d480861265011fa5e77fad02887Christian König   if (!vldecoder)
842471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_RESOURCES;
85b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
862471acfc4c051d480861265011fa5e77fad02887Christian König   vldecoder->device = dev;
87725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
88ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König   vldecoder->decoder = pipe->create_video_decoder
892471acfc4c051d480861265011fa5e77fad02887Christian König   (
90ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König      pipe, p_profile,
912471acfc4c051d480861265011fa5e77fad02887Christian König      PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
922471acfc4c051d480861265011fa5e77fad02887Christian König      PIPE_VIDEO_CHROMA_FORMAT_420,
9382e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange      width, height, max_references
942471acfc4c051d480861265011fa5e77fad02887Christian König   );
9582e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange
962471acfc4c051d480861265011fa5e77fad02887Christian König   if (!vldecoder->decoder) {
972471acfc4c051d480861265011fa5e77fad02887Christian König      ret = VDP_STATUS_ERROR;
982471acfc4c051d480861265011fa5e77fad02887Christian König      goto error_decoder;
992471acfc4c051d480861265011fa5e77fad02887Christian König   }
100b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
101231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   vldecoder->num_buffers = pipe->screen->get_video_param
102231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   (
103231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      pipe->screen, p_profile,
104231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      PIPE_VIDEO_CAP_NUM_BUFFERS_DESIRED
105231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   );
106e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König   vldecoder->cur_buffer = 0;
107e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König
108231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   vldecoder->buffers = CALLOC(vldecoder->num_buffers, sizeof(void*));
109231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   if (!vldecoder->buffers)
110231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König         goto error_alloc_buffers;
111231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König
112231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   for (i = 0; i < vldecoder->num_buffers; ++i) {
113231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      vldecoder->buffers[i] = vldecoder->decoder->create_buffer(vldecoder->decoder);
114231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      if (!vldecoder->buffers[i]) {
115e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König         ret = VDP_STATUS_ERROR;
116231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König         goto error_create_buffers;
117e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König      }
1182471acfc4c051d480861265011fa5e77fad02887Christian König   }
119b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
12049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   *decoder = vlAddDataHTAB(vldecoder);
12149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (*decoder == 0) {
122725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      ret = VDP_STATUS_ERROR;
1232471acfc4c051d480861265011fa5e77fad02887Christian König      goto error_handle;
12449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   }
1252471acfc4c051d480861265011fa5e77fad02887Christian König
12608f3a7cf7e9133f50adf33f800aa3696c909347fChristian König   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoder created succesfully\n");
127b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
12849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return VDP_STATUS_OK;
129b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
1302471acfc4c051d480861265011fa5e77fad02887Christian Königerror_handle:
131231fce7d630bcf6aaf0e435e461ad5af842e437fChristian Königerror_create_buffers:
132e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König
133231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   for (i = 0; i < vldecoder->num_buffers; ++i)
134231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      if (vldecoder->buffers[i])
135231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König         vldecoder->decoder->destroy_buffer(vldecoder->decoder, vldecoder->buffers[i]);
136231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König
137231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   FREE(vldecoder->buffers);
138231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König
139231fce7d630bcf6aaf0e435e461ad5af842e437fChristian Königerror_alloc_buffers:
140e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König
1412471acfc4c051d480861265011fa5e77fad02887Christian König   vldecoder->decoder->destroy(vldecoder->decoder);
1422471acfc4c051d480861265011fa5e77fad02887Christian König
1432471acfc4c051d480861265011fa5e77fad02887Christian Königerror_decoder:
14449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   FREE(vldecoder);
1452471acfc4c051d480861265011fa5e77fad02887Christian König   return ret;
146725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
147725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
148fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
149fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Destroy a VdpDecoder.
150fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
151725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
15249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderDestroy(VdpDecoder decoder)
153725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
1542471acfc4c051d480861265011fa5e77fad02887Christian König   vlVdpDecoder *vldecoder;
155e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König   unsigned i;
156d5b05a869a71147987a1c1d6c84f8df17148f031Christian König
15708f3a7cf7e9133f50adf33f800aa3696c909347fChristian König   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Destroying decoder\n");
158b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
15949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
1602471acfc4c051d480861265011fa5e77fad02887Christian König   if (!vldecoder)
161725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      return VDP_STATUS_INVALID_HANDLE;
162b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
163231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   for (i = 0; i < vldecoder->num_buffers; ++i)
164231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      if (vldecoder->buffers[i])
165231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König         vldecoder->decoder->destroy_buffer(vldecoder->decoder, vldecoder->buffers[i]);
166231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König
167231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   FREE(vldecoder->buffers);
168e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König
1692471acfc4c051d480861265011fa5e77fad02887Christian König   vldecoder->decoder->destroy(vldecoder->decoder);
170b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
17149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   FREE(vldecoder);
172b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
17349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return VDP_STATUS_OK;
174725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
175725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
176fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
177fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Retrieve the parameters used to create a VdpBitmapSurface.
178fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
179725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
1802471acfc4c051d480861265011fa5e77fad02887Christian KönigvlVdpDecoderGetParameters(VdpDecoder decoder,
1812471acfc4c051d480861265011fa5e77fad02887Christian König                          VdpDecoderProfile *profile,
1822471acfc4c051d480861265011fa5e77fad02887Christian König                          uint32_t *width,
1832471acfc4c051d480861265011fa5e77fad02887Christian König                          uint32_t *height)
184725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
18534145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   vlVdpDecoder *vldecoder;
18634145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König
187fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoder get parameters called\n");
18834145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König
18934145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
19034145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   if (!vldecoder)
19134145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König      return VDP_STATUS_INVALID_HANDLE;
192c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange
19334145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   *profile = PipeToProfile(vldecoder->decoder->profile);
19434145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   *width = vldecoder->decoder->width;
19534145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   *height = vldecoder->decoder->height;
196c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange
19749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return VDP_STATUS_OK;
198725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
199725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
200fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
201fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a mpeg 1/2 video.
202fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
2032471acfc4c051d480861265011fa5e77fad02887Christian Königstatic VdpStatus
2047746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmericvlVdpDecoderRenderMpeg12(struct pipe_video_decoder *decoder,
20512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst                         VdpPictureInfoMPEG1Or2 *picture_info)
206725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
207c888fe027c338f337123de4da2de1ac73b0f7587Christian König   struct pipe_mpeg12_picture_desc picture;
2082e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   struct pipe_mpeg12_quant_matrix quant;
2092471acfc4c051d480861265011fa5e77fad02887Christian König   struct pipe_video_buffer *ref_frames[2];
210c888fe027c338f337123de4da2de1ac73b0f7587Christian König   unsigned i;
21149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
212fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG12\n");
21349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
2141d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   i = 0;
2151d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König
21649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */
2171d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   if (picture_info->forward_reference !=  VDP_INVALID_HANDLE) {
2181d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      ref_frames[i] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer;
2191d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      if (!ref_frames[i])
22049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König         return VDP_STATUS_INVALID_HANDLE;
2211d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      ++i;
22249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   }
22349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
2241d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   if (picture_info->backward_reference !=  VDP_INVALID_HANDLE) {
2251d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      ref_frames[i] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer;
2261d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      if (!ref_frames[i])
22749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König         return VDP_STATUS_INVALID_HANDLE;
2281d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      ++i;
22949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   }
23049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
2311d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   decoder->set_reference_frames(decoder, ref_frames, i);
2321d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König
233c888fe027c338f337123de4da2de1ac73b0f7587Christian König   memset(&picture, 0, sizeof(picture));
2347e1fbb360332ecac2789e28a0f3d303306f687b1Christian König   picture.base.profile = decoder->profile;
235c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.picture_coding_type = picture_info->picture_coding_type;
236c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.picture_structure = picture_info->picture_structure;
237c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.frame_pred_frame_dct = picture_info->frame_pred_frame_dct;
238c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.q_scale_type = picture_info->q_scale_type;
239c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.alternate_scan = picture_info->alternate_scan;
240c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.intra_vlc_format = picture_info->intra_vlc_format;
241c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.concealment_motion_vectors = picture_info->concealment_motion_vectors;
2422e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   picture.intra_dc_precision = picture_info->intra_dc_precision;
243c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.f_code[0][0] = picture_info->f_code[0][0] - 1;
244c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.f_code[0][1] = picture_info->f_code[0][1] - 1;
245c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.f_code[1][0] = picture_info->f_code[1][0] - 1;
246c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.f_code[1][1] = picture_info->f_code[1][1] - 1;
247c4d47f065ae2a015a9d2e9a060d71e04d5935c2bMaarten Lankhorst   picture.num_slices = picture_info->slice_count;
248c888fe027c338f337123de4da2de1ac73b0f7587Christian König
2491d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   decoder->set_picture_parameters(decoder, &picture.base);
250c888fe027c338f337123de4da2de1ac73b0f7587Christian König
2512e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   memset(&quant, 0, sizeof(quant));
2522e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   quant.base.codec = PIPE_VIDEO_CODEC_MPEG12;
2532e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   quant.intra_matrix = picture_info->intra_quantizer_matrix;
2542e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   quant.non_intra_matrix = picture_info->non_intra_quantizer_matrix;
2552e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König
2562e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   decoder->set_quant_matrix(decoder, &quant.base);
25712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   return VDP_STATUS_OK;
25812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst}
25912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst
26012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst/**
261eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst * Decode a mpeg 4 video.
26212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst */
26312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorststatic VdpStatus
26412bf452945ae64da69f474298758f9a7c8b94af5Maarten LankhorstvlVdpDecoderRenderMpeg4(struct pipe_video_decoder *decoder,
26512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst                         VdpPictureInfoMPEG4Part2 *picture_info)
26612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst{
26712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   struct pipe_mpeg4_picture_desc picture;
26812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   struct pipe_mpeg4_quant_matrix quant;
26912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   struct pipe_video_buffer *ref_frames[2] = {};
27012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   unsigned i;
271b4fa7db65639322ae8dea19a23c9cc8234a3d7e1Christian König
27212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG4\n");
273c888fe027c338f337123de4da2de1ac73b0f7587Christian König
27412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */
27512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   if (picture_info->forward_reference !=  VDP_INVALID_HANDLE) {
27612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      ref_frames[0] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer;
27712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      if (!ref_frames[0])
27812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst         return VDP_STATUS_INVALID_HANDLE;
27912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   }
28012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst
28112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   if (picture_info->backward_reference !=  VDP_INVALID_HANDLE) {
28212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      ref_frames[1] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer;
28312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      if (!ref_frames[1])
28412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst         return VDP_STATUS_INVALID_HANDLE;
28512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   }
28612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   decoder->set_reference_frames(decoder, ref_frames, 2);
28749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
28812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   memset(&picture, 0, sizeof(picture));
28912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   picture.base.profile = decoder->profile;
29012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   for (i = 0; i < 2; ++i) {
29112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      picture.trd[i] = picture_info->trd[i];
29212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      picture.trb[i] = picture_info->trb[i];
29312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   }
29412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   picture.vop_time_increment_resolution = picture_info->vop_time_increment_resolution;
29512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   picture.vop_coding_type = picture_info->vop_coding_type;
29612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   picture.vop_fcode_forward = picture_info->vop_fcode_forward;
29712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   picture.vop_fcode_backward = picture_info->vop_fcode_backward;
29812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   picture.resync_marker_disable = picture_info->resync_marker_disable;
29912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   picture.interlaced = picture_info->interlaced;
30012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   picture.quant_type = picture_info->quant_type;
30112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   picture.quarter_sample = picture_info->quarter_sample;
30212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   picture.short_video_header = picture_info->short_video_header;
30312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   picture.rounding_control = picture_info->rounding_control;
30412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   picture.alternate_vertical_scan_flag = picture_info->alternate_vertical_scan_flag;
30512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   picture.top_field_first = picture_info->top_field_first;
30612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   decoder->set_picture_parameters(decoder, &picture.base);
30749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
30812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   memset(&quant, 0, sizeof(quant));
30912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   quant.base.codec = PIPE_VIDEO_CODEC_MPEG4;
31012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   quant.intra_matrix = picture_info->intra_quantizer_matrix;
31112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   quant.non_intra_matrix = picture_info->non_intra_quantizer_matrix;
31212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   decoder->set_quant_matrix(decoder, &quant.base);
3132471acfc4c051d480861265011fa5e77fad02887Christian König   return VDP_STATUS_OK;
31438bd8131776879e9dc90d06848657756a4a13a66Christian König}
31538bd8131776879e9dc90d06848657756a4a13a66Christian König
316eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorststatic VdpStatus
317eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten LankhorstvlVdpDecoderRenderVC1(struct pipe_video_decoder *decoder,
318eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst                      VdpPictureInfoVC1 *picture_info)
319eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst{
320eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   struct pipe_vc1_picture_desc picture;
321eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   struct pipe_video_buffer *ref_frames[2] = {};
322eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   unsigned i;
323eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst
324eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding VC-1\n");
325eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst
326eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */
327eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   if (picture_info->forward_reference !=  VDP_INVALID_HANDLE) {
328eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst      ref_frames[0] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer;
329eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst      if (!ref_frames[0])
330eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst         return VDP_STATUS_INVALID_HANDLE;
331eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   }
332eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst
333eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   if (picture_info->backward_reference !=  VDP_INVALID_HANDLE) {
334eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst      ref_frames[1] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer;
335eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst      if (!ref_frames[1])
336eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst         return VDP_STATUS_INVALID_HANDLE;
337eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   }
338eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   decoder->set_reference_frames(decoder, ref_frames, 2);
339eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst
340eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   memset(&picture, 0, sizeof(picture));
341eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.base.profile = decoder->profile;
342eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.slice_count = picture_info->slice_count;
343eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.picture_type = picture_info->picture_type;
344eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.frame_coding_mode = picture_info->frame_coding_mode;
345eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.postprocflag = picture_info->postprocflag;
346eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.pulldown = picture_info->pulldown;
347eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.interlace = picture_info->interlace;
348eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.tfcntrflag = picture_info->tfcntrflag;
349eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.finterpflag = picture_info->finterpflag;
350eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.psf = picture_info->psf;
351eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.dquant = picture_info->dquant;
352eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.panscan_flag = picture_info->panscan_flag;
353eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.refdist_flag = picture_info->refdist_flag;
354eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.quantizer = picture_info->quantizer;
355eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.extended_mv = picture_info->extended_mv;
356eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.extended_dmv = picture_info->extended_dmv;
357eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.overlap = picture_info->overlap;
358eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.vstransform = picture_info->vstransform;
359eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.loopfilter = picture_info->loopfilter;
360eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.fastuvmc = picture_info->fastuvmc;
361eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.range_mapy_flag = picture_info->range_mapy_flag;
362eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.range_mapy = picture_info->range_mapy;
363eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.range_mapuv_flag = picture_info->range_mapuv_flag;
364eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.range_mapuv = picture_info->range_mapuv;
365eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.multires = picture_info->multires;
366eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.syncmarker = picture_info->syncmarker;
367eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.rangered = picture_info->rangered;
368eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.maxbframes = picture_info->maxbframes;
369eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.deblockEnable = picture_info->deblockEnable;
370eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   picture.pquant = picture_info->pquant;
371eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   decoder->set_picture_parameters(decoder, &picture.base);
372eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   return VDP_STATUS_OK;
373eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst}
374eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst
375fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
376fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a compressed field/frame and render the result into a VdpVideoSurface.
377fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
37838bd8131776879e9dc90d06848657756a4a13a66Christian KönigVdpStatus
37949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderRender(VdpDecoder decoder,
38049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpVideoSurface target,
38149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpPictureInfo const *picture_info,
38249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   uint32_t bitstream_buffer_count,
38349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpBitstreamBuffer const *bitstream_buffers)
384725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
38549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vlVdpDecoder *vldecoder;
38649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vlVdpSurface *vlsurf;
38712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   VdpStatus ret;
38812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   struct pipe_video_decoder *dec;
38912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   unsigned i;
39049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
39108f3a7cf7e9133f50adf33f800aa3696c909347fChristian König   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding\n");
39249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
39349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!(picture_info && bitstream_buffers))
39449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_POINTER;
39549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
39649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
39749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!vldecoder)
39849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_HANDLE;
39912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   dec = vldecoder->decoder;
40049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
40149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vlsurf = (vlVdpSurface *)vlGetDataHTAB(target);
40249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!vlsurf)
40349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_HANDLE;
40449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
40549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (vlsurf->device != vldecoder->device)
40649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
40749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
40812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   if (vlsurf->video_buffer->chroma_format != dec->chroma_format)
4092471acfc4c051d480861265011fa5e77fad02887Christian König      // TODO: Recreate decoder with correct chroma
4102471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_INVALID_CHROMA_TYPE;
41149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
41212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   ++vldecoder->cur_buffer;
41312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   vldecoder->cur_buffer %= vldecoder->num_buffers;
4141d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König
41512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   dec->set_decode_buffer(dec, vldecoder->buffers[vldecoder->cur_buffer]);
41612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   dec->set_decode_target(dec, vlsurf->video_buffer);
4171d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König
41812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   switch (u_reduce_video_profile(dec->profile)) {
41912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   case PIPE_VIDEO_CODEC_MPEG12:
42012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      ret = vlVdpDecoderRenderMpeg12(dec, (VdpPictureInfoMPEG1Or2 *)picture_info);
42112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      break;
42212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   case PIPE_VIDEO_CODEC_MPEG4:
42312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      ret = vlVdpDecoderRenderMpeg4(dec, (VdpPictureInfoMPEG4Part2 *)picture_info);
42449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      break;
425eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   case PIPE_VIDEO_CODEC_VC1:
426eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst      ret = vlVdpDecoderRenderVC1(dec, (VdpPictureInfoVC1 *)picture_info);
427eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst      break;
42849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   default:
42949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_DECODER_PROFILE;
43049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   }
43112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   if (ret != VDP_STATUS_OK)
43212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      return ret;
43312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst
43412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   dec->begin_frame(dec);
43512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   for (i = 0; i < bitstream_buffer_count; ++i)
43612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      dec->decode_bitstream(dec, bitstream_buffers[i].bitstream_bytes,
43712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst                                           bitstream_buffers[i].bitstream);
43812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   dec->end_frame(dec);
43912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   return ret;
440b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König}
441