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