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 33fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König#include "vl/vl_vlc.h" 34fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König 352471acfc4c051d480861265011fa5e77fad02887Christian König#include "vdpau_private.h" 362471acfc4c051d480861265011fa5e77fad02887Christian König 37fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 38fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Create a VdpDecoder. 39fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 40725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 4149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderCreate(VdpDevice device, 4249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpDecoderProfile profile, 4349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t width, uint32_t height, 4449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t max_references, 4549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpDecoder *decoder) 46725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 472471acfc4c051d480861265011fa5e77fad02887Christian König enum pipe_video_profile p_profile; 48ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König struct pipe_context *pipe; 491eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst struct pipe_screen *screen; 502471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDevice *dev; 512471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDecoder *vldecoder; 522471acfc4c051d480861265011fa5e77fad02887Christian König VdpStatus ret; 531eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst bool supported; 54b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 5549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!decoder) 5649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_POINTER; 571eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst *decoder = 0; 58b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 5949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!(width && height)) 6049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_VALUE; 61b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 622471acfc4c051d480861265011fa5e77fad02887Christian König p_profile = ProfileToPipe(profile); 632471acfc4c051d480861265011fa5e77fad02887Christian König if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN) 642471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_INVALID_DECODER_PROFILE; 652471acfc4c051d480861265011fa5e77fad02887Christian König 662471acfc4c051d480861265011fa5e77fad02887Christian König dev = vlGetDataHTAB(device); 672471acfc4c051d480861265011fa5e77fad02887Christian König if (!dev) 682471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_INVALID_HANDLE; 692471acfc4c051d480861265011fa5e77fad02887Christian König 701448e829e86981e6144410ba6a3d0f16357fb2b3Christian König pipe = dev->context; 711eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst screen = dev->vscreen->pscreen; 7205579339c0da442669ea75749651e8cf4f9ec39bChristian König 7305579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_lock(dev->mutex); 7405579339c0da442669ea75749651e8cf4f9ec39bChristian König 751eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst supported = screen->get_video_param 761eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst ( 771eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst screen, 781eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst p_profile, 791eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst PIPE_VIDEO_CAP_SUPPORTED 801eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst ); 8105579339c0da442669ea75749651e8cf4f9ec39bChristian König if (!supported) { 8205579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(dev->mutex); 831eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst return VDP_STATUS_INVALID_DECODER_PROFILE; 8405579339c0da442669ea75749651e8cf4f9ec39bChristian König } 85b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 86725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen vldecoder = CALLOC(1,sizeof(vlVdpDecoder)); 8705579339c0da442669ea75749651e8cf4f9ec39bChristian König if (!vldecoder) { 8805579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(dev->mutex); 892471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_RESOURCES; 9005579339c0da442669ea75749651e8cf4f9ec39bChristian König } 91b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 922471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->device = dev; 93725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 94ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König vldecoder->decoder = pipe->create_video_decoder 952471acfc4c051d480861265011fa5e77fad02887Christian König ( 96ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König pipe, p_profile, 972471acfc4c051d480861265011fa5e77fad02887Christian König PIPE_VIDEO_ENTRYPOINT_BITSTREAM, 982471acfc4c051d480861265011fa5e77fad02887Christian König PIPE_VIDEO_CHROMA_FORMAT_420, 998c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König width, height, max_references, 1008c2bfa34a0d70ab08de44e3b091b3a097abbad97Christian König false 1012471acfc4c051d480861265011fa5e77fad02887Christian König ); 10282e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange 1032471acfc4c051d480861265011fa5e77fad02887Christian König if (!vldecoder->decoder) { 1042471acfc4c051d480861265011fa5e77fad02887Christian König ret = VDP_STATUS_ERROR; 1052471acfc4c051d480861265011fa5e77fad02887Christian König goto error_decoder; 1062471acfc4c051d480861265011fa5e77fad02887Christian König } 107b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 10849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König *decoder = vlAddDataHTAB(vldecoder); 10949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (*decoder == 0) { 110725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen ret = VDP_STATUS_ERROR; 1112471acfc4c051d480861265011fa5e77fad02887Christian König goto error_handle; 11249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 11305579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(dev->mutex); 1142471acfc4c051d480861265011fa5e77fad02887Christian König 11549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 116b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 1172471acfc4c051d480861265011fa5e77fad02887Christian Königerror_handle: 1182471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->decoder->destroy(vldecoder->decoder); 1192471acfc4c051d480861265011fa5e77fad02887Christian König 1202471acfc4c051d480861265011fa5e77fad02887Christian Königerror_decoder: 12105579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(dev->mutex); 12249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König FREE(vldecoder); 1232471acfc4c051d480861265011fa5e77fad02887Christian König return ret; 124725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 125725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 126fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 127fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Destroy a VdpDecoder. 128fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 129725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 13049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderDestroy(VdpDecoder decoder) 131725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 1322471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDecoder *vldecoder; 133d5b05a869a71147987a1c1d6c84f8df17148f031Christian König 13449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 1352471acfc4c051d480861265011fa5e77fad02887Christian König if (!vldecoder) 136725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen return VDP_STATUS_INVALID_HANDLE; 137b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 13805579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_lock(vldecoder->device->mutex); 1392471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->decoder->destroy(vldecoder->decoder); 14005579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(vldecoder->device->mutex); 141b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 14249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König FREE(vldecoder); 143b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 14449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 145725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 146725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 147fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 148fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Retrieve the parameters used to create a VdpBitmapSurface. 149fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 150725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 1512471acfc4c051d480861265011fa5e77fad02887Christian KönigvlVdpDecoderGetParameters(VdpDecoder decoder, 1522471acfc4c051d480861265011fa5e77fad02887Christian König VdpDecoderProfile *profile, 1532471acfc4c051d480861265011fa5e77fad02887Christian König uint32_t *width, 1542471acfc4c051d480861265011fa5e77fad02887Christian König uint32_t *height) 155725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 15634145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König vlVdpDecoder *vldecoder; 15734145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König 15834145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 15934145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König if (!vldecoder) 16034145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König return VDP_STATUS_INVALID_HANDLE; 161c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange 16234145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *profile = PipeToProfile(vldecoder->decoder->profile); 16334145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *width = vldecoder->decoder->width; 16434145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *height = vldecoder->decoder->height; 165c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange 16649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 167725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 168725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 1698ea416f35de0c664ef47b71841756758f22d7faaChristian Königstatic VdpStatus 1708ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpGetReferenceFrame(VdpVideoSurface handle, struct pipe_video_buffer **ref_frame) 1718ea416f35de0c664ef47b71841756758f22d7faaChristian König{ 1728ea416f35de0c664ef47b71841756758f22d7faaChristian König vlVdpSurface *surface; 1738ea416f35de0c664ef47b71841756758f22d7faaChristian König 1748ea416f35de0c664ef47b71841756758f22d7faaChristian König /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */ 1758ea416f35de0c664ef47b71841756758f22d7faaChristian König if (handle == VDP_INVALID_HANDLE) { 1768ea416f35de0c664ef47b71841756758f22d7faaChristian König *ref_frame = NULL; 1778ea416f35de0c664ef47b71841756758f22d7faaChristian König return VDP_STATUS_OK; 1788ea416f35de0c664ef47b71841756758f22d7faaChristian König } 1798ea416f35de0c664ef47b71841756758f22d7faaChristian König 1808ea416f35de0c664ef47b71841756758f22d7faaChristian König surface = vlGetDataHTAB(handle); 1818ea416f35de0c664ef47b71841756758f22d7faaChristian König if (!surface) 1828ea416f35de0c664ef47b71841756758f22d7faaChristian König return VDP_STATUS_INVALID_HANDLE; 1838ea416f35de0c664ef47b71841756758f22d7faaChristian König 1848ea416f35de0c664ef47b71841756758f22d7faaChristian König *ref_frame = surface->video_buffer; 1858ea416f35de0c664ef47b71841756758f22d7faaChristian König if (!*ref_frame) 1868ea416f35de0c664ef47b71841756758f22d7faaChristian König return VDP_STATUS_INVALID_HANDLE; 1878ea416f35de0c664ef47b71841756758f22d7faaChristian König 1888ea416f35de0c664ef47b71841756758f22d7faaChristian König return VDP_STATUS_OK; 1898ea416f35de0c664ef47b71841756758f22d7faaChristian König} 1908ea416f35de0c664ef47b71841756758f22d7faaChristian König 191fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 192fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a mpeg 1/2 video. 193fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 1942471acfc4c051d480861265011fa5e77fad02887Christian Königstatic VdpStatus 1958ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpDecoderRenderMpeg12(struct pipe_mpeg12_picture_desc *picture, 19612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst VdpPictureInfoMPEG1Or2 *picture_info) 197725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 1988ea416f35de0c664ef47b71841756758f22d7faaChristian König VdpStatus r; 19949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 200fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG12\n"); 20149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2028ea416f35de0c664ef47b71841756758f22d7faaChristian König r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]); 2038ea416f35de0c664ef47b71841756758f22d7faaChristian König if (r != VDP_STATUS_OK) 2048ea416f35de0c664ef47b71841756758f22d7faaChristian König return r; 2058ea416f35de0c664ef47b71841756758f22d7faaChristian König 2068ea416f35de0c664ef47b71841756758f22d7faaChristian König r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]); 2078ea416f35de0c664ef47b71841756758f22d7faaChristian König if (r != VDP_STATUS_OK) 2088ea416f35de0c664ef47b71841756758f22d7faaChristian König return r; 2098ea416f35de0c664ef47b71841756758f22d7faaChristian König 2108ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->picture_coding_type = picture_info->picture_coding_type; 2118ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->picture_structure = picture_info->picture_structure; 2128ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->frame_pred_frame_dct = picture_info->frame_pred_frame_dct; 2138ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->q_scale_type = picture_info->q_scale_type; 2148ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->alternate_scan = picture_info->alternate_scan; 2158ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->intra_vlc_format = picture_info->intra_vlc_format; 2168ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->concealment_motion_vectors = picture_info->concealment_motion_vectors; 2178ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->intra_dc_precision = picture_info->intra_dc_precision; 2188ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->f_code[0][0] = picture_info->f_code[0][0] - 1; 2198ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->f_code[0][1] = picture_info->f_code[0][1] - 1; 2208ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->f_code[1][0] = picture_info->f_code[1][0] - 1; 2218ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->f_code[1][1] = picture_info->f_code[1][1] - 1; 2228ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->num_slices = picture_info->slice_count; 2238ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->top_field_first = picture_info->top_field_first; 2248ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->full_pel_forward_vector = picture_info->full_pel_forward_vector; 2258ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->full_pel_backward_vector = picture_info->full_pel_backward_vector; 2268ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->intra_matrix = picture_info->intra_quantizer_matrix; 2278ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->non_intra_matrix = picture_info->non_intra_quantizer_matrix; 22849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 22912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst return VDP_STATUS_OK; 23012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst} 23112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst 23212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst/** 233eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst * Decode a mpeg 4 video. 23412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst */ 23512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorststatic VdpStatus 2368ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpDecoderRenderMpeg4(struct pipe_mpeg4_picture_desc *picture, 2378ea416f35de0c664ef47b71841756758f22d7faaChristian König VdpPictureInfoMPEG4Part2 *picture_info) 23812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst{ 2398ea416f35de0c664ef47b71841756758f22d7faaChristian König VdpStatus r; 24012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst unsigned i; 241b4fa7db65639322ae8dea19a23c9cc8234a3d7e1Christian König 24212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG4\n"); 243c888fe027c338f337123de4da2de1ac73b0f7587Christian König 2448ea416f35de0c664ef47b71841756758f22d7faaChristian König r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]); 2458ea416f35de0c664ef47b71841756758f22d7faaChristian König if (r != VDP_STATUS_OK) 2468ea416f35de0c664ef47b71841756758f22d7faaChristian König return r; 24712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst 2488ea416f35de0c664ef47b71841756758f22d7faaChristian König r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]); 2498ea416f35de0c664ef47b71841756758f22d7faaChristian König if (r != VDP_STATUS_OK) 2508ea416f35de0c664ef47b71841756758f22d7faaChristian König return r; 25149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 25212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst for (i = 0; i < 2; ++i) { 2538ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->trd[i] = picture_info->trd[i]; 2548ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->trb[i] = picture_info->trb[i]; 25512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst } 2568ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->vop_time_increment_resolution = picture_info->vop_time_increment_resolution; 2578ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->vop_coding_type = picture_info->vop_coding_type; 2588ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->vop_fcode_forward = picture_info->vop_fcode_forward; 2598ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->vop_fcode_backward = picture_info->vop_fcode_backward; 2608ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->resync_marker_disable = picture_info->resync_marker_disable; 2618ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->interlaced = picture_info->interlaced; 2628ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->quant_type = picture_info->quant_type; 2638ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->quarter_sample = picture_info->quarter_sample; 2648ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->short_video_header = picture_info->short_video_header; 2658ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->rounding_control = picture_info->rounding_control; 2668ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->alternate_vertical_scan_flag = picture_info->alternate_vertical_scan_flag; 2678ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->top_field_first = picture_info->top_field_first; 2688ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->intra_matrix = picture_info->intra_quantizer_matrix; 2698ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->non_intra_matrix = picture_info->non_intra_quantizer_matrix; 2708ea416f35de0c664ef47b71841756758f22d7faaChristian König 2712471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_OK; 27238bd8131776879e9dc90d06848657756a4a13a66Christian König} 27338bd8131776879e9dc90d06848657756a4a13a66Christian König 274eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorststatic VdpStatus 2758ea416f35de0c664ef47b71841756758f22d7faaChristian KönigvlVdpDecoderRenderVC1(struct pipe_vc1_picture_desc *picture, 276eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst VdpPictureInfoVC1 *picture_info) 277eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst{ 2788ea416f35de0c664ef47b71841756758f22d7faaChristian König VdpStatus r; 279eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst 280eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding VC-1\n"); 281eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst 2828ea416f35de0c664ef47b71841756758f22d7faaChristian König r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]); 2838ea416f35de0c664ef47b71841756758f22d7faaChristian König if (r != VDP_STATUS_OK) 2848ea416f35de0c664ef47b71841756758f22d7faaChristian König return r; 2858ea416f35de0c664ef47b71841756758f22d7faaChristian König 2868ea416f35de0c664ef47b71841756758f22d7faaChristian König r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]); 2878ea416f35de0c664ef47b71841756758f22d7faaChristian König if (r != VDP_STATUS_OK) 2888ea416f35de0c664ef47b71841756758f22d7faaChristian König return r; 2898ea416f35de0c664ef47b71841756758f22d7faaChristian König 2908ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->slice_count = picture_info->slice_count; 2918ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->picture_type = picture_info->picture_type; 2928ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->frame_coding_mode = picture_info->frame_coding_mode; 2938ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->postprocflag = picture_info->postprocflag; 2948ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->pulldown = picture_info->pulldown; 2958ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->interlace = picture_info->interlace; 2968ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->tfcntrflag = picture_info->tfcntrflag; 2978ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->finterpflag = picture_info->finterpflag; 2988ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->psf = picture_info->psf; 2998ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->dquant = picture_info->dquant; 3008ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->panscan_flag = picture_info->panscan_flag; 3018ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->refdist_flag = picture_info->refdist_flag; 3028ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->quantizer = picture_info->quantizer; 3038ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->extended_mv = picture_info->extended_mv; 3048ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->extended_dmv = picture_info->extended_dmv; 3058ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->overlap = picture_info->overlap; 3068ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->vstransform = picture_info->vstransform; 3078ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->loopfilter = picture_info->loopfilter; 3088ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->fastuvmc = picture_info->fastuvmc; 3098ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->range_mapy_flag = picture_info->range_mapy_flag; 3108ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->range_mapy = picture_info->range_mapy; 3118ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->range_mapuv_flag = picture_info->range_mapuv_flag; 3128ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->range_mapuv = picture_info->range_mapuv; 3138ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->multires = picture_info->multires; 3148ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->syncmarker = picture_info->syncmarker; 3158ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->rangered = picture_info->rangered; 3168ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->maxbframes = picture_info->maxbframes; 3178ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->deblockEnable = picture_info->deblockEnable; 3188ea416f35de0c664ef47b71841756758f22d7faaChristian König picture->pquant = picture_info->pquant; 319eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst 320eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst return VDP_STATUS_OK; 321eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst} 322eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst 323d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian Königstatic VdpStatus 324d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian KönigvlVdpDecoderRenderH264(struct pipe_h264_picture_desc *picture, 325d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König VdpPictureInfoH264 *picture_info) 326d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König{ 327d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König unsigned i; 328d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 329d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding H264\n"); 330d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 331d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->slice_count = picture_info->slice_count; 332d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->field_order_cnt[0] = picture_info->field_order_cnt[0]; 333d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->field_order_cnt[1] = picture_info->field_order_cnt[1]; 334d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->is_reference = picture_info->is_reference; 335d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->frame_num = picture_info->frame_num; 336d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->field_pic_flag = picture_info->field_pic_flag; 337d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->bottom_field_flag = picture_info->bottom_field_flag; 338d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->num_ref_frames = picture_info->num_ref_frames; 339d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->mb_adaptive_frame_field_flag = picture_info->mb_adaptive_frame_field_flag; 340d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->constrained_intra_pred_flag = picture_info->constrained_intra_pred_flag; 341d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->weighted_pred_flag = picture_info->weighted_pred_flag; 342d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->weighted_bipred_idc = picture_info->weighted_bipred_idc; 343d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->frame_mbs_only_flag = picture_info->frame_mbs_only_flag; 344d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->transform_8x8_mode_flag = picture_info->transform_8x8_mode_flag; 345d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->chroma_qp_index_offset = picture_info->chroma_qp_index_offset; 346d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->second_chroma_qp_index_offset = picture_info->second_chroma_qp_index_offset; 347d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->pic_init_qp_minus26 = picture_info->pic_init_qp_minus26; 348d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->num_ref_idx_l0_active_minus1 = picture_info->num_ref_idx_l0_active_minus1; 349d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->num_ref_idx_l1_active_minus1 = picture_info->num_ref_idx_l1_active_minus1; 350d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->log2_max_frame_num_minus4 = picture_info->log2_max_frame_num_minus4; 351d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->pic_order_cnt_type = picture_info->pic_order_cnt_type; 352d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->log2_max_pic_order_cnt_lsb_minus4 = picture_info->log2_max_pic_order_cnt_lsb_minus4; 353d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->delta_pic_order_always_zero_flag = picture_info->delta_pic_order_always_zero_flag; 354d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->direct_8x8_inference_flag = picture_info->direct_8x8_inference_flag; 355d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->entropy_coding_mode_flag = picture_info->entropy_coding_mode_flag; 356d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->pic_order_present_flag = picture_info->pic_order_present_flag; 357d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->deblocking_filter_control_present_flag = picture_info->deblocking_filter_control_present_flag; 358d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->redundant_pic_cnt_present_flag = picture_info->redundant_pic_cnt_present_flag; 359d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 360d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König memcpy(picture->scaling_lists_4x4, picture_info->scaling_lists_4x4, 6*16); 361d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König memcpy(picture->scaling_lists_8x8, picture_info->scaling_lists_8x8, 2*64); 362d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 363d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König for (i = 0; i < 16; ++i) { 364d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König VdpStatus ret = vlVdpGetReferenceFrame 365d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König ( 366d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture_info->referenceFrames[i].surface, 367d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König &picture->ref[i] 368d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König ); 369d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König if (ret != VDP_STATUS_OK) 370d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König return ret; 371d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 372d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->is_long_term[i] = picture_info->referenceFrames[i].is_long_term; 373d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->top_is_reference[i] = picture_info->referenceFrames[i].top_is_reference; 374d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->bottom_is_reference[i] = picture_info->referenceFrames[i].bottom_is_reference; 375d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->field_order_cnt_list[i][0] = picture_info->referenceFrames[i].field_order_cnt[0]; 376d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->field_order_cnt_list[i][1] = picture_info->referenceFrames[i].field_order_cnt[1]; 377d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König picture->frame_num_list[i] = picture_info->referenceFrames[i].frame_idx; 378d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König } 379d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 380d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König return VDP_STATUS_OK; 381d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König} 382d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König 383fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian Königstatic void 384fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian KönigvlVdpDecoderFixVC1Startcode(uint32_t *num_buffers, const void *buffers[], unsigned sizes[]) 385fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König{ 386fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König static const uint8_t vc1_startcode[] = { 0x00, 0x00, 0x01, 0x0D }; 387fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König struct vl_vlc vlc; 388fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König unsigned i; 389fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König 390fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König /* search the first 64 bytes for a startcode */ 391fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König vl_vlc_init(&vlc, *num_buffers, buffers, sizes); 392fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König for (i = 0; i < 64 && vl_vlc_bits_left(&vlc) >= 32; ++i) { 393fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König uint32_t value = vl_vlc_peekbits(&vlc, 32); 394fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König if (value == 0x0000010D || 395fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König value == 0x0000010C || 396fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König value == 0x0000010B) 397fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König return; 398fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König vl_vlc_eatbits(&vlc, 8); 399fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König vl_vlc_fillbits(&vlc); 400fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König } 401fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König 402fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König /* none found, ok add one manually */ 403fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Manually adding VC-1 startcode\n"); 404fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König for (i = *num_buffers; i > 0; --i) { 405fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König buffers[i] = buffers[i - 1]; 406fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König sizes[i] = sizes[i - 1]; 407fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König } 408fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König ++(*num_buffers); 409fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König buffers[0] = vc1_startcode; 410fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König sizes[0] = 4; 411fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König} 412fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König 413fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 414fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a compressed field/frame and render the result into a VdpVideoSurface. 415fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 41638bd8131776879e9dc90d06848657756a4a13a66Christian KönigVdpStatus 41749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderRender(VdpDecoder decoder, 41849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpVideoSurface target, 41949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpPictureInfo const *picture_info, 42049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t bitstream_buffer_count, 42149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpBitstreamBuffer const *bitstream_buffers) 422725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 423fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König const void * buffers[bitstream_buffer_count + 1]; 424fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König unsigned sizes[bitstream_buffer_count + 1]; 42549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlVdpDecoder *vldecoder; 42649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlVdpSurface *vlsurf; 42712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst VdpStatus ret; 428020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König struct pipe_screen *screen; 42912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst struct pipe_video_decoder *dec; 4308f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König bool buffer_support[2]; 43112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst unsigned i; 4328ea416f35de0c664ef47b71841756758f22d7faaChristian König union { 4338ea416f35de0c664ef47b71841756758f22d7faaChristian König struct pipe_picture_desc base; 4348ea416f35de0c664ef47b71841756758f22d7faaChristian König struct pipe_mpeg12_picture_desc mpeg12; 4358ea416f35de0c664ef47b71841756758f22d7faaChristian König struct pipe_mpeg4_picture_desc mpeg4; 4368ea416f35de0c664ef47b71841756758f22d7faaChristian König struct pipe_vc1_picture_desc vc1; 437d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König struct pipe_h264_picture_desc h264; 4388ea416f35de0c664ef47b71841756758f22d7faaChristian König } desc; 43949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 44049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!(picture_info && bitstream_buffers)) 44149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_POINTER; 44249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 44349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 44449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!vldecoder) 44549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 44612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst dec = vldecoder->decoder; 447020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König screen = dec->context->screen; 44849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 44949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlsurf = (vlVdpSurface *)vlGetDataHTAB(target); 45049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!vlsurf) 45149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 45249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 45349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (vlsurf->device != vldecoder->device) 45449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_HANDLE_DEVICE_MISMATCH; 45549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 456020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König if (vlsurf->video_buffer != NULL && vlsurf->video_buffer->chroma_format != dec->chroma_format) 4572471acfc4c051d480861265011fa5e77fad02887Christian König // TODO: Recreate decoder with correct chroma 4582471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_INVALID_CHROMA_TYPE; 45949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 46005579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_lock(vlsurf->device->mutex); 46105579339c0da442669ea75749651e8cf4f9ec39bChristian König 4628f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König buffer_support[0] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE); 4638f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König buffer_support[1] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_SUPPORTS_INTERLACED); 4648f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König 465020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König if (vlsurf->video_buffer == NULL || 4668f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König !screen->is_video_format_supported(screen, vlsurf->video_buffer->buffer_format, dec->profile) || 4679f777699ed39e1c326938f84fc8f54198990cfa1Christian König !buffer_support[vlsurf->video_buffer->interlaced]) { 468020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König 469020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König /* destroy the old one */ 470020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König if (vlsurf->video_buffer) 471020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König vlsurf->video_buffer->destroy(vlsurf->video_buffer); 472020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König 473020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König /* set the buffer format to the prefered one */ 474020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König vlsurf->templat.buffer_format = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_PREFERED_FORMAT); 475020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König 4768f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König /* also set interlacing to decoders preferences */ 4778f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König vlsurf->templat.interlaced = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_PREFERS_INTERLACED); 4788f54929c5d9a07a999cb0a55c406062fd8cdfb74Christian König 479020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König /* and recreate the video buffer */ 480020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König vlsurf->video_buffer = dec->context->create_video_buffer(dec->context, &vlsurf->templat); 481020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König 482020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König /* still no luck? get me out of here... */ 48305579339c0da442669ea75749651e8cf4f9ec39bChristian König if (!vlsurf->video_buffer) { 48405579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(vlsurf->device->mutex); 485020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König return VDP_STATUS_NO_IMPLEMENTATION; 48605579339c0da442669ea75749651e8cf4f9ec39bChristian König } 4877f6af4909241de7197e774dee988f574cb576a3bChristian König vlVdpVideoSurfaceClear(vlsurf); 488020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König } 489020a6f6cd8c3c8632f68e1f47ba3c63f2315e47eChristian König 490fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König for (i = 0; i < bitstream_buffer_count; ++i) { 491fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König buffers[i] = bitstream_buffers[i].bitstream; 492fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König sizes[i] = bitstream_buffers[i].bitstream_bytes; 493fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König } 494fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König 4958ea416f35de0c664ef47b71841756758f22d7faaChristian König memset(&desc, 0, sizeof(desc)); 4968ea416f35de0c664ef47b71841756758f22d7faaChristian König desc.base.profile = dec->profile; 49712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst switch (u_reduce_video_profile(dec->profile)) { 49812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst case PIPE_VIDEO_CODEC_MPEG12: 4998ea416f35de0c664ef47b71841756758f22d7faaChristian König ret = vlVdpDecoderRenderMpeg12(&desc.mpeg12, (VdpPictureInfoMPEG1Or2 *)picture_info); 50012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst break; 50112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst case PIPE_VIDEO_CODEC_MPEG4: 5028ea416f35de0c664ef47b71841756758f22d7faaChristian König ret = vlVdpDecoderRenderMpeg4(&desc.mpeg4, (VdpPictureInfoMPEG4Part2 *)picture_info); 50349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König break; 504eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst case PIPE_VIDEO_CODEC_VC1: 505fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König if (dec->profile == PIPE_VIDEO_PROFILE_VC1_ADVANCED) 506fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König vlVdpDecoderFixVC1Startcode(&bitstream_buffer_count, buffers, sizes); 5078ea416f35de0c664ef47b71841756758f22d7faaChristian König ret = vlVdpDecoderRenderVC1(&desc.vc1, (VdpPictureInfoVC1 *)picture_info); 508eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst break; 509d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König case PIPE_VIDEO_CODEC_MPEG4_AVC: 510d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König ret = vlVdpDecoderRenderH264(&desc.h264, (VdpPictureInfoH264 *)picture_info); 511d6aa0ad55dc245bfacb7d9c3b479fe5a6557d43fChristian König break; 51249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König default: 51305579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(vlsurf->device->mutex); 51449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_DECODER_PROFILE; 51549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 516fa66fda5b042d8735145d2ac1e64b6e7feacd634Christian König 51705579339c0da442669ea75749651e8cf4f9ec39bChristian König if (ret != VDP_STATUS_OK) { 51805579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(vlsurf->device->mutex); 51912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst return ret; 52005579339c0da442669ea75749651e8cf4f9ec39bChristian König } 52112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst 5228ea416f35de0c664ef47b71841756758f22d7faaChristian König dec->begin_frame(dec, vlsurf->video_buffer, &desc.base); 5238ea416f35de0c664ef47b71841756758f22d7faaChristian König dec->decode_bitstream(dec, vlsurf->video_buffer, &desc.base, bitstream_buffer_count, buffers, sizes); 5248ea416f35de0c664ef47b71841756758f22d7faaChristian König dec->end_frame(dec, vlsurf->video_buffer, &desc.base); 52505579339c0da442669ea75749651e8cf4f9ec39bChristian König pipe_mutex_unlock(vlsurf->device->mutex); 52612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst return ret; 527b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König} 528