decode.c revision 05579339c0da442669ea75749651e8cf4f9ec39b
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;
511eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   bool supported;
52b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
5349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!decoder)
5449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_POINTER;
551eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   *decoder = 0;
56b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
5749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!(width && height))
5849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_VALUE;
59b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
602471acfc4c051d480861265011fa5e77fad02887Christian König   p_profile = ProfileToPipe(profile);
612471acfc4c051d480861265011fa5e77fad02887Christian König   if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN)
622471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_INVALID_DECODER_PROFILE;
632471acfc4c051d480861265011fa5e77fad02887Christian König
642471acfc4c051d480861265011fa5e77fad02887Christian König   dev = vlGetDataHTAB(device);
652471acfc4c051d480861265011fa5e77fad02887Christian König   if (!dev)
662471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_INVALID_HANDLE;
672471acfc4c051d480861265011fa5e77fad02887Christian König
681448e829e86981e6144410ba6a3d0f16357fb2b3Christian König   pipe = dev->context;
691eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   screen = dev->vscreen->pscreen;
7005579339c0da442669ea75749651e8cf4f9ec39bChristian König
7105579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_lock(dev->mutex);
7205579339c0da442669ea75749651e8cf4f9ec39bChristian König
731eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   supported = screen->get_video_param
741eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   (
751eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      screen,
761eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      p_profile,
771eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      PIPE_VIDEO_CAP_SUPPORTED
781eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   );
7905579339c0da442669ea75749651e8cf4f9ec39bChristian König   if (!supported) {
8005579339c0da442669ea75749651e8cf4f9ec39bChristian König      pipe_mutex_unlock(dev->mutex);
811eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      return VDP_STATUS_INVALID_DECODER_PROFILE;
8205579339c0da442669ea75749651e8cf4f9ec39bChristian König   }
83b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
84725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   vldecoder = CALLOC(1,sizeof(vlVdpDecoder));
8505579339c0da442669ea75749651e8cf4f9ec39bChristian König   if (!vldecoder) {
8605579339c0da442669ea75749651e8cf4f9ec39bChristian König      pipe_mutex_unlock(dev->mutex);
872471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_RESOURCES;
8805579339c0da442669ea75749651e8cf4f9ec39bChristian König   }
89b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
902471acfc4c051d480861265011fa5e77fad02887Christian König   vldecoder->device = dev;
91725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
92ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König   vldecoder->decoder = pipe->create_video_decoder
932471acfc4c051d480861265011fa5e77fad02887Christian König   (
94ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König      pipe, p_profile,
952471acfc4c051d480861265011fa5e77fad02887Christian König      PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
962471acfc4c051d480861265011fa5e77fad02887Christian König      PIPE_VIDEO_CHROMA_FORMAT_420,
978c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König      width, height, max_references,
988c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König      false
992471acfc4c051d480861265011fa5e77fad02887Christian König   );
10082e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange
1012471acfc4c051d480861265011fa5e77fad02887Christian König   if (!vldecoder->decoder) {
1022471acfc4c051d480861265011fa5e77fad02887Christian König      ret = VDP_STATUS_ERROR;
1032471acfc4c051d480861265011fa5e77fad02887Christian König      goto error_decoder;
1042471acfc4c051d480861265011fa5e77fad02887Christian König   }
105b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
10649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   *decoder = vlAddDataHTAB(vldecoder);
10749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (*decoder == 0) {
108725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      ret = VDP_STATUS_ERROR;
1092471acfc4c051d480861265011fa5e77fad02887Christian König      goto error_handle;
11049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   }
11105579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(dev->mutex);
1122471acfc4c051d480861265011fa5e77fad02887Christian König
11349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return VDP_STATUS_OK;
114b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
1152471acfc4c051d480861265011fa5e77fad02887Christian Königerror_handle:
1162471acfc4c051d480861265011fa5e77fad02887Christian König   vldecoder->decoder->destroy(vldecoder->decoder);
1172471acfc4c051d480861265011fa5e77fad02887Christian König
1182471acfc4c051d480861265011fa5e77fad02887Christian Königerror_decoder:
11905579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(dev->mutex);
12049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   FREE(vldecoder);
1212471acfc4c051d480861265011fa5e77fad02887Christian König   return ret;
122725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
123725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
124fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
125fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Destroy a VdpDecoder.
126fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
127725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
12849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderDestroy(VdpDecoder decoder)
129725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
1302471acfc4c051d480861265011fa5e77fad02887Christian König   vlVdpDecoder *vldecoder;
131d5b05a869a71147987a1c1d6c84f8df17148f031Christian König
13249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
1332471acfc4c051d480861265011fa5e77fad02887Christian König   if (!vldecoder)
134725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      return VDP_STATUS_INVALID_HANDLE;
135b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
13605579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_lock(vldecoder->device->mutex);
1372471acfc4c051d480861265011fa5e77fad02887Christian König   vldecoder->decoder->destroy(vldecoder->decoder);
13805579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(vldecoder->device->mutex);
139b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
14049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   FREE(vldecoder);
141b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
14249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return VDP_STATUS_OK;
143725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
144725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
145fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
146fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Retrieve the parameters used to create a VdpBitmapSurface.
147fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
148725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
1492471acfc4c051d480861265011fa5e77fad02887Christian KönigvlVdpDecoderGetParameters(VdpDecoder decoder,
1502471acfc4c051d480861265011fa5e77fad02887Christian König                          VdpDecoderProfile *profile,
1512471acfc4c051d480861265011fa5e77fad02887Christian König                          uint32_t *width,
1522471acfc4c051d480861265011fa5e77fad02887Christian König                          uint32_t *height)
153725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
15434145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   vlVdpDecoder *vldecoder;
15534145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König
15634145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
15734145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   if (!vldecoder)
15834145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König      return VDP_STATUS_INVALID_HANDLE;
159c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange
16034145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   *profile = PipeToProfile(vldecoder->decoder->profile);
16134145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   *width = vldecoder->decoder->width;
16234145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   *height = vldecoder->decoder->height;
163c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange
16449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return VDP_STATUS_OK;
165725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
166725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
1678ea416f35de0c664ef47b71841756758f22d7faaChristian Königstatic VdpStatus
1688ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpGetReferenceFrame(VdpVideoSurface handle, struct pipe_video_buffer **ref_frame)
1698ea416f35de0c664ef47b71841756758f22d7faaChristian König{
1708ea416f35de0c664ef47b71841756758f22d7faaChristian König   vlVdpSurface *surface;
1718ea416f35de0c664ef47b71841756758f22d7faaChristian König
1728ea416f35de0c664ef47b71841756758f22d7faaChristian König   /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */
1738ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (handle ==  VDP_INVALID_HANDLE) {
1748ea416f35de0c664ef47b71841756758f22d7faaChristian König      *ref_frame = NULL;
1758ea416f35de0c664ef47b71841756758f22d7faaChristian König      return VDP_STATUS_OK;
1768ea416f35de0c664ef47b71841756758f22d7faaChristian König   }
1778ea416f35de0c664ef47b71841756758f22d7faaChristian König
1788ea416f35de0c664ef47b71841756758f22d7faaChristian König   surface = vlGetDataHTAB(handle);
1798ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (!surface)
1808ea416f35de0c664ef47b71841756758f22d7faaChristian König      return VDP_STATUS_INVALID_HANDLE;
1818ea416f35de0c664ef47b71841756758f22d7faaChristian König
1828ea416f35de0c664ef47b71841756758f22d7faaChristian König   *ref_frame = surface->video_buffer;
1838ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (!*ref_frame)
1848ea416f35de0c664ef47b71841756758f22d7faaChristian König         return VDP_STATUS_INVALID_HANDLE;
1858ea416f35de0c664ef47b71841756758f22d7faaChristian König
1868ea416f35de0c664ef47b71841756758f22d7faaChristian König   return VDP_STATUS_OK;
1878ea416f35de0c664ef47b71841756758f22d7faaChristian König}
1888ea416f35de0c664ef47b71841756758f22d7faaChristian König
189fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
190fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a mpeg 1/2 video.
191fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
1922471acfc4c051d480861265011fa5e77fad02887Christian Königstatic VdpStatus
1938ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpDecoderRenderMpeg12(struct pipe_mpeg12_picture_desc *picture,
19412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst                         VdpPictureInfoMPEG1Or2 *picture_info)
195725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
1968ea416f35de0c664ef47b71841756758f22d7faaChristian König   VdpStatus r;
19749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
198fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG12\n");
19949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
2008ea416f35de0c664ef47b71841756758f22d7faaChristian König   r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]);
2018ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (r != VDP_STATUS_OK)
2028ea416f35de0c664ef47b71841756758f22d7faaChristian König      return r;
2038ea416f35de0c664ef47b71841756758f22d7faaChristian König
2048ea416f35de0c664ef47b71841756758f22d7faaChristian König   r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]);
2058ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (r != VDP_STATUS_OK)
2068ea416f35de0c664ef47b71841756758f22d7faaChristian König      return r;
2078ea416f35de0c664ef47b71841756758f22d7faaChristian König
2088ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->picture_coding_type = picture_info->picture_coding_type;
2098ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->picture_structure = picture_info->picture_structure;
2108ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->frame_pred_frame_dct = picture_info->frame_pred_frame_dct;
2118ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->q_scale_type = picture_info->q_scale_type;
2128ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->alternate_scan = picture_info->alternate_scan;
2138ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->intra_vlc_format = picture_info->intra_vlc_format;
2148ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->concealment_motion_vectors = picture_info->concealment_motion_vectors;
2158ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->intra_dc_precision = picture_info->intra_dc_precision;
2168ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->f_code[0][0] = picture_info->f_code[0][0] - 1;
2178ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->f_code[0][1] = picture_info->f_code[0][1] - 1;
2188ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->f_code[1][0] = picture_info->f_code[1][0] - 1;
2198ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->f_code[1][1] = picture_info->f_code[1][1] - 1;
2208ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->num_slices = picture_info->slice_count;
2218ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->top_field_first = picture_info->top_field_first;
2228ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->full_pel_forward_vector = picture_info->full_pel_forward_vector;
2238ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->full_pel_backward_vector = picture_info->full_pel_backward_vector;
2248ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->intra_matrix = picture_info->intra_quantizer_matrix;
2258ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->non_intra_matrix = picture_info->non_intra_quantizer_matrix;
22649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
22712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   return VDP_STATUS_OK;
22812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst}
22912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst
23012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst/**
231eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst * Decode a mpeg 4 video.
23212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst */
23312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorststatic VdpStatus
2348ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpDecoderRenderMpeg4(struct pipe_mpeg4_picture_desc *picture,
2358ea416f35de0c664ef47b71841756758f22d7faaChristian König                        VdpPictureInfoMPEG4Part2 *picture_info)
23612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst{
2378ea416f35de0c664ef47b71841756758f22d7faaChristian König   VdpStatus r;
23812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   unsigned i;
239b4fa7db65639322ae8dea19a23c9cc8234a3d7e1Christian König
24012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG4\n");
241c888fe027c338f337123de4da2de1ac73b0f7587Christian König
2428ea416f35de0c664ef47b71841756758f22d7faaChristian König   r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]);
2438ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (r != VDP_STATUS_OK)
2448ea416f35de0c664ef47b71841756758f22d7faaChristian König      return r;
24512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst
2468ea416f35de0c664ef47b71841756758f22d7faaChristian König   r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]);
2478ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (r != VDP_STATUS_OK)
2488ea416f35de0c664ef47b71841756758f22d7faaChristian König      return r;
24949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
25012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   for (i = 0; i < 2; ++i) {
2518ea416f35de0c664ef47b71841756758f22d7faaChristian König      picture->trd[i] = picture_info->trd[i];
2528ea416f35de0c664ef47b71841756758f22d7faaChristian König      picture->trb[i] = picture_info->trb[i];
25312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   }
2548ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->vop_time_increment_resolution = picture_info->vop_time_increment_resolution;
2558ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->vop_coding_type = picture_info->vop_coding_type;
2568ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->vop_fcode_forward = picture_info->vop_fcode_forward;
2578ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->vop_fcode_backward = picture_info->vop_fcode_backward;
2588ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->resync_marker_disable = picture_info->resync_marker_disable;
2598ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->interlaced = picture_info->interlaced;
2608ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->quant_type = picture_info->quant_type;
2618ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->quarter_sample = picture_info->quarter_sample;
2628ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->short_video_header = picture_info->short_video_header;
2638ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->rounding_control = picture_info->rounding_control;
2648ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->alternate_vertical_scan_flag = picture_info->alternate_vertical_scan_flag;
2658ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->top_field_first = picture_info->top_field_first;
2668ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->intra_matrix = picture_info->intra_quantizer_matrix;
2678ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->non_intra_matrix = picture_info->non_intra_quantizer_matrix;
2688ea416f35de0c664ef47b71841756758f22d7faaChristian König
2692471acfc4c051d480861265011fa5e77fad02887Christian König   return VDP_STATUS_OK;
27038bd8131776879e9dc90d06848657756a4a13a66Christian König}
27138bd8131776879e9dc90d06848657756a4a13a66Christian König
272eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorststatic VdpStatus
2738ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpDecoderRenderVC1(struct pipe_vc1_picture_desc *picture,
274eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst                      VdpPictureInfoVC1 *picture_info)
275eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst{
2768ea416f35de0c664ef47b71841756758f22d7faaChristian König   VdpStatus r;
277eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst
278eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding VC-1\n");
279eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst
2808ea416f35de0c664ef47b71841756758f22d7faaChristian König   r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]);
2818ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (r != VDP_STATUS_OK)
2828ea416f35de0c664ef47b71841756758f22d7faaChristian König      return r;
2838ea416f35de0c664ef47b71841756758f22d7faaChristian König
2848ea416f35de0c664ef47b71841756758f22d7faaChristian König   r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]);
2858ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (r != VDP_STATUS_OK)
2868ea416f35de0c664ef47b71841756758f22d7faaChristian König      return r;
2878ea416f35de0c664ef47b71841756758f22d7faaChristian König
2888ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->slice_count = picture_info->slice_count;
2898ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->picture_type = picture_info->picture_type;
2908ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->frame_coding_mode = picture_info->frame_coding_mode;
2918ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->postprocflag = picture_info->postprocflag;
2928ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->pulldown = picture_info->pulldown;
2938ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->interlace = picture_info->interlace;
2948ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->tfcntrflag = picture_info->tfcntrflag;
2958ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->finterpflag = picture_info->finterpflag;
2968ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->psf = picture_info->psf;
2978ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->dquant = picture_info->dquant;
2988ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->panscan_flag = picture_info->panscan_flag;
2998ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->refdist_flag = picture_info->refdist_flag;
3008ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->quantizer = picture_info->quantizer;
3018ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->extended_mv = picture_info->extended_mv;
3028ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->extended_dmv = picture_info->extended_dmv;
3038ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->overlap = picture_info->overlap;
3048ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->vstransform = picture_info->vstransform;
3058ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->loopfilter = picture_info->loopfilter;
3068ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->fastuvmc = picture_info->fastuvmc;
3078ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->range_mapy_flag = picture_info->range_mapy_flag;
3088ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->range_mapy = picture_info->range_mapy;
3098ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->range_mapuv_flag = picture_info->range_mapuv_flag;
3108ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->range_mapuv = picture_info->range_mapuv;
3118ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->multires = picture_info->multires;
3128ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->syncmarker = picture_info->syncmarker;
3138ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->rangered = picture_info->rangered;
3148ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->maxbframes = picture_info->maxbframes;
3158ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->deblockEnable = picture_info->deblockEnable;
3168ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->pquant = picture_info->pquant;
317eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst
318eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   return VDP_STATUS_OK;
319eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst}
320eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst
321d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian Königstatic VdpStatus
322d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian KönigvlVdpDecoderRenderH264(struct pipe_h264_picture_desc *picture,
323d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König                       VdpPictureInfoH264 *picture_info)
324d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König{
325d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   unsigned i;
326d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
327d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding H264\n");
328d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
329d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->slice_count = picture_info->slice_count;
330d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->field_order_cnt[0] = picture_info->field_order_cnt[0];
331d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->field_order_cnt[1] = picture_info->field_order_cnt[1];
332d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->is_reference = picture_info->is_reference;
333d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->frame_num = picture_info->frame_num;
334d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->field_pic_flag = picture_info->field_pic_flag;
335d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->bottom_field_flag = picture_info->bottom_field_flag;
336d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->num_ref_frames = picture_info->num_ref_frames;
337d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->mb_adaptive_frame_field_flag = picture_info->mb_adaptive_frame_field_flag;
338d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->constrained_intra_pred_flag = picture_info->constrained_intra_pred_flag;
339d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->weighted_pred_flag = picture_info->weighted_pred_flag;
340d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->weighted_bipred_idc = picture_info->weighted_bipred_idc;
341d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->frame_mbs_only_flag = picture_info->frame_mbs_only_flag;
342d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->transform_8x8_mode_flag = picture_info->transform_8x8_mode_flag;
343d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->chroma_qp_index_offset = picture_info->chroma_qp_index_offset;
344d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->second_chroma_qp_index_offset = picture_info->second_chroma_qp_index_offset;
345d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->pic_init_qp_minus26 = picture_info->pic_init_qp_minus26;
346d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->num_ref_idx_l0_active_minus1 = picture_info->num_ref_idx_l0_active_minus1;
347d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->num_ref_idx_l1_active_minus1 = picture_info->num_ref_idx_l1_active_minus1;
348d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->log2_max_frame_num_minus4 = picture_info->log2_max_frame_num_minus4;
349d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->pic_order_cnt_type = picture_info->pic_order_cnt_type;
350d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->log2_max_pic_order_cnt_lsb_minus4 = picture_info->log2_max_pic_order_cnt_lsb_minus4;
351d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->delta_pic_order_always_zero_flag = picture_info->delta_pic_order_always_zero_flag;
352d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->direct_8x8_inference_flag = picture_info->direct_8x8_inference_flag;
353d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->entropy_coding_mode_flag = picture_info->entropy_coding_mode_flag;
354d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->pic_order_present_flag = picture_info->pic_order_present_flag;
355d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->deblocking_filter_control_present_flag = picture_info->deblocking_filter_control_present_flag;
356d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->redundant_pic_cnt_present_flag = picture_info->redundant_pic_cnt_present_flag;
357d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
358d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   memcpy(picture->scaling_lists_4x4, picture_info->scaling_lists_4x4, 6*16);
359d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   memcpy(picture->scaling_lists_8x8, picture_info->scaling_lists_8x8, 2*64);
360d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
361d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   for (i = 0; i < 16; ++i) {
362d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      VdpStatus ret = vlVdpGetReferenceFrame
363d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      (
364d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König         picture_info->referenceFrames[i].surface,
365d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König         &picture->ref[i]
366d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      );
367d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      if (ret != VDP_STATUS_OK)
368d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König         return ret;
369d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
370d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      picture->is_long_term[i] = picture_info->referenceFrames[i].is_long_term;
371d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      picture->top_is_reference[i] = picture_info->referenceFrames[i].top_is_reference;
372d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      picture->bottom_is_reference[i] = picture_info->referenceFrames[i].bottom_is_reference;
373d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      picture->field_order_cnt_list[i][0] = picture_info->referenceFrames[i].field_order_cnt[0];
374d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      picture->field_order_cnt_list[i][1] = picture_info->referenceFrames[i].field_order_cnt[1];
375d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      picture->frame_num_list[i] = picture_info->referenceFrames[i].frame_idx;
376d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   }
377d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
378d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   return VDP_STATUS_OK;
379d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König}
380d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
381fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
382fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a compressed field/frame and render the result into a VdpVideoSurface.
383fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
38438bd8131776879e9dc90d06848657756a4a13a66Christian KönigVdpStatus
38549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderRender(VdpDecoder decoder,
38649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpVideoSurface target,
38749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpPictureInfo const *picture_info,
38849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   uint32_t bitstream_buffer_count,
38949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpBitstreamBuffer const *bitstream_buffers)
390725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
3917ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König   const void * buffers[bitstream_buffer_count];
3927ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König   unsigned sizes[bitstream_buffer_count];
39349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vlVdpDecoder *vldecoder;
39449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vlVdpSurface *vlsurf;
39512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   VdpStatus ret;
396020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König   struct pipe_screen *screen;
39712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   struct pipe_video_decoder *dec;
3988f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König   bool buffer_support[2];
39912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   unsigned i;
4008ea416f35de0c664ef47b71841756758f22d7faaChristian König   union {
4018ea416f35de0c664ef47b71841756758f22d7faaChristian König      struct pipe_picture_desc base;
4028ea416f35de0c664ef47b71841756758f22d7faaChristian König      struct pipe_mpeg12_picture_desc mpeg12;
4038ea416f35de0c664ef47b71841756758f22d7faaChristian König      struct pipe_mpeg4_picture_desc mpeg4;
4048ea416f35de0c664ef47b71841756758f22d7faaChristian König      struct pipe_vc1_picture_desc vc1;
405d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      struct pipe_h264_picture_desc h264;
4068ea416f35de0c664ef47b71841756758f22d7faaChristian König   } desc;
40749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
40849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!(picture_info && bitstream_buffers))
40949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_POINTER;
41049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
41149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
41249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!vldecoder)
41349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_HANDLE;
41412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   dec = vldecoder->decoder;
415020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König   screen = dec->context->screen;
41649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
41749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vlsurf = (vlVdpSurface *)vlGetDataHTAB(target);
41849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!vlsurf)
41949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_HANDLE;
42049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
42149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (vlsurf->device != vldecoder->device)
42249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
42349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
424020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König   if (vlsurf->video_buffer != NULL && vlsurf->video_buffer->chroma_format != dec->chroma_format)
4252471acfc4c051d480861265011fa5e77fad02887Christian König      // TODO: Recreate decoder with correct chroma
4262471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_INVALID_CHROMA_TYPE;
42749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
42805579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_lock(vlsurf->device->mutex);
42905579339c0da442669ea75749651e8cf4f9ec39bChristian König
4308f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König   buffer_support[0] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE);
4318f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König   buffer_support[1] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_SUPPORTS_INTERLACED);
4328f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König
433020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König   if (vlsurf->video_buffer == NULL ||
4348f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König       !screen->is_video_format_supported(screen, vlsurf->video_buffer->buffer_format, dec->profile) ||
4358f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König       buffer_support[vlsurf->video_buffer->interlaced]) {
436020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König
437020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      /* destroy the old one */
438020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      if (vlsurf->video_buffer)
439020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König         vlsurf->video_buffer->destroy(vlsurf->video_buffer);
440020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König
441020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      /* set the buffer format to the prefered one */
442020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      vlsurf->templat.buffer_format = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_PREFERED_FORMAT);
443020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König
4448f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König      /* also set interlacing to decoders preferences */
4458f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König      vlsurf->templat.interlaced = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_PREFERS_INTERLACED);
4468f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König
447020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      /* and recreate the video buffer */
448020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      vlsurf->video_buffer = dec->context->create_video_buffer(dec->context, &vlsurf->templat);
449020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König
450020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      /* still no luck? get me out of here... */
45105579339c0da442669ea75749651e8cf4f9ec39bChristian König      if (!vlsurf->video_buffer) {
45205579339c0da442669ea75749651e8cf4f9ec39bChristian König         pipe_mutex_unlock(vlsurf->device->mutex);
453020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König         return VDP_STATUS_NO_IMPLEMENTATION;
45405579339c0da442669ea75749651e8cf4f9ec39bChristian König      }
455020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König   }
456020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König
4578ea416f35de0c664ef47b71841756758f22d7faaChristian König   memset(&desc, 0, sizeof(desc));
4588ea416f35de0c664ef47b71841756758f22d7faaChristian König   desc.base.profile = dec->profile;
45912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   switch (u_reduce_video_profile(dec->profile)) {
46012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   case PIPE_VIDEO_CODEC_MPEG12:
4618ea416f35de0c664ef47b71841756758f22d7faaChristian König      ret = vlVdpDecoderRenderMpeg12(&desc.mpeg12, (VdpPictureInfoMPEG1Or2 *)picture_info);
46212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      break;
46312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   case PIPE_VIDEO_CODEC_MPEG4:
4648ea416f35de0c664ef47b71841756758f22d7faaChristian König      ret = vlVdpDecoderRenderMpeg4(&desc.mpeg4, (VdpPictureInfoMPEG4Part2 *)picture_info);
46549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      break;
466eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   case PIPE_VIDEO_CODEC_VC1:
4678ea416f35de0c664ef47b71841756758f22d7faaChristian König      ret = vlVdpDecoderRenderVC1(&desc.vc1, (VdpPictureInfoVC1 *)picture_info);
468eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst      break;
469d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   case PIPE_VIDEO_CODEC_MPEG4_AVC:
470d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      ret = vlVdpDecoderRenderH264(&desc.h264, (VdpPictureInfoH264 *)picture_info);
471d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      break;
47249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   default:
47305579339c0da442669ea75749651e8cf4f9ec39bChristian König      pipe_mutex_unlock(vlsurf->device->mutex);
47449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_DECODER_PROFILE;
47549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   }
47605579339c0da442669ea75749651e8cf4f9ec39bChristian König   if (ret != VDP_STATUS_OK) {
47705579339c0da442669ea75749651e8cf4f9ec39bChristian König      pipe_mutex_unlock(vlsurf->device->mutex);
47812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      return ret;
47905579339c0da442669ea75749651e8cf4f9ec39bChristian König   }
48012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst
4817ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König   for (i = 0; i < bitstream_buffer_count; ++i) {
4827ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König      buffers[i] = bitstream_buffers[i].bitstream;
4837ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König      sizes[i] = bitstream_buffers[i].bitstream_bytes;
4847ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König   }
4858ea416f35de0c664ef47b71841756758f22d7faaChristian König
4868ea416f35de0c664ef47b71841756758f22d7faaChristian König   dec->begin_frame(dec, vlsurf->video_buffer, &desc.base);
4878ea416f35de0c664ef47b71841756758f22d7faaChristian König   dec->decode_bitstream(dec, vlsurf->video_buffer, &desc.base, bitstream_buffer_count, buffers, sizes);
4888ea416f35de0c664ef47b71841756758f22d7faaChristian König   dec->end_frame(dec, vlsurf->video_buffer, &desc.base);
48905579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(vlsurf->device->mutex);
49012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   return ret;
491b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König}
492