decode.c revision 65fe0866aec7b5608419f6d184cb1fa4fe1dc45a
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{
10165fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	debug_printf("[VDPAU] Destroying decoder\n");
102725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpDecoder *vldecoder;
103725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
104725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
105725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!vldecoder)  {
106725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen      return VDP_STATUS_INVALID_HANDLE;
107725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	}
108725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
10965fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	if (vldecoder->vctx)
11065fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	{
11165fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen		if (vldecoder->vctx->vscreen)
11265fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen			vl_screen_destroy(vldecoder->vctx->vscreen);
11365fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	}
1146ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
115725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (vldecoder->vctx)
116725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		vl_video_destroy(vldecoder->vctx);
117725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
118725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	FREE(vldecoder);
119725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
120725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	return VDP_STATUS_OK;
121725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
122725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
123725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
1246ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling SørensenvlVdpCreateSurfaceTarget   (vlVdpDecoder *vldecoder,
125725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							vlVdpSurface *vlsurf
126725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen)
127725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
1286ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	struct pipe_resource tmplt;
1296ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	struct pipe_resource *surf_tex;
1306ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	struct pipe_video_context *vpipe;
13165fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen
13265fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	debug_printf("[VDPAU] Creating surface\n");
1336ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1346ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if(!(vldecoder && vlsurf))
1356ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		return VDP_STATUS_INVALID_POINTER;
1366ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1376ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	vpipe = vldecoder->vctx;
1386ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1396ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	memset(&tmplt, 0, sizeof(struct pipe_resource));
1406ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.target = PIPE_TEXTURE_2D;
1416ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.format = vlsurf->format;
1426ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.last_level = 0;
1436ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (vpipe->is_format_supported(vpipe, tmplt.format,
1446ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                  PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET,
1456ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                  PIPE_TEXTURE_GEOM_NON_POWER_OF_TWO)) {
1466ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      tmplt.width0 = vlsurf->width;
1476ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      tmplt.height0 = vlsurf->height;
1486ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen    }
1496ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen    else {
1506ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      assert(vpipe->is_format_supported(vpipe, tmplt.format,
1516ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                       PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET,
1526ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                       PIPE_TEXTURE_GEOM_NON_SQUARE));
1536ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      tmplt.width0 = util_next_power_of_two(vlsurf->width);
1546ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen      tmplt.height0 = util_next_power_of_two(vlsurf->height);
1556ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen    }
1566ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.depth0 = 1;
1576ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.usage = PIPE_USAGE_DEFAULT;
1586ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
1596ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	tmplt.flags = 0;
1606ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1616ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	surf_tex = vpipe->screen->resource_create(vpipe->screen, &tmplt);
1626ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1636ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	vlsurf->psurface = vpipe->screen->get_tex_surface(vpipe->screen, surf_tex, 0, 0, 0,
1646ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen                                         PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET);
1656ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1666ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	pipe_resource_reference(&surf_tex, NULL);
1676ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
1686ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (!vlsurf->psurface)
1696ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		return VDP_STATUS_RESOURCES;
1706ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
171725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
172725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	return VDP_STATUS_OK;
173725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
174725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
175725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
176725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenvlVdpDecoderRenderMpeg2    (vlVdpDecoder *vldecoder,
177725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							vlVdpSurface *vlsurf,
178725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							VdpPictureInfoMPEG1Or2 *picture_info,
179725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							uint32_t bitstream_buffer_count,
180725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							VdpBitstreamBuffer const *bitstream_buffers
181725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen							)
182725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
183725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	struct pipe_video_context *vpipe;
184725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpSurface *t_vdp_surf;
185725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpSurface *p_vdp_surf;
186725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpSurface *f_vdp_surf;
187725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	struct pipe_surface *t_surf;
188725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	struct pipe_surface *p_surf;
189725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	struct pipe_surface *f_surf;
190725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	uint32_t num_macroblocks;
191cac5e60fd3fa7b756bcd4174db8096335c70e145Thomas Balling Sørensen	struct pipe_mpeg12_macroblock *pipe_macroblocks;
1926ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	VdpStatus ret;
1936ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
19465fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	debug_printf("[VDPAU] Decoding MPEG2\n");
195725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
196725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vpipe = vldecoder->vctx->vpipe;
197725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	t_vdp_surf = vlsurf;
1986ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
199725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	/* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */
2006ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (picture_info->backward_reference ==  VDP_INVALID_HANDLE)
2016ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		p_vdp_surf = NULL;
2026ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	else	{
2036ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		p_vdp_surf = (vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference);
2046ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		if (!p_vdp_surf)
2056ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen			return VDP_STATUS_INVALID_HANDLE;
2066ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	}
2076ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
2086ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (picture_info->forward_reference ==  VDP_INVALID_HANDLE)
2096ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		f_vdp_surf = NULL;
2106ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	else	{
2116ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		f_vdp_surf = (vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference);
2126ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		if (!f_vdp_surf)
2136ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen			return VDP_STATUS_INVALID_HANDLE;
2146ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	}
2156ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
2166ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
217725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (f_vdp_surf ==  VDP_INVALID_HANDLE) f_vdp_surf = NULL;
218725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
2196ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	ret = vlVdpCreateSurfaceTarget(vldecoder,t_vdp_surf);
220cac5e60fd3fa7b756bcd4174db8096335c70e145Thomas Balling Sørensen
221d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen	if (vlVdpMPEG2BitstreamToMacroblock(vpipe->screen, bitstream_buffers, bitstream_buffer_count,
222d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen                     &num_macroblocks, &pipe_macroblocks))
223d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen					 {
224d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen						 debug_printf("[VDPAU] Error in frame-header. Skipping.\n");
225d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen
226d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen						 ret = VDP_STATUS_OK;
227d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen						 goto skip_frame;
228d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen					 }
229725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
230725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vpipe->set_decode_target(vpipe,t_surf);
23165fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	//vpipe->decode_macroblocks(vpipe, p_surf, f_surf, num_macroblocks, (struct pipe_macroblock *)pipe_macroblocks, NULL);
232d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen
233d0e203f1f00b0f760acc7fab07cd7ce8cca34000Thomas Balling Sørensen	skip_frame:
2346ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	return ret;
235725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen}
236725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
237725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus
238725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenvlVdpDecoderRender (VdpDecoder decoder,
239725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen					VdpVideoSurface target,
240725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen					VdpPictureInfo const *picture_info,
241725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen					uint32_t bitstream_buffer_count,
242725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen					VdpBitstreamBuffer const *bitstream_buffers
243725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen)
244725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{
245725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpDecoder *vldecoder;
246725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlVdpSurface *vlsurf;
2476ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	struct vl_screen *vscreen;
248725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	VdpStatus ret;
2496ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	debug_printf("[VDPAU] Decoding\n");
250725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
251725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!(picture_info && bitstream_buffers))
252725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_POINTER;
253725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
254725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
255725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
256725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!vldecoder)
257725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_HANDLE;
258725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
259725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	vlsurf = (vlVdpSurface *)vlGetDataHTAB(target);
260725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (!vlsurf)
261725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_HANDLE;
262725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
263725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (vlsurf->device != vldecoder->device)
264725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
265725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
266725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	if (vlsurf->chroma_format != vldecoder->chroma_format)
267725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		return VDP_STATUS_INVALID_CHROMA_TYPE;
268725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
2696ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	vscreen = vl_screen_create(vldecoder->device->display, vldecoder->device->screen);
2706ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (!vscreen)
2716ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		return VDP_STATUS_RESOURCES;
2726ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
2736ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	vldecoder->vctx = vl_video_create(vscreen, vldecoder->profile, vlsurf->format, vlsurf->width, vlsurf->height);
2746ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	if (!vldecoder->vctx)
2756ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen		return VDP_STATUS_RESOURCES;
2766ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
2776ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen	vldecoder->vctx->vscreen = vscreen;
2786ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen
279725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen    // TODO: Right now only mpeg2 is supported.
280725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	switch (vldecoder->vctx->vpipe->profile)   {
281725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
282725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
283725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen			ret = vlVdpDecoderRenderMpeg2(vldecoder,vlsurf,(VdpPictureInfoMPEG1Or2 *)picture_info,
284725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen											bitstream_buffer_count,bitstream_buffers);
285725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen			break;
286725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen		default:
287725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen			return VDP_STATUS_INVALID_DECODER_PROFILE;
288725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	}
289725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	assert(0);
290725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen
291725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen	return ret;
292cac5e60fd3fa7b756bcd4174db8096335c70e145Thomas Balling Sørensen}
29365fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen
29465fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling SørensenVdpStatus
29565fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling SørensenvlVdpGenerateCSCMatrix(
29665fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	VdpProcamp *procamp,
29765fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	VdpColorStandard standard,
29865fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	VdpCSCMatrix *csc_matrix)
29965fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen{
30065fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	debug_printf("[VDPAU] Generating CSCMatrix\n");
30165fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	if (!(csc_matrix && procamp))
30265fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen		return VDP_STATUS_INVALID_POINTER;
30365fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen
30465fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen	return VDP_STATUS_OK;
30565fe0866aec7b5608419f6d184cb1fa4fe1dc45aThomas Balling Sørensen}