decode.c revision 1eb48c5500e5b3e3319108a1cecf63524fdede0d
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" 31c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen 322471acfc4c051d480861265011fa5e77fad02887Christian König#include "vdpau_private.h" 332471acfc4c051d480861265011fa5e77fad02887Christian König 34fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 35fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Create a VdpDecoder. 36fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 37725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 3849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderCreate(VdpDevice device, 3949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpDecoderProfile profile, 4049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t width, uint32_t height, 4149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t max_references, 4249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpDecoder *decoder) 43725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 442471acfc4c051d480861265011fa5e77fad02887Christian König enum pipe_video_profile p_profile; 45ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König struct pipe_context *pipe; 461eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst struct pipe_screen *screen; 472471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDevice *dev; 482471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDecoder *vldecoder; 492471acfc4c051d480861265011fa5e77fad02887Christian König VdpStatus ret; 50e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König unsigned i; 511eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst bool supported; 52b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 5308f3a7cf7e9133f50adf33f800aa3696c909347fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Creating decoder\n"); 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 70ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König pipe = dev->context->pipe; 711eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst screen = dev->vscreen->pscreen; 721eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst supported = screen->get_video_param 731eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst ( 741eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst screen, 751eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst p_profile, 761eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst PIPE_VIDEO_CAP_SUPPORTED 771eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst ); 781eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst if (!supported) 791eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst return VDP_STATUS_INVALID_DECODER_PROFILE; 80b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 81725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen vldecoder = CALLOC(1,sizeof(vlVdpDecoder)); 822471acfc4c051d480861265011fa5e77fad02887Christian König if (!vldecoder) 832471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_RESOURCES; 84b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 852471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->device = dev; 86725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 87ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König vldecoder->decoder = pipe->create_video_decoder 882471acfc4c051d480861265011fa5e77fad02887Christian König ( 89ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König pipe, p_profile, 902471acfc4c051d480861265011fa5e77fad02887Christian König PIPE_VIDEO_ENTRYPOINT_BITSTREAM, 912471acfc4c051d480861265011fa5e77fad02887Christian König PIPE_VIDEO_CHROMA_FORMAT_420, 9282e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange width, height, max_references 932471acfc4c051d480861265011fa5e77fad02887Christian König ); 9482e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange 952471acfc4c051d480861265011fa5e77fad02887Christian König if (!vldecoder->decoder) { 962471acfc4c051d480861265011fa5e77fad02887Christian König ret = VDP_STATUS_ERROR; 972471acfc4c051d480861265011fa5e77fad02887Christian König goto error_decoder; 982471acfc4c051d480861265011fa5e77fad02887Christian König } 99b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 100231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->num_buffers = pipe->screen->get_video_param 101231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König ( 102231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König pipe->screen, p_profile, 103231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König PIPE_VIDEO_CAP_NUM_BUFFERS_DESIRED 104231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König ); 105e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König vldecoder->cur_buffer = 0; 106e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König 107231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->buffers = CALLOC(vldecoder->num_buffers, sizeof(void*)); 108231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König if (!vldecoder->buffers) 109231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König goto error_alloc_buffers; 110231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König 111231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König for (i = 0; i < vldecoder->num_buffers; ++i) { 112231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->buffers[i] = vldecoder->decoder->create_buffer(vldecoder->decoder); 113231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König if (!vldecoder->buffers[i]) { 114e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König ret = VDP_STATUS_ERROR; 115231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König goto error_create_buffers; 116e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König } 1172471acfc4c051d480861265011fa5e77fad02887Christian König } 118b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 11949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König *decoder = vlAddDataHTAB(vldecoder); 12049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (*decoder == 0) { 121725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen ret = VDP_STATUS_ERROR; 1222471acfc4c051d480861265011fa5e77fad02887Christian König goto error_handle; 12349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 1242471acfc4c051d480861265011fa5e77fad02887Christian König 12508f3a7cf7e9133f50adf33f800aa3696c909347fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoder created succesfully\n"); 126b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 12749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 128b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 1292471acfc4c051d480861265011fa5e77fad02887Christian Königerror_handle: 130231fce7d630bcf6aaf0e435e461ad5af842e437fChristian Königerror_create_buffers: 131e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König 132231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König for (i = 0; i < vldecoder->num_buffers; ++i) 133231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König if (vldecoder->buffers[i]) 134231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->decoder->destroy_buffer(vldecoder->decoder, vldecoder->buffers[i]); 135231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König 136231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König FREE(vldecoder->buffers); 137231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König 138231fce7d630bcf6aaf0e435e461ad5af842e437fChristian Königerror_alloc_buffers: 139e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König 1402471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->decoder->destroy(vldecoder->decoder); 1412471acfc4c051d480861265011fa5e77fad02887Christian König 1422471acfc4c051d480861265011fa5e77fad02887Christian Königerror_decoder: 14349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König FREE(vldecoder); 1442471acfc4c051d480861265011fa5e77fad02887Christian König return ret; 145725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 146725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 147fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 148fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Destroy a VdpDecoder. 149fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 150725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 15149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderDestroy(VdpDecoder decoder) 152725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 1532471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDecoder *vldecoder; 154e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König unsigned i; 155d5b05a869a71147987a1c1d6c84f8df17148f031Christian König 15608f3a7cf7e9133f50adf33f800aa3696c909347fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Destroying decoder\n"); 157b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 15849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 1592471acfc4c051d480861265011fa5e77fad02887Christian König if (!vldecoder) 160725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen return VDP_STATUS_INVALID_HANDLE; 161b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 162231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König for (i = 0; i < vldecoder->num_buffers; ++i) 163231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König if (vldecoder->buffers[i]) 164231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->decoder->destroy_buffer(vldecoder->decoder, vldecoder->buffers[i]); 165231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König 166231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König FREE(vldecoder->buffers); 167e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König 1682471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->decoder->destroy(vldecoder->decoder); 169b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 17049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König FREE(vldecoder); 171b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 17249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 173725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 174725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 175fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 176fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Retrieve the parameters used to create a VdpBitmapSurface. 177fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 178725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 1792471acfc4c051d480861265011fa5e77fad02887Christian KönigvlVdpDecoderGetParameters(VdpDecoder decoder, 1802471acfc4c051d480861265011fa5e77fad02887Christian König VdpDecoderProfile *profile, 1812471acfc4c051d480861265011fa5e77fad02887Christian König uint32_t *width, 1822471acfc4c051d480861265011fa5e77fad02887Christian König uint32_t *height) 183725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 18434145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König vlVdpDecoder *vldecoder; 18534145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König 186fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoder get parameters called\n"); 18734145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König 18834145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 18934145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König if (!vldecoder) 19034145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König return VDP_STATUS_INVALID_HANDLE; 191c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange 19234145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *profile = PipeToProfile(vldecoder->decoder->profile); 19334145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *width = vldecoder->decoder->width; 19434145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *height = vldecoder->decoder->height; 195c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange 19649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 197725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 198725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 199fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 200fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a mpeg 1/2 video. 201fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 2022471acfc4c051d480861265011fa5e77fad02887Christian Königstatic VdpStatus 2037746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmericvlVdpDecoderRenderMpeg12(struct pipe_video_decoder *decoder, 2047746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmeric VdpPictureInfoMPEG1Or2 *picture_info, 2057746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmeric uint32_t bitstream_buffer_count, 2067746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmeric VdpBitstreamBuffer const *bitstream_buffers) 207725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 208c888fe027c338f337123de4da2de1ac73b0f7587Christian König struct pipe_mpeg12_picture_desc picture; 2092e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König struct pipe_mpeg12_quant_matrix quant; 2102471acfc4c051d480861265011fa5e77fad02887Christian König struct pipe_video_buffer *ref_frames[2]; 211c888fe027c338f337123de4da2de1ac73b0f7587Christian König unsigned i; 21249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 213fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG12\n"); 21449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2151d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König i = 0; 2161d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König 21749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */ 2181d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König if (picture_info->forward_reference != VDP_INVALID_HANDLE) { 2191d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König ref_frames[i] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer; 2201d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König if (!ref_frames[i]) 22149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 2221d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König ++i; 22349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 22449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2251d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König if (picture_info->backward_reference != VDP_INVALID_HANDLE) { 2261d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König ref_frames[i] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer; 2271d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König if (!ref_frames[i]) 22849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 2291d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König ++i; 23049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 23149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2321d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König decoder->set_reference_frames(decoder, ref_frames, i); 2331d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König 234c888fe027c338f337123de4da2de1ac73b0f7587Christian König memset(&picture, 0, sizeof(picture)); 2357e1fbb360332ecac2789e28a0f3d303306f687b1Christian König picture.base.profile = decoder->profile; 236c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.picture_coding_type = picture_info->picture_coding_type; 237c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.picture_structure = picture_info->picture_structure; 238c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.frame_pred_frame_dct = picture_info->frame_pred_frame_dct; 239c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.q_scale_type = picture_info->q_scale_type; 240c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.alternate_scan = picture_info->alternate_scan; 241c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.intra_vlc_format = picture_info->intra_vlc_format; 242c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.concealment_motion_vectors = picture_info->concealment_motion_vectors; 2432e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König picture.intra_dc_precision = picture_info->intra_dc_precision; 244c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.f_code[0][0] = picture_info->f_code[0][0] - 1; 245c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.f_code[0][1] = picture_info->f_code[0][1] - 1; 246c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.f_code[1][0] = picture_info->f_code[1][0] - 1; 247c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.f_code[1][1] = picture_info->f_code[1][1] - 1; 248c4d47f065ae2a015a9d2e9a060d71e04d5935c2bMaarten Lankhorst picture.num_slices = picture_info->slice_count; 249c888fe027c338f337123de4da2de1ac73b0f7587Christian König 2501d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König decoder->set_picture_parameters(decoder, &picture.base); 251c888fe027c338f337123de4da2de1ac73b0f7587Christian König 2522e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König memset(&quant, 0, sizeof(quant)); 2532e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König quant.base.codec = PIPE_VIDEO_CODEC_MPEG12; 2542e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König quant.intra_matrix = picture_info->intra_quantizer_matrix; 2552e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König quant.non_intra_matrix = picture_info->non_intra_quantizer_matrix; 2562e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König 2572e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König decoder->set_quant_matrix(decoder, &quant.base); 258b4fa7db65639322ae8dea19a23c9cc8234a3d7e1Christian König 2591d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König decoder->begin_frame(decoder); 260c888fe027c338f337123de4da2de1ac73b0f7587Christian König 2611d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König for (i = 0; i < bitstream_buffer_count; ++i) 2621d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König decoder->decode_bitstream(decoder, bitstream_buffers[i].bitstream_bytes, 263d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König bitstream_buffers[i].bitstream); 26449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 265d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König decoder->end_frame(decoder); 26649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2672471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_OK; 26838bd8131776879e9dc90d06848657756a4a13a66Christian König} 26938bd8131776879e9dc90d06848657756a4a13a66Christian König 270fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 271fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a compressed field/frame and render the result into a VdpVideoSurface. 272fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 27338bd8131776879e9dc90d06848657756a4a13a66Christian KönigVdpStatus 27449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderRender(VdpDecoder decoder, 27549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpVideoSurface target, 27649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpPictureInfo const *picture_info, 27749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t bitstream_buffer_count, 27849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpBitstreamBuffer const *bitstream_buffers) 279725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 28049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlVdpDecoder *vldecoder; 28149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlVdpSurface *vlsurf; 28249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 28308f3a7cf7e9133f50adf33f800aa3696c909347fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding\n"); 28449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 28549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!(picture_info && bitstream_buffers)) 28649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_POINTER; 28749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 28849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 28949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!vldecoder) 29049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 29149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 29249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlsurf = (vlVdpSurface *)vlGetDataHTAB(target); 29349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!vlsurf) 29449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 29549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 29649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (vlsurf->device != vldecoder->device) 29749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_HANDLE_DEVICE_MISMATCH; 29849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2992471acfc4c051d480861265011fa5e77fad02887Christian König if (vlsurf->video_buffer->chroma_format != vldecoder->decoder->chroma_format) 3002471acfc4c051d480861265011fa5e77fad02887Christian König // TODO: Recreate decoder with correct chroma 3012471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_INVALID_CHROMA_TYPE; 30249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 303fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange // TODO: Right now only mpeg 1 & 2 videos are supported. 304c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange switch (vldecoder->decoder->profile) { 3057746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmeric case PIPE_VIDEO_PROFILE_MPEG1: 30649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE: 30749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König case PIPE_VIDEO_PROFILE_MPEG2_MAIN: 308e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König ++vldecoder->cur_buffer; 309231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->cur_buffer %= vldecoder->num_buffers; 3101d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König 311231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->decoder->set_decode_buffer(vldecoder->decoder, vldecoder->buffers[vldecoder->cur_buffer]); 3121d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König vldecoder->decoder->set_decode_target(vldecoder->decoder, vlsurf->video_buffer); 3131d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König 3141d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König return vlVdpDecoderRenderMpeg12(vldecoder->decoder, (VdpPictureInfoMPEG1Or2 *)picture_info, 3151d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König bitstream_buffer_count, bitstream_buffers); 31649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König break; 3172471acfc4c051d480861265011fa5e77fad02887Christian König 31849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König default: 31949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_DECODER_PROFILE; 32049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 321b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König} 322