decode.c revision 1eb48c5500e5b3e3319108a1cecf63524fdede0d
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"
31c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen
322471acfc4c051d480861265011fa5e77fad02887Christian König#include "vdpau_private.h"
332471acfc4c051d480861265011fa5e77fad02887Christian König
34fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
35fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Create a VdpDecoder.
36fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
37725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
3849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderCreate(VdpDevice device,
3949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpDecoderProfile profile,
4049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   uint32_t width, uint32_t height,
4149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   uint32_t max_references,
4249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpDecoder *decoder)
43725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
442471acfc4c051d480861265011fa5e77fad02887Christian König   enum pipe_video_profile p_profile;
45ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König   struct pipe_context *pipe;
461eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   struct pipe_screen *screen;
472471acfc4c051d480861265011fa5e77fad02887Christian König   vlVdpDevice *dev;
482471acfc4c051d480861265011fa5e77fad02887Christian König   vlVdpDecoder *vldecoder;
492471acfc4c051d480861265011fa5e77fad02887Christian König   VdpStatus ret;
50e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König   unsigned i;
511eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   bool supported;
52b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
5308f3a7cf7e9133f50adf33f800aa3696c909347fChristian König   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Creating decoder\n");
54b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
5549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!decoder)
5649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_POINTER;
571eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   *decoder = 0;
58b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
5949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!(width && height))
6049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_VALUE;
61b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
622471acfc4c051d480861265011fa5e77fad02887Christian König   p_profile = ProfileToPipe(profile);
632471acfc4c051d480861265011fa5e77fad02887Christian König   if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN)
642471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_INVALID_DECODER_PROFILE;
652471acfc4c051d480861265011fa5e77fad02887Christian König
662471acfc4c051d480861265011fa5e77fad02887Christian König   dev = vlGetDataHTAB(device);
672471acfc4c051d480861265011fa5e77fad02887Christian König   if (!dev)
682471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_INVALID_HANDLE;
692471acfc4c051d480861265011fa5e77fad02887Christian König
70ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König   pipe = dev->context->pipe;
711eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   screen = dev->vscreen->pscreen;
721eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   supported = screen->get_video_param
731eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   (
741eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      screen,
751eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      p_profile,
761eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      PIPE_VIDEO_CAP_SUPPORTED
771eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   );
781eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   if (!supported)
791eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      return VDP_STATUS_INVALID_DECODER_PROFILE;
80b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
81725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   vldecoder = CALLOC(1,sizeof(vlVdpDecoder));
822471acfc4c051d480861265011fa5e77fad02887Christian König   if (!vldecoder)
832471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_RESOURCES;
84b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
852471acfc4c051d480861265011fa5e77fad02887Christian König   vldecoder->device = dev;
86725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
87ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König   vldecoder->decoder = pipe->create_video_decoder
882471acfc4c051d480861265011fa5e77fad02887Christian König   (
89ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König      pipe, p_profile,
902471acfc4c051d480861265011fa5e77fad02887Christian König      PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
912471acfc4c051d480861265011fa5e77fad02887Christian König      PIPE_VIDEO_CHROMA_FORMAT_420,
9282e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange      width, height, max_references
932471acfc4c051d480861265011fa5e77fad02887Christian König   );
9482e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange
952471acfc4c051d480861265011fa5e77fad02887Christian König   if (!vldecoder->decoder) {
962471acfc4c051d480861265011fa5e77fad02887Christian König      ret = VDP_STATUS_ERROR;
972471acfc4c051d480861265011fa5e77fad02887Christian König      goto error_decoder;
982471acfc4c051d480861265011fa5e77fad02887Christian König   }
99b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
100231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   vldecoder->num_buffers = pipe->screen->get_video_param
101231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   (
102231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      pipe->screen, p_profile,
103231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      PIPE_VIDEO_CAP_NUM_BUFFERS_DESIRED
104231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   );
105e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König   vldecoder->cur_buffer = 0;
106e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König
107231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   vldecoder->buffers = CALLOC(vldecoder->num_buffers, sizeof(void*));
108231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   if (!vldecoder->buffers)
109231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König         goto error_alloc_buffers;
110231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König
111231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   for (i = 0; i < vldecoder->num_buffers; ++i) {
112231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      vldecoder->buffers[i] = vldecoder->decoder->create_buffer(vldecoder->decoder);
113231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      if (!vldecoder->buffers[i]) {
114e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König         ret = VDP_STATUS_ERROR;
115231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König         goto error_create_buffers;
116e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König      }
1172471acfc4c051d480861265011fa5e77fad02887Christian König   }
118b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
11949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   *decoder = vlAddDataHTAB(vldecoder);
12049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (*decoder == 0) {
121725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      ret = VDP_STATUS_ERROR;
1222471acfc4c051d480861265011fa5e77fad02887Christian König      goto error_handle;
12349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   }
1242471acfc4c051d480861265011fa5e77fad02887Christian König
12508f3a7cf7e9133f50adf33f800aa3696c909347fChristian König   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoder created succesfully\n");
126b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
12749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return VDP_STATUS_OK;
128b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
1292471acfc4c051d480861265011fa5e77fad02887Christian Königerror_handle:
130231fce7d630bcf6aaf0e435e461ad5af842e437fChristian Königerror_create_buffers:
131e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König
132231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   for (i = 0; i < vldecoder->num_buffers; ++i)
133231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      if (vldecoder->buffers[i])
134231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König         vldecoder->decoder->destroy_buffer(vldecoder->decoder, vldecoder->buffers[i]);
135231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König
136231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   FREE(vldecoder->buffers);
137231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König
138231fce7d630bcf6aaf0e435e461ad5af842e437fChristian Königerror_alloc_buffers:
139e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König
1402471acfc4c051d480861265011fa5e77fad02887Christian König   vldecoder->decoder->destroy(vldecoder->decoder);
1412471acfc4c051d480861265011fa5e77fad02887Christian König
1422471acfc4c051d480861265011fa5e77fad02887Christian Königerror_decoder:
14349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   FREE(vldecoder);
1442471acfc4c051d480861265011fa5e77fad02887Christian König   return ret;
145725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
146725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
147fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
148fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Destroy a VdpDecoder.
149fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
150725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
15149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderDestroy(VdpDecoder decoder)
152725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
1532471acfc4c051d480861265011fa5e77fad02887Christian König   vlVdpDecoder *vldecoder;
154e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König   unsigned i;
155d5b05a869a71147987a1c1d6c84f8df17148f031Christian König
15608f3a7cf7e9133f50adf33f800aa3696c909347fChristian König   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Destroying decoder\n");
157b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
15849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
1592471acfc4c051d480861265011fa5e77fad02887Christian König   if (!vldecoder)
160725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      return VDP_STATUS_INVALID_HANDLE;
161b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
162231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   for (i = 0; i < vldecoder->num_buffers; ++i)
163231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      if (vldecoder->buffers[i])
164231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König         vldecoder->decoder->destroy_buffer(vldecoder->decoder, vldecoder->buffers[i]);
165231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König
166231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König   FREE(vldecoder->buffers);
167e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König
1682471acfc4c051d480861265011fa5e77fad02887Christian König   vldecoder->decoder->destroy(vldecoder->decoder);
169b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
17049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   FREE(vldecoder);
171b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
17249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return VDP_STATUS_OK;
173725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
174725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
175fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
176fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Retrieve the parameters used to create a VdpBitmapSurface.
177fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
178725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
1792471acfc4c051d480861265011fa5e77fad02887Christian KönigvlVdpDecoderGetParameters(VdpDecoder decoder,
1802471acfc4c051d480861265011fa5e77fad02887Christian König                          VdpDecoderProfile *profile,
1812471acfc4c051d480861265011fa5e77fad02887Christian König                          uint32_t *width,
1822471acfc4c051d480861265011fa5e77fad02887Christian König                          uint32_t *height)
183725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
18434145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   vlVdpDecoder *vldecoder;
18534145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König
186fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoder get parameters called\n");
18734145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König
18834145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
18934145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   if (!vldecoder)
19034145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König      return VDP_STATUS_INVALID_HANDLE;
191c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange
19234145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   *profile = PipeToProfile(vldecoder->decoder->profile);
19334145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   *width = vldecoder->decoder->width;
19434145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   *height = vldecoder->decoder->height;
195c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange
19649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return VDP_STATUS_OK;
197725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
198725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
199fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
200fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a mpeg 1/2 video.
201fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
2022471acfc4c051d480861265011fa5e77fad02887Christian Königstatic VdpStatus
2037746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmericvlVdpDecoderRenderMpeg12(struct pipe_video_decoder *decoder,
2047746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmeric                         VdpPictureInfoMPEG1Or2 *picture_info,
2057746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmeric                         uint32_t bitstream_buffer_count,
2067746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmeric                         VdpBitstreamBuffer const *bitstream_buffers)
207725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
208c888fe027c338f337123de4da2de1ac73b0f7587Christian König   struct pipe_mpeg12_picture_desc picture;
2092e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   struct pipe_mpeg12_quant_matrix quant;
2102471acfc4c051d480861265011fa5e77fad02887Christian König   struct pipe_video_buffer *ref_frames[2];
211c888fe027c338f337123de4da2de1ac73b0f7587Christian König   unsigned i;
21249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
213fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG12\n");
21449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
2151d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   i = 0;
2161d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König
21749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */
2181d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   if (picture_info->forward_reference !=  VDP_INVALID_HANDLE) {
2191d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      ref_frames[i] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer;
2201d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      if (!ref_frames[i])
22149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König         return VDP_STATUS_INVALID_HANDLE;
2221d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      ++i;
22349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   }
22449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
2251d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   if (picture_info->backward_reference !=  VDP_INVALID_HANDLE) {
2261d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      ref_frames[i] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer;
2271d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      if (!ref_frames[i])
22849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König         return VDP_STATUS_INVALID_HANDLE;
2291d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      ++i;
23049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   }
23149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
2321d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   decoder->set_reference_frames(decoder, ref_frames, i);
2331d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König
234c888fe027c338f337123de4da2de1ac73b0f7587Christian König   memset(&picture, 0, sizeof(picture));
2357e1fbb360332ecac2789e28a0f3d303306f687b1Christian König   picture.base.profile = decoder->profile;
236c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.picture_coding_type = picture_info->picture_coding_type;
237c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.picture_structure = picture_info->picture_structure;
238c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.frame_pred_frame_dct = picture_info->frame_pred_frame_dct;
239c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.q_scale_type = picture_info->q_scale_type;
240c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.alternate_scan = picture_info->alternate_scan;
241c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.intra_vlc_format = picture_info->intra_vlc_format;
242c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.concealment_motion_vectors = picture_info->concealment_motion_vectors;
2432e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   picture.intra_dc_precision = picture_info->intra_dc_precision;
244c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.f_code[0][0] = picture_info->f_code[0][0] - 1;
245c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.f_code[0][1] = picture_info->f_code[0][1] - 1;
246c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.f_code[1][0] = picture_info->f_code[1][0] - 1;
247c888fe027c338f337123de4da2de1ac73b0f7587Christian König   picture.f_code[1][1] = picture_info->f_code[1][1] - 1;
248c4d47f065ae2a015a9d2e9a060d71e04d5935c2bMaarten Lankhorst   picture.num_slices = picture_info->slice_count;
249c888fe027c338f337123de4da2de1ac73b0f7587Christian König
2501d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   decoder->set_picture_parameters(decoder, &picture.base);
251c888fe027c338f337123de4da2de1ac73b0f7587Christian König
2522e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   memset(&quant, 0, sizeof(quant));
2532e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   quant.base.codec = PIPE_VIDEO_CODEC_MPEG12;
2542e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   quant.intra_matrix = picture_info->intra_quantizer_matrix;
2552e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   quant.non_intra_matrix = picture_info->non_intra_quantizer_matrix;
2562e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König
2572e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König   decoder->set_quant_matrix(decoder, &quant.base);
258b4fa7db65639322ae8dea19a23c9cc8234a3d7e1Christian König
2591d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   decoder->begin_frame(decoder);
260c888fe027c338f337123de4da2de1ac73b0f7587Christian König
2611d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König   for (i = 0; i < bitstream_buffer_count; ++i)
2621d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      decoder->decode_bitstream(decoder, bitstream_buffers[i].bitstream_bytes,
263d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König                                bitstream_buffers[i].bitstream);
26449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
265d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König   decoder->end_frame(decoder);
26649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
2672471acfc4c051d480861265011fa5e77fad02887Christian König   return VDP_STATUS_OK;
26838bd8131776879e9dc90d06848657756a4a13a66Christian König}
26938bd8131776879e9dc90d06848657756a4a13a66Christian König
270fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
271fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a compressed field/frame and render the result into a VdpVideoSurface.
272fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
27338bd8131776879e9dc90d06848657756a4a13a66Christian KönigVdpStatus
27449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderRender(VdpDecoder decoder,
27549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpVideoSurface target,
27649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpPictureInfo const *picture_info,
27749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   uint32_t bitstream_buffer_count,
27849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpBitstreamBuffer const *bitstream_buffers)
279725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
28049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vlVdpDecoder *vldecoder;
28149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vlVdpSurface *vlsurf;
28249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
28308f3a7cf7e9133f50adf33f800aa3696c909347fChristian König   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding\n");
28449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
28549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!(picture_info && bitstream_buffers))
28649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_POINTER;
28749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
28849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
28949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!vldecoder)
29049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_HANDLE;
29149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
29249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vlsurf = (vlVdpSurface *)vlGetDataHTAB(target);
29349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!vlsurf)
29449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_HANDLE;
29549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
29649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (vlsurf->device != vldecoder->device)
29749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
29849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
2992471acfc4c051d480861265011fa5e77fad02887Christian König   if (vlsurf->video_buffer->chroma_format != vldecoder->decoder->chroma_format)
3002471acfc4c051d480861265011fa5e77fad02887Christian König      // TODO: Recreate decoder with correct chroma
3012471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_INVALID_CHROMA_TYPE;
30249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
303fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange   // TODO: Right now only mpeg 1 & 2 videos are supported.
304c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange   switch (vldecoder->decoder->profile) {
3057746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmeric   case PIPE_VIDEO_PROFILE_MPEG1:
30649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
30749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
308e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König      ++vldecoder->cur_buffer;
309231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      vldecoder->cur_buffer %= vldecoder->num_buffers;
3101d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König
311231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König      vldecoder->decoder->set_decode_buffer(vldecoder->decoder, vldecoder->buffers[vldecoder->cur_buffer]);
3121d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      vldecoder->decoder->set_decode_target(vldecoder->decoder, vlsurf->video_buffer);
3131d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König
3141d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König      return vlVdpDecoderRenderMpeg12(vldecoder->decoder, (VdpPictureInfoMPEG1Or2 *)picture_info,
3151d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König                                      bitstream_buffer_count, bitstream_buffers);
31649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      break;
3172471acfc4c051d480861265011fa5e77fad02887Christian König
31849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   default:
31949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_DECODER_PROFILE;
32049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   }
321b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König}
322