tng_vld_dec.c revision a7634d944fe745c4061b4b5c0d425cc585b923a2
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 3906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#define GET_SURFACE_INFO_colocated_index(psb_surface) ((int) (psb_surface->extra_info[3])) 4006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#define SET_SURFACE_INFO_colocated_index(psb_surface, val) psb_surface->extra_info[3] = (uint32_t) val; 4106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 4206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/* Set MSVDX Front end register */ 4306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_FE_state(object_context_p obj_context, psb_buffer_p buf) 4406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 4506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 4606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng context_DEC_p ctx = (context_DEC_p) obj_context->format_data; 4706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng CTRL_ALLOC_HEADER *cmd_header = (CTRL_ALLOC_HEADER *)psb_cmdbuf_alloc_space(cmdbuf, sizeof(CTRL_ALLOC_HEADER)); 4806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 4906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32Cmd_AdditionalParams = CMD_CTRL_ALLOC_HEADER; 5006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32ExternStateBuffAddr = 0; 5106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (buf) 5206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng RELOC(cmd_header->ui32ExternStateBuffAddr, 0, buf); 5306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32MacroblockParamAddr = 0; /* Only EC needs to set this */ 5406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 5506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->cmd_params = &cmd_header->ui32Cmd_AdditionalParams; 5606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->p_slice_params = &cmd_header->ui32SliceParams; 5706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32SliceParams = 0; 5806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 5906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_first_pic_last = &cmd_header->uiSliceFirstMbYX_uiPicLastMbYX; 6056ada57fd5c4a41fbf281589526d47850bed05fdhding *ctx->slice_first_pic_last = 0; 6106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 6206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->p_range_mapping_base0 = &cmd_header->ui32AltOutputAddr[0]; 6306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->p_range_mapping_base1 = &cmd_header->ui32AltOutputAddr[1]; 6406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 6506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->alt_output_flags = &cmd_header->ui32AltOutputFlags; 6606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 6706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32AltOutputFlags = 0; 6806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32AltOutputAddr[0] = 0; 6906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd_header->ui32AltOutputAddr[1] = 0; 7006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 7106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 7206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/* Programme the Alt output if there is a rotation*/ 7306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_setup_alternative_frame(object_context_p obj_context) 7406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 7506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng uint32_t cmd = 0; 7606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 7706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng context_DEC_p ctx = (context_DEC_p) obj_context->format_data; 7881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng psb_surface_p src_surface = obj_context->current_render_target->psb_surface; 794d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng psb_surface_p out_loop_surface = obj_context->current_render_target->out_loop_surface; 804d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng int ved_scaling = (CONTEXT_SCALING(obj_context) && !ctx->yuv_ctx); 81a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe uint32_t startX = 0, startY = 0, luma_addr_offset = 0, chroma_addr_offset = 0; 8206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 8381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* In VPP ctx, current_render_target is rotated surface */ 844d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng if (ctx->yuv_ctx && (VAEntrypointVideoProc == obj_context->entry_point)) { 85925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix drv_debug_msg(VIDEO_DEBUG_GENERAL, "Setup second-pass rotation\n"); 86925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix out_loop_surface = src_surface; 8781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng src_surface = ctx->yuv_ctx->src_surface; 8881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 8981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 9039eff7a021afd8ec1a6f375dbc6476cbaa485d5dLi Zeng if (CONTEXT_ALTERNATIVE_OUTPUT(obj_context) || obj_context->entry_point == VAEntrypointVideoProc) { 914d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng if (ved_scaling) { 924d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng out_loop_surface = obj_context->current_render_target->scaling_surface; 934d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng#ifndef BAYTRAIL 944d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng tng_ved_write_scale_reg(obj_context); 954d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng 964d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS,ALTERNATIVE_OUTPUT_PICTURE_ROTATION, SCALE_INPUT_SIZE_SEL, 1); 974d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS,ALTERNATIVE_OUTPUT_PICTURE_ROTATION, SCALE_ENABLE, 1); 984d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng#endif 99a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe } else { 100a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe startX = ((uint32_t)obj_context->current_render_target->offset_x_s + 0x3f) & ~0x3f; 101a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe startY = ((uint32_t)obj_context->current_render_target->offset_y_s + 0x1) & ~0x1; 102a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe luma_addr_offset = (((uint32_t)(startX + out_loop_surface->stride * startY)) + 0x3f ) & ~0x3f; 103a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe chroma_addr_offset = (((uint32_t)(startX + out_loop_surface->stride * startY / 2)) + 0x3f ) & ~0x3f; 1044d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng } 1054d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng 106925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix if (out_loop_surface == NULL) { 107a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe drv_debug_msg(VIDEO_DEBUG_ERROR, "out-loop surface is NULL, abort msvdx alternative output\n"); 10806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return; 10906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 11006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 1114d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng if (GET_SURFACE_INFO_rotate(out_loop_surface) != obj_context->msvdx_rotate && !ved_scaling) 112925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix drv_debug_msg(VIDEO_DEBUG_WARNING, "Display rotate mode does not match surface rotate mode!\n"); 11306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 11406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng /* CRendecBlock RendecBlk( mCtrlAlloc , RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS) ); */ 11506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS)); 11606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 117a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe psb_cmdbuf_rendec_write_address(cmdbuf, &out_loop_surface->buf, out_loop_surface->buf.buffer_ofs + luma_addr_offset); 118a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe psb_cmdbuf_rendec_write_address(cmdbuf, &out_loop_surface->buf, out_loop_surface->buf.buffer_ofs + chroma_addr_offset + out_loop_surface->chroma_offset); 11906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 12006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_end(cmdbuf); 12106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 12206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ALT_PICTURE_ENABLE, 1); 123925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_ROW_STRIDE, out_loop_surface->stride_mode); 12406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , RECON_WRITE_DISABLE, 0); /* FIXME Always generate Rec */ 125925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_MODE, GET_SURFACE_INFO_rotate(out_loop_surface)); 12606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 127a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe RELOC(*ctx->p_range_mapping_base0, out_loop_surface->buf.buffer_ofs + luma_addr_offset, &out_loop_surface->buf); 128a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe RELOC(*ctx->p_range_mapping_base1, out_loop_surface->buf.buffer_ofs + chroma_addr_offset + out_loop_surface->chroma_offset, &out_loop_surface->buf); 12906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 13006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 13106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (obj_context->profile == VAProfileVP8Version0_3 || 13256ada57fd5c4a41fbf281589526d47850bed05fdhding obj_context->profile == VAProfileJPEGBaseline || ctx->yuv_ctx) { 13306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_start(cmdbuf, (REG_MSVDX_CMD_OFFSET + MSVDX_CMDS_AUX_LINE_BUFFER_BASE_ADDRESS_OFFSET)); 13406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->aux_line_buffer_vld, ctx->aux_line_buffer_vld.buffer_ofs); 13506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_end(cmdbuf); 13606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 13706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION, USE_AUX_LINE_BUF, 1); 13856ada57fd5c4a41fbf281589526d47850bed05fdhding if (ctx->yuv_ctx) 13956ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , RECON_WRITE_DISABLE, 1); 14006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 14106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 14206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng /* Set the rotation registers */ 14306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION)); 14406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_write(cmdbuf, cmd); 14506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng *ctx->alt_output_flags = cmd; 14606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 14706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng cmd = 0; 14881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, EXTENDED_ROW_STRIDE, EXT_ROW_STRIDE, src_surface->stride / 64); 14906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_write(cmdbuf, cmd); 15006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 15106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_rendec_end(cmdbuf); 15206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 15306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 15406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengint vld_dec_slice_parameter_size(object_context_p obj_context) 15506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 15606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int size; 15706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 15806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng switch (obj_context->profile) { 15906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileMPEG2Simple: 16006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileMPEG2Main: 16106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng size = sizeof(VASliceParameterBufferMPEG2); 16206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 16306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileMPEG4Simple: 16406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileMPEG4AdvancedSimple: 16506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileMPEG4Main: 16606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileH263Baseline: 16706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng size = sizeof(VASliceParameterBufferMPEG4); 16806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 16906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileH264Baseline: 17006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileH264Main: 17106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileH264High: 17206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileH264ConstrainedBaseline: 17306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng size = sizeof(VASliceParameterBufferH264); 17406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 17506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileVC1Simple: 17606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileVC1Main: 17706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileVC1Advanced: 17806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng size = sizeof(VASliceParameterBufferVC1); 17906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 18006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileVP8Version0_3: 181d4b3bda95f2efc571b057ca9ece5ea076a55cdb0Tianmi Chen size = sizeof(VASliceParameterBufferVP8); 18206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProfileJPEGBaseline: 183a52334a05d2be04432b1f8b2bccf9e90768a218aNana GUo size = sizeof(VASliceParameterBufferJPEGBaseline); 18406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng default: 18506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng size = 0; 18606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 18706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 18806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 18906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return size; 19006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 19106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 19206c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_process_slice_data(context_DEC_p ctx, object_buffer_p obj_buffer) 19306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 19406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 19506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng void *slice_param; 19606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int buffer_idx = 0; 19706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng unsigned int element_idx = 0, element_size; 19806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 19906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType)); 20006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 20106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(ctx->pic_params); 20206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(ctx->slice_param_list_idx); 20306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 20406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#if 0 20506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (!ctx->pic_params) { 20606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng /* Picture params missing */ 20706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return VA_STATUS_ERROR_UNKNOWN; 20806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 20906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#endif 21006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if ((NULL == obj_buffer->psb_buffer) || 21106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng (0 == obj_buffer->size)) { 21206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng /* We need to have data in the bitstream buffer */ 21306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return VA_STATUS_ERROR_UNKNOWN; 21406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 21506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 21606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng element_size = vld_dec_slice_parameter_size(ctx->obj_context); 21706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 21806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng while (buffer_idx < ctx->slice_param_list_idx) { 21906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng object_buffer_p slice_buf = ctx->slice_param_list[buffer_idx]; 22006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (element_idx >= slice_buf->num_elements) { 22106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng /* Move to next buffer */ 22206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng element_idx = 0; 22306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng buffer_idx++; 22406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng continue; 22506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 22606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 22706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng slice_param = slice_buf->buffer_data; 22806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng slice_param += element_idx * element_size; 22906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng element_idx++; 23006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = vld_dec_process_slice(ctx, slice_param, obj_buffer); 23106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (vaStatus != VA_STATUS_SUCCESS) { 23206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 23306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 23406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 23506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 23606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list_idx = 0; 23706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 23806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 23906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 24006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/* 24106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng * Adds a VASliceParameterBuffer to the list of slice params 24206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng */ 24306c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_add_slice_param(context_DEC_p ctx, object_buffer_p obj_buffer) 24406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 24506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(obj_buffer->type == VASliceParameterBufferType); 24606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (ctx->slice_param_list_idx >= ctx->slice_param_list_size) { 24706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng unsigned char *new_list; 24806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list_size += 8; 24906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng new_list = realloc(ctx->slice_param_list, 25006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng sizeof(object_buffer_p) * ctx->slice_param_list_size); 25106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (NULL == new_list) { 25206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return VA_STATUS_ERROR_ALLOCATION_FAILED; 25306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 25406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list = (object_buffer_p*) new_list; 25506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 25606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list[ctx->slice_param_list_idx] = obj_buffer; 25706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list_idx++; 25806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return VA_STATUS_SUCCESS; 25906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 26006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 26106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_write_kick(object_context_p obj_context) 26206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 26306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 26406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng *cmdbuf->cmd_idx++ = CMD_COMPLETION; 26506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 26606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 26706c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_process_slice(context_DEC_p ctx, 26806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng void *vld_slice_param, 26906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng object_buffer_p obj_buffer) 27006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 27106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 27206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng VASliceParameterBufferBase *slice_param = (VASliceParameterBufferBase *) vld_slice_param; 27306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 27406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType)); 27506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 27606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) || 27706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL)) { 278e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifndef SLICE_HEADER_PARSING 27906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (0 == slice_param->slice_data_size) { 28006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = VA_STATUS_ERROR_UNKNOWN; 28106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 28206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 28306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 284e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif 28506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(!ctx->split_buffer_pending); 28606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 28706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (psb_context_get_next_cmdbuf(ctx->obj_context)) { 28806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = VA_STATUS_ERROR_UNKNOWN; 28906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 29006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 29106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 29206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vld_dec_FE_state(ctx->obj_context, ctx->preload_buffer); 2931b8d958031a6ae24789addf7ff073316b89aff87Nana GUo ctx->begin_slice(ctx, slice_param); 29406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_data_buffer = obj_buffer->psb_buffer; 295e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifdef SLICE_HEADER_PARSING 296e853beb775a5de607bd080d7d43e638f95199e68Nana GUo if (ctx->parse_enabled == 1) 297e853beb775a5de607bd080d7d43e638f95199e68Nana GUo psb_cmdbuf_dma_write_key(ctx->obj_context->cmdbuf, 298e853beb775a5de607bd080d7d43e638f95199e68Nana GUo ctx->SR_flags, 299e853beb775a5de607bd080d7d43e638f95199e68Nana GUo ctx->parse_key); 300e853beb775a5de607bd080d7d43e638f95199e68Nana GUo else 301e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif 302e853beb775a5de607bd080d7d43e638f95199e68Nana GUo psb_cmdbuf_dma_write_bitstream(ctx->obj_context->cmdbuf, 30306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng obj_buffer->psb_buffer, 30406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng obj_buffer->psb_buffer->buffer_ofs + slice_param->slice_data_offset, 30506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng slice_param->slice_data_size, 30606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->bits_offset, 30706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->SR_flags); 30806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 30906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) { 31006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->split_buffer_pending = TRUE; 31106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 31206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } else { 31306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(ctx->split_buffer_pending); 31406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(0 == slice_param->slice_data_offset); 31506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (slice_param->slice_data_size) { 31606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_cmdbuf_dma_write_bitstream_chained(ctx->obj_context->cmdbuf, 31706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng obj_buffer->psb_buffer, 31806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng slice_param->slice_data_size); 31906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 32006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 32106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 32206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL) || 32306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END)) { 32406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END) { 32506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ASSERT(ctx->split_buffer_pending); 32606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 32706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 32806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->process_slice(ctx, slice_param); 32906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vld_dec_write_kick(ctx->obj_context); 33006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 33106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->split_buffer_pending = FALSE; 33206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->obj_context->video_op = psb_video_vld; 33306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->obj_context->flags = 0; 33406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 33506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->end_slice(ctx); 33606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 33706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (psb_context_submit_cmdbuf(ctx->obj_context)) { 33806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = VA_STATUS_ERROR_UNKNOWN; 33906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 34006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 34106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 34206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 34306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 34406c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_allocate_colocated_buffer(context_DEC_p ctx, object_surface_p obj_surface, uint32_t size) 34506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 34606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_buffer_p buf; 34706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng VAStatus vaStatus; 34806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_surface_p surface = obj_surface->psb_surface; 34906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int index = GET_SURFACE_INFO_colocated_index(surface); 35006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 35106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (!index) { 35206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng index = ctx->colocated_buffers_idx; 35306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (index >= ctx->colocated_buffers_size) { 35406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return VA_STATUS_ERROR_UNKNOWN; 35506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 35606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 35706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocating colocated buffer for surface %08x size = %08x\n", surface, size); 35806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 35906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng buf = &(ctx->colocated_buffers[index]); 36006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = psb_buffer_create(ctx->obj_context->driver_data, size, psb_bt_vpu_only, buf); 36106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (VA_STATUS_SUCCESS != vaStatus) { 36206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 36306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 36406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->colocated_buffers_idx++; 36506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng SET_SURFACE_INFO_colocated_index(surface, index + 1); /* 0 means unset, index is offset by 1 */ 36606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } else { 36706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng buf = &(ctx->colocated_buffers[index - 1]); 36806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (buf->size < size) { 36906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_buffer_destroy(buf); 37006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = psb_buffer_create(ctx->obj_context->driver_data, size, psb_bt_vpu_only, buf); 37106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (VA_STATUS_SUCCESS != vaStatus) { 37206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 37306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 37406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng SET_SURFACE_INFO_colocated_index(surface, index); /* replace the original buffer */ 37506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 37606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 37706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return VA_STATUS_SUCCESS; 37806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 37906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 38006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengpsb_buffer_p vld_dec_lookup_colocated_buffer(context_DEC_p ctx, psb_surface_p surface) 38106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 38206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int index = GET_SURFACE_INFO_colocated_index(surface); 38306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (!index) { 38406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return NULL; 38506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 38606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return &(ctx->colocated_buffers[index-1]); /* 0 means unset, index is offset by 1 */ 38706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 38806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 38906c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_CreateContext(context_DEC_p ctx, object_context_p obj_context) 39006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 39106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 39206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 39306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->obj_context = obj_context; 39406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->split_buffer_pending = FALSE; 39506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list_size = 8; 39606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list = (object_buffer_p*) calloc(1, sizeof(object_buffer_p) * ctx->slice_param_list_size); 39706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list_idx = 0; 39806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 39906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (NULL == ctx->slice_param_list) { 40006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 40106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 40206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 40306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 40406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 40506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->colocated_buffers_size = obj_context->num_render_targets; 40606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->colocated_buffers_idx = 0; 40706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->colocated_buffers = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s) * ctx->colocated_buffers_size); 40806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (NULL == ctx->colocated_buffers) { 40906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 41006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 41106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng free(ctx->slice_param_list); 41206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 41381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 41481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (vaStatus == VA_STATUS_SUCCESS) { 41581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = psb_buffer_create(obj_context->driver_data, 41681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng AUX_LINE_BUFFER_VLD_SIZE, 41781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng psb_bt_cpu_vpu, 41881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng &ctx->aux_line_buffer_vld); 41981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng DEBUG_FAILURE; 42081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 42181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 42206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 42306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 42406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 42506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_DestroyContext(context_DEC_p ctx) 42606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 42706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int i; 42806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->preload_buffer = NULL; 42906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 430feee186c19ae8213aad756baeb51d2fa11f36730Li Zeng psb_buffer_destroy(&ctx->aux_line_buffer_vld); 431feee186c19ae8213aad756baeb51d2fa11f36730Li Zeng 43206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (ctx->slice_param_list) { 43306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng free(ctx->slice_param_list); 43406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->slice_param_list = NULL; 43506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 43606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 43706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (ctx->colocated_buffers) { 43806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng for (i = 0; i < ctx->colocated_buffers_idx; ++i) 43906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb_buffer_destroy(&(ctx->colocated_buffers[i])); 44006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 44106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng free(ctx->colocated_buffers); 44206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng ctx->colocated_buffers = NULL; 44306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 44406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 44506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 44606c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_RenderPicture( 44706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng object_context_p obj_context, 44806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng object_buffer_p *buffers, 44906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int num_buffers) 45006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{ 45106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng int i; 45206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng context_DEC_p ctx = (context_DEC_p) obj_context->format_data; 45306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 45406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 45506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng for (i = 0; i < num_buffers; i++) { 45606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng object_buffer_p obj_buffer = buffers[i]; 45706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb__dump_va_buffers_verbose(obj_buffer); 45806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 45906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng switch (obj_buffer->type) { 46006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VASliceParameterBufferType: 46106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = vld_dec_add_slice_param(ctx, obj_buffer); 46206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 46306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 46406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 46506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VASliceDataBufferType: 46606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng case VAProtectedSliceDataBufferType: 46706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = vld_dec_process_slice_data(ctx, obj_buffer); 46806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 46906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 47006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 47106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng default: 47206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng vaStatus = ctx->process_buffer(ctx, obj_buffer); 47306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng DEBUG_FAILURE; 47406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 47506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng if (vaStatus != VA_STATUS_SUCCESS) { 47606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng break; 47706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 47806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng } 47906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng 48006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng return vaStatus; 48106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng} 48256ada57fd5c4a41fbf281589526d47850bed05fdhding 483a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpevoid vld_dec_yuv_rotate(object_context_p obj_context) 48456ada57fd5c4a41fbf281589526d47850bed05fdhding{ 48556ada57fd5c4a41fbf281589526d47850bed05fdhding VAStatus vaStatus = VA_STATUS_SUCCESS; 48656ada57fd5c4a41fbf281589526d47850bed05fdhding struct format_vtable_s *vtable = &tng_yuv_processor_vtable; 48756ada57fd5c4a41fbf281589526d47850bed05fdhding struct surface_param_s surface_param; 48856ada57fd5c4a41fbf281589526d47850bed05fdhding struct object_buffer_s buffer; 48956ada57fd5c4a41fbf281589526d47850bed05fdhding object_buffer_p buffer_p = &buffer; 49056ada57fd5c4a41fbf281589526d47850bed05fdhding 491a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe surface_param.src_surface = obj_context->current_render_target->scaling_surface; 492a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe surface_param.display_width = obj_context->current_render_target->buffer_width_s; 493a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe surface_param.display_height = obj_context->current_render_target->buffer_height_s; 494a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe surface_param.coded_width = obj_context->current_render_target->width_s; 495a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe surface_param.coded_height = obj_context->current_render_target->height_s; 49656ada57fd5c4a41fbf281589526d47850bed05fdhding 49756ada57fd5c4a41fbf281589526d47850bed05fdhding buffer.num_elements = 1; 49856ada57fd5c4a41fbf281589526d47850bed05fdhding buffer.type = YUVProcessorSurfaceType; 49956ada57fd5c4a41fbf281589526d47850bed05fdhding buffer.size = sizeof(struct surface_param_s); 50056ada57fd5c4a41fbf281589526d47850bed05fdhding buffer.buffer_data = &surface_param; 50156ada57fd5c4a41fbf281589526d47850bed05fdhding 50256ada57fd5c4a41fbf281589526d47850bed05fdhding vtable->createContext(obj_context, NULL); 50356ada57fd5c4a41fbf281589526d47850bed05fdhding vtable->beginPicture(obj_context); 50456ada57fd5c4a41fbf281589526d47850bed05fdhding vtable->renderPicture(obj_context, &buffer_p, 1); 50556ada57fd5c4a41fbf281589526d47850bed05fdhding vtable->endPicture(obj_context); 50656ada57fd5c4a41fbf281589526d47850bed05fdhding vtable->destroyContext(obj_context); 50756ada57fd5c4a41fbf281589526d47850bed05fdhding} 508