decode.c revision d3770d6229d95e9beb67358ae2b2c8824ed3ae58
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 28725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen#include <util/u_memory.h> 296ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen#include <util/u_math.h> 306ada38d29a9b6eb01ad21e9b1ec089bf42d497daThomas Balling Sørensen#include <util/u_debug.h> 31c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen 322471acfc4c051d480861265011fa5e77fad02887Christian König#include "vdpau_private.h" 332471acfc4c051d480861265011fa5e77fad02887Christian König 34725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 3549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderCreate(VdpDevice device, 3649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpDecoderProfile profile, 3749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t width, uint32_t height, 3849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t max_references, 3949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpDecoder *decoder) 40725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 412471acfc4c051d480861265011fa5e77fad02887Christian König enum pipe_video_profile p_profile; 42ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König struct pipe_context *pipe; 432471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDevice *dev; 442471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDecoder *vldecoder; 452471acfc4c051d480861265011fa5e77fad02887Christian König VdpStatus ret; 46e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König unsigned i; 47b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 4808f3a7cf7e9133f50adf33f800aa3696c909347fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Creating decoder\n"); 49b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 5049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!decoder) 5149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_POINTER; 52b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 5349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!(width && height)) 5449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_VALUE; 55b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 562471acfc4c051d480861265011fa5e77fad02887Christian König p_profile = ProfileToPipe(profile); 572471acfc4c051d480861265011fa5e77fad02887Christian König if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN) 582471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_INVALID_DECODER_PROFILE; 592471acfc4c051d480861265011fa5e77fad02887Christian König 602471acfc4c051d480861265011fa5e77fad02887Christian König dev = vlGetDataHTAB(device); 612471acfc4c051d480861265011fa5e77fad02887Christian König if (!dev) 622471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_INVALID_HANDLE; 632471acfc4c051d480861265011fa5e77fad02887Christian König 64ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König pipe = dev->context->pipe; 65b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 66725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen vldecoder = CALLOC(1,sizeof(vlVdpDecoder)); 672471acfc4c051d480861265011fa5e77fad02887Christian König if (!vldecoder) 682471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_RESOURCES; 69b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 702471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->device = dev; 71725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 7249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König // TODO: Define max_references. Used mainly for H264 73ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König vldecoder->decoder = pipe->create_video_decoder 742471acfc4c051d480861265011fa5e77fad02887Christian König ( 75ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König pipe, p_profile, 762471acfc4c051d480861265011fa5e77fad02887Christian König PIPE_VIDEO_ENTRYPOINT_BITSTREAM, 772471acfc4c051d480861265011fa5e77fad02887Christian König PIPE_VIDEO_CHROMA_FORMAT_420, 782471acfc4c051d480861265011fa5e77fad02887Christian König width, height 792471acfc4c051d480861265011fa5e77fad02887Christian König ); 802471acfc4c051d480861265011fa5e77fad02887Christian König if (!vldecoder->decoder) { 812471acfc4c051d480861265011fa5e77fad02887Christian König ret = VDP_STATUS_ERROR; 822471acfc4c051d480861265011fa5e77fad02887Christian König goto error_decoder; 832471acfc4c051d480861265011fa5e77fad02887Christian König } 84b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 85231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->num_buffers = pipe->screen->get_video_param 86231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König ( 87231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König pipe->screen, p_profile, 88231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König PIPE_VIDEO_CAP_NUM_BUFFERS_DESIRED 89231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König ); 90e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König vldecoder->cur_buffer = 0; 91e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König 92231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->buffers = CALLOC(vldecoder->num_buffers, sizeof(void*)); 93231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König if (!vldecoder->buffers) 94231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König goto error_alloc_buffers; 95231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König 96231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König for (i = 0; i < vldecoder->num_buffers; ++i) { 97231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->buffers[i] = vldecoder->decoder->create_buffer(vldecoder->decoder); 98231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König if (!vldecoder->buffers[i]) { 99e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König ret = VDP_STATUS_ERROR; 100231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König goto error_create_buffers; 101e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König } 1022471acfc4c051d480861265011fa5e77fad02887Christian König } 103b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 10449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König *decoder = vlAddDataHTAB(vldecoder); 10549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (*decoder == 0) { 106725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen ret = VDP_STATUS_ERROR; 1072471acfc4c051d480861265011fa5e77fad02887Christian König goto error_handle; 10849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 1092471acfc4c051d480861265011fa5e77fad02887Christian König 11008f3a7cf7e9133f50adf33f800aa3696c909347fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoder created succesfully\n"); 111b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 11249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 113b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 1142471acfc4c051d480861265011fa5e77fad02887Christian Königerror_handle: 115231fce7d630bcf6aaf0e435e461ad5af842e437fChristian Königerror_create_buffers: 116e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König 117231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König for (i = 0; i < vldecoder->num_buffers; ++i) 118231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König if (vldecoder->buffers[i]) 119231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->decoder->destroy_buffer(vldecoder->decoder, vldecoder->buffers[i]); 120231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König 121231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König FREE(vldecoder->buffers); 122231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König 123231fce7d630bcf6aaf0e435e461ad5af842e437fChristian Königerror_alloc_buffers: 124e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König 1252471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->decoder->destroy(vldecoder->decoder); 1262471acfc4c051d480861265011fa5e77fad02887Christian König 1272471acfc4c051d480861265011fa5e77fad02887Christian Königerror_decoder: 12849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König FREE(vldecoder); 1292471acfc4c051d480861265011fa5e77fad02887Christian König return ret; 130725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 131725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 132725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 13349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderDestroy(VdpDecoder decoder) 134725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 1352471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDecoder *vldecoder; 136e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König unsigned i; 137d5b05a869a71147987a1c1d6c84f8df17148f031Christian König 13808f3a7cf7e9133f50adf33f800aa3696c909347fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Destroying decoder\n"); 139b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 14049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 1412471acfc4c051d480861265011fa5e77fad02887Christian König if (!vldecoder) 142725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen return VDP_STATUS_INVALID_HANDLE; 143b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 144231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König for (i = 0; i < vldecoder->num_buffers; ++i) 145231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König if (vldecoder->buffers[i]) 146231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->decoder->destroy_buffer(vldecoder->decoder, vldecoder->buffers[i]); 147231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König 148231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König FREE(vldecoder->buffers); 149e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König 1502471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->decoder->destroy(vldecoder->decoder); 151b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 15249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König FREE(vldecoder); 153b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 15449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 155725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 156725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 157725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 1582471acfc4c051d480861265011fa5e77fad02887Christian KönigvlVdpDecoderGetParameters(VdpDecoder decoder, 1592471acfc4c051d480861265011fa5e77fad02887Christian König VdpDecoderProfile *profile, 1602471acfc4c051d480861265011fa5e77fad02887Christian König uint32_t *width, 1612471acfc4c051d480861265011fa5e77fad02887Christian König uint32_t *height) 162725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 16334145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König vlVdpDecoder *vldecoder; 16434145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König 16534145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] decoder get parameters called\n"); 16634145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König 16734145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 16834145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König if (!vldecoder) 16934145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König return VDP_STATUS_INVALID_HANDLE; 17034145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König 17134145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *profile = PipeToProfile(vldecoder->decoder->profile); 17234145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *width = vldecoder->decoder->width; 17334145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *height = vldecoder->decoder->height; 17434145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König 17549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 176725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 177725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 1782471acfc4c051d480861265011fa5e77fad02887Christian Königstatic VdpStatus 1797746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmericvlVdpDecoderRenderMpeg12(struct pipe_video_decoder *decoder, 1807746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmeric VdpPictureInfoMPEG1Or2 *picture_info, 1817746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmeric uint32_t bitstream_buffer_count, 1827746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmeric VdpBitstreamBuffer const *bitstream_buffers) 183725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 184c888fe027c338f337123de4da2de1ac73b0f7587Christian König struct pipe_mpeg12_picture_desc picture; 1852471acfc4c051d480861265011fa5e77fad02887Christian König struct pipe_video_buffer *ref_frames[2]; 186b4fa7db65639322ae8dea19a23c9cc8234a3d7e1Christian König uint8_t intra_quantizer_matrix[64]; 187c888fe027c338f337123de4da2de1ac73b0f7587Christian König unsigned i; 18849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 18908f3a7cf7e9133f50adf33f800aa3696c909347fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG2\n"); 19049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 1911d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König i = 0; 1921d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König 19349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */ 1941d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König if (picture_info->forward_reference != VDP_INVALID_HANDLE) { 1951d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König ref_frames[i] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer; 1961d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König if (!ref_frames[i]) 19749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 1981d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König ++i; 19949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 20049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2011d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König if (picture_info->backward_reference != VDP_INVALID_HANDLE) { 2021d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König ref_frames[i] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer; 2031d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König if (!ref_frames[i]) 20449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 2051d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König ++i; 20649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 20749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2081d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König decoder->set_reference_frames(decoder, ref_frames, i); 2091d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König 210c888fe027c338f337123de4da2de1ac73b0f7587Christian König memset(&picture, 0, sizeof(picture)); 2117e1fbb360332ecac2789e28a0f3d303306f687b1Christian König picture.base.profile = decoder->profile; 212c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.picture_coding_type = picture_info->picture_coding_type; 213c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.picture_structure = picture_info->picture_structure; 214c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.frame_pred_frame_dct = picture_info->frame_pred_frame_dct; 215c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.q_scale_type = picture_info->q_scale_type; 216c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.alternate_scan = picture_info->alternate_scan; 217c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.intra_vlc_format = picture_info->intra_vlc_format; 218c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.concealment_motion_vectors = picture_info->concealment_motion_vectors; 219c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.f_code[0][0] = picture_info->f_code[0][0] - 1; 220c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.f_code[0][1] = picture_info->f_code[0][1] - 1; 221c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.f_code[1][0] = picture_info->f_code[1][0] - 1; 222c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.f_code[1][1] = picture_info->f_code[1][1] - 1; 223c888fe027c338f337123de4da2de1ac73b0f7587Christian König 2241d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König decoder->set_picture_parameters(decoder, &picture.base); 225c888fe027c338f337123de4da2de1ac73b0f7587Christian König 226b4fa7db65639322ae8dea19a23c9cc8234a3d7e1Christian König memcpy(intra_quantizer_matrix, picture_info->intra_quantizer_matrix, sizeof(intra_quantizer_matrix)); 227b4fa7db65639322ae8dea19a23c9cc8234a3d7e1Christian König intra_quantizer_matrix[0] = 1 << (7 - picture_info->intra_dc_precision); 2281d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König decoder->set_quant_matrix(decoder, intra_quantizer_matrix, picture_info->non_intra_quantizer_matrix); 229b4fa7db65639322ae8dea19a23c9cc8234a3d7e1Christian König 2301d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König decoder->begin_frame(decoder); 231c888fe027c338f337123de4da2de1ac73b0f7587Christian König 2321d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König for (i = 0; i < bitstream_buffer_count; ++i) 2331d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König decoder->decode_bitstream(decoder, bitstream_buffers[i].bitstream_bytes, 234d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König bitstream_buffers[i].bitstream); 23549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 236d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König decoder->end_frame(decoder); 23749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2382471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_OK; 23938bd8131776879e9dc90d06848657756a4a13a66Christian König} 24038bd8131776879e9dc90d06848657756a4a13a66Christian König 24138bd8131776879e9dc90d06848657756a4a13a66Christian KönigVdpStatus 24249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderRender(VdpDecoder decoder, 24349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpVideoSurface target, 24449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpPictureInfo const *picture_info, 24549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t bitstream_buffer_count, 24649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpBitstreamBuffer const *bitstream_buffers) 247725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 24849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlVdpDecoder *vldecoder; 24949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlVdpSurface *vlsurf; 25049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 25108f3a7cf7e9133f50adf33f800aa3696c909347fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding\n"); 25249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 25349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!(picture_info && bitstream_buffers)) 25449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_POINTER; 25549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 25649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 25749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!vldecoder) 25849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 25949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 26049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlsurf = (vlVdpSurface *)vlGetDataHTAB(target); 26149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!vlsurf) 26249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 26349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 26449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (vlsurf->device != vldecoder->device) 26549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_HANDLE_DEVICE_MISMATCH; 26649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2672471acfc4c051d480861265011fa5e77fad02887Christian König if (vlsurf->video_buffer->chroma_format != vldecoder->decoder->chroma_format) 2682471acfc4c051d480861265011fa5e77fad02887Christian König // TODO: Recreate decoder with correct chroma 2692471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_INVALID_CHROMA_TYPE; 27049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2717746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmeric // TODO: Right now only mpeg 1 & 2 is supported. 2722471acfc4c051d480861265011fa5e77fad02887Christian König switch (vldecoder->decoder->profile) { 2737746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmeric case PIPE_VIDEO_PROFILE_MPEG1: 27449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE: 27549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König case PIPE_VIDEO_PROFILE_MPEG2_MAIN: 276e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König ++vldecoder->cur_buffer; 277231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->cur_buffer %= vldecoder->num_buffers; 2781d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König 279231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->decoder->set_decode_buffer(vldecoder->decoder, vldecoder->buffers[vldecoder->cur_buffer]); 2801d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König vldecoder->decoder->set_decode_target(vldecoder->decoder, vlsurf->video_buffer); 2811d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König 2821d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König return vlVdpDecoderRenderMpeg12(vldecoder->decoder, (VdpPictureInfoMPEG1Or2 *)picture_info, 2831d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König bitstream_buffer_count, bitstream_buffers); 28449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König break; 2852471acfc4c051d480861265011fa5e77fad02887Christian König 28649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König default: 28749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_DECODER_PROFILE; 28849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 289b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König} 290