tng_yuv_processor.c revision 56ada57fd5c4a41fbf281589526d47850bed05fd
1/* 2 * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 3 * Copyright (c) Imagination Technologies Limited, UK 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sub license, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial portions 15 * of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26/* 27 * Authors: 28 * Li Zeng <li.zeng@intel.com> 29 */ 30 31#include "tng_vld_dec.h" 32#include "psb_drv_debug.h" 33#include "hwdefs/dxva_fw_ctrl.h" 34#include "hwdefs/reg_io2.h" 35#include "hwdefs/msvdx_offsets.h" 36#include "hwdefs/msvdx_cmds_io2.h" 37 38static void tng_yuv_processor_QueryConfigAttributes( 39 VAProfile profile, 40 VAEntrypoint entrypoint, 41 VAConfigAttrib *attrib_list, 42 int num_attribs) 43{ 44 /* No specific attributes */ 45} 46 47static VAStatus tng_yuv_processor_ValidateConfig( 48 object_config_p obj_config) 49{ 50 return VA_STATUS_SUCCESS; 51} 52 53static VAStatus tng_yuv_processor_CreateContext( 54 object_context_p obj_context, 55 object_config_p obj_config) 56{ 57 VAStatus vaStatus = VA_STATUS_SUCCESS; 58 context_DEC_p dec_ctx = (context_DEC_p) obj_context->format_data; 59 context_yuv_processor_p ctx; 60 61 ctx = (context_yuv_processor_p) malloc(sizeof(struct context_yuv_processor_s)); 62 if (NULL == ctx) { 63 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 64 DEBUG_FAILURE; 65 return vaStatus; 66 } 67 dec_ctx->yuv_ctx = ctx; 68 69 return vaStatus; 70} 71 72static void tng_yuv_processor_DestroyContext( 73 object_context_p obj_context) 74{ 75 context_DEC_p dec_ctx = (context_DEC_p) obj_context->format_data; 76 77 free(dec_ctx->yuv_ctx); 78 dec_ctx->yuv_ctx = NULL; 79} 80 81static VAStatus tng_yuv_processor_BeginPicture( 82 object_context_p obj_context) 83{ 84 return VA_STATUS_SUCCESS; 85} 86 87static void tng__yuv_processor_process(context_DEC_p dec_ctx) 88{ 89 context_yuv_processor_p ctx = dec_ctx->yuv_ctx; 90 psb_cmdbuf_p cmdbuf = dec_ctx->obj_context->cmdbuf; 91 psb_surface_p target_surface = dec_ctx->obj_context->current_render_target->psb_surface; 92 psb_buffer_p buffer; 93 uint32_t reg_value; 94 95 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, DISPLAY_PICTURE_SIZE)); 96 97 reg_value = 0; 98 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_HEIGHT, (ctx->display_height) - 1); 99 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_WIDTH, (ctx->display_width) - 1); 100 psb_cmdbuf_rendec_write(cmdbuf, reg_value); 101 102 reg_value = 0; 103 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_HEIGHT, (ctx->coded_height) - 1); 104 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_WIDTH, (ctx->coded_width) - 1); 105 psb_cmdbuf_rendec_write(cmdbuf, reg_value); 106 psb_cmdbuf_rendec_end(cmdbuf); 107 108 109 /*TODO add stride and else there*/ 110 reg_value = 0; 111 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, CODEC_MODE, 3); 112 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, ASYNC_MODE, 1); 113 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, CODEC_PROFILE, 1); 114 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, CHROMA_FORMAT, 1); 115 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, ROW_STRIDE, target_surface->stride_mode); 116 117 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET( MSVDX_CMDS, OPERATING_MODE )); 118 psb_cmdbuf_rendec_write(cmdbuf, reg_value); 119 psb_cmdbuf_rendec_end(cmdbuf); 120 121 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, REFERENCE_PICTURE_BASE_ADDRESSES)); 122 buffer = &target_surface->buf; 123 psb_cmdbuf_rendec_write_address(cmdbuf, buffer, buffer->buffer_ofs); 124 psb_cmdbuf_rendec_write_address(cmdbuf, buffer, 125 buffer->buffer_ofs + 126 target_surface->chroma_offset); 127 psb_cmdbuf_rendec_end(cmdbuf); 128 129 reg_value = 0; 130 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, CONSTRAINED_INTRA_PRED, 0 ); 131 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, MODE_CONFIG, 0 ); 132 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, DISABLE_DEBLOCK_FILTER_IDC, 1 ); 133 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_ALPHA_CO_OFFSET_DIV2, 0 ); 134 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_BETA_OFFSET_DIV2, 0 ); 135 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_FIELD_TYPE, 2 ); 136 REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_CODE_TYPE, 1 ); // P 137 *dec_ctx->p_slice_params = reg_value; 138 139 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET( MSVDX_CMDS, SLICE_PARAMS ) ); 140 psb_cmdbuf_rendec_write(cmdbuf, reg_value); 141 psb_cmdbuf_rendec_end(cmdbuf); 142 143 vld_dec_setup_alternative_frame(dec_ctx->obj_context); 144 145 *cmdbuf->cmd_idx++ = CMD_DEBLOCK | CMD_DEBLOCK_TYPE_SKIP; 146 *cmdbuf->cmd_idx++ = 0; 147 *cmdbuf->cmd_idx++ = ctx->coded_width / 16; 148 *cmdbuf->cmd_idx++ = ctx->coded_height / 16; 149 *cmdbuf->cmd_idx++ = 0; 150 *cmdbuf->cmd_idx++ = 0; 151 152} 153 154static VAStatus tng__yuv_processor_execute(context_DEC_p dec_ctx, object_buffer_p obj_buffer) 155{ 156 psb_surface_p target_surface = dec_ctx->obj_context->current_render_target->psb_surface; 157 context_yuv_processor_p ctx = dec_ctx->yuv_ctx; 158 uint32_t reg_value; 159 VAStatus vaStatus; 160 161 ASSERT(obj_buffer->type == YUVProcessorSurfaceType); 162 ASSERT(obj_buffer->num_elements == 1); 163 ASSERT(obj_buffer->size == sizeof(struct surface_param_s)); 164 ASSERT(target_surface); 165 166 if ((obj_buffer->num_elements != 1) || 167 (obj_buffer->size != sizeof(struct surface_param_s)) || 168 (NULL == target_surface)) { 169 return VA_STATUS_ERROR_UNKNOWN; 170 } 171 172 surface_param_p surface_params = (surface_param_p) obj_buffer->buffer_data; 173 ctx->display_width = surface_params->display_width; 174 ctx->display_height = surface_params->display_height; 175 ctx->coded_width = surface_params->coded_width; 176 ctx->coded_height = surface_params->coded_height; 177 ctx->target_surface = target_surface; 178#ifdef ADNROID 179 LOGE("%s, %d %d %d %d***************************************************\n", 180 __func__, ctx->display_width, ctx->display_height, ctx->coded_width, ctx->coded_height); 181#endif 182 vaStatus = VA_STATUS_SUCCESS; 183 184 if (psb_context_get_next_cmdbuf(dec_ctx->obj_context)) { 185 vaStatus = VA_STATUS_ERROR_UNKNOWN; 186 DEBUG_FAILURE; 187 return vaStatus; 188 } 189 /* ctx->begin_slice(ctx, slice_param); */ 190 vld_dec_FE_state(dec_ctx->obj_context, NULL); 191 192 tng__yuv_processor_process(dec_ctx); 193 /* ctx->process_slice(ctx, slice_param); */ 194 vld_dec_write_kick(dec_ctx->obj_context); 195 196 dec_ctx->obj_context->video_op = psb_video_vld; 197 dec_ctx->obj_context->flags = 0; 198 199 /* ctx->end_slice(ctx); */ 200 dec_ctx->obj_context->flags = FW_VA_RENDER_IS_FIRST_SLICE | FW_VA_RENDER_IS_LAST_SLICE | FW_INTERNAL_CONTEXT_SWITCH; 201 202 if (psb_context_submit_cmdbuf(dec_ctx->obj_context)) { 203 vaStatus = VA_STATUS_ERROR_UNKNOWN; 204 } 205 return vaStatus; 206} 207 208static VAStatus tng_yuv_processor_process_buffer( 209 context_DEC_p dec_ctx, 210 object_buffer_p buffer) 211{ 212 VAStatus vaStatus = VA_STATUS_SUCCESS; 213 object_buffer_p obj_buffer = buffer; 214 215 { 216 switch (obj_buffer->type) { 217 case YUVProcessorSurfaceType: 218 vaStatus = tng__yuv_processor_execute(dec_ctx, obj_buffer); 219 DEBUG_FAILURE; 220 break; 221 222 default: 223 vaStatus = VA_STATUS_ERROR_UNKNOWN; 224 DEBUG_FAILURE; 225 } 226 } 227 228 return vaStatus; 229} 230 231 232VAStatus tng_yuv_processor_RenderPicture( 233 object_context_p obj_context, 234 object_buffer_p *buffers, 235 int num_buffers) 236{ 237 int i; 238 context_DEC_p ctx = (context_DEC_p) obj_context->format_data; 239 VAStatus vaStatus = VA_STATUS_SUCCESS; 240 241 for (i = 0; i < num_buffers; i++) { 242 object_buffer_p obj_buffer = buffers[i]; 243 244 switch (obj_buffer->type) { 245 246 default: 247 vaStatus = tng_yuv_processor_process_buffer(ctx, obj_buffer); 248 DEBUG_FAILURE; 249 } 250 if (vaStatus != VA_STATUS_SUCCESS) { 251 break; 252 } 253 } 254 255 return vaStatus; 256} 257 258static VAStatus tng_yuv_processor_EndPicture( 259 object_context_p obj_context) 260{ 261 //INIT_CONTEXT_YUV_PROCESSOR 262 263 if (psb_context_flush_cmdbuf(obj_context)) { 264 return VA_STATUS_ERROR_UNKNOWN; 265 } 266 return VA_STATUS_SUCCESS; 267} 268 269struct format_vtable_s tng_yuv_processor_vtable = { 270queryConfigAttributes: 271 tng_yuv_processor_QueryConfigAttributes, 272validateConfig: 273 tng_yuv_processor_ValidateConfig, 274createContext: 275 tng_yuv_processor_CreateContext, 276destroyContext: 277 tng_yuv_processor_DestroyContext, 278beginPicture: 279 tng_yuv_processor_BeginPicture, 280renderPicture: 281 tng_yuv_processor_RenderPicture, 282endPicture: 283 tng_yuv_processor_EndPicture 284}; 285