decode.c revision b90f569a0f8578a20b9ee2997396b6c3ddd3b573
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
36b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian KönigvlVdpDecoderCreate ( 	VdpDevice device,
37b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König						VdpDecoderProfile profile,
38b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König						uint32_t width, uint32_t height,
39b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König						uint32_t max_references,
40b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König						VdpDecoder *decoder
41725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen)
42725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
437d2bdc2d4db8321a72edcc921a0fcfa4e4d41ef9Thomas Balling Sørensen	enum pipe_video_profile p_profile = PIPE_VIDEO_PROFILE_UNKNOWN;
447d2bdc2d4db8321a72edcc921a0fcfa4e4d41ef9Thomas Balling Sørensen	VdpStatus ret = VDP_STATUS_OK;
457d2bdc2d4db8321a72edcc921a0fcfa4e4d41ef9Thomas Balling Sørensen	vlVdpDecoder *vldecoder = NULL;
46b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
476ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	debug_printf("[VDPAU] Creating decoder\n");
48b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
49725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!decoder)
50725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_POINTER;
51b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
52725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!(width && height))
53725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_VALUE;
54b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
55725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   vlVdpDevice *dev = vlGetDataHTAB(device);
56725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   if (!dev)  {
57725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      ret = VDP_STATUS_INVALID_HANDLE;
58725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      goto inv_device;
59725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   }
60b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
61725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   vldecoder = CALLOC(1,sizeof(vlVdpDecoder));
62725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   if (!vldecoder)   {
63725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	   ret = VDP_STATUS_RESOURCES;
64725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	   goto no_decoder;
65725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   }
66b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
67725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   p_profile = ProfileToPipe(profile);
68725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN)	{
69725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	   ret = VDP_STATUS_INVALID_DECODER_PROFILE;
70725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	   goto inv_profile;
71725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen   }
72725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
73725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	// TODO: Define max_references. Used mainly for H264
74b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
756ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	vldecoder->profile = p_profile;
76bff1ac875c2c62ba5045bb953f800253c49361cbThomas Balling Sørensen	vldecoder->height = height;
77bff1ac875c2c62ba5045bb953f800253c49361cbThomas Balling Sørensen	vldecoder->width = width;
78725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vldecoder->device = dev;
79bff1ac875c2c62ba5045bb953f800253c49361cbThomas Balling Sørensen	vldecoder->vctx = NULL;
80b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
81725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	*decoder = vlAddDataHTAB(vldecoder);
82725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (*decoder == 0) {
83725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      ret = VDP_STATUS_ERROR;
84725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      goto no_handle;
85725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	}
866ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	debug_printf("[VDPAU] Decoder created succesfully\n");
87b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
88725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	return VDP_STATUS_OK;
89b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
90725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	no_handle:
91725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	FREE(vldecoder);
92725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	inv_profile:
93725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	no_screen:
94725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	no_decoder:
95725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	inv_device:
96725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen    return ret;
97725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
98725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
99725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
100725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenvlVdpDecoderDestroy  (VdpDecoder decoder
101725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen)
102725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
10365fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	debug_printf("[VDPAU] Destroying decoder\n");
104725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpDecoder *vldecoder;
105b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
106725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
107725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!vldecoder)  {
108725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      return VDP_STATUS_INVALID_HANDLE;
109725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	}
110b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
11165fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	if (vldecoder->vctx)
11265fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	{
11365fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen		if (vldecoder->vctx->vscreen)
11465fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen			vl_screen_destroy(vldecoder->vctx->vscreen);
11565fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	}
116b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
117725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (vldecoder->vctx)
118725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		vl_video_destroy(vldecoder->vctx);
119b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
120725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	FREE(vldecoder);
121b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
122725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	return VDP_STATUS_OK;
123725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
124725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
125725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
1266ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenvlVdpCreateSurfaceTarget   (vlVdpDecoder *vldecoder,
127725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							vlVdpSurface *vlsurf
128725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen)
129725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
130b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König	struct pipe_surface surf_template;
1316ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	struct pipe_resource tmplt;
1326ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	struct pipe_resource *surf_tex;
133bff1ac875c2c62ba5045bb953f800253c49361cbThomas Balling Sørensen	struct pipe_video_context *vctx;
134b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
13565fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	debug_printf("[VDPAU] Creating surface\n");
136b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
1376ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if(!(vldecoder && vlsurf))
1386ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		return VDP_STATUS_INVALID_POINTER;
139b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
1407d2bdc2d4db8321a72edcc921a0fcfa4e4d41ef9Thomas Balling Sørensen	vctx = vldecoder->vctx->vpipe;
141b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
1426ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	memset(&tmplt, 0, sizeof(struct pipe_resource));
1436ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.target = PIPE_TEXTURE_2D;
1447d2bdc2d4db8321a72edcc921a0fcfa4e4d41ef9Thomas Balling Sørensen	tmplt.format = vctx->get_param(vctx,PIPE_CAP_DECODE_TARGET_PREFERRED_FORMAT);
1456ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.last_level = 0;
1467d2bdc2d4db8321a72edcc921a0fcfa4e4d41ef9Thomas Balling Sørensen
147bff1ac875c2c62ba5045bb953f800253c49361cbThomas Balling Sørensen	if (vctx->is_format_supported(vctx, tmplt.format,
1486ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                  PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET,
1496ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                  PIPE_TEXTURE_GEOM_NON_POWER_OF_TWO)) {
1506ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      tmplt.width0 = vlsurf->width;
1516ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      tmplt.height0 = vlsurf->height;
1526ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen    }
1536ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen    else {
154bff1ac875c2c62ba5045bb953f800253c49361cbThomas Balling Sørensen      assert(vctx->is_format_supported(vctx, tmplt.format,
1556ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                       PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET,
1566ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                       PIPE_TEXTURE_GEOM_NON_SQUARE));
1576ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      tmplt.width0 = util_next_power_of_two(vlsurf->width);
1586ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      tmplt.height0 = util_next_power_of_two(vlsurf->height);
1596ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen    }
160b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
1616ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.depth0 = 1;
1626ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.usage = PIPE_USAGE_DEFAULT;
1636ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
1646ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.flags = 0;
165b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
166bff1ac875c2c62ba5045bb953f800253c49361cbThomas Balling Sørensen	surf_tex = vctx->screen->resource_create(vctx->screen, &tmplt);
167b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
168b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König	memset(&surf_template, 0, sizeof(surf_template));
169b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König	surf_template.format = surf_tex->format;
170b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König	surf_template.usage = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
171b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König	vlsurf->psurface = vctx->create_surface(vctx->screen, surf_tex, &surf_template);
172b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
1736ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	pipe_resource_reference(&surf_tex, NULL);
174b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
1756ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (!vlsurf->psurface)
1766ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		return VDP_STATUS_RESOURCES;
1777d2bdc2d4db8321a72edcc921a0fcfa4e4d41ef9Thomas Balling Sørensen	debug_printf("[VDPAU] Done creating surface\n");
178b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
179725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	return VDP_STATUS_OK;
180725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
181725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
182725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
183725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenvlVdpDecoderRenderMpeg2    (vlVdpDecoder *vldecoder,
184725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							vlVdpSurface *vlsurf,
185725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							VdpPictureInfoMPEG1Or2 *picture_info,
186725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							uint32_t bitstream_buffer_count,
187725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							VdpBitstreamBuffer const *bitstream_buffers
188725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							)
189725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
190725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	struct pipe_video_context *vpipe;
191725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpSurface *t_vdp_surf;
192725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpSurface *p_vdp_surf;
193725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpSurface *f_vdp_surf;
194725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	struct pipe_surface *t_surf;
195725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	struct pipe_surface *p_surf;
196725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	struct pipe_surface *f_surf;
197725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	uint32_t num_macroblocks;
198cac5e60fd3fa7b756bcd4174db8096335c70e145Thomas Balling Sørensen	struct pipe_mpeg12_macroblock *pipe_macroblocks;
1996ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	VdpStatus ret;
200b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
20165fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	debug_printf("[VDPAU] Decoding MPEG2\n");
202725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
203725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	t_vdp_surf = vlsurf;
204b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
205725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	/* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */
206b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König	if (picture_info->backward_reference ==  VDP_INVALID_HANDLE)
2076ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		p_vdp_surf = NULL;
2086ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	else	{
2096ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		p_vdp_surf = (vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference);
2106ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		if (!p_vdp_surf)
2116ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen			return VDP_STATUS_INVALID_HANDLE;
2126ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	}
2136ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
214b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König	if (picture_info->forward_reference ==  VDP_INVALID_HANDLE)
2156ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		f_vdp_surf = NULL;
2166ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	else	{
2176ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		f_vdp_surf = (vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference);
2186ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		if (!f_vdp_surf)
2196ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen			return VDP_STATUS_INVALID_HANDLE;
2206ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	}
221b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
222b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
223725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (f_vdp_surf ==  VDP_INVALID_HANDLE) f_vdp_surf = NULL;
224b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
2256ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	ret = vlVdpCreateSurfaceTarget(vldecoder,t_vdp_surf);
226cac5e60fd3fa7b756bcd4174db8096335c70e145Thomas Balling Sørensen
227bff1ac875c2c62ba5045bb953f800253c49361cbThomas Balling Sørensen	vpipe = vldecoder->vctx->vpipe;
228bff1ac875c2c62ba5045bb953f800253c49361cbThomas Balling Sørensen
229d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen	if (vlVdpMPEG2BitstreamToMacroblock(vpipe->screen, bitstream_buffers, bitstream_buffer_count,
230d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen                     &num_macroblocks, &pipe_macroblocks))
231d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen					 {
232d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen						 debug_printf("[VDPAU] Error in frame-header. Skipping.\n");
233b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
234d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen						 ret = VDP_STATUS_OK;
235d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen						 goto skip_frame;
236d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen					 }
237b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
238725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vpipe->set_decode_target(vpipe,t_surf);
239bff1ac875c2c62ba5045bb953f800253c49361cbThomas Balling Sørensen	vpipe->decode_macroblocks(vpipe, p_surf, f_surf, num_macroblocks, (struct pipe_macroblock *)pipe_macroblocks, NULL);
240b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
241d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen	skip_frame:
2426ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	return ret;
243725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
244725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
245725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
246b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian KönigvlVdpDecoderRender (VdpDecoder decoder,
247b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König					VdpVideoSurface target,
248b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König					VdpPictureInfo const *picture_info,
249b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König					uint32_t bitstream_buffer_count,
250725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen					VdpBitstreamBuffer const *bitstream_buffers
251725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen)
252725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
253725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpDecoder *vldecoder;
254725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpSurface *vlsurf;
2556ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	struct vl_screen *vscreen;
256725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	VdpStatus ret;
2576ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	debug_printf("[VDPAU] Decoding\n");
258b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
259725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!(picture_info && bitstream_buffers))
260725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_POINTER;
261b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
262b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
263725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
264725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!vldecoder)
265725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_HANDLE;
266725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
267725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlsurf = (vlVdpSurface *)vlGetDataHTAB(target);
268725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!vlsurf)
269725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_HANDLE;
270b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
271725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (vlsurf->device != vldecoder->device)
272725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
273b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
274bff1ac875c2c62ba5045bb953f800253c49361cbThomas Balling Sørensen	/* Test doesn't make sence */
275bff1ac875c2c62ba5045bb953f800253c49361cbThomas Balling Sørensen	/*if (vlsurf->chroma_format != vldecoder->chroma_format)
276bff1ac875c2c62ba5045bb953f800253c49361cbThomas Balling Sørensen		return VDP_STATUS_INVALID_CHROMA_TYPE;*/
277b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
2786ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	vscreen = vl_screen_create(vldecoder->device->display, vldecoder->device->screen);
2796ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (!vscreen)
2806ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		return VDP_STATUS_RESOURCES;
281b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
2827d2bdc2d4db8321a72edcc921a0fcfa4e4d41ef9Thomas Balling Sørensen	vldecoder->vctx = vl_video_create(vscreen, vldecoder->profile, vlsurf->chroma_format, vldecoder->width, vldecoder->height);
2836ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (!vldecoder->vctx)
2846ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		return VDP_STATUS_RESOURCES;
285b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
286725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen    // TODO: Right now only mpeg2 is supported.
287725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	switch (vldecoder->vctx->vpipe->profile)   {
288725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
289725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
290725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen			ret = vlVdpDecoderRenderMpeg2(vldecoder,vlsurf,(VdpPictureInfoMPEG1Or2 *)picture_info,
291725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen											bitstream_buffer_count,bitstream_buffers);
292725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen			break;
293725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		default:
294725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen			return VDP_STATUS_INVALID_DECODER_PROFILE;
295725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	}
296725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	assert(0);
297725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
298725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	return ret;
299cac5e60fd3fa7b756bcd4174db8096335c70e145Thomas Balling Sørensen}
30065fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen
301b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian KönigVdpStatus
30265fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling SørensenvlVdpGenerateCSCMatrix(
303b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König	VdpProcamp *procamp,
30465fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	VdpColorStandard standard,
30565fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	VdpCSCMatrix *csc_matrix)
30665fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen{
30765fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	debug_printf("[VDPAU] Generating CSCMatrix\n");
30865fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	if (!(csc_matrix && procamp))
30965fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen		return VDP_STATUS_INVALID_POINTER;
310b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König
31165fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	return VDP_STATUS_OK;
312b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König}
313