decode.c revision 7ac114f94a8fac5fa7cc0e99bf6a3c03ec194650
1c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen/************************************************************************** 2c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * 3c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * Copyright 2010 Thomas Balling Sørensen. 4c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * All Rights Reserved. 5c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * 6c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * Permission is hereby granted, free of charge, to any person obtaining a 7c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * copy of this software and associated documentation files (the 8c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * "Software"), to deal in the Software without restriction, including 9c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * without limitation the rights to use, copy, modify, merge, publish, 10c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * distribute, sub license, and/or sell copies of the Software, and to 11c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * permit persons to whom the Software is furnished to do so, subject to 12c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * the following conditions: 13c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * 14c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * The above copyright notice and this permission notice (including the 15c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * next paragraph) shall be included in all copies or substantial portions 16c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * of the Software. 17c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * 18c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen * 26c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen **************************************************************************/ 27c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen 2828f8ff6b622d63e8ffe322ab2cdf5197941f1a40Kai Wasserbäch#include "util/u_memory.h" 2928f8ff6b622d63e8ffe322ab2cdf5197941f1a40Kai Wasserbäch#include "util/u_math.h" 3028f8ff6b622d63e8ffe322ab2cdf5197941f1a40Kai Wasserbäch#include "util/u_debug.h" 3112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst#include "util/u_video.h" 32c97ccc33531d4bf3f3154515317255645ada2afeThomas Balling Sørensen 332471acfc4c051d480861265011fa5e77fad02887Christian König#include "vdpau_private.h" 342471acfc4c051d480861265011fa5e77fad02887Christian König 35fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 36fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Create a VdpDecoder. 37fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 38725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 3949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderCreate(VdpDevice device, 4049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpDecoderProfile profile, 4149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t width, uint32_t height, 4249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t max_references, 4349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpDecoder *decoder) 44725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 452471acfc4c051d480861265011fa5e77fad02887Christian König enum pipe_video_profile p_profile; 46ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König struct pipe_context *pipe; 471eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst struct pipe_screen *screen; 482471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDevice *dev; 492471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDecoder *vldecoder; 502471acfc4c051d480861265011fa5e77fad02887Christian König VdpStatus ret; 51e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König unsigned i; 521eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst bool supported; 53b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 5408f3a7cf7e9133f50adf33f800aa3696c909347fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Creating decoder\n"); 55b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 5649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!decoder) 5749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_POINTER; 581eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst *decoder = 0; 59b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 6049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!(width && height)) 6149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_VALUE; 62b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 632471acfc4c051d480861265011fa5e77fad02887Christian König p_profile = ProfileToPipe(profile); 642471acfc4c051d480861265011fa5e77fad02887Christian König if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN) 652471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_INVALID_DECODER_PROFILE; 662471acfc4c051d480861265011fa5e77fad02887Christian König 672471acfc4c051d480861265011fa5e77fad02887Christian König dev = vlGetDataHTAB(device); 682471acfc4c051d480861265011fa5e77fad02887Christian König if (!dev) 692471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_INVALID_HANDLE; 702471acfc4c051d480861265011fa5e77fad02887Christian König 71ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König pipe = dev->context->pipe; 721eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst screen = dev->vscreen->pscreen; 731eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst supported = screen->get_video_param 741eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst ( 751eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst screen, 761eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst p_profile, 771eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst PIPE_VIDEO_CAP_SUPPORTED 781eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst ); 791eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst if (!supported) 801eb48c5500e5b3e3319108a1cecf63524fdede0dMaarten Lankhorst return VDP_STATUS_INVALID_DECODER_PROFILE; 81b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 82725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen vldecoder = CALLOC(1,sizeof(vlVdpDecoder)); 832471acfc4c051d480861265011fa5e77fad02887Christian König if (!vldecoder) 842471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_RESOURCES; 85b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 862471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->device = dev; 87725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 88ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König vldecoder->decoder = pipe->create_video_decoder 892471acfc4c051d480861265011fa5e77fad02887Christian König ( 90ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König pipe, p_profile, 912471acfc4c051d480861265011fa5e77fad02887Christian König PIPE_VIDEO_ENTRYPOINT_BITSTREAM, 922471acfc4c051d480861265011fa5e77fad02887Christian König PIPE_VIDEO_CHROMA_FORMAT_420, 9382e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange width, height, max_references 942471acfc4c051d480861265011fa5e77fad02887Christian König ); 9582e8bf36d8fcd46bcb76ec300875a47c7312f1a1Emeric Grange 962471acfc4c051d480861265011fa5e77fad02887Christian König if (!vldecoder->decoder) { 972471acfc4c051d480861265011fa5e77fad02887Christian König ret = VDP_STATUS_ERROR; 982471acfc4c051d480861265011fa5e77fad02887Christian König goto error_decoder; 992471acfc4c051d480861265011fa5e77fad02887Christian König } 100b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 101231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->num_buffers = pipe->screen->get_video_param 102231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König ( 103231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König pipe->screen, p_profile, 104231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König PIPE_VIDEO_CAP_NUM_BUFFERS_DESIRED 105231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König ); 106e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König vldecoder->cur_buffer = 0; 107e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König 108231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->buffers = CALLOC(vldecoder->num_buffers, sizeof(void*)); 109231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König if (!vldecoder->buffers) 110231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König goto error_alloc_buffers; 111231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König 112231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König for (i = 0; i < vldecoder->num_buffers; ++i) { 113231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->buffers[i] = vldecoder->decoder->create_buffer(vldecoder->decoder); 114231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König if (!vldecoder->buffers[i]) { 115e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König ret = VDP_STATUS_ERROR; 116231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König goto error_create_buffers; 117e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König } 1182471acfc4c051d480861265011fa5e77fad02887Christian König } 119b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 12049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König *decoder = vlAddDataHTAB(vldecoder); 12149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (*decoder == 0) { 122725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen ret = VDP_STATUS_ERROR; 1232471acfc4c051d480861265011fa5e77fad02887Christian König goto error_handle; 12449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 1252471acfc4c051d480861265011fa5e77fad02887Christian König 12608f3a7cf7e9133f50adf33f800aa3696c909347fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoder created succesfully\n"); 127b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 12849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 129b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 1302471acfc4c051d480861265011fa5e77fad02887Christian Königerror_handle: 131231fce7d630bcf6aaf0e435e461ad5af842e437fChristian Königerror_create_buffers: 132e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König 133231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König for (i = 0; i < vldecoder->num_buffers; ++i) 134231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König if (vldecoder->buffers[i]) 135231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->decoder->destroy_buffer(vldecoder->decoder, vldecoder->buffers[i]); 136231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König 137231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König FREE(vldecoder->buffers); 138231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König 139231fce7d630bcf6aaf0e435e461ad5af842e437fChristian Königerror_alloc_buffers: 140e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König 1412471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->decoder->destroy(vldecoder->decoder); 1422471acfc4c051d480861265011fa5e77fad02887Christian König 1432471acfc4c051d480861265011fa5e77fad02887Christian Königerror_decoder: 14449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König FREE(vldecoder); 1452471acfc4c051d480861265011fa5e77fad02887Christian König return ret; 146725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 147725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 148fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 149fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Destroy a VdpDecoder. 150fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 151725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 15249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderDestroy(VdpDecoder decoder) 153725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 1542471acfc4c051d480861265011fa5e77fad02887Christian König vlVdpDecoder *vldecoder; 155e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König unsigned i; 156d5b05a869a71147987a1c1d6c84f8df17148f031Christian König 15708f3a7cf7e9133f50adf33f800aa3696c909347fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Destroying decoder\n"); 158b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 15949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 1602471acfc4c051d480861265011fa5e77fad02887Christian König if (!vldecoder) 161725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen return VDP_STATUS_INVALID_HANDLE; 162b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 163231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König for (i = 0; i < vldecoder->num_buffers; ++i) 164231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König if (vldecoder->buffers[i]) 165231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König vldecoder->decoder->destroy_buffer(vldecoder->decoder, vldecoder->buffers[i]); 166231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König 167231fce7d630bcf6aaf0e435e461ad5af842e437fChristian König FREE(vldecoder->buffers); 168e06a09ac37c1ab55326922abc314fe84e3ac5824Christian König 1692471acfc4c051d480861265011fa5e77fad02887Christian König vldecoder->decoder->destroy(vldecoder->decoder); 170b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 17149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König FREE(vldecoder); 172b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König 17349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 174725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 175725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 176fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 177fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Retrieve the parameters used to create a VdpBitmapSurface. 178fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 179725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling SørensenVdpStatus 1802471acfc4c051d480861265011fa5e77fad02887Christian KönigvlVdpDecoderGetParameters(VdpDecoder decoder, 1812471acfc4c051d480861265011fa5e77fad02887Christian König VdpDecoderProfile *profile, 1822471acfc4c051d480861265011fa5e77fad02887Christian König uint32_t *width, 1832471acfc4c051d480861265011fa5e77fad02887Christian König uint32_t *height) 184725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 18534145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König vlVdpDecoder *vldecoder; 18634145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König 187fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoder get parameters called\n"); 18834145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König 18934145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 19034145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König if (!vldecoder) 19134145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König return VDP_STATUS_INVALID_HANDLE; 192c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange 19334145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *profile = PipeToProfile(vldecoder->decoder->profile); 19434145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *width = vldecoder->decoder->width; 19534145ecdad8d6d3b14dc88dafd71b689c68de36cChristian König *height = vldecoder->decoder->height; 196c24bc6f8684abee8c9a1b263334cd7a8506657b1Emeric Grange 19749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_OK; 198725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen} 199725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen 200fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 201fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a mpeg 1/2 video. 202fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 2032471acfc4c051d480861265011fa5e77fad02887Christian Königstatic VdpStatus 2047746b7d4bf48b75dd273510e7a6ad6405c91b8bbEmericvlVdpDecoderRenderMpeg12(struct pipe_video_decoder *decoder, 20512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst VdpPictureInfoMPEG1Or2 *picture_info) 206725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 207c888fe027c338f337123de4da2de1ac73b0f7587Christian König struct pipe_mpeg12_picture_desc picture; 2082e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König struct pipe_mpeg12_quant_matrix quant; 2092471acfc4c051d480861265011fa5e77fad02887Christian König struct pipe_video_buffer *ref_frames[2]; 210c888fe027c338f337123de4da2de1ac73b0f7587Christian König unsigned i; 21149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 212fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG12\n"); 21349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2141d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König i = 0; 2151d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König 21649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */ 2171d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König if (picture_info->forward_reference != VDP_INVALID_HANDLE) { 2181d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König ref_frames[i] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer; 2191d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König if (!ref_frames[i]) 22049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 2211d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König ++i; 22249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 22349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2241d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König if (picture_info->backward_reference != VDP_INVALID_HANDLE) { 2251d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König ref_frames[i] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer; 2261d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König if (!ref_frames[i]) 22749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 2281d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König ++i; 22949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 23049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 2311d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König decoder->set_reference_frames(decoder, ref_frames, i); 2321d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König 233c888fe027c338f337123de4da2de1ac73b0f7587Christian König memset(&picture, 0, sizeof(picture)); 2347e1fbb360332ecac2789e28a0f3d303306f687b1Christian König picture.base.profile = decoder->profile; 235c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.picture_coding_type = picture_info->picture_coding_type; 236c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.picture_structure = picture_info->picture_structure; 237c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.frame_pred_frame_dct = picture_info->frame_pred_frame_dct; 238c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.q_scale_type = picture_info->q_scale_type; 239c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.alternate_scan = picture_info->alternate_scan; 240c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.intra_vlc_format = picture_info->intra_vlc_format; 241c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.concealment_motion_vectors = picture_info->concealment_motion_vectors; 2422e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König picture.intra_dc_precision = picture_info->intra_dc_precision; 243c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.f_code[0][0] = picture_info->f_code[0][0] - 1; 244c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.f_code[0][1] = picture_info->f_code[0][1] - 1; 245c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.f_code[1][0] = picture_info->f_code[1][0] - 1; 246c888fe027c338f337123de4da2de1ac73b0f7587Christian König picture.f_code[1][1] = picture_info->f_code[1][1] - 1; 247c4d47f065ae2a015a9d2e9a060d71e04d5935c2bMaarten Lankhorst picture.num_slices = picture_info->slice_count; 24845bb4b79f6ddd1fdb447632c88333866585fb80cMaarten Lankhorst picture.top_field_first = picture_info->top_field_first; 24945bb4b79f6ddd1fdb447632c88333866585fb80cMaarten Lankhorst picture.full_pel_forward_vector = picture_info->full_pel_forward_vector; 25045bb4b79f6ddd1fdb447632c88333866585fb80cMaarten Lankhorst picture.full_pel_backward_vector = picture_info->full_pel_backward_vector; 251c888fe027c338f337123de4da2de1ac73b0f7587Christian König 2521d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König decoder->set_picture_parameters(decoder, &picture.base); 253c888fe027c338f337123de4da2de1ac73b0f7587Christian König 2542e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König memset(&quant, 0, sizeof(quant)); 2552e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König quant.base.codec = PIPE_VIDEO_CODEC_MPEG12; 2562e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König quant.intra_matrix = picture_info->intra_quantizer_matrix; 2572e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König quant.non_intra_matrix = picture_info->non_intra_quantizer_matrix; 2582e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König 2592e62b30826679e9d5e1a783dc19baabec4fc8dfaChristian König decoder->set_quant_matrix(decoder, &quant.base); 26012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst return VDP_STATUS_OK; 26112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst} 26212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst 26312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst/** 264eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst * Decode a mpeg 4 video. 26512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst */ 26612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorststatic VdpStatus 26712bf452945ae64da69f474298758f9a7c8b94af5Maarten LankhorstvlVdpDecoderRenderMpeg4(struct pipe_video_decoder *decoder, 26812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst VdpPictureInfoMPEG4Part2 *picture_info) 26912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst{ 27012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst struct pipe_mpeg4_picture_desc picture; 27112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst struct pipe_mpeg4_quant_matrix quant; 27212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst struct pipe_video_buffer *ref_frames[2] = {}; 27312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst unsigned i; 274b4fa7db65639322ae8dea19a23c9cc8234a3d7e1Christian König 27512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG4\n"); 276c888fe027c338f337123de4da2de1ac73b0f7587Christian König 27712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */ 27812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst if (picture_info->forward_reference != VDP_INVALID_HANDLE) { 27912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst ref_frames[0] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer; 28012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst if (!ref_frames[0]) 28112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst return VDP_STATUS_INVALID_HANDLE; 28212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst } 28312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst 28412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst if (picture_info->backward_reference != VDP_INVALID_HANDLE) { 28512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst ref_frames[1] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer; 28612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst if (!ref_frames[1]) 28712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst return VDP_STATUS_INVALID_HANDLE; 28812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst } 28912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst decoder->set_reference_frames(decoder, ref_frames, 2); 29049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 29112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst memset(&picture, 0, sizeof(picture)); 29212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.base.profile = decoder->profile; 29312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst for (i = 0; i < 2; ++i) { 29412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.trd[i] = picture_info->trd[i]; 29512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.trb[i] = picture_info->trb[i]; 29612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst } 29712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.vop_time_increment_resolution = picture_info->vop_time_increment_resolution; 29812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.vop_coding_type = picture_info->vop_coding_type; 29912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.vop_fcode_forward = picture_info->vop_fcode_forward; 30012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.vop_fcode_backward = picture_info->vop_fcode_backward; 30112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.resync_marker_disable = picture_info->resync_marker_disable; 30212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.interlaced = picture_info->interlaced; 30312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.quant_type = picture_info->quant_type; 30412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.quarter_sample = picture_info->quarter_sample; 30512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.short_video_header = picture_info->short_video_header; 30612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.rounding_control = picture_info->rounding_control; 30712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.alternate_vertical_scan_flag = picture_info->alternate_vertical_scan_flag; 30812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst picture.top_field_first = picture_info->top_field_first; 30912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst decoder->set_picture_parameters(decoder, &picture.base); 31049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 31112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst memset(&quant, 0, sizeof(quant)); 31212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst quant.base.codec = PIPE_VIDEO_CODEC_MPEG4; 31312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst quant.intra_matrix = picture_info->intra_quantizer_matrix; 31412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst quant.non_intra_matrix = picture_info->non_intra_quantizer_matrix; 31512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst decoder->set_quant_matrix(decoder, &quant.base); 3162471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_OK; 31738bd8131776879e9dc90d06848657756a4a13a66Christian König} 31838bd8131776879e9dc90d06848657756a4a13a66Christian König 319eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorststatic VdpStatus 320eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten LankhorstvlVdpDecoderRenderVC1(struct pipe_video_decoder *decoder, 321eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst VdpPictureInfoVC1 *picture_info) 322eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst{ 323eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst struct pipe_vc1_picture_desc picture; 324eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst struct pipe_video_buffer *ref_frames[2] = {}; 325eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst 326eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding VC-1\n"); 327eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst 328eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */ 329eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst if (picture_info->forward_reference != VDP_INVALID_HANDLE) { 330eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst ref_frames[0] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->forward_reference))->video_buffer; 331eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst if (!ref_frames[0]) 332eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst return VDP_STATUS_INVALID_HANDLE; 333eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst } 334eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst 335eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst if (picture_info->backward_reference != VDP_INVALID_HANDLE) { 336eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst ref_frames[1] = ((vlVdpSurface *)vlGetDataHTAB(picture_info->backward_reference))->video_buffer; 337eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst if (!ref_frames[1]) 338eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst return VDP_STATUS_INVALID_HANDLE; 339eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst } 340eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst decoder->set_reference_frames(decoder, ref_frames, 2); 341eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst 342eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst memset(&picture, 0, sizeof(picture)); 343eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.base.profile = decoder->profile; 344eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.slice_count = picture_info->slice_count; 345eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.picture_type = picture_info->picture_type; 346eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.frame_coding_mode = picture_info->frame_coding_mode; 347eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.postprocflag = picture_info->postprocflag; 348eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.pulldown = picture_info->pulldown; 349eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.interlace = picture_info->interlace; 350eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.tfcntrflag = picture_info->tfcntrflag; 351eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.finterpflag = picture_info->finterpflag; 352eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.psf = picture_info->psf; 353eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.dquant = picture_info->dquant; 354eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.panscan_flag = picture_info->panscan_flag; 355eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.refdist_flag = picture_info->refdist_flag; 356eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.quantizer = picture_info->quantizer; 357eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.extended_mv = picture_info->extended_mv; 358eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.extended_dmv = picture_info->extended_dmv; 359eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.overlap = picture_info->overlap; 360eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.vstransform = picture_info->vstransform; 361eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.loopfilter = picture_info->loopfilter; 362eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.fastuvmc = picture_info->fastuvmc; 363eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.range_mapy_flag = picture_info->range_mapy_flag; 364eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.range_mapy = picture_info->range_mapy; 365eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.range_mapuv_flag = picture_info->range_mapuv_flag; 366eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.range_mapuv = picture_info->range_mapuv; 367eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.multires = picture_info->multires; 368eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.syncmarker = picture_info->syncmarker; 369eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.rangered = picture_info->rangered; 370eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.maxbframes = picture_info->maxbframes; 371eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.deblockEnable = picture_info->deblockEnable; 372eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst picture.pquant = picture_info->pquant; 373eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst decoder->set_picture_parameters(decoder, &picture.base); 374eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst return VDP_STATUS_OK; 375eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst} 376eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst 377fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange/** 378fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange * Decode a compressed field/frame and render the result into a VdpVideoSurface. 379fa2a8316cebeb75626ffa3e38dbc1500e82054f6Emeric Grange */ 38038bd8131776879e9dc90d06848657756a4a13a66Christian KönigVdpStatus 38149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian KönigvlVdpDecoderRender(VdpDecoder decoder, 38249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpVideoSurface target, 38349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpPictureInfo const *picture_info, 38449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König uint32_t bitstream_buffer_count, 38549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König VdpBitstreamBuffer const *bitstream_buffers) 386725e4ada3062c80623abf51477dfdc73fe294f3fThomas Balling Sørensen{ 3877ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König const void * buffers[bitstream_buffer_count]; 3887ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König unsigned sizes[bitstream_buffer_count]; 38949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlVdpDecoder *vldecoder; 39049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlVdpSurface *vlsurf; 39112bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst VdpStatus ret; 39212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst struct pipe_video_decoder *dec; 39312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst unsigned i; 39449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 39508f3a7cf7e9133f50adf33f800aa3696c909347fChristian König VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding\n"); 39649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 39749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!(picture_info && bitstream_buffers)) 39849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_POINTER; 39949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 40049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder); 40149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!vldecoder) 40249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 40312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst dec = vldecoder->decoder; 40449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 40549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König vlsurf = (vlVdpSurface *)vlGetDataHTAB(target); 40649f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (!vlsurf) 40749f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_HANDLE; 40849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 40949f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König if (vlsurf->device != vldecoder->device) 41049f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_HANDLE_DEVICE_MISMATCH; 41149f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 41212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst if (vlsurf->video_buffer->chroma_format != dec->chroma_format) 4132471acfc4c051d480861265011fa5e77fad02887Christian König // TODO: Recreate decoder with correct chroma 4142471acfc4c051d480861265011fa5e77fad02887Christian König return VDP_STATUS_INVALID_CHROMA_TYPE; 41549f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König 41612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst ++vldecoder->cur_buffer; 41712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst vldecoder->cur_buffer %= vldecoder->num_buffers; 4181d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König 41912bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst dec->set_decode_buffer(dec, vldecoder->buffers[vldecoder->cur_buffer]); 42012bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst dec->set_decode_target(dec, vlsurf->video_buffer); 4211d1d038c85ebb37f1da4540f092563e8ecab7dfbChristian König 42212bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst switch (u_reduce_video_profile(dec->profile)) { 42312bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst case PIPE_VIDEO_CODEC_MPEG12: 42412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst ret = vlVdpDecoderRenderMpeg12(dec, (VdpPictureInfoMPEG1Or2 *)picture_info); 42512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst break; 42612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst case PIPE_VIDEO_CODEC_MPEG4: 42712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst ret = vlVdpDecoderRenderMpeg4(dec, (VdpPictureInfoMPEG4Part2 *)picture_info); 42849f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König break; 429eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst case PIPE_VIDEO_CODEC_VC1: 430eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst ret = vlVdpDecoderRenderVC1(dec, (VdpPictureInfoVC1 *)picture_info); 431eadbcb221db16af96aa6c3f40d48896d23d9eebcMaarten Lankhorst break; 43249f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König default: 43349f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König return VDP_STATUS_INVALID_DECODER_PROFILE; 43449f4aff75ce781fb71383a5ffe44e51e34ff1bf3Christian König } 43512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst if (ret != VDP_STATUS_OK) 43612bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst return ret; 43712bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst 43812bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst dec->begin_frame(dec); 4397ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König for (i = 0; i < bitstream_buffer_count; ++i) { 4407ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König buffers[i] = bitstream_buffers[i].bitstream; 4417ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König sizes[i] = bitstream_buffers[i].bitstream_bytes; 4427ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König } 4437ac114f94a8fac5fa7cc0e99bf6a3c03ec194650Christian König dec->decode_bitstream(dec, bitstream_buffer_count, buffers, sizes); 44412bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst dec->end_frame(dec); 44512bf452945ae64da69f474298758f9a7c8b94af5Maarten Lankhorst return ret; 446b90f569a0f8578a20b9ee2997396b6c3ddd3b573Christian König} 447