decode.c revision 05579339c0da442669ea75749651e8cf4f9ec39b
1c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen/************************************************************************** 2c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * 3c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * Copyright 2010 Thomas Balling Sørensen. 4c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * All Rights Reserved. 5c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * 6c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * Permission is hereby granted, free of charge, to any person obtaining a 7c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * copy of this software and associated documentation files (the 8c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * "Software"), to deal in the Software without restriction, including 9c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * without limitation the rights to use, copy, modify, merge, publish, 10c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * distribute, sub license, and/or sell copies of the Software, and to 11c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * permit persons to whom the Software is furnished to do so, subject to 12c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * the following conditions: 13c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * 14c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * The above copyright notice and this permission notice (including the 15c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * next paragraph) shall be included in all copies or substantial portions 16c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * of the Software. 17c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * 18c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * 26c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen **************************************************************************/ 27c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen 2828f8ff6b622d63e8ffe322ab2cdf5197941f1a40Kai Wasserbäch#include "util/u_memory.h" 2928f8ff6b622d63e8ffe322ab2cdf5197941f1a40Kai Wasserbäch#include "util/u_math.h" 3028f8ff6b622d63e8ffe322ab2cdf5197941f1a40Kai Wasserbäch#include "util/u_debug.h" 3112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst#include "util/u_video.h" 32c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen 332471acfc4c051d480861265011fa5e77fad02887Christian König#include "vdpau_private.h" 342471acfc4c051d480861265011fa5e77fad02887Christian König 35fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 36fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Create a VdpDecoder. 37fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 38725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 3949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderCreate(VdpDevice device, 4049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpDecoderProfile profile, 4149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t width, uint32_t height, 4249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t max_references, 4349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpDecoder *decoder) 44725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 452471acfc4c051d480861265011fa5e77fad02887Christian König enum pipe_video_profile p_profile; 46ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König struct pipe_context *pipe; 471eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst struct pipe_screen *screen; 482471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDevice *dev; 492471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDecoder *vldecoder; 502471acfc4c051d480861265011fa5e77fad02887Christian König VdpStatus ret; 511eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst bool supported; 52b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 5349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!decoder) 5449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_POINTER; 551eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst *decoder = 0; 56b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 5749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!(width && height)) 5849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_VALUE; 59b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 602471acfc4c051d480861265011fa5e77fad02887Christian König p_profile = ProfileToPipe(profile); 612471acfc4c051d480861265011fa5e77fad02887Christian König if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN) 622471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_INVALID_DECODER_PROFILE; 632471acfc4c051d480861265011fa5e77fad02887Christian König 642471acfc4c051d480861265011fa5e77fad02887Christian König dev = vlGetDataHTAB(device); 652471acfc4c051d480861265011fa5e77fad02887Christian König if (!dev) 662471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_INVALID_HANDLE; 672471acfc4c051d480861265011fa5e77fad02887Christian König 681448e829e86981e6144410ba6a3d0f16357fb2b3Christian König pipe = dev->context; 691eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst screen = dev->vscreen->pscreen; 7005579339c0da442669ea75749651e8cf4f9ec39bChristian König 7105579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_lock(dev->mutex); 7205579339c0da442669ea75749651e8cf4f9ec39bChristian König 731eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst supported = screen->get_video_param 741eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst ( 751eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst screen, 761eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst p_profile, 771eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst PIPE_VIDEO_CAP_SUPPORTED 781eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst ); 7905579339c0da442669ea75749651e8cf4f9ec39bChristian König if (!supported) { 8005579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(dev->mutex); 811eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst return VDP_STATUS_INVALID_DECODER_PROFILE; 8205579339c0da442669ea75749651e8cf4f9ec39bChristian König } 83b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 84725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen vldecoder = CALLOC(1,sizeof(vlVdpDecoder)); 8505579339c0da442669ea75749651e8cf4f9ec39bChristian König if (!vldecoder) { 8605579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(dev->mutex); 872471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_RESOURCES; 8805579339c0da442669ea75749651e8cf4f9ec39bChristian König } 89b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 902471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->device = dev; 91725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 92ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König vldecoder->decoder = pipe->create_video_decoder 932471acfc4c051d480861265011fa5e77fad02887Christian König ( 94ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König pipe, p_profile, 952471acfc4c051d480861265011fa5e77fad02887Christian König PIPE_VIDEO_ENTRYPOINT_BITSTREAM, 962471acfc4c051d480861265011fa5e77fad02887Christian König PIPE_VIDEO_CHROMA_FORMAT_420, 978c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König width, height, max_references, 988c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König false 992471acfc4c051d480861265011fa5e77fad02887Christian König ); 10082e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange 1012471acfc4c051d480861265011fa5e77fad02887Christian König if (!vldecoder->decoder) { 1022471acfc4c051d480861265011fa5e77fad02887Christian König ret = VDP_STATUS_ERROR; 1032471acfc4c051d480861265011fa5e77fad02887Christian König goto error_decoder; 1042471acfc4c051d480861265011fa5e77fad02887Christian König } 105b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 10649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König *decoder = vlAddDataHTAB(vldecoder); 10749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (*decoder == 0) { 108725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen ret = VDP_STATUS_ERROR; 1092471acfc4c051d480861265011fa5e77fad02887Christian König goto error_handle; 11049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 11105579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(dev->mutex); 1122471acfc4c051d480861265011fa5e77fad02887Christian König 11349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 114b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 1152471acfc4c051d480861265011fa5e77fad02887Christian Königerror_handle: 1162471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->decoder->destroy(vldecoder->decoder); 1172471acfc4c051d480861265011fa5e77fad02887Christian König 1182471acfc4c051d480861265011fa5e77fad02887Christian Königerror_decoder: 11905579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(dev->mutex); 12049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König FREE(vldecoder); 1212471acfc4c051d480861265011fa5e77fad02887Christian König return ret; 122725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 123725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 124fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 125fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Destroy a VdpDecoder. 126fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 127725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 12849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderDestroy(VdpDecoder decoder) 129725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 1302471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDecoder *vldecoder; 131d5b05a869a71147987a1c1d6c84f8df17148f031Christian König 13249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 1332471acfc4c051d480861265011fa5e77fad02887Christian König if (!vldecoder) 134725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen return VDP_STATUS_INVALID_HANDLE; 135b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 13605579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_lock(vldecoder->device->mutex); 1372471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->decoder->destroy(vldecoder->decoder); 13805579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(vldecoder->device->mutex); 139b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 14049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König FREE(vldecoder); 141b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 14249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 143725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 144725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 145fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 146fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Retrieve the parameters used to create a VdpBitmapSurface. 147fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 148725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 1492471acfc4c051d480861265011fa5e77fad02887Christian KönigvlVdpDecoderGetParameters(VdpDecoder decoder, 1502471acfc4c051d480861265011fa5e77fad02887Christian König VdpDecoderProfile *profile, 1512471acfc4c051d480861265011fa5e77fad02887Christian König uint32_t *width, 1522471acfc4c051d480861265011fa5e77fad02887Christian König uint32_t *height) 153725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 15434145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König vlVdpDecoder *vldecoder; 15534145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König 15634145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 15734145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König if (!vldecoder) 15834145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König return VDP_STATUS_INVALID_HANDLE; 159c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange 16034145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *profile = PipeToProfile(vldecoder->decoder->profile); 16134145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *width = vldecoder->decoder->width; 16234145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *height = vldecoder->decoder->height; 163c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange 16449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 165725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 166725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 1678ea416f35de0c664ef47b71841756758f22d7faaChristian Königstatic VdpStatus 1688ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpGetReferenceFrame(VdpVideoSurface handle, struct pipe_video_buffer **ref_frame) 1698ea416f35de0c664ef47b71841756758f22d7faaChristian König{ 1708ea416f35de0c664ef47b71841756758f22d7faaChristian König vlVdpSurface *surface; 1718ea416f35de0c664ef47b71841756758f22d7faaChristian König 1728ea416f35de0c664ef47b71841756758f22d7faaChristian König /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */ 1738ea416f35de0c664ef47b71841756758f22d7faaChristian König if (handle == VDP_INVALID_HANDLE) { 1748ea416f35de0c664ef47b71841756758f22d7faaChristian König *ref_frame = NULL; 1758ea416f35de0c664ef47b71841756758f22d7faaChristian König return VDP_STATUS_OK; 1768ea416f35de0c664ef47b71841756758f22d7faaChristian König } 1778ea416f35de0c664ef47b71841756758f22d7faaChristian König 1788ea416f35de0c664ef47b71841756758f22d7faaChristian König surface = vlGetDataHTAB(handle); 1798ea416f35de0c664ef47b71841756758f22d7faaChristian König if (!surface) 1808ea416f35de0c664ef47b71841756758f22d7faaChristian König return VDP_STATUS_INVALID_HANDLE; 1818ea416f35de0c664ef47b71841756758f22d7faaChristian König 1828ea416f35de0c664ef47b71841756758f22d7faaChristian König *ref_frame = surface->video_buffer; 1838ea416f35de0c664ef47b71841756758f22d7faaChristian König if (!*ref_frame) 1848ea416f35de0c664ef47b71841756758f22d7faaChristian König return VDP_STATUS_INVALID_HANDLE; 1858ea416f35de0c664ef47b71841756758f22d7faaChristian König 1868ea416f35de0c664ef47b71841756758f22d7faaChristian König return VDP_STATUS_OK; 1878ea416f35de0c664ef47b71841756758f22d7faaChristian König} 1888ea416f35de0c664ef47b71841756758f22d7faaChristian König 189fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 190fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a mpeg 1/2 video. 191fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 1922471acfc4c051d480861265011fa5e77fad02887Christian Königstatic VdpStatus 1938ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpDecoderRenderMpeg12(struct pipe_mpeg12_picture_desc *picture, 19412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst VdpPictureInfoMPEG1Or2 *picture_info) 195725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 1968ea416f35de0c664ef47b71841756758f22d7faaChristian König VdpStatus r; 19749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 198fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG12\n"); 19949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2008ea416f35de0c664ef47b71841756758f22d7faaChristian König r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]); 2018ea416f35de0c664ef47b71841756758f22d7faaChristian König if (r != VDP_STATUS_OK) 2028ea416f35de0c664ef47b71841756758f22d7faaChristian König return r; 2038ea416f35de0c664ef47b71841756758f22d7faaChristian König 2048ea416f35de0c664ef47b71841756758f22d7faaChristian König r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]); 2058ea416f35de0c664ef47b71841756758f22d7faaChristian König if (r != VDP_STATUS_OK) 2068ea416f35de0c664ef47b71841756758f22d7faaChristian König return r; 2078ea416f35de0c664ef47b71841756758f22d7faaChristian König 2088ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->picture_coding_type = picture_info->picture_coding_type; 2098ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->picture_structure = picture_info->picture_structure; 2108ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->frame_pred_frame_dct = picture_info->frame_pred_frame_dct; 2118ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->q_scale_type = picture_info->q_scale_type; 2128ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->alternate_scan = picture_info->alternate_scan; 2138ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->intra_vlc_format = picture_info->intra_vlc_format; 2148ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->concealment_motion_vectors = picture_info->concealment_motion_vectors; 2158ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->intra_dc_precision = picture_info->intra_dc_precision; 2168ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->f_code[0][0] = picture_info->f_code[0][0] - 1; 2178ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->f_code[0][1] = picture_info->f_code[0][1] - 1; 2188ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->f_code[1][0] = picture_info->f_code[1][0] - 1; 2198ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->f_code[1][1] = picture_info->f_code[1][1] - 1; 2208ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->num_slices = picture_info->slice_count; 2218ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->top_field_first = picture_info->top_field_first; 2228ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->full_pel_forward_vector = picture_info->full_pel_forward_vector; 2238ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->full_pel_backward_vector = picture_info->full_pel_backward_vector; 2248ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->intra_matrix = picture_info->intra_quantizer_matrix; 2258ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->non_intra_matrix = picture_info->non_intra_quantizer_matrix; 22649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 22712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst return VDP_STATUS_OK; 22812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst} 22912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst 23012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst/** 231eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst * Decode a mpeg 4 video. 23212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst */ 23312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorststatic VdpStatus 2348ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpDecoderRenderMpeg4(struct pipe_mpeg4_picture_desc *picture, 2358ea416f35de0c664ef47b71841756758f22d7faaChristian König VdpPictureInfoMPEG4Part2 *picture_info) 23612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst{ 2378ea416f35de0c664ef47b71841756758f22d7faaChristian König VdpStatus r; 23812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst unsigned i; 239b4fa7db65639322ae8dea19a23c9cc8234a3d7e1Christian König 24012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG4\n"); 241c888fe027c338f337123de4da2de1ac73b0f7587Christian König 2428ea416f35de0c664ef47b71841756758f22d7faaChristian König r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]); 2438ea416f35de0c664ef47b71841756758f22d7faaChristian König if (r != VDP_STATUS_OK) 2448ea416f35de0c664ef47b71841756758f22d7faaChristian König return r; 24512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst 2468ea416f35de0c664ef47b71841756758f22d7faaChristian König r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]); 2478ea416f35de0c664ef47b71841756758f22d7faaChristian König if (r != VDP_STATUS_OK) 2488ea416f35de0c664ef47b71841756758f22d7faaChristian König return r; 24949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 25012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst for (i = 0; i < 2; ++i) { 2518ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->trd[i] = picture_info->trd[i]; 2528ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->trb[i] = picture_info->trb[i]; 25312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst } 2548ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->vop_time_increment_resolution = picture_info->vop_time_increment_resolution; 2558ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->vop_coding_type = picture_info->vop_coding_type; 2568ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->vop_fcode_forward = picture_info->vop_fcode_forward; 2578ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->vop_fcode_backward = picture_info->vop_fcode_backward; 2588ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->resync_marker_disable = picture_info->resync_marker_disable; 2598ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->interlaced = picture_info->interlaced; 2608ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->quant_type = picture_info->quant_type; 2618ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->quarter_sample = picture_info->quarter_sample; 2628ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->short_video_header = picture_info->short_video_header; 2638ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->rounding_control = picture_info->rounding_control; 2648ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->alternate_vertical_scan_flag = picture_info->alternate_vertical_scan_flag; 2658ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->top_field_first = picture_info->top_field_first; 2668ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->intra_matrix = picture_info->intra_quantizer_matrix; 2678ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->non_intra_matrix = picture_info->non_intra_quantizer_matrix; 2688ea416f35de0c664ef47b71841756758f22d7faaChristian König 2692471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_OK; 27038bd8131776879e9dc90d06848657756a4a13a66Christian König} 27138bd8131776879e9dc90d06848657756a4a13a66Christian König 272eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorststatic VdpStatus 2738ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpDecoderRenderVC1(struct pipe_vc1_picture_desc *picture, 274eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst VdpPictureInfoVC1 *picture_info) 275eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst{ 2768ea416f35de0c664ef47b71841756758f22d7faaChristian König VdpStatus r; 277eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst 278eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding VC-1\n"); 279eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst 2808ea416f35de0c664ef47b71841756758f22d7faaChristian König r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]); 2818ea416f35de0c664ef47b71841756758f22d7faaChristian König if (r != VDP_STATUS_OK) 2828ea416f35de0c664ef47b71841756758f22d7faaChristian König return r; 2838ea416f35de0c664ef47b71841756758f22d7faaChristian König 2848ea416f35de0c664ef47b71841756758f22d7faaChristian König r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]); 2858ea416f35de0c664ef47b71841756758f22d7faaChristian König if (r != VDP_STATUS_OK) 2868ea416f35de0c664ef47b71841756758f22d7faaChristian König return r; 2878ea416f35de0c664ef47b71841756758f22d7faaChristian König 2888ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->slice_count = picture_info->slice_count; 2898ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->picture_type = picture_info->picture_type; 2908ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->frame_coding_mode = picture_info->frame_coding_mode; 2918ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->postprocflag = picture_info->postprocflag; 2928ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->pulldown = picture_info->pulldown; 2938ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->interlace = picture_info->interlace; 2948ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->tfcntrflag = picture_info->tfcntrflag; 2958ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->finterpflag = picture_info->finterpflag; 2968ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->psf = picture_info->psf; 2978ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->dquant = picture_info->dquant; 2988ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->panscan_flag = picture_info->panscan_flag; 2998ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->refdist_flag = picture_info->refdist_flag; 3008ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->quantizer = picture_info->quantizer; 3018ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->extended_mv = picture_info->extended_mv; 3028ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->extended_dmv = picture_info->extended_dmv; 3038ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->overlap = picture_info->overlap; 3048ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->vstransform = picture_info->vstransform; 3058ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->loopfilter = picture_info->loopfilter; 3068ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->fastuvmc = picture_info->fastuvmc; 3078ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->range_mapy_flag = picture_info->range_mapy_flag; 3088ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->range_mapy = picture_info->range_mapy; 3098ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->range_mapuv_flag = picture_info->range_mapuv_flag; 3108ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->range_mapuv = picture_info->range_mapuv; 3118ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->multires = picture_info->multires; 3128ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->syncmarker = picture_info->syncmarker; 3138ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->rangered = picture_info->rangered; 3148ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->maxbframes = picture_info->maxbframes; 3158ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->deblockEnable = picture_info->deblockEnable; 3168ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->pquant = picture_info->pquant; 317eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst 318eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst return VDP_STATUS_OK; 319eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst} 320eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst 321d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian Königstatic VdpStatus 322d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian KönigvlVdpDecoderRenderH264(struct pipe_h264_picture_desc *picture, 323d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König VdpPictureInfoH264 *picture_info) 324d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König{ 325d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König unsigned i; 326d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 327d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding H264\n"); 328d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 329d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->slice_count = picture_info->slice_count; 330d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->field_order_cnt[0] = picture_info->field_order_cnt[0]; 331d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->field_order_cnt[1] = picture_info->field_order_cnt[1]; 332d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->is_reference = picture_info->is_reference; 333d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->frame_num = picture_info->frame_num; 334d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->field_pic_flag = picture_info->field_pic_flag; 335d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->bottom_field_flag = picture_info->bottom_field_flag; 336d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->num_ref_frames = picture_info->num_ref_frames; 337d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->mb_adaptive_frame_field_flag = picture_info->mb_adaptive_frame_field_flag; 338d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->constrained_intra_pred_flag = picture_info->constrained_intra_pred_flag; 339d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->weighted_pred_flag = picture_info->weighted_pred_flag; 340d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->weighted_bipred_idc = picture_info->weighted_bipred_idc; 341d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->frame_mbs_only_flag = picture_info->frame_mbs_only_flag; 342d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->transform_8x8_mode_flag = picture_info->transform_8x8_mode_flag; 343d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->chroma_qp_index_offset = picture_info->chroma_qp_index_offset; 344d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->second_chroma_qp_index_offset = picture_info->second_chroma_qp_index_offset; 345d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->pic_init_qp_minus26 = picture_info->pic_init_qp_minus26; 346d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->num_ref_idx_l0_active_minus1 = picture_info->num_ref_idx_l0_active_minus1; 347d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->num_ref_idx_l1_active_minus1 = picture_info->num_ref_idx_l1_active_minus1; 348d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->log2_max_frame_num_minus4 = picture_info->log2_max_frame_num_minus4; 349d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->pic_order_cnt_type = picture_info->pic_order_cnt_type; 350d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->log2_max_pic_order_cnt_lsb_minus4 = picture_info->log2_max_pic_order_cnt_lsb_minus4; 351d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->delta_pic_order_always_zero_flag = picture_info->delta_pic_order_always_zero_flag; 352d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->direct_8x8_inference_flag = picture_info->direct_8x8_inference_flag; 353d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->entropy_coding_mode_flag = picture_info->entropy_coding_mode_flag; 354d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->pic_order_present_flag = picture_info->pic_order_present_flag; 355d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->deblocking_filter_control_present_flag = picture_info->deblocking_filter_control_present_flag; 356d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->redundant_pic_cnt_present_flag = picture_info->redundant_pic_cnt_present_flag; 357d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 358d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König memcpy(picture->scaling_lists_4x4, picture_info->scaling_lists_4x4, 6*16); 359d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König memcpy(picture->scaling_lists_8x8, picture_info->scaling_lists_8x8, 2*64); 360d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 361d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König for (i = 0; i < 16; ++i) { 362d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König VdpStatus ret = vlVdpGetReferenceFrame 363d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König ( 364d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture_info->referenceFrames[i].surface, 365d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König &picture->ref[i] 366d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König ); 367d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König if (ret != VDP_STATUS_OK) 368d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König return ret; 369d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 370d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->is_long_term[i] = picture_info->referenceFrames[i].is_long_term; 371d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->top_is_reference[i] = picture_info->referenceFrames[i].top_is_reference; 372d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->bottom_is_reference[i] = picture_info->referenceFrames[i].bottom_is_reference; 373d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->field_order_cnt_list[i][0] = picture_info->referenceFrames[i].field_order_cnt[0]; 374d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->field_order_cnt_list[i][1] = picture_info->referenceFrames[i].field_order_cnt[1]; 375d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->frame_num_list[i] = picture_info->referenceFrames[i].frame_idx; 376d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König } 377d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 378d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König return VDP_STATUS_OK; 379d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König} 380d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 381fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 382fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a compressed field/frame and render the result into a VdpVideoSurface. 383fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 38438bd8131776879e9dc90d06848657756a4a13a66Christian KönigVdpStatus 38549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderRender(VdpDecoder decoder, 38649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpVideoSurface target, 38749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpPictureInfo const *picture_info, 38849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t bitstream_buffer_count, 38949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpBitstreamBuffer const *bitstream_buffers) 390725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 3917ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König const void * buffers[bitstream_buffer_count]; 3927ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König unsigned sizes[bitstream_buffer_count]; 39349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlVdpDecoder *vldecoder; 39449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlVdpSurface *vlsurf; 39512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst VdpStatus ret; 396020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König struct pipe_screen *screen; 39712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst struct pipe_video_decoder *dec; 3988f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König bool buffer_support[2]; 39912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst unsigned i; 4008ea416f35de0c664ef47b71841756758f22d7faaChristian König union { 4018ea416f35de0c664ef47b71841756758f22d7faaChristian König struct pipe_picture_desc base; 4028ea416f35de0c664ef47b71841756758f22d7faaChristian König struct pipe_mpeg12_picture_desc mpeg12; 4038ea416f35de0c664ef47b71841756758f22d7faaChristian König struct pipe_mpeg4_picture_desc mpeg4; 4048ea416f35de0c664ef47b71841756758f22d7faaChristian König struct pipe_vc1_picture_desc vc1; 405d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König struct pipe_h264_picture_desc h264; 4068ea416f35de0c664ef47b71841756758f22d7faaChristian König } desc; 40749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 40849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!(picture_info && bitstream_buffers)) 40949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_POINTER; 41049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 41149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 41249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!vldecoder) 41349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 41412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst dec = vldecoder->decoder; 415020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König screen = dec->context->screen; 41649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 41749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlsurf = (vlVdpSurface *)vlGetDataHTAB(target); 41849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!vlsurf) 41949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 42049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 42149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (vlsurf->device != vldecoder->device) 42249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_HANDLE_DEVICE_MISMATCH; 42349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 424020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König if (vlsurf->video_buffer != NULL && vlsurf->video_buffer->chroma_format != dec->chroma_format) 4252471acfc4c051d480861265011fa5e77fad02887Christian König // TODO: Recreate decoder with correct chroma 4262471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_INVALID_CHROMA_TYPE; 42749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 42805579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_lock(vlsurf->device->mutex); 42905579339c0da442669ea75749651e8cf4f9ec39bChristian König 4308f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König buffer_support[0] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE); 4318f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König buffer_support[1] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_SUPPORTS_INTERLACED); 4328f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König 433020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König if (vlsurf->video_buffer == NULL || 4348f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König !screen->is_video_format_supported(screen, vlsurf->video_buffer->buffer_format, dec->profile) || 4358f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König buffer_support[vlsurf->video_buffer->interlaced]) { 436020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König 437020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König /* destroy the old one */ 438020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König if (vlsurf->video_buffer) 439020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König vlsurf->video_buffer->destroy(vlsurf->video_buffer); 440020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König 441020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König /* set the buffer format to the prefered one */ 442020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König vlsurf->templat.buffer_format = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_PREFERED_FORMAT); 443020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König 4448f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König /* also set interlacing to decoders preferences */ 4458f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König vlsurf->templat.interlaced = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_PREFERS_INTERLACED); 4468f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König 447020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König /* and recreate the video buffer */ 448020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König vlsurf->video_buffer = dec->context->create_video_buffer(dec->context, &vlsurf->templat); 449020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König 450020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König /* still no luck? get me out of here... */ 45105579339c0da442669ea75749651e8cf4f9ec39bChristian König if (!vlsurf->video_buffer) { 45205579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(vlsurf->device->mutex); 453020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König return VDP_STATUS_NO_IMPLEMENTATION; 45405579339c0da442669ea75749651e8cf4f9ec39bChristian König } 455020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König } 456020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König 4578ea416f35de0c664ef47b71841756758f22d7faaChristian König memset(&desc, 0, sizeof(desc)); 4588ea416f35de0c664ef47b71841756758f22d7faaChristian König desc.base.profile = dec->profile; 45912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst switch (u_reduce_video_profile(dec->profile)) { 46012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst case PIPE_VIDEO_CODEC_MPEG12: 4618ea416f35de0c664ef47b71841756758f22d7faaChristian König ret = vlVdpDecoderRenderMpeg12(&desc.mpeg12, (VdpPictureInfoMPEG1Or2 *)picture_info); 46212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst break; 46312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst case PIPE_VIDEO_CODEC_MPEG4: 4648ea416f35de0c664ef47b71841756758f22d7faaChristian König ret = vlVdpDecoderRenderMpeg4(&desc.mpeg4, (VdpPictureInfoMPEG4Part2 *)picture_info); 46549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König break; 466eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst case PIPE_VIDEO_CODEC_VC1: 4678ea416f35de0c664ef47b71841756758f22d7faaChristian König ret = vlVdpDecoderRenderVC1(&desc.vc1, (VdpPictureInfoVC1 *)picture_info); 468eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst break; 469d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König case PIPE_VIDEO_CODEC_MPEG4_AVC: 470d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König ret = vlVdpDecoderRenderH264(&desc.h264, (VdpPictureInfoH264 *)picture_info); 471d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König break; 47249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König default: 47305579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(vlsurf->device->mutex); 47449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_DECODER_PROFILE; 47549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 47605579339c0da442669ea75749651e8cf4f9ec39bChristian König if (ret != VDP_STATUS_OK) { 47705579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(vlsurf->device->mutex); 47812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst return ret; 47905579339c0da442669ea75749651e8cf4f9ec39bChristian König } 48012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst 4817ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König for (i = 0; i < bitstream_buffer_count; ++i) { 4827ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König buffers[i] = bitstream_buffers[i].bitstream; 4837ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König sizes[i] = bitstream_buffers[i].bitstream_bytes; 4847ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König } 4858ea416f35de0c664ef47b71841756758f22d7faaChristian König 4868ea416f35de0c664ef47b71841756758f22d7faaChristian König dec->begin_frame(dec, vlsurf->video_buffer, &desc.base); 4878ea416f35de0c664ef47b71841756758f22d7faaChristian König dec->decode_bitstream(dec, vlsurf->video_buffer, &desc.base, bitstream_buffer_count, buffers, sizes); 4888ea416f35de0c664ef47b71841756758f22d7faaChristian König dec->end_frame(dec, vlsurf->video_buffer, &desc.base); 48905579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(vlsurf->device->mutex); 49012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst return ret; 491b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König} 492