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
33fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König#include "vl/vl_vlc.h"
34fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König
352471acfc4c051d480861265011fa5e77fad02887Christian König#include "vdpau_private.h"
362471acfc4c051d480861265011fa5e77fad02887Christian König
37fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
38fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Create a VdpDecoder.
39fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
40725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
4149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderCreate(VdpDevice device,
4249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpDecoderProfile profile,
4349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   uint32_t width, uint32_t height,
4449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   uint32_t max_references,
4549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpDecoder *decoder)
46725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
472471acfc4c051d480861265011fa5e77fad02887Christian König   enum pipe_video_profile p_profile;
48ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König   struct pipe_context *pipe;
491eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   struct pipe_screen *screen;
502471acfc4c051d480861265011fa5e77fad02887Christian König   vlVdpDevice *dev;
512471acfc4c051d480861265011fa5e77fad02887Christian König   vlVdpDecoder *vldecoder;
522471acfc4c051d480861265011fa5e77fad02887Christian König   VdpStatus ret;
531eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   bool supported;
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
701448e829e86981e6144410ba6a3d0f16357fb2b3Christian König   pipe = dev->context;
711eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   screen = dev->vscreen->pscreen;
7205579339c0da442669ea75749651e8cf4f9ec39bChristian König
7305579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_lock(dev->mutex);
7405579339c0da442669ea75749651e8cf4f9ec39bChristian König
751eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   supported = screen->get_video_param
761eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   (
771eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      screen,
781eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      p_profile,
791eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      PIPE_VIDEO_CAP_SUPPORTED
801eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst   );
8105579339c0da442669ea75749651e8cf4f9ec39bChristian König   if (!supported) {
8205579339c0da442669ea75749651e8cf4f9ec39bChristian König      pipe_mutex_unlock(dev->mutex);
831eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst      return VDP_STATUS_INVALID_DECODER_PROFILE;
8405579339c0da442669ea75749651e8cf4f9ec39bChristian König   }
85b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
86725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   vldecoder = CALLOC(1,sizeof(vlVdpDecoder));
8705579339c0da442669ea75749651e8cf4f9ec39bChristian König   if (!vldecoder) {
8805579339c0da442669ea75749651e8cf4f9ec39bChristian König      pipe_mutex_unlock(dev->mutex);
892471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_RESOURCES;
9005579339c0da442669ea75749651e8cf4f9ec39bChristian König   }
91b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
922471acfc4c051d480861265011fa5e77fad02887Christian König   vldecoder->device = dev;
93725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
94ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König   vldecoder->decoder = pipe->create_video_decoder
952471acfc4c051d480861265011fa5e77fad02887Christian König   (
96ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König      pipe, p_profile,
972471acfc4c051d480861265011fa5e77fad02887Christian König      PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
982471acfc4c051d480861265011fa5e77fad02887Christian König      PIPE_VIDEO_CHROMA_FORMAT_420,
998c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König      width, height, max_references,
1008c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König      false
1012471acfc4c051d480861265011fa5e77fad02887Christian König   );
10282e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange
1032471acfc4c051d480861265011fa5e77fad02887Christian König   if (!vldecoder->decoder) {
1042471acfc4c051d480861265011fa5e77fad02887Christian König      ret = VDP_STATUS_ERROR;
1052471acfc4c051d480861265011fa5e77fad02887Christian König      goto error_decoder;
1062471acfc4c051d480861265011fa5e77fad02887Christian König   }
107b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
10849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   *decoder = vlAddDataHTAB(vldecoder);
10949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (*decoder == 0) {
110725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      ret = VDP_STATUS_ERROR;
1112471acfc4c051d480861265011fa5e77fad02887Christian König      goto error_handle;
11249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   }
11305579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(dev->mutex);
1142471acfc4c051d480861265011fa5e77fad02887Christian König
11549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return VDP_STATUS_OK;
116b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
1172471acfc4c051d480861265011fa5e77fad02887Christian Königerror_handle:
1182471acfc4c051d480861265011fa5e77fad02887Christian König   vldecoder->decoder->destroy(vldecoder->decoder);
1192471acfc4c051d480861265011fa5e77fad02887Christian König
1202471acfc4c051d480861265011fa5e77fad02887Christian Königerror_decoder:
12105579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(dev->mutex);
12249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   FREE(vldecoder);
1232471acfc4c051d480861265011fa5e77fad02887Christian König   return ret;
124725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
125725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
126fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
127fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Destroy a VdpDecoder.
128fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
129725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
13049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderDestroy(VdpDecoder decoder)
131725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
1322471acfc4c051d480861265011fa5e77fad02887Christian König   vlVdpDecoder *vldecoder;
133d5b05a869a71147987a1c1d6c84f8df17148f031Christian König
13449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
1352471acfc4c051d480861265011fa5e77fad02887Christian König   if (!vldecoder)
136725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      return VDP_STATUS_INVALID_HANDLE;
137b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
13805579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_lock(vldecoder->device->mutex);
1392471acfc4c051d480861265011fa5e77fad02887Christian König   vldecoder->decoder->destroy(vldecoder->decoder);
14005579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(vldecoder->device->mutex);
141b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
14249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   FREE(vldecoder);
143b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
14449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return VDP_STATUS_OK;
145725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
146725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
147fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
148fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Retrieve the parameters used to create a VdpBitmapSurface.
149fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
150725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
1512471acfc4c051d480861265011fa5e77fad02887Christian KönigvlVdpDecoderGetParameters(VdpDecoder decoder,
1522471acfc4c051d480861265011fa5e77fad02887Christian König                          VdpDecoderProfile *profile,
1532471acfc4c051d480861265011fa5e77fad02887Christian König                          uint32_t *width,
1542471acfc4c051d480861265011fa5e77fad02887Christian König                          uint32_t *height)
155725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
15634145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   vlVdpDecoder *vldecoder;
15734145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König
15834145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
15934145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   if (!vldecoder)
16034145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König      return VDP_STATUS_INVALID_HANDLE;
161c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange
16234145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   *profile = PipeToProfile(vldecoder->decoder->profile);
16334145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   *width = vldecoder->decoder->width;
16434145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König   *height = vldecoder->decoder->height;
165c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange
16649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   return VDP_STATUS_OK;
167725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
168725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
1698ea416f35de0c664ef47b71841756758f22d7faaChristian Königstatic VdpStatus
1708ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpGetReferenceFrame(VdpVideoSurface handle, struct pipe_video_buffer **ref_frame)
1718ea416f35de0c664ef47b71841756758f22d7faaChristian König{
1728ea416f35de0c664ef47b71841756758f22d7faaChristian König   vlVdpSurface *surface;
1738ea416f35de0c664ef47b71841756758f22d7faaChristian König
1748ea416f35de0c664ef47b71841756758f22d7faaChristian König   /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */
1758ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (handle ==  VDP_INVALID_HANDLE) {
1768ea416f35de0c664ef47b71841756758f22d7faaChristian König      *ref_frame = NULL;
1778ea416f35de0c664ef47b71841756758f22d7faaChristian König      return VDP_STATUS_OK;
1788ea416f35de0c664ef47b71841756758f22d7faaChristian König   }
1798ea416f35de0c664ef47b71841756758f22d7faaChristian König
1808ea416f35de0c664ef47b71841756758f22d7faaChristian König   surface = vlGetDataHTAB(handle);
1818ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (!surface)
1828ea416f35de0c664ef47b71841756758f22d7faaChristian König      return VDP_STATUS_INVALID_HANDLE;
1838ea416f35de0c664ef47b71841756758f22d7faaChristian König
1848ea416f35de0c664ef47b71841756758f22d7faaChristian König   *ref_frame = surface->video_buffer;
1858ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (!*ref_frame)
1868ea416f35de0c664ef47b71841756758f22d7faaChristian König         return VDP_STATUS_INVALID_HANDLE;
1878ea416f35de0c664ef47b71841756758f22d7faaChristian König
1888ea416f35de0c664ef47b71841756758f22d7faaChristian König   return VDP_STATUS_OK;
1898ea416f35de0c664ef47b71841756758f22d7faaChristian König}
1908ea416f35de0c664ef47b71841756758f22d7faaChristian König
191fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
192fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a mpeg 1/2 video.
193fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
1942471acfc4c051d480861265011fa5e77fad02887Christian Königstatic VdpStatus
1958ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpDecoderRenderMpeg12(struct pipe_mpeg12_picture_desc *picture,
19612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst                         VdpPictureInfoMPEG1Or2 *picture_info)
197725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
1988ea416f35de0c664ef47b71841756758f22d7faaChristian König   VdpStatus r;
19949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
200fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG12\n");
20149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
2028ea416f35de0c664ef47b71841756758f22d7faaChristian König   r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]);
2038ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (r != VDP_STATUS_OK)
2048ea416f35de0c664ef47b71841756758f22d7faaChristian König      return r;
2058ea416f35de0c664ef47b71841756758f22d7faaChristian König
2068ea416f35de0c664ef47b71841756758f22d7faaChristian König   r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]);
2078ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (r != VDP_STATUS_OK)
2088ea416f35de0c664ef47b71841756758f22d7faaChristian König      return r;
2098ea416f35de0c664ef47b71841756758f22d7faaChristian König
2108ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->picture_coding_type = picture_info->picture_coding_type;
2118ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->picture_structure = picture_info->picture_structure;
2128ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->frame_pred_frame_dct = picture_info->frame_pred_frame_dct;
2138ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->q_scale_type = picture_info->q_scale_type;
2148ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->alternate_scan = picture_info->alternate_scan;
2158ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->intra_vlc_format = picture_info->intra_vlc_format;
2168ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->concealment_motion_vectors = picture_info->concealment_motion_vectors;
2178ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->intra_dc_precision = picture_info->intra_dc_precision;
2188ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->f_code[0][0] = picture_info->f_code[0][0] - 1;
2198ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->f_code[0][1] = picture_info->f_code[0][1] - 1;
2208ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->f_code[1][0] = picture_info->f_code[1][0] - 1;
2218ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->f_code[1][1] = picture_info->f_code[1][1] - 1;
2228ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->num_slices = picture_info->slice_count;
2238ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->top_field_first = picture_info->top_field_first;
2248ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->full_pel_forward_vector = picture_info->full_pel_forward_vector;
2258ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->full_pel_backward_vector = picture_info->full_pel_backward_vector;
2268ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->intra_matrix = picture_info->intra_quantizer_matrix;
2278ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->non_intra_matrix = picture_info->non_intra_quantizer_matrix;
22849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
22912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   return VDP_STATUS_OK;
23012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst}
23112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst
23212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst/**
233eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst * Decode a mpeg 4 video.
23412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst */
23512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorststatic VdpStatus
2368ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpDecoderRenderMpeg4(struct pipe_mpeg4_picture_desc *picture,
2378ea416f35de0c664ef47b71841756758f22d7faaChristian König                        VdpPictureInfoMPEG4Part2 *picture_info)
23812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst{
2398ea416f35de0c664ef47b71841756758f22d7faaChristian König   VdpStatus r;
24012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   unsigned i;
241b4fa7db65639322ae8dea19a23c9cc8234a3d7e1Christian König
24212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG4\n");
243c888fe027c338f337123de4da2de1ac73b0f7587Christian König
2448ea416f35de0c664ef47b71841756758f22d7faaChristian König   r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]);
2458ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (r != VDP_STATUS_OK)
2468ea416f35de0c664ef47b71841756758f22d7faaChristian König      return r;
24712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst
2488ea416f35de0c664ef47b71841756758f22d7faaChristian König   r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]);
2498ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (r != VDP_STATUS_OK)
2508ea416f35de0c664ef47b71841756758f22d7faaChristian König      return r;
25149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
25212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   for (i = 0; i < 2; ++i) {
2538ea416f35de0c664ef47b71841756758f22d7faaChristian König      picture->trd[i] = picture_info->trd[i];
2548ea416f35de0c664ef47b71841756758f22d7faaChristian König      picture->trb[i] = picture_info->trb[i];
25512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   }
2568ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->vop_time_increment_resolution = picture_info->vop_time_increment_resolution;
2578ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->vop_coding_type = picture_info->vop_coding_type;
2588ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->vop_fcode_forward = picture_info->vop_fcode_forward;
2598ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->vop_fcode_backward = picture_info->vop_fcode_backward;
2608ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->resync_marker_disable = picture_info->resync_marker_disable;
2618ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->interlaced = picture_info->interlaced;
2628ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->quant_type = picture_info->quant_type;
2638ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->quarter_sample = picture_info->quarter_sample;
2648ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->short_video_header = picture_info->short_video_header;
2658ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->rounding_control = picture_info->rounding_control;
2668ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->alternate_vertical_scan_flag = picture_info->alternate_vertical_scan_flag;
2678ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->top_field_first = picture_info->top_field_first;
2688ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->intra_matrix = picture_info->intra_quantizer_matrix;
2698ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->non_intra_matrix = picture_info->non_intra_quantizer_matrix;
2708ea416f35de0c664ef47b71841756758f22d7faaChristian König
2712471acfc4c051d480861265011fa5e77fad02887Christian König   return VDP_STATUS_OK;
27238bd8131776879e9dc90d06848657756a4a13a66Christian König}
27338bd8131776879e9dc90d06848657756a4a13a66Christian König
274eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorststatic VdpStatus
2758ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpDecoderRenderVC1(struct pipe_vc1_picture_desc *picture,
276eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst                      VdpPictureInfoVC1 *picture_info)
277eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst{
2788ea416f35de0c664ef47b71841756758f22d7faaChristian König   VdpStatus r;
279eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst
280eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding VC-1\n");
281eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst
2828ea416f35de0c664ef47b71841756758f22d7faaChristian König   r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]);
2838ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (r != VDP_STATUS_OK)
2848ea416f35de0c664ef47b71841756758f22d7faaChristian König      return r;
2858ea416f35de0c664ef47b71841756758f22d7faaChristian König
2868ea416f35de0c664ef47b71841756758f22d7faaChristian König   r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]);
2878ea416f35de0c664ef47b71841756758f22d7faaChristian König   if (r != VDP_STATUS_OK)
2888ea416f35de0c664ef47b71841756758f22d7faaChristian König      return r;
2898ea416f35de0c664ef47b71841756758f22d7faaChristian König
2908ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->slice_count = picture_info->slice_count;
2918ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->picture_type = picture_info->picture_type;
2928ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->frame_coding_mode = picture_info->frame_coding_mode;
2938ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->postprocflag = picture_info->postprocflag;
2948ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->pulldown = picture_info->pulldown;
2958ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->interlace = picture_info->interlace;
2968ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->tfcntrflag = picture_info->tfcntrflag;
2978ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->finterpflag = picture_info->finterpflag;
2988ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->psf = picture_info->psf;
2998ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->dquant = picture_info->dquant;
3008ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->panscan_flag = picture_info->panscan_flag;
3018ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->refdist_flag = picture_info->refdist_flag;
3028ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->quantizer = picture_info->quantizer;
3038ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->extended_mv = picture_info->extended_mv;
3048ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->extended_dmv = picture_info->extended_dmv;
3058ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->overlap = picture_info->overlap;
3068ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->vstransform = picture_info->vstransform;
3078ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->loopfilter = picture_info->loopfilter;
3088ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->fastuvmc = picture_info->fastuvmc;
3098ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->range_mapy_flag = picture_info->range_mapy_flag;
3108ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->range_mapy = picture_info->range_mapy;
3118ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->range_mapuv_flag = picture_info->range_mapuv_flag;
3128ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->range_mapuv = picture_info->range_mapuv;
3138ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->multires = picture_info->multires;
3148ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->syncmarker = picture_info->syncmarker;
3158ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->rangered = picture_info->rangered;
3168ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->maxbframes = picture_info->maxbframes;
3178ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->deblockEnable = picture_info->deblockEnable;
3188ea416f35de0c664ef47b71841756758f22d7faaChristian König   picture->pquant = picture_info->pquant;
319eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst
320eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   return VDP_STATUS_OK;
321eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst}
322eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst
323d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian Königstatic VdpStatus
324d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian KönigvlVdpDecoderRenderH264(struct pipe_h264_picture_desc *picture,
325d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König                       VdpPictureInfoH264 *picture_info)
326d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König{
327d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   unsigned i;
328d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
329d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding H264\n");
330d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
331d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->slice_count = picture_info->slice_count;
332d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->field_order_cnt[0] = picture_info->field_order_cnt[0];
333d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->field_order_cnt[1] = picture_info->field_order_cnt[1];
334d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->is_reference = picture_info->is_reference;
335d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->frame_num = picture_info->frame_num;
336d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->field_pic_flag = picture_info->field_pic_flag;
337d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->bottom_field_flag = picture_info->bottom_field_flag;
338d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->num_ref_frames = picture_info->num_ref_frames;
339d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->mb_adaptive_frame_field_flag = picture_info->mb_adaptive_frame_field_flag;
340d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->constrained_intra_pred_flag = picture_info->constrained_intra_pred_flag;
341d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->weighted_pred_flag = picture_info->weighted_pred_flag;
342d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->weighted_bipred_idc = picture_info->weighted_bipred_idc;
343d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->frame_mbs_only_flag = picture_info->frame_mbs_only_flag;
344d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->transform_8x8_mode_flag = picture_info->transform_8x8_mode_flag;
345d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->chroma_qp_index_offset = picture_info->chroma_qp_index_offset;
346d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->second_chroma_qp_index_offset = picture_info->second_chroma_qp_index_offset;
347d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->pic_init_qp_minus26 = picture_info->pic_init_qp_minus26;
348d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->num_ref_idx_l0_active_minus1 = picture_info->num_ref_idx_l0_active_minus1;
349d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->num_ref_idx_l1_active_minus1 = picture_info->num_ref_idx_l1_active_minus1;
350d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->log2_max_frame_num_minus4 = picture_info->log2_max_frame_num_minus4;
351d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->pic_order_cnt_type = picture_info->pic_order_cnt_type;
352d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->log2_max_pic_order_cnt_lsb_minus4 = picture_info->log2_max_pic_order_cnt_lsb_minus4;
353d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->delta_pic_order_always_zero_flag = picture_info->delta_pic_order_always_zero_flag;
354d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->direct_8x8_inference_flag = picture_info->direct_8x8_inference_flag;
355d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->entropy_coding_mode_flag = picture_info->entropy_coding_mode_flag;
356d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->pic_order_present_flag = picture_info->pic_order_present_flag;
357d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->deblocking_filter_control_present_flag = picture_info->deblocking_filter_control_present_flag;
358d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   picture->redundant_pic_cnt_present_flag = picture_info->redundant_pic_cnt_present_flag;
359d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
360d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   memcpy(picture->scaling_lists_4x4, picture_info->scaling_lists_4x4, 6*16);
361d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   memcpy(picture->scaling_lists_8x8, picture_info->scaling_lists_8x8, 2*64);
362d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
363d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   for (i = 0; i < 16; ++i) {
364d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      VdpStatus ret = vlVdpGetReferenceFrame
365d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      (
366d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König         picture_info->referenceFrames[i].surface,
367d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König         &picture->ref[i]
368d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      );
369d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      if (ret != VDP_STATUS_OK)
370d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König         return ret;
371d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
372d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      picture->is_long_term[i] = picture_info->referenceFrames[i].is_long_term;
373d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      picture->top_is_reference[i] = picture_info->referenceFrames[i].top_is_reference;
374d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      picture->bottom_is_reference[i] = picture_info->referenceFrames[i].bottom_is_reference;
375d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      picture->field_order_cnt_list[i][0] = picture_info->referenceFrames[i].field_order_cnt[0];
376d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      picture->field_order_cnt_list[i][1] = picture_info->referenceFrames[i].field_order_cnt[1];
377d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      picture->frame_num_list[i] = picture_info->referenceFrames[i].frame_idx;
378d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   }
379d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
380d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   return VDP_STATUS_OK;
381d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König}
382d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König
383fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian Königstatic void
384fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian KönigvlVdpDecoderFixVC1Startcode(uint32_t *num_buffers, const void *buffers[], unsigned sizes[])
385fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König{
386fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   static const uint8_t vc1_startcode[] = { 0x00, 0x00, 0x01, 0x0D };
387fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   struct vl_vlc vlc;
388fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   unsigned i;
389fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König
390fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   /* search the first 64 bytes for a startcode */
391fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   vl_vlc_init(&vlc, *num_buffers, buffers, sizes);
392fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   for (i = 0; i < 64 && vl_vlc_bits_left(&vlc) >= 32; ++i) {
393fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König      uint32_t value = vl_vlc_peekbits(&vlc, 32);
394fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König      if (value == 0x0000010D ||
395fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König          value == 0x0000010C ||
396fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König          value == 0x0000010B)
397fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König         return;
398fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König      vl_vlc_eatbits(&vlc, 8);
399fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König      vl_vlc_fillbits(&vlc);
400fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   }
401fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König
402fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   /* none found, ok add one manually */
403fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Manually adding VC-1 startcode\n");
404fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   for (i = *num_buffers; i > 0; --i) {
405fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König      buffers[i] = buffers[i - 1];
406fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König      sizes[i] = sizes[i - 1];
407fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   }
408fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   ++(*num_buffers);
409fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   buffers[0] = vc1_startcode;
410fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   sizes[0] = 4;
411fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König}
412fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König
413fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/**
414fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a compressed field/frame and render the result into a VdpVideoSurface.
415fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */
41638bd8131776879e9dc90d06848657756a4a13a66Christian KönigVdpStatus
41749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderRender(VdpDecoder decoder,
41849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpVideoSurface target,
41949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpPictureInfo const *picture_info,
42049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   uint32_t bitstream_buffer_count,
42149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König                   VdpBitstreamBuffer const *bitstream_buffers)
422725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
423fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   const void * buffers[bitstream_buffer_count + 1];
424fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   unsigned sizes[bitstream_buffer_count + 1];
42549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vlVdpDecoder *vldecoder;
42649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vlVdpSurface *vlsurf;
42712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   VdpStatus ret;
428020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König   struct pipe_screen *screen;
42912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   struct pipe_video_decoder *dec;
4308f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König   bool buffer_support[2];
43112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   unsigned i;
4328ea416f35de0c664ef47b71841756758f22d7faaChristian König   union {
4338ea416f35de0c664ef47b71841756758f22d7faaChristian König      struct pipe_picture_desc base;
4348ea416f35de0c664ef47b71841756758f22d7faaChristian König      struct pipe_mpeg12_picture_desc mpeg12;
4358ea416f35de0c664ef47b71841756758f22d7faaChristian König      struct pipe_mpeg4_picture_desc mpeg4;
4368ea416f35de0c664ef47b71841756758f22d7faaChristian König      struct pipe_vc1_picture_desc vc1;
437d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      struct pipe_h264_picture_desc h264;
4388ea416f35de0c664ef47b71841756758f22d7faaChristian König   } desc;
43949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
44049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!(picture_info && bitstream_buffers))
44149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_POINTER;
44249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
44349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
44449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!vldecoder)
44549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_HANDLE;
44612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   dec = vldecoder->decoder;
447020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König   screen = dec->context->screen;
44849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
44949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   vlsurf = (vlVdpSurface *)vlGetDataHTAB(target);
45049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (!vlsurf)
45149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_HANDLE;
45249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
45349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   if (vlsurf->device != vldecoder->device)
45449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
45549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
456020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König   if (vlsurf->video_buffer != NULL && vlsurf->video_buffer->chroma_format != dec->chroma_format)
4572471acfc4c051d480861265011fa5e77fad02887Christian König      // TODO: Recreate decoder with correct chroma
4582471acfc4c051d480861265011fa5e77fad02887Christian König      return VDP_STATUS_INVALID_CHROMA_TYPE;
45949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König
46005579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_lock(vlsurf->device->mutex);
46105579339c0da442669ea75749651e8cf4f9ec39bChristian König
4628f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König   buffer_support[0] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE);
4638f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König   buffer_support[1] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_SUPPORTS_INTERLACED);
4648f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König
465020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König   if (vlsurf->video_buffer == NULL ||
4668f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König       !screen->is_video_format_supported(screen, vlsurf->video_buffer->buffer_format, dec->profile) ||
4679f777699ed39e1c326938f84fc8f54198990cfa1Christian König       !buffer_support[vlsurf->video_buffer->interlaced]) {
468020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König
469020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      /* destroy the old one */
470020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      if (vlsurf->video_buffer)
471020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König         vlsurf->video_buffer->destroy(vlsurf->video_buffer);
472020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König
473020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      /* set the buffer format to the prefered one */
474020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      vlsurf->templat.buffer_format = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_PREFERED_FORMAT);
475020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König
4768f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König      /* also set interlacing to decoders preferences */
4778f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König      vlsurf->templat.interlaced = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_PREFERS_INTERLACED);
4788f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König
479020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      /* and recreate the video buffer */
480020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      vlsurf->video_buffer = dec->context->create_video_buffer(dec->context, &vlsurf->templat);
481020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König
482020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König      /* still no luck? get me out of here... */
48305579339c0da442669ea75749651e8cf4f9ec39bChristian König      if (!vlsurf->video_buffer) {
48405579339c0da442669ea75749651e8cf4f9ec39bChristian König         pipe_mutex_unlock(vlsurf->device->mutex);
485020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König         return VDP_STATUS_NO_IMPLEMENTATION;
48605579339c0da442669ea75749651e8cf4f9ec39bChristian König      }
4877f6af4909241de7197e774dee988f574cb576a3bChristian König      vlVdpVideoSurfaceClear(vlsurf);
488020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König   }
489020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König
490fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   for (i = 0; i < bitstream_buffer_count; ++i) {
491fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König      buffers[i] = bitstream_buffers[i].bitstream;
492fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König      sizes[i] = bitstream_buffers[i].bitstream_bytes;
493fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König   }
494fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König
4958ea416f35de0c664ef47b71841756758f22d7faaChristian König   memset(&desc, 0, sizeof(desc));
4968ea416f35de0c664ef47b71841756758f22d7faaChristian König   desc.base.profile = dec->profile;
49712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   switch (u_reduce_video_profile(dec->profile)) {
49812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   case PIPE_VIDEO_CODEC_MPEG12:
4998ea416f35de0c664ef47b71841756758f22d7faaChristian König      ret = vlVdpDecoderRenderMpeg12(&desc.mpeg12, (VdpPictureInfoMPEG1Or2 *)picture_info);
50012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      break;
50112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   case PIPE_VIDEO_CODEC_MPEG4:
5028ea416f35de0c664ef47b71841756758f22d7faaChristian König      ret = vlVdpDecoderRenderMpeg4(&desc.mpeg4, (VdpPictureInfoMPEG4Part2 *)picture_info);
50349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      break;
504eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst   case PIPE_VIDEO_CODEC_VC1:
505fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König      if (dec->profile == PIPE_VIDEO_PROFILE_VC1_ADVANCED)
506fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König         vlVdpDecoderFixVC1Startcode(&bitstream_buffer_count, buffers, sizes);
5078ea416f35de0c664ef47b71841756758f22d7faaChristian König      ret = vlVdpDecoderRenderVC1(&desc.vc1, (VdpPictureInfoVC1 *)picture_info);
508eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst      break;
509d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König   case PIPE_VIDEO_CODEC_MPEG4_AVC:
510d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      ret = vlVdpDecoderRenderH264(&desc.h264, (VdpPictureInfoH264 *)picture_info);
511d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König      break;
51249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   default:
51305579339c0da442669ea75749651e8cf4f9ec39bChristian König      pipe_mutex_unlock(vlsurf->device->mutex);
51449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König      return VDP_STATUS_INVALID_DECODER_PROFILE;
51549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König   }
516fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König
51705579339c0da442669ea75749651e8cf4f9ec39bChristian König   if (ret != VDP_STATUS_OK) {
51805579339c0da442669ea75749651e8cf4f9ec39bChristian König      pipe_mutex_unlock(vlsurf->device->mutex);
51912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst      return ret;
52005579339c0da442669ea75749651e8cf4f9ec39bChristian König   }
52112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst
5228ea416f35de0c664ef47b71841756758f22d7faaChristian König   dec->begin_frame(dec, vlsurf->video_buffer, &desc.base);
5238ea416f35de0c664ef47b71841756758f22d7faaChristian König   dec->decode_bitstream(dec, vlsurf->video_buffer, &desc.base, bitstream_buffer_count, buffers, sizes);
5248ea416f35de0c664ef47b71841756758f22d7faaChristian König   dec->end_frame(dec, vlsurf->video_buffer, &desc.base);
52505579339c0da442669ea75749651e8cf4f9ec39bChristian König   pipe_mutex_unlock(vlsurf->device->mutex);
52612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst   return ret;
527b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König}
528