decode.c revision cac5e60fd3fa7b756bcd4174db8096335c70e145
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
28c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen#include "vdpau_private.h"
29cac5e60fd3fa7b756bcd4174db8096335c70e145Thomas Balling Sørensen#include "mpeg2_bitstream_parser.h"
30725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen#include <util/u_memory.h>
316ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen#include <util/u_math.h>
32725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen#include <pipe/p_video_context.h>
336ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen#include <util/u_debug.h>
34c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen
35725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
36725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenvlVdpDecoderCreate ( 	VdpDevice device,
37725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen						VdpDecoderProfile profile,
38725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen						uint32_t width, uint32_t height,
39725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen						uint32_t max_references,
40725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen						VdpDecoder *decoder
41725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen)
42725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
436ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	struct vl_screen *vscreen;
44725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	enum pipe_video_profile p_profile;
45725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	VdpStatus ret;
46725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpDecoder *vldecoder;
47725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
486ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	debug_printf("[VDPAU] Creating decoder\n");
496ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
50725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!decoder)
51725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_POINTER;
52725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
53725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!(width && height))
54725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_VALUE;
55725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
56725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   vlVdpDevice *dev = vlGetDataHTAB(device);
57725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   if (!dev)  {
58725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      ret = VDP_STATUS_INVALID_HANDLE;
59725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      goto inv_device;
60725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   }
61725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
62725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   vldecoder = CALLOC(1,sizeof(vlVdpDecoder));
63725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   if (!vldecoder)   {
64725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	   ret = VDP_STATUS_RESOURCES;
65725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	   goto no_decoder;
66725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   }
67725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
68725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   p_profile = ProfileToPipe(profile);
69725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN)	{
70725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	   ret = VDP_STATUS_INVALID_DECODER_PROFILE;
71725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	   goto inv_profile;
72725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   }
73725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
74725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	// TODO: Define max_references. Used mainly for H264
75725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
766ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	vldecoder->profile = p_profile;
77725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vldecoder->device = dev;
78725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
79725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	*decoder = vlAddDataHTAB(vldecoder);
80725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (*decoder == 0) {
81725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      ret = VDP_STATUS_ERROR;
82725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      goto no_handle;
83725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	}
846ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	debug_printf("[VDPAU] Decoder created succesfully\n");
85725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
86725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	return VDP_STATUS_OK;
87725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
88725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	no_handle:
89725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	FREE(vldecoder);
90725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	inv_profile:
91725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	no_screen:
92725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	no_decoder:
93725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	inv_device:
94725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen    return ret;
95725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
96725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
97725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
98725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenvlVdpDecoderDestroy  (VdpDecoder decoder
99725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen)
100725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
101725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpDecoder *vldecoder;
102725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
103725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
104725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!vldecoder)  {
105725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      return VDP_STATUS_INVALID_HANDLE;
106725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	}
107725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
1086ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (vldecoder->vctx->vscreen)
1096ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		vl_screen_destroy(vldecoder->vctx->vscreen);
1106ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
111725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (vldecoder->vctx)
112725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		vl_video_destroy(vldecoder->vctx);
113725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
114725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	FREE(vldecoder);
115725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
116725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	return VDP_STATUS_OK;
117725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
118725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
119725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
1206ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenvlVdpCreateSurfaceTarget   (vlVdpDecoder *vldecoder,
121725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							vlVdpSurface *vlsurf
122725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen)
123725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
1246ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	struct pipe_resource tmplt;
1256ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	struct pipe_resource *surf_tex;
1266ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	struct pipe_video_context *vpipe;
1276ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1286ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if(!(vldecoder && vlsurf))
1296ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		return VDP_STATUS_INVALID_POINTER;
1306ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1316ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	vpipe = vldecoder->vctx;
1326ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1336ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	memset(&tmplt, 0, sizeof(struct pipe_resource));
1346ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.target = PIPE_TEXTURE_2D;
1356ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.format = vlsurf->format;
1366ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.last_level = 0;
1376ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (vpipe->is_format_supported(vpipe, tmplt.format,
1386ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                  PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET,
1396ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                  PIPE_TEXTURE_GEOM_NON_POWER_OF_TWO)) {
1406ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      tmplt.width0 = vlsurf->width;
1416ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      tmplt.height0 = vlsurf->height;
1426ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen    }
1436ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen    else {
1446ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      assert(vpipe->is_format_supported(vpipe, tmplt.format,
1456ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                       PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET,
1466ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                       PIPE_TEXTURE_GEOM_NON_SQUARE));
1476ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      tmplt.width0 = util_next_power_of_two(vlsurf->width);
1486ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      tmplt.height0 = util_next_power_of_two(vlsurf->height);
1496ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen    }
1506ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.depth0 = 1;
1516ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.usage = PIPE_USAGE_DEFAULT;
1526ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
1536ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.flags = 0;
1546ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1556ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	surf_tex = vpipe->screen->resource_create(vpipe->screen, &tmplt);
1566ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1576ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	vlsurf->psurface = vpipe->screen->get_tex_surface(vpipe->screen, surf_tex, 0, 0, 0,
1586ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                         PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET);
1596ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1606ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	pipe_resource_reference(&surf_tex, NULL);
1616ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1626ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (!vlsurf->psurface)
1636ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		return VDP_STATUS_RESOURCES;
1646ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
165725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
166725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	return VDP_STATUS_OK;
167725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
168725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
169725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
170725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenvlVdpDecoderRenderMpeg2    (vlVdpDecoder *vldecoder,
171725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							vlVdpSurface *vlsurf,
172725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							VdpPictureInfoMPEG1Or2 *picture_info,
173725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							uint32_t bitstream_buffer_count,
174725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							VdpBitstreamBuffer const *bitstream_buffers
175725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							)
176725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
177725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	struct pipe_video_context *vpipe;
178725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpSurface *t_vdp_surf;
179725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpSurface *p_vdp_surf;
180725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpSurface *f_vdp_surf;
181725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	struct pipe_surface *t_surf;
182725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	struct pipe_surface *p_surf;
183725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	struct pipe_surface *f_surf;
184725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	uint32_t num_macroblocks;
185cac5e60fd3fa7b756bcd4174db8096335c70e145Thomas Balling Sørensen	struct pipe_mpeg12_macroblock *pipe_macroblocks;
1866ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	VdpStatus ret;
1876ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
188725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
189725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vpipe = vldecoder->vctx->vpipe;
190725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	t_vdp_surf = vlsurf;
1916ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
192725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	/* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */
1936ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (picture_info->backward_reference ==  VDP_INVALID_HANDLE)
1946ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		p_vdp_surf = NULL;
1956ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	else	{
1966ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		p_vdp_surf = (vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference);
1976ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		if (!p_vdp_surf)
1986ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen			return VDP_STATUS_INVALID_HANDLE;
1996ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	}
2006ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
2016ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (picture_info->forward_reference ==  VDP_INVALID_HANDLE)
2026ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		f_vdp_surf = NULL;
2036ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	else	{
2046ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		f_vdp_surf = (vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference);
2056ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		if (!f_vdp_surf)
2066ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen			return VDP_STATUS_INVALID_HANDLE;
2076ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	}
2086ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
2096ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
210725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (f_vdp_surf ==  VDP_INVALID_HANDLE) f_vdp_surf = NULL;
211725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
2126ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	ret = vlVdpCreateSurfaceTarget(vldecoder,t_vdp_surf);
213cac5e60fd3fa7b756bcd4174db8096335c70e145Thomas Balling Sørensen
214cac5e60fd3fa7b756bcd4174db8096335c70e145Thomas Balling Sørensen	vlVdpBitstreamToMacroblock(vpipe->screen, bitstream_buffers,
215cac5e60fd3fa7b756bcd4174db8096335c70e145Thomas Balling Sørensen                     &num_macroblocks, &pipe_macroblocks);
216725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
217725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vpipe->set_decode_target(vpipe,t_surf);
218cac5e60fd3fa7b756bcd4174db8096335c70e145Thomas Balling Sørensen	vpipe->decode_macroblocks(vpipe, p_surf, f_surf, num_macroblocks, pipe_macroblocks, NULL);
2196ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	return ret;
220725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
221725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
222725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
223725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenvlVdpDecoderRender (VdpDecoder decoder,
224725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen					VdpVideoSurface target,
225725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen					VdpPictureInfo const *picture_info,
226725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen					uint32_t bitstream_buffer_count,
227725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen					VdpBitstreamBuffer const *bitstream_buffers
228725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen)
229725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
230725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpDecoder *vldecoder;
231725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpSurface *vlsurf;
2326ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	struct vl_screen *vscreen;
233725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	VdpStatus ret;
2346ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	debug_printf("[VDPAU] Decoding\n");
235725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
236725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!(picture_info && bitstream_buffers))
237725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_POINTER;
238725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
239725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
240725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
241725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!vldecoder)
242725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_HANDLE;
243725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
244725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlsurf = (vlVdpSurface *)vlGetDataHTAB(target);
245725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!vlsurf)
246725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_HANDLE;
247725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
248725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (vlsurf->device != vldecoder->device)
249725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
250725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
251725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (vlsurf->chroma_format != vldecoder->chroma_format)
252725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_CHROMA_TYPE;
253725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
2546ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	vscreen = vl_screen_create(vldecoder->device->display, vldecoder->device->screen);
2556ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (!vscreen)
2566ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		return VDP_STATUS_RESOURCES;
2576ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
2586ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	vldecoder->vctx = vl_video_create(vscreen, vldecoder->profile, vlsurf->format, vlsurf->width, vlsurf->height);
2596ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (!vldecoder->vctx)
2606ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		return VDP_STATUS_RESOURCES;
2616ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
2626ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	vldecoder->vctx->vscreen = vscreen;
2636ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
264725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen    // TODO: Right now only mpeg2 is supported.
265725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	switch (vldecoder->vctx->vpipe->profile)   {
266725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
267725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
268725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen			ret = vlVdpDecoderRenderMpeg2(vldecoder,vlsurf,(VdpPictureInfoMPEG1Or2 *)picture_info,
269725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen											bitstream_buffer_count,bitstream_buffers);
270725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen			break;
271725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		default:
272725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen			return VDP_STATUS_INVALID_DECODER_PROFILE;
273725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	}
274725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	assert(0);
275725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
276725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	return ret;
277cac5e60fd3fa7b756bcd4174db8096335c70e145Thomas Balling Sørensen}
278