106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/* 2ff36d22f039635357d9fced020fa5237cf75be9fhding * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 3ff36d22f039635357d9fced020fa5237cf75be9fhding * Copyright (c) Imagination Technologies Limited, UK 406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng * 5ff36d22f039635357d9fced020fa5237cf75be9fhding * Permission is hereby granted, free of charge, to any person obtaining a 6ff36d22f039635357d9fced020fa5237cf75be9fhding * copy of this software and associated documentation files (the 7ff36d22f039635357d9fced020fa5237cf75be9fhding * "Software"), to deal in the Software without restriction, including 8ff36d22f039635357d9fced020fa5237cf75be9fhding * without limitation the rights to use, copy, modify, merge, publish, 9ff36d22f039635357d9fced020fa5237cf75be9fhding * distribute, sub license, and/or sell copies of the Software, and to 10ff36d22f039635357d9fced020fa5237cf75be9fhding * permit persons to whom the Software is furnished to do so, subject to 11ff36d22f039635357d9fced020fa5237cf75be9fhding * the following conditions: 1206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng * 13ff36d22f039635357d9fced020fa5237cf75be9fhding * The above copyright notice and this permission notice (including the 14ff36d22f039635357d9fced020fa5237cf75be9fhding * next paragraph) shall be included in all copies or substantial portions 15ff36d22f039635357d9fced020fa5237cf75be9fhding * of the Software. 16ff36d22f039635357d9fced020fa5237cf75be9fhding * 17ff36d22f039635357d9fced020fa5237cf75be9fhding * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18ff36d22f039635357d9fced020fa5237cf75be9fhding * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19ff36d22f039635357d9fced020fa5237cf75be9fhding * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20ff36d22f039635357d9fced020fa5237cf75be9fhding * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 21ff36d22f039635357d9fced020fa5237cf75be9fhding * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22ff36d22f039635357d9fced020fa5237cf75be9fhding * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23ff36d22f039635357d9fced020fa5237cf75be9fhding * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng */ 2506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 2606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/* 2706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng * Authors: 2806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng * Li Zeng <li.zeng@intel.com> 2906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng */ 3006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "tng_vld_dec.h" 3106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "psb_drv_debug.h" 3206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "hwdefs/dxva_fw_ctrl.h" 3306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "hwdefs/reg_io2.h" 3406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "hwdefs/msvdx_offsets.h" 3506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "hwdefs/msvdx_cmds_io2.h" 3606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "va/va_dec_jpeg.h" 37d4b3bda95f2efc571b057ca9ece5ea076a55cdb0Tianmi Chen#include "va/va_dec_vp8.h" 3806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 394bac5bf335c63740958c98bab11b94dc37def621Elliott Hughes#include <malloc.h> 404bac5bf335c63740958c98bab11b94dc37def621Elliott Hughes 4106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#define GET_SURFACE_INFO_colocated_index(psb_surface) ((int) (psb_surface->extra_info[3])) 4206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#define SET_SURFACE_INFO_colocated_index(psb_surface, val) psb_surface->extra_info[3] = (uint32_t) val; 4306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 4406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/* Set MSVDX Front end register */ 4506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_FE_state(object_context_p obj_context, psb_buffer_p buf) 4606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 4706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 4806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng context_DEC_p ctx = (context_DEC_p) obj_context->format_data; 4906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng CTRL_ALLOC_HEADER *cmd_header = (CTRL_ALLOC_HEADER *)psb_cmdbuf_alloc_space(cmdbuf, sizeof(CTRL_ALLOC_HEADER)); 5006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 5106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32Cmd_AdditionalParams = CMD_CTRL_ALLOC_HEADER; 5206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32ExternStateBuffAddr = 0; 5306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (buf) 5406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng RELOC(cmd_header->ui32ExternStateBuffAddr, 0, buf); 5506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32MacroblockParamAddr = 0; /* Only EC needs to set this */ 5606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 5706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->cmd_params = &cmd_header->ui32Cmd_AdditionalParams; 5806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->p_slice_params = &cmd_header->ui32SliceParams; 5906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32SliceParams = 0; 6006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 6106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_first_pic_last = &cmd_header->uiSliceFirstMbYX_uiPicLastMbYX; 6256ada57fd5c4a41fbf281589526d47850bed05fdhding *ctx->slice_first_pic_last = 0; 6306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 6406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->p_range_mapping_base0 = &cmd_header->ui32AltOutputAddr[0]; 6506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->p_range_mapping_base1 = &cmd_header->ui32AltOutputAddr[1]; 6606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 6706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->alt_output_flags = &cmd_header->ui32AltOutputFlags; 6806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 6906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32AltOutputFlags = 0; 7006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32AltOutputAddr[0] = 0; 7106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32AltOutputAddr[1] = 0; 7206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 7306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 7406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/* Programme the Alt output if there is a rotation*/ 7506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_setup_alternative_frame(object_context_p obj_context) 7606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 7706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng uint32_t cmd = 0; 7806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 7906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng context_DEC_p ctx = (context_DEC_p) obj_context->format_data; 8081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng psb_surface_p src_surface = obj_context->current_render_target->psb_surface; 814d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng psb_surface_p out_loop_surface = obj_context->current_render_target->out_loop_surface; 824d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng int ved_scaling = (CONTEXT_SCALING(obj_context) && !ctx->yuv_ctx); 83a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe uint32_t startX = 0, startY = 0, luma_addr_offset = 0, chroma_addr_offset = 0; 8406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 8581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* In VPP ctx, current_render_target is rotated surface */ 864d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng if (ctx->yuv_ctx && (VAEntrypointVideoProc == obj_context->entry_point)) { 87925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix drv_debug_msg(VIDEO_DEBUG_GENERAL, "Setup second-pass rotation\n"); 88925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix out_loop_surface = src_surface; 8981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng src_surface = ctx->yuv_ctx->src_surface; 9081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 9181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 9239eff7a021afd8ec1a6f375dbc6476cbaa485d5dLi Zeng if (CONTEXT_ALTERNATIVE_OUTPUT(obj_context) || obj_context->entry_point == VAEntrypointVideoProc) { 934d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng if (ved_scaling) { 944d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng out_loop_surface = obj_context->current_render_target->scaling_surface; 954d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng#ifndef BAYTRAIL 964d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng tng_ved_write_scale_reg(obj_context); 974d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng 984d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS,ALTERNATIVE_OUTPUT_PICTURE_ROTATION, SCALE_INPUT_SIZE_SEL, 1); 994d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS,ALTERNATIVE_OUTPUT_PICTURE_ROTATION, SCALE_ENABLE, 1); 1004d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng#endif 101a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe } else { 102a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe startX = ((uint32_t)obj_context->current_render_target->offset_x_s + 0x3f) & ~0x3f; 103a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe startY = ((uint32_t)obj_context->current_render_target->offset_y_s + 0x1) & ~0x1; 104a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe luma_addr_offset = (((uint32_t)(startX + out_loop_surface->stride * startY)) + 0x3f ) & ~0x3f; 105a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe chroma_addr_offset = (((uint32_t)(startX + out_loop_surface->stride * startY / 2)) + 0x3f ) & ~0x3f; 1064d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng } 1074d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng 108925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix if (out_loop_surface == NULL) { 109a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe drv_debug_msg(VIDEO_DEBUG_ERROR, "out-loop surface is NULL, abort msvdx alternative output\n"); 11006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return; 11106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 11206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 1134d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng if (GET_SURFACE_INFO_rotate(out_loop_surface) != obj_context->msvdx_rotate && !ved_scaling) 114925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix drv_debug_msg(VIDEO_DEBUG_WARNING, "Display rotate mode does not match surface rotate mode!\n"); 11506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 11606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng /* CRendecBlock RendecBlk( mCtrlAlloc , RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS) ); */ 11706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS)); 11806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 119a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe psb_cmdbuf_rendec_write_address(cmdbuf, &out_loop_surface->buf, out_loop_surface->buf.buffer_ofs + luma_addr_offset); 120a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe psb_cmdbuf_rendec_write_address(cmdbuf, &out_loop_surface->buf, out_loop_surface->buf.buffer_ofs + chroma_addr_offset + out_loop_surface->chroma_offset); 12106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 12206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_end(cmdbuf); 12306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 12406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ALT_PICTURE_ENABLE, 1); 125925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_ROW_STRIDE, out_loop_surface->stride_mode); 12606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , RECON_WRITE_DISABLE, 0); /* FIXME Always generate Rec */ 127925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_MODE, GET_SURFACE_INFO_rotate(out_loop_surface)); 12806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 129a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe RELOC(*ctx->p_range_mapping_base0, out_loop_surface->buf.buffer_ofs + luma_addr_offset, &out_loop_surface->buf); 130a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe RELOC(*ctx->p_range_mapping_base1, out_loop_surface->buf.buffer_ofs + chroma_addr_offset + out_loop_surface->chroma_offset, &out_loop_surface->buf); 13106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 13206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 13306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (obj_context->profile == VAProfileVP8Version0_3 || 13456ada57fd5c4a41fbf281589526d47850bed05fdhding obj_context->profile == VAProfileJPEGBaseline || ctx->yuv_ctx) { 13506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_start(cmdbuf, (REG_MSVDX_CMD_OFFSET + MSVDX_CMDS_AUX_LINE_BUFFER_BASE_ADDRESS_OFFSET)); 13606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->aux_line_buffer_vld, ctx->aux_line_buffer_vld.buffer_ofs); 13706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_end(cmdbuf); 13806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 13906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION, USE_AUX_LINE_BUF, 1); 14056ada57fd5c4a41fbf281589526d47850bed05fdhding if (ctx->yuv_ctx) 14156ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , RECON_WRITE_DISABLE, 1); 14206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 14306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 14406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng /* Set the rotation registers */ 14506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION)); 14606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_write(cmdbuf, cmd); 14706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng *ctx->alt_output_flags = cmd; 14806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 14906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd = 0; 15081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, EXTENDED_ROW_STRIDE, EXT_ROW_STRIDE, src_surface->stride / 64); 15106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_write(cmdbuf, cmd); 15206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 15306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_end(cmdbuf); 15406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 15506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 15606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengint vld_dec_slice_parameter_size(object_context_p obj_context) 15706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 15806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int size; 15906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 16006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng switch (obj_context->profile) { 16106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileMPEG2Simple: 16206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileMPEG2Main: 16306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng size = sizeof(VASliceParameterBufferMPEG2); 16406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 16506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileMPEG4Simple: 16606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileMPEG4AdvancedSimple: 16706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileMPEG4Main: 16806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileH263Baseline: 16906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng size = sizeof(VASliceParameterBufferMPEG4); 17006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 17106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileH264Baseline: 17206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileH264Main: 17306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileH264High: 17406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileH264ConstrainedBaseline: 17506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng size = sizeof(VASliceParameterBufferH264); 17606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 17706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileVC1Simple: 17806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileVC1Main: 17906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileVC1Advanced: 18006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng size = sizeof(VASliceParameterBufferVC1); 18106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 18206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileVP8Version0_3: 183d4b3bda95f2efc571b057ca9ece5ea076a55cdb0Tianmi Chen size = sizeof(VASliceParameterBufferVP8); 18406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileJPEGBaseline: 185a52334a05d2be04432b1f8b2bccf9e90768a218aNana GUo size = sizeof(VASliceParameterBufferJPEGBaseline); 18606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng default: 18706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng size = 0; 18806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 18906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 19006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 19106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return size; 19206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 19306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 19406c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_process_slice_data(context_DEC_p ctx, object_buffer_p obj_buffer) 19506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 19606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 19706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng void *slice_param; 19806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int buffer_idx = 0; 19906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng unsigned int element_idx = 0, element_size; 20006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 20106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType)); 20206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 20306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(ctx->pic_params); 20406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(ctx->slice_param_list_idx); 20506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 20606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#if 0 20706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (!ctx->pic_params) { 20806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng /* Picture params missing */ 20906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return VA_STATUS_ERROR_UNKNOWN; 21006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 21106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#endif 21206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if ((NULL == obj_buffer->psb_buffer) || 21306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng (0 == obj_buffer->size)) { 21406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng /* We need to have data in the bitstream buffer */ 21506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return VA_STATUS_ERROR_UNKNOWN; 21606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 21706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 21806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng element_size = vld_dec_slice_parameter_size(ctx->obj_context); 21906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 22006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng while (buffer_idx < ctx->slice_param_list_idx) { 22106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng object_buffer_p slice_buf = ctx->slice_param_list[buffer_idx]; 22206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (element_idx >= slice_buf->num_elements) { 22306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng /* Move to next buffer */ 22406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng element_idx = 0; 22506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng buffer_idx++; 22606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng continue; 22706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 22806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 22906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng slice_param = slice_buf->buffer_data; 230cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan slice_param = (void *)((unsigned long)slice_param + element_idx * element_size); 23106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng element_idx++; 23206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = vld_dec_process_slice(ctx, slice_param, obj_buffer); 23306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (vaStatus != VA_STATUS_SUCCESS) { 23406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 23506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 23606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 23706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 23806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list_idx = 0; 23906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 24006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 24106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 24206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/* 24306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng * Adds a VASliceParameterBuffer to the list of slice params 24406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng */ 24506c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_add_slice_param(context_DEC_p ctx, object_buffer_p obj_buffer) 24606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 24706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(obj_buffer->type == VASliceParameterBufferType); 24806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (ctx->slice_param_list_idx >= ctx->slice_param_list_size) { 24906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng unsigned char *new_list; 25006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list_size += 8; 25106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng new_list = realloc(ctx->slice_param_list, 25206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng sizeof(object_buffer_p) * ctx->slice_param_list_size); 25306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (NULL == new_list) { 25406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return VA_STATUS_ERROR_ALLOCATION_FAILED; 25506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 25606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list = (object_buffer_p*) new_list; 25706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 25806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list[ctx->slice_param_list_idx] = obj_buffer; 25906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list_idx++; 26006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return VA_STATUS_SUCCESS; 26106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 26206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 26306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_write_kick(object_context_p obj_context) 26406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 26506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 26606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng *cmdbuf->cmd_idx++ = CMD_COMPLETION; 26706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 26806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 26906c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_process_slice(context_DEC_p ctx, 27006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng void *vld_slice_param, 27106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng object_buffer_p obj_buffer) 27206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 27306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 27406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng VASliceParameterBufferBase *slice_param = (VASliceParameterBufferBase *) vld_slice_param; 27506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 27606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType)); 27706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 27806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) || 27906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL)) { 280e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifndef SLICE_HEADER_PARSING 28106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (0 == slice_param->slice_data_size) { 28206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = VA_STATUS_ERROR_UNKNOWN; 28306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 28406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 28506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 286e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif 28706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(!ctx->split_buffer_pending); 28806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 28906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (psb_context_get_next_cmdbuf(ctx->obj_context)) { 29006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = VA_STATUS_ERROR_UNKNOWN; 29106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 29206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 29306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 29406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vld_dec_FE_state(ctx->obj_context, ctx->preload_buffer); 2951b8d958031a6ae24789addf7ff073316b89aff87Nana GUo ctx->begin_slice(ctx, slice_param); 29606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_data_buffer = obj_buffer->psb_buffer; 297e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifdef SLICE_HEADER_PARSING 298e853beb775a5de607bd080d7d43e638f95199e68Nana GUo if (ctx->parse_enabled == 1) 299e853beb775a5de607bd080d7d43e638f95199e68Nana GUo psb_cmdbuf_dma_write_key(ctx->obj_context->cmdbuf, 300e853beb775a5de607bd080d7d43e638f95199e68Nana GUo ctx->SR_flags, 301e853beb775a5de607bd080d7d43e638f95199e68Nana GUo ctx->parse_key); 302e853beb775a5de607bd080d7d43e638f95199e68Nana GUo else 303e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif 304e853beb775a5de607bd080d7d43e638f95199e68Nana GUo psb_cmdbuf_dma_write_bitstream(ctx->obj_context->cmdbuf, 30506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng obj_buffer->psb_buffer, 30606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng obj_buffer->psb_buffer->buffer_ofs + slice_param->slice_data_offset, 30706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng slice_param->slice_data_size, 30806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->bits_offset, 30906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->SR_flags); 31006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 31106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) { 31206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->split_buffer_pending = TRUE; 31306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 31406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } else { 31506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(ctx->split_buffer_pending); 31606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(0 == slice_param->slice_data_offset); 31706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (slice_param->slice_data_size) { 31806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_dma_write_bitstream_chained(ctx->obj_context->cmdbuf, 31906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng obj_buffer->psb_buffer, 32006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng slice_param->slice_data_size); 32106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 32206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 32306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 32406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL) || 32506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END)) { 32606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END) { 32706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(ctx->split_buffer_pending); 32806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 32906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 33006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->process_slice(ctx, slice_param); 33106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vld_dec_write_kick(ctx->obj_context); 33206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 33306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->split_buffer_pending = FALSE; 33406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->obj_context->video_op = psb_video_vld; 33506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->obj_context->flags = 0; 33606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 33706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->end_slice(ctx); 33806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 33906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (psb_context_submit_cmdbuf(ctx->obj_context)) { 34006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = VA_STATUS_ERROR_UNKNOWN; 34106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 34206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 34306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 34406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 34506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 34606c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_allocate_colocated_buffer(context_DEC_p ctx, object_surface_p obj_surface, uint32_t size) 34706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 34806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_buffer_p buf; 34906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng VAStatus vaStatus; 35006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_surface_p surface = obj_surface->psb_surface; 35106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int index = GET_SURFACE_INFO_colocated_index(surface); 35206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 35306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (!index) { 35406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng index = ctx->colocated_buffers_idx; 35506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (index >= ctx->colocated_buffers_size) { 35606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return VA_STATUS_ERROR_UNKNOWN; 35706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 35806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 35906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocating colocated buffer for surface %08x size = %08x\n", surface, size); 36006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 36106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng buf = &(ctx->colocated_buffers[index]); 36206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = psb_buffer_create(ctx->obj_context->driver_data, size, psb_bt_vpu_only, buf); 36306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (VA_STATUS_SUCCESS != vaStatus) { 36406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 36506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 36606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->colocated_buffers_idx++; 36706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng SET_SURFACE_INFO_colocated_index(surface, index + 1); /* 0 means unset, index is offset by 1 */ 36806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } else { 36906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng buf = &(ctx->colocated_buffers[index - 1]); 37006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (buf->size < size) { 37106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_buffer_destroy(buf); 37206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = psb_buffer_create(ctx->obj_context->driver_data, size, psb_bt_vpu_only, buf); 37306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (VA_STATUS_SUCCESS != vaStatus) { 37406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 37506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 37606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng SET_SURFACE_INFO_colocated_index(surface, index); /* replace the original buffer */ 37706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 37806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 37906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return VA_STATUS_SUCCESS; 38006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 38106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 38206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengpsb_buffer_p vld_dec_lookup_colocated_buffer(context_DEC_p ctx, psb_surface_p surface) 38306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 38406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int index = GET_SURFACE_INFO_colocated_index(surface); 38506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (!index) { 38606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return NULL; 38706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 38806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return &(ctx->colocated_buffers[index-1]); /* 0 means unset, index is offset by 1 */ 38906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 39006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 39106c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_CreateContext(context_DEC_p ctx, object_context_p obj_context) 39206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 39306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 39406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 39506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->obj_context = obj_context; 39606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->split_buffer_pending = FALSE; 39706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list_size = 8; 39806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list = (object_buffer_p*) calloc(1, sizeof(object_buffer_p) * ctx->slice_param_list_size); 39906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list_idx = 0; 40006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 40106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (NULL == ctx->slice_param_list) { 40206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 40306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 40406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 40506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 40606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 40706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->colocated_buffers_size = obj_context->num_render_targets; 40806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->colocated_buffers_idx = 0; 40906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->colocated_buffers = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s) * ctx->colocated_buffers_size); 41006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (NULL == ctx->colocated_buffers) { 41106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 41206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 41306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng free(ctx->slice_param_list); 41406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 41581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 41681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (vaStatus == VA_STATUS_SUCCESS) { 41781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = psb_buffer_create(obj_context->driver_data, 41881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng AUX_LINE_BUFFER_VLD_SIZE, 41981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng psb_bt_cpu_vpu, 42081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng &ctx->aux_line_buffer_vld); 42181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng DEBUG_FAILURE; 42281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 42381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 42406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 42506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 42606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 42706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_DestroyContext(context_DEC_p ctx) 42806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 42906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int i; 43006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->preload_buffer = NULL; 43106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 432feee186c19ae8213aad756baeb51d2fa11f36730Li Zeng psb_buffer_destroy(&ctx->aux_line_buffer_vld); 433feee186c19ae8213aad756baeb51d2fa11f36730Li Zeng 43406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (ctx->slice_param_list) { 43506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng free(ctx->slice_param_list); 43606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list = NULL; 43706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 43806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 43906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (ctx->colocated_buffers) { 44006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng for (i = 0; i < ctx->colocated_buffers_idx; ++i) 44106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_buffer_destroy(&(ctx->colocated_buffers[i])); 44206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 44306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng free(ctx->colocated_buffers); 44406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->colocated_buffers = NULL; 44506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 44606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 44706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 44806c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_RenderPicture( 44906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng object_context_p obj_context, 45006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng object_buffer_p *buffers, 45106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int num_buffers) 45206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 45306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int i; 45406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng context_DEC_p ctx = (context_DEC_p) obj_context->format_data; 45506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 45606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 45706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng for (i = 0; i < num_buffers; i++) { 45806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng object_buffer_p obj_buffer = buffers[i]; 45906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb__dump_va_buffers_verbose(obj_buffer); 46006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 46106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng switch (obj_buffer->type) { 46206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VASliceParameterBufferType: 46306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = vld_dec_add_slice_param(ctx, obj_buffer); 46406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 46506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 46606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 46706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VASliceDataBufferType: 46806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProtectedSliceDataBufferType: 46906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = vld_dec_process_slice_data(ctx, obj_buffer); 47006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 47106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 47206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 47306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng default: 47406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = ctx->process_buffer(ctx, obj_buffer); 47506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 47606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 47706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (vaStatus != VA_STATUS_SUCCESS) { 47806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 47906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 48006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 48106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 48206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 48306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 48456ada57fd5c4a41fbf281589526d47850bed05fdhding 485a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpevoid vld_dec_yuv_rotate(object_context_p obj_context) 48656ada57fd5c4a41fbf281589526d47850bed05fdhding{ 48756ada57fd5c4a41fbf281589526d47850bed05fdhding VAStatus vaStatus = VA_STATUS_SUCCESS; 48856ada57fd5c4a41fbf281589526d47850bed05fdhding struct format_vtable_s *vtable = &tng_yuv_processor_vtable; 48956ada57fd5c4a41fbf281589526d47850bed05fdhding struct surface_param_s surface_param; 49056ada57fd5c4a41fbf281589526d47850bed05fdhding struct object_buffer_s buffer; 49156ada57fd5c4a41fbf281589526d47850bed05fdhding object_buffer_p buffer_p = &buffer; 49256ada57fd5c4a41fbf281589526d47850bed05fdhding 493a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe surface_param.src_surface = obj_context->current_render_target->scaling_surface; 494a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe surface_param.display_width = obj_context->current_render_target->buffer_width_s; 495a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe surface_param.display_height = obj_context->current_render_target->buffer_height_s; 496a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe surface_param.coded_width = obj_context->current_render_target->width_s; 497a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe surface_param.coded_height = obj_context->current_render_target->height_s; 49856ada57fd5c4a41fbf281589526d47850bed05fdhding 49956ada57fd5c4a41fbf281589526d47850bed05fdhding buffer.num_elements = 1; 50056ada57fd5c4a41fbf281589526d47850bed05fdhding buffer.type = YUVProcessorSurfaceType; 50156ada57fd5c4a41fbf281589526d47850bed05fdhding buffer.size = sizeof(struct surface_param_s); 502cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan buffer.buffer_data = (unsigned char *)&surface_param; 50356ada57fd5c4a41fbf281589526d47850bed05fdhding 50456ada57fd5c4a41fbf281589526d47850bed05fdhding vtable->createContext(obj_context, NULL); 50556ada57fd5c4a41fbf281589526d47850bed05fdhding vtable->beginPicture(obj_context); 50656ada57fd5c4a41fbf281589526d47850bed05fdhding vtable->renderPicture(obj_context, &buffer_p, 1); 50756ada57fd5c4a41fbf281589526d47850bed05fdhding vtable->endPicture(obj_context); 50856ada57fd5c4a41fbf281589526d47850bed05fdhding vtable->destroyContext(obj_context); 50956ada57fd5c4a41fbf281589526d47850bed05fdhding} 510