156ada57fd5c4a41fbf281589526d47850bed05fdhding/* 256ada57fd5c4a41fbf281589526d47850bed05fdhding * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 356ada57fd5c4a41fbf281589526d47850bed05fdhding * Copyright (c) Imagination Technologies Limited, UK 456ada57fd5c4a41fbf281589526d47850bed05fdhding * 556ada57fd5c4a41fbf281589526d47850bed05fdhding * Permission is hereby granted, free of charge, to any person obtaining a 656ada57fd5c4a41fbf281589526d47850bed05fdhding * copy of this software and associated documentation files (the 756ada57fd5c4a41fbf281589526d47850bed05fdhding * "Software"), to deal in the Software without restriction, including 856ada57fd5c4a41fbf281589526d47850bed05fdhding * without limitation the rights to use, copy, modify, merge, publish, 956ada57fd5c4a41fbf281589526d47850bed05fdhding * distribute, sub license, and/or sell copies of the Software, and to 1056ada57fd5c4a41fbf281589526d47850bed05fdhding * permit persons to whom the Software is furnished to do so, subject to 1156ada57fd5c4a41fbf281589526d47850bed05fdhding * the following conditions: 1256ada57fd5c4a41fbf281589526d47850bed05fdhding * 1356ada57fd5c4a41fbf281589526d47850bed05fdhding * The above copyright notice and this permission notice (including the 1456ada57fd5c4a41fbf281589526d47850bed05fdhding * next paragraph) shall be included in all copies or substantial portions 1556ada57fd5c4a41fbf281589526d47850bed05fdhding * of the Software. 1656ada57fd5c4a41fbf281589526d47850bed05fdhding * 1756ada57fd5c4a41fbf281589526d47850bed05fdhding * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1856ada57fd5c4a41fbf281589526d47850bed05fdhding * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1956ada57fd5c4a41fbf281589526d47850bed05fdhding * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2056ada57fd5c4a41fbf281589526d47850bed05fdhding * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 2156ada57fd5c4a41fbf281589526d47850bed05fdhding * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2256ada57fd5c4a41fbf281589526d47850bed05fdhding * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2356ada57fd5c4a41fbf281589526d47850bed05fdhding * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2456ada57fd5c4a41fbf281589526d47850bed05fdhding */ 2556ada57fd5c4a41fbf281589526d47850bed05fdhding 2656ada57fd5c4a41fbf281589526d47850bed05fdhding/* 2756ada57fd5c4a41fbf281589526d47850bed05fdhding * Authors: 2856ada57fd5c4a41fbf281589526d47850bed05fdhding * Li Zeng <li.zeng@intel.com> 2956ada57fd5c4a41fbf281589526d47850bed05fdhding */ 3056ada57fd5c4a41fbf281589526d47850bed05fdhding 3156ada57fd5c4a41fbf281589526d47850bed05fdhding#include "tng_vld_dec.h" 3256ada57fd5c4a41fbf281589526d47850bed05fdhding#include "psb_drv_debug.h" 3356ada57fd5c4a41fbf281589526d47850bed05fdhding#include "hwdefs/dxva_fw_ctrl.h" 3456ada57fd5c4a41fbf281589526d47850bed05fdhding#include "hwdefs/reg_io2.h" 3556ada57fd5c4a41fbf281589526d47850bed05fdhding#include "hwdefs/msvdx_offsets.h" 3656ada57fd5c4a41fbf281589526d47850bed05fdhding#include "hwdefs/msvdx_cmds_io2.h" 3756ada57fd5c4a41fbf281589526d47850bed05fdhding 38e2d5072c4f0604bdebae4d964ccd2f4f125b4600Elliott Hughes#include <malloc.h> 39e2d5072c4f0604bdebae4d964ccd2f4f125b4600Elliott Hughes 4081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng#define SURFACE(id) ((object_surface_p) object_heap_lookup( &dec_ctx->obj_context->driver_data->surface_heap, id )) 4181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 4256ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic void tng_yuv_processor_QueryConfigAttributes( 43cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VAProfile __maybe_unused rofile, 44cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VAEntrypoint __maybe_unused entrypoint, 45cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VAConfigAttrib __maybe_unused * attrib_list, 46cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan int __maybe_unused num_attribs) 4756ada57fd5c4a41fbf281589526d47850bed05fdhding{ 4856ada57fd5c4a41fbf281589526d47850bed05fdhding /* No specific attributes */ 4956ada57fd5c4a41fbf281589526d47850bed05fdhding} 5056ada57fd5c4a41fbf281589526d47850bed05fdhding 5156ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic VAStatus tng_yuv_processor_ValidateConfig( 52cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan object_config_p __maybe_unused obj_config) 5356ada57fd5c4a41fbf281589526d47850bed05fdhding{ 5456ada57fd5c4a41fbf281589526d47850bed05fdhding return VA_STATUS_SUCCESS; 5556ada57fd5c4a41fbf281589526d47850bed05fdhding} 5656ada57fd5c4a41fbf281589526d47850bed05fdhding 5781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zengstatic VAStatus tng_yuv_processor_process_buffer( context_DEC_p, object_buffer_p); 5881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 5956ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic VAStatus tng_yuv_processor_CreateContext( 6056ada57fd5c4a41fbf281589526d47850bed05fdhding object_context_p obj_context, 61cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan object_config_p __maybe_unused obj_config) 6256ada57fd5c4a41fbf281589526d47850bed05fdhding{ 6356ada57fd5c4a41fbf281589526d47850bed05fdhding VAStatus vaStatus = VA_STATUS_SUCCESS; 6456ada57fd5c4a41fbf281589526d47850bed05fdhding context_DEC_p dec_ctx = (context_DEC_p) obj_context->format_data; 6556ada57fd5c4a41fbf281589526d47850bed05fdhding context_yuv_processor_p ctx; 6656ada57fd5c4a41fbf281589526d47850bed05fdhding 6756ada57fd5c4a41fbf281589526d47850bed05fdhding ctx = (context_yuv_processor_p) malloc(sizeof(struct context_yuv_processor_s)); 685631a1e01115aeaf179dea4ac98460fd5e0fb7acnguo CHECK_ALLOCATION(ctx); 695631a1e01115aeaf179dea4ac98460fd5e0fb7acnguo 7081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* ctx could be create in/out another dec context */ 7181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->has_dec_ctx = 0; 7281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->src_surface = NULL; 7381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 7481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (!dec_ctx) { 7581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng dec_ctx = (context_DEC_p) malloc(sizeof(struct context_DEC_s)); 7681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng CHECK_ALLOCATION(dec_ctx); 7781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_context->format_data = (void *)dec_ctx; 7881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->has_dec_ctx = 1; 7981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = vld_dec_CreateContext(dec_ctx, obj_context); 8081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng DEBUG_FAILURE; 8181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 8281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 8356ada57fd5c4a41fbf281589526d47850bed05fdhding dec_ctx->yuv_ctx = ctx; 8481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng dec_ctx->process_buffer = tng_yuv_processor_process_buffer; 8556ada57fd5c4a41fbf281589526d47850bed05fdhding 8656ada57fd5c4a41fbf281589526d47850bed05fdhding return vaStatus; 8756ada57fd5c4a41fbf281589526d47850bed05fdhding} 8856ada57fd5c4a41fbf281589526d47850bed05fdhding 8956ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic void tng_yuv_processor_DestroyContext( 9056ada57fd5c4a41fbf281589526d47850bed05fdhding object_context_p obj_context) 9156ada57fd5c4a41fbf281589526d47850bed05fdhding{ 9256ada57fd5c4a41fbf281589526d47850bed05fdhding context_DEC_p dec_ctx = (context_DEC_p) obj_context->format_data; 93c3cdab1ea32ee08500683399971ca87214dddcefmahongpe context_yuv_processor_p yuv_ctx = NULL; 94c3cdab1ea32ee08500683399971ca87214dddcefmahongpe int has_dec_ctx = 0; 95c3cdab1ea32ee08500683399971ca87214dddcefmahongpe 96c3cdab1ea32ee08500683399971ca87214dddcefmahongpe if (dec_ctx == NULL) 97c3cdab1ea32ee08500683399971ca87214dddcefmahongpe return; 98c3cdab1ea32ee08500683399971ca87214dddcefmahongpe 99c3cdab1ea32ee08500683399971ca87214dddcefmahongpe yuv_ctx = dec_ctx->yuv_ctx; 10056ada57fd5c4a41fbf281589526d47850bed05fdhding 10181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (yuv_ctx) { 102c3cdab1ea32ee08500683399971ca87214dddcefmahongpe has_dec_ctx = yuv_ctx->has_dec_ctx; 10381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng free(yuv_ctx); 1045631a1e01115aeaf179dea4ac98460fd5e0fb7acnguo dec_ctx->yuv_ctx = NULL; 1055631a1e01115aeaf179dea4ac98460fd5e0fb7acnguo } 10681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 107c3cdab1ea32ee08500683399971ca87214dddcefmahongpe if (has_dec_ctx) { 10881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng free(dec_ctx); 10981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_context->format_data = NULL; 11081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 11156ada57fd5c4a41fbf281589526d47850bed05fdhding} 11256ada57fd5c4a41fbf281589526d47850bed05fdhding 11356ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic VAStatus tng_yuv_processor_BeginPicture( 114cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan object_context_p __maybe_unused obj_context) 11556ada57fd5c4a41fbf281589526d47850bed05fdhding{ 11656ada57fd5c4a41fbf281589526d47850bed05fdhding return VA_STATUS_SUCCESS; 11756ada57fd5c4a41fbf281589526d47850bed05fdhding} 11856ada57fd5c4a41fbf281589526d47850bed05fdhding 11956ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic void tng__yuv_processor_process(context_DEC_p dec_ctx) 12056ada57fd5c4a41fbf281589526d47850bed05fdhding{ 12156ada57fd5c4a41fbf281589526d47850bed05fdhding context_yuv_processor_p ctx = dec_ctx->yuv_ctx; 12256ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_p cmdbuf = dec_ctx->obj_context->cmdbuf; 12381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* psb_surface_p target_surface = dec_ctx->obj_context->current_render_target->psb_surface; */ 12481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng psb_surface_p src_surface = ctx->src_surface; 12556ada57fd5c4a41fbf281589526d47850bed05fdhding psb_buffer_p buffer; 12656ada57fd5c4a41fbf281589526d47850bed05fdhding uint32_t reg_value; 12756ada57fd5c4a41fbf281589526d47850bed05fdhding 12856ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, DISPLAY_PICTURE_SIZE)); 12956ada57fd5c4a41fbf281589526d47850bed05fdhding 13056ada57fd5c4a41fbf281589526d47850bed05fdhding reg_value = 0; 13156ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_HEIGHT, (ctx->display_height) - 1); 13256ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_WIDTH, (ctx->display_width) - 1); 13356ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_write(cmdbuf, reg_value); 13456ada57fd5c4a41fbf281589526d47850bed05fdhding 13556ada57fd5c4a41fbf281589526d47850bed05fdhding reg_value = 0; 13656ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_HEIGHT, (ctx->coded_height) - 1); 13756ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_WIDTH, (ctx->coded_width) - 1); 13856ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_write(cmdbuf, reg_value); 13956ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_end(cmdbuf); 14056ada57fd5c4a41fbf281589526d47850bed05fdhding 14156ada57fd5c4a41fbf281589526d47850bed05fdhding 14256ada57fd5c4a41fbf281589526d47850bed05fdhding /*TODO add stride and else there*/ 14356ada57fd5c4a41fbf281589526d47850bed05fdhding reg_value = 0; 14456ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, CODEC_MODE, 3); 14556ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, ASYNC_MODE, 1); 14656ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, CODEC_PROFILE, 1); 14781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, CHROMA_FORMAT, 1); 14881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, ROW_STRIDE, src_surface->stride_mode); 14956ada57fd5c4a41fbf281589526d47850bed05fdhding 15056ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET( MSVDX_CMDS, OPERATING_MODE )); 15156ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_write(cmdbuf, reg_value); 15256ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_end(cmdbuf); 15356ada57fd5c4a41fbf281589526d47850bed05fdhding 15456ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, REFERENCE_PICTURE_BASE_ADDRESSES)); 15581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng buffer = &src_surface->buf; 15656ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_write_address(cmdbuf, buffer, buffer->buffer_ofs); 15756ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_write_address(cmdbuf, buffer, 15856ada57fd5c4a41fbf281589526d47850bed05fdhding buffer->buffer_ofs + 15981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng src_surface->chroma_offset); 16056ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_end(cmdbuf); 16156ada57fd5c4a41fbf281589526d47850bed05fdhding 16256ada57fd5c4a41fbf281589526d47850bed05fdhding reg_value = 0; 16356ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, CONSTRAINED_INTRA_PRED, 0 ); 16456ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, MODE_CONFIG, 0 ); 16556ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, DISABLE_DEBLOCK_FILTER_IDC, 1 ); 16656ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_ALPHA_CO_OFFSET_DIV2, 0 ); 16756ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_BETA_OFFSET_DIV2, 0 ); 16856ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_FIELD_TYPE, 2 ); 16956ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_CODE_TYPE, 1 ); // P 17056ada57fd5c4a41fbf281589526d47850bed05fdhding *dec_ctx->p_slice_params = reg_value; 17156ada57fd5c4a41fbf281589526d47850bed05fdhding 17256ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET( MSVDX_CMDS, SLICE_PARAMS ) ); 17356ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_write(cmdbuf, reg_value); 17456ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_end(cmdbuf); 17556ada57fd5c4a41fbf281589526d47850bed05fdhding 17656ada57fd5c4a41fbf281589526d47850bed05fdhding vld_dec_setup_alternative_frame(dec_ctx->obj_context); 17756ada57fd5c4a41fbf281589526d47850bed05fdhding 17856ada57fd5c4a41fbf281589526d47850bed05fdhding *cmdbuf->cmd_idx++ = CMD_DEBLOCK | CMD_DEBLOCK_TYPE_SKIP; 17956ada57fd5c4a41fbf281589526d47850bed05fdhding *cmdbuf->cmd_idx++ = 0; 18056ada57fd5c4a41fbf281589526d47850bed05fdhding *cmdbuf->cmd_idx++ = ctx->coded_width / 16; 18156ada57fd5c4a41fbf281589526d47850bed05fdhding *cmdbuf->cmd_idx++ = ctx->coded_height / 16; 18256ada57fd5c4a41fbf281589526d47850bed05fdhding *cmdbuf->cmd_idx++ = 0; 18356ada57fd5c4a41fbf281589526d47850bed05fdhding *cmdbuf->cmd_idx++ = 0; 18456ada57fd5c4a41fbf281589526d47850bed05fdhding 18556ada57fd5c4a41fbf281589526d47850bed05fdhding} 18656ada57fd5c4a41fbf281589526d47850bed05fdhding 18756ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic VAStatus tng__yuv_processor_execute(context_DEC_p dec_ctx, object_buffer_p obj_buffer) 18856ada57fd5c4a41fbf281589526d47850bed05fdhding{ 18981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* psb_surface_p target_surface = dec_ctx->obj_context->current_render_target->psb_surface; */ 19056ada57fd5c4a41fbf281589526d47850bed05fdhding context_yuv_processor_p ctx = dec_ctx->yuv_ctx; 19156ada57fd5c4a41fbf281589526d47850bed05fdhding uint32_t reg_value; 19256ada57fd5c4a41fbf281589526d47850bed05fdhding VAStatus vaStatus; 19356ada57fd5c4a41fbf281589526d47850bed05fdhding 19481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ASSERT(obj_buffer->type == YUVProcessorSurfaceType || 19581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_buffer->type == VAProcPipelineParameterBufferType); 19656ada57fd5c4a41fbf281589526d47850bed05fdhding ASSERT(obj_buffer->num_elements == 1); 19756ada57fd5c4a41fbf281589526d47850bed05fdhding ASSERT(obj_buffer->size == sizeof(struct surface_param_s)); 19856ada57fd5c4a41fbf281589526d47850bed05fdhding 19956ada57fd5c4a41fbf281589526d47850bed05fdhding if ((obj_buffer->num_elements != 1) || 20081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ((obj_buffer->size != sizeof(struct surface_param_s)) && 20181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng (obj_buffer->size != sizeof(VAProcPipelineParameterBuffer)))) { 20256ada57fd5c4a41fbf281589526d47850bed05fdhding return VA_STATUS_ERROR_UNKNOWN; 20356ada57fd5c4a41fbf281589526d47850bed05fdhding } 20456ada57fd5c4a41fbf281589526d47850bed05fdhding 20581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* yuv rotation issued from dec driver, TODO removed later */ 20681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (obj_buffer->type == YUVProcessorSurfaceType) { 20781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng surface_param_p surface_params = (surface_param_p) obj_buffer->buffer_data; 208a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe psb_surface_p rotate_surface = dec_ctx->obj_context->current_render_target->out_loop_surface; 209a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe object_context_p obj_context = dec_ctx->obj_context; 210a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe psb_driver_data_p driver_data = obj_context->driver_data; 211a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe 212a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe ctx->display_width = (surface_params->display_width + 0xf) & ~0xf; 213a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe ctx->display_height = (surface_params->display_height + 0xf) & ~0xf; 214a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe ctx->coded_width = (surface_params->coded_width + 0xf) & ~0xf; 215a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe ctx->coded_height = (surface_params->coded_height + 0xf) & ~0xf; 216a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe ctx->src_surface = surface_params->src_surface; 217a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe 21881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->proc_param = NULL; 219a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe dec_ctx->obj_context->msvdx_rotate = obj_context->msvdx_rotate; 220a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe SET_SURFACE_INFO_rotate(rotate_surface, dec_ctx->obj_context->msvdx_rotate); 221a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe 222a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_buffer->buffer_data = NULL; 223a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_buffer->size = 0; 224a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe 225a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe#ifdef PSBVIDEO_MSVDX_DEC_TILING 226a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe if (GET_SURFACE_INFO_tiling(ctx->src_surface)) { 227a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe unsigned long msvdx_tile = psb__tile_stride_log2_256(rotate_surface->stride); 228a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_context->msvdx_tile &= 0xf; /* clear rotate tile */ 229a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_context->msvdx_tile |= (msvdx_tile << 4); 230a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_context->ctp_type &= (~PSB_CTX_TILING_MASK); /* clear tile context */ 231a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_context->ctp_type |= ((obj_context->msvdx_tile & 0xff) << 16); 232a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe psb_update_context(driver_data, obj_context->ctp_type); 233a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe drv_debug_msg(VIDEO_DEBUG_GENERAL, "update tile context, msvdx_tiled is 0x%08x \n", obj_context->msvdx_tile); 234a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe } 235a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe#endif 23681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } else if (obj_buffer->type == VAProcPipelineParameterBufferType) { 23781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAProcPipelineParameterBuffer *vpp_params = (VAProcPipelineParameterBuffer *) obj_buffer->buffer_data; 23881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_surface_p obj_surface = SURFACE(vpp_params->surface); 23981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng psb_surface_p rotate_surface = dec_ctx->obj_context->current_render_target->psb_surface; 24081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 241c3cdab1ea32ee08500683399971ca87214dddcefmahongpe if (obj_surface == NULL){ 242c3cdab1ea32ee08500683399971ca87214dddcefmahongpe vaStatus = VA_STATUS_ERROR_UNKNOWN; 243c3cdab1ea32ee08500683399971ca87214dddcefmahongpe return vaStatus; 244c3cdab1ea32ee08500683399971ca87214dddcefmahongpe } 245c3cdab1ea32ee08500683399971ca87214dddcefmahongpe 24681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng //ctx->display_width = ((vpp_params->surface_region->width + 0xf) & ~0xf); 24781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng //ctx->display_height = ((vpp_params->surface_region->height + 0x1f) & ~0x1f); 24881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->display_width = ((obj_surface->width + 0xf) & ~0xf); 2495c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng ctx->display_height = ((obj_surface->height + 0xf) & ~0xf); 25081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->coded_width = ctx->display_width; 25181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->coded_height = ctx->display_height; 25281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 25381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->src_surface = obj_surface->psb_surface; 25481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng dec_ctx->obj_context->msvdx_rotate = vpp_params->rotation_state; 25581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng SET_SURFACE_INFO_rotate(rotate_surface, dec_ctx->obj_context->msvdx_rotate); 25681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 25781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->proc_param = vpp_params; 25881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_buffer->buffer_data = NULL; 25981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_buffer->size = 0; 2605c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng 2615c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng#ifdef PSBVIDEO_MSVDX_DEC_TILING 2625c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng object_context_p obj_context = dec_ctx->obj_context; 2635c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng psb_driver_data_p driver_data = obj_context->driver_data; 2645c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "attempt to update tile context\n"); 2655c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng if (GET_SURFACE_INFO_tiling(ctx->src_surface)) { 2665c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "update tile context\n"); 2675c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng 2685c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng unsigned long msvdx_tile = psb__tile_stride_log2_256(rotate_surface->stride); 2695c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng obj_context->msvdx_tile &= 0xf; /* clear rotate tile */ 2705c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng obj_context->msvdx_tile |= (msvdx_tile << 4); 2715c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng obj_context->ctp_type &= (~PSB_CTX_TILING_MASK); /* clear tile context */ 2725c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng obj_context->ctp_type |= ((obj_context->msvdx_tile & 0xff) << 16); 2735c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng psb_update_context(driver_data, obj_context->ctp_type); 274dbf2ee864763f6da009b5455943917c72e31e9ecGu, Wangyi drv_debug_msg(VIDEO_DEBUG_GENERAL, "update tile context, msvdx_tiled is 0x%08x \n", obj_context->msvdx_tile); 2755c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng } 2765c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng#endif 27781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 27881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 27956ada57fd5c4a41fbf281589526d47850bed05fdhding#ifdef ADNROID 28081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng LOGV("%s, %d %d %d %d***************************************************\n", 28181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng __func__, ctx->display_width, ctx->display_height, ctx->coded_width, ctx->coded_height); 28256ada57fd5c4a41fbf281589526d47850bed05fdhding#endif 28381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 28456ada57fd5c4a41fbf281589526d47850bed05fdhding vaStatus = VA_STATUS_SUCCESS; 28556ada57fd5c4a41fbf281589526d47850bed05fdhding 28656ada57fd5c4a41fbf281589526d47850bed05fdhding if (psb_context_get_next_cmdbuf(dec_ctx->obj_context)) { 28756ada57fd5c4a41fbf281589526d47850bed05fdhding vaStatus = VA_STATUS_ERROR_UNKNOWN; 28856ada57fd5c4a41fbf281589526d47850bed05fdhding DEBUG_FAILURE; 28956ada57fd5c4a41fbf281589526d47850bed05fdhding return vaStatus; 29056ada57fd5c4a41fbf281589526d47850bed05fdhding } 29156ada57fd5c4a41fbf281589526d47850bed05fdhding /* ctx->begin_slice(ctx, slice_param); */ 29256ada57fd5c4a41fbf281589526d47850bed05fdhding vld_dec_FE_state(dec_ctx->obj_context, NULL); 29356ada57fd5c4a41fbf281589526d47850bed05fdhding 29456ada57fd5c4a41fbf281589526d47850bed05fdhding tng__yuv_processor_process(dec_ctx); 29556ada57fd5c4a41fbf281589526d47850bed05fdhding /* ctx->process_slice(ctx, slice_param); */ 29656ada57fd5c4a41fbf281589526d47850bed05fdhding vld_dec_write_kick(dec_ctx->obj_context); 29756ada57fd5c4a41fbf281589526d47850bed05fdhding 29856ada57fd5c4a41fbf281589526d47850bed05fdhding dec_ctx->obj_context->video_op = psb_video_vld; 29956ada57fd5c4a41fbf281589526d47850bed05fdhding dec_ctx->obj_context->flags = 0; 30056ada57fd5c4a41fbf281589526d47850bed05fdhding 30156ada57fd5c4a41fbf281589526d47850bed05fdhding /* ctx->end_slice(ctx); */ 30256ada57fd5c4a41fbf281589526d47850bed05fdhding dec_ctx->obj_context->flags = FW_VA_RENDER_IS_FIRST_SLICE | FW_VA_RENDER_IS_LAST_SLICE | FW_INTERNAL_CONTEXT_SWITCH; 30356ada57fd5c4a41fbf281589526d47850bed05fdhding 30456ada57fd5c4a41fbf281589526d47850bed05fdhding if (psb_context_submit_cmdbuf(dec_ctx->obj_context)) { 30556ada57fd5c4a41fbf281589526d47850bed05fdhding vaStatus = VA_STATUS_ERROR_UNKNOWN; 30656ada57fd5c4a41fbf281589526d47850bed05fdhding } 30756ada57fd5c4a41fbf281589526d47850bed05fdhding return vaStatus; 30856ada57fd5c4a41fbf281589526d47850bed05fdhding} 30956ada57fd5c4a41fbf281589526d47850bed05fdhding 31056ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic VAStatus tng_yuv_processor_process_buffer( 31156ada57fd5c4a41fbf281589526d47850bed05fdhding context_DEC_p dec_ctx, 31256ada57fd5c4a41fbf281589526d47850bed05fdhding object_buffer_p buffer) 31356ada57fd5c4a41fbf281589526d47850bed05fdhding{ 31456ada57fd5c4a41fbf281589526d47850bed05fdhding VAStatus vaStatus = VA_STATUS_SUCCESS; 31556ada57fd5c4a41fbf281589526d47850bed05fdhding object_buffer_p obj_buffer = buffer; 316cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan unsigned int type = obj_buffer->type; 31756ada57fd5c4a41fbf281589526d47850bed05fdhding { 318cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan switch (type) { 31956ada57fd5c4a41fbf281589526d47850bed05fdhding case YUVProcessorSurfaceType: 32081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng case VAProcPipelineParameterBufferType: 32156ada57fd5c4a41fbf281589526d47850bed05fdhding vaStatus = tng__yuv_processor_execute(dec_ctx, obj_buffer); 32256ada57fd5c4a41fbf281589526d47850bed05fdhding DEBUG_FAILURE; 32356ada57fd5c4a41fbf281589526d47850bed05fdhding break; 32456ada57fd5c4a41fbf281589526d47850bed05fdhding 32556ada57fd5c4a41fbf281589526d47850bed05fdhding default: 32656ada57fd5c4a41fbf281589526d47850bed05fdhding vaStatus = VA_STATUS_ERROR_UNKNOWN; 32756ada57fd5c4a41fbf281589526d47850bed05fdhding DEBUG_FAILURE; 32856ada57fd5c4a41fbf281589526d47850bed05fdhding } 32956ada57fd5c4a41fbf281589526d47850bed05fdhding } 33056ada57fd5c4a41fbf281589526d47850bed05fdhding 33156ada57fd5c4a41fbf281589526d47850bed05fdhding return vaStatus; 33256ada57fd5c4a41fbf281589526d47850bed05fdhding} 33356ada57fd5c4a41fbf281589526d47850bed05fdhding 33456ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic VAStatus tng_yuv_processor_EndPicture( 33556ada57fd5c4a41fbf281589526d47850bed05fdhding object_context_p obj_context) 33656ada57fd5c4a41fbf281589526d47850bed05fdhding{ 33781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng context_DEC_p dec_ctx = (context_DEC_p) obj_context->format_data; 33881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng context_yuv_processor_p ctx = dec_ctx->yuv_ctx; 33956ada57fd5c4a41fbf281589526d47850bed05fdhding 34056ada57fd5c4a41fbf281589526d47850bed05fdhding if (psb_context_flush_cmdbuf(obj_context)) { 34156ada57fd5c4a41fbf281589526d47850bed05fdhding return VA_STATUS_ERROR_UNKNOWN; 34256ada57fd5c4a41fbf281589526d47850bed05fdhding } 34381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 34481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (ctx->proc_param) { 34581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng free(ctx->proc_param); 34681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->proc_param = NULL; 34781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 34881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 34956ada57fd5c4a41fbf281589526d47850bed05fdhding return VA_STATUS_SUCCESS; 35056ada57fd5c4a41fbf281589526d47850bed05fdhding} 35156ada57fd5c4a41fbf281589526d47850bed05fdhding 35256ada57fd5c4a41fbf281589526d47850bed05fdhdingstruct format_vtable_s tng_yuv_processor_vtable = { 35356ada57fd5c4a41fbf281589526d47850bed05fdhdingqueryConfigAttributes: 35456ada57fd5c4a41fbf281589526d47850bed05fdhding tng_yuv_processor_QueryConfigAttributes, 35556ada57fd5c4a41fbf281589526d47850bed05fdhdingvalidateConfig: 35656ada57fd5c4a41fbf281589526d47850bed05fdhding tng_yuv_processor_ValidateConfig, 35756ada57fd5c4a41fbf281589526d47850bed05fdhdingcreateContext: 35856ada57fd5c4a41fbf281589526d47850bed05fdhding tng_yuv_processor_CreateContext, 35956ada57fd5c4a41fbf281589526d47850bed05fdhdingdestroyContext: 36056ada57fd5c4a41fbf281589526d47850bed05fdhding tng_yuv_processor_DestroyContext, 36156ada57fd5c4a41fbf281589526d47850bed05fdhdingbeginPicture: 36256ada57fd5c4a41fbf281589526d47850bed05fdhding tng_yuv_processor_BeginPicture, 36356ada57fd5c4a41fbf281589526d47850bed05fdhdingrenderPicture: 36481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vld_dec_RenderPicture, 36556ada57fd5c4a41fbf281589526d47850bed05fdhdingendPicture: 36656ada57fd5c4a41fbf281589526d47850bed05fdhding tng_yuv_processor_EndPicture 36756ada57fd5c4a41fbf281589526d47850bed05fdhding}; 36881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 36981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng#define VED_SUPPORTED_FILTERS_NUM 1 37081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData; 37181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng#define CONFIG(id) ((object_config_p) object_heap_lookup( &driver_data->config_heap, id )) 37281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id )) 37381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id )) 37481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 37581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi ZengVAStatus ved_QueryVideoProcFilters( 37681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VADriverContextP ctx, 37781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAContextID context, 37881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAProcFilterType *filters, 37981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng unsigned int *num_filters) 38081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng{ 38181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng INIT_DRIVER_DATA; 38281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 38381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_context_p obj_context; 38481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_config_p obj_config; 38581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAEntrypoint tmp; 38681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng int count; 38781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 38881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if ctx is right */ 38981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_context = CONTEXT(context); 39081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == obj_context) { 39181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 39281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 39381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 39481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 39581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 39681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_config = CONFIG(obj_context->config_id); 39781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == obj_config) { 39881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 39981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 40081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 40181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 40281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 40381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng tmp = obj_config->entrypoint; 40481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (tmp != VAEntrypointVideoProc) { 40581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "current entrypoint is %d, not VAEntrypointVideoProc\n", tmp); 40681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_UNKNOWN; 40781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 40881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 40981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 41081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if filters and num_filters is valid */ 41181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == num_filters || NULL == filters) { 41281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filters, filters); 41381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 41481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 41581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 41681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 41781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if the filter array size is valid */ 41881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (*num_filters < VED_SUPPORTED_FILTERS_NUM) { 41981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "The filters array size(%d) is NOT valid! Supported filters num is %d\n", 42081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng *num_filters, VED_SUPPORTED_FILTERS_NUM); 42181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 42281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng *num_filters = VED_SUPPORTED_FILTERS_NUM; 42381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 42481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 42581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 4268b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng count = 0; 4278b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng filters[count++] = VAProcFilterNone; 4288b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng *num_filters = count; 4298b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng 43081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zengerr: 43181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng return vaStatus; 43281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng} 43381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 43481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi ZengVAStatus ved_QueryVideoProcFilterCaps( 43581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VADriverContextP ctx, 43681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAContextID context, 43781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAProcFilterType type, 43881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng void *filter_caps, 43981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng unsigned int *num_filter_caps) 44081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng{ 44181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng INIT_DRIVER_DATA; 44281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 44381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_context_p obj_context; 44481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_config_p obj_config; 44581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAProcFilterCap *no_cap; 44681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 44781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if context is right */ 44881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_context = CONTEXT(context); 44981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == obj_context) { 45081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 45181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 45281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 45381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 45481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 45581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_config = CONFIG(obj_context->config_id); 45681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == obj_config) { 45781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 45881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 45981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 46081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 46181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 46281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if filter_caps and num_filter_caps is right */ 46381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == num_filter_caps || NULL == filter_caps){ 46481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filter_caps, filter_caps); 46581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 46681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 46781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 46881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 46981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (*num_filter_caps < 1) { 47081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters == %d (> 1)\n", *num_filter_caps); 47181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 47281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 47381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 47481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 47581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if curent HW support and return corresponding caps */ 47681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* FIXME: we should use a constant table to return caps */ 4778b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng switch (type) { 4788b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng case VAProcFilterNone: 4798b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng no_cap = filter_caps; 4808b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng no_cap->range.min_value = 0; 4818b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng no_cap->range.max_value = 0; 4828b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng no_cap->range.default_value = 0; 4838b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng no_cap->range.step = 0; 4848b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng *num_filter_caps = 1; 4858b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng break; 4868b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng default: 4878b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide filter type %d\n", type); 4888b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 48981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng *num_filter_caps = 0; 4908b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng goto err; 49181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 49281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 49381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zengerr: 49481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng return vaStatus; 49581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng} 49681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 49781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi ZengVAStatus ved_QueryVideoProcPipelineCaps( 49881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VADriverContextP ctx, 49981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAContextID context, 50081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VABufferID *filters, 50181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng unsigned int num_filters, 50281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAProcPipelineCaps *pipeline_caps) 50381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng{ 50481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng INIT_DRIVER_DATA; 50581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 50681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_context_p obj_context; 50781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_config_p obj_config; 50881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAProcFilterParameterBufferBase *base; 50981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_buffer_p buf; 51081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 51181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if ctx is right */ 51281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_context = CONTEXT(context); 51381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == obj_context) { 51481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 51581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 51681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 51781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 51881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 51981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_config = CONFIG(obj_context->config_id); 52081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == obj_config) { 52181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 52281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 52381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 52481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 52581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 52681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if filters and num_filters and pipeline-caps are right */ 52781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (num_filters != 1) { 52881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_filters %d\n", num_filters); 52981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 53081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 53181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 53281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 53381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == filters || pipeline_caps == NULL) { 53481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filters %p or pipeline_caps %p\n", filters, pipeline_caps); 53581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 53681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 53781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 53881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 53981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng memset(pipeline_caps, 0, sizeof(*pipeline_caps)); 54081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 5418b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng buf = BUFFER(*(filters)); 542c3cdab1ea32ee08500683399971ca87214dddcefmahongpe 5438b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng if (buf == NULL){ 5448b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter buffer: NULL \n"); 5458b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 5468b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng goto err; 5478b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng } 54881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 5498b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng base = (VAProcFilterParameterBufferBase *)buf->buffer_data; 5508b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng /* check filter buffer setting */ 5518b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng switch (base->type) { 5528b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng case VAProcFilterNone: 55339eff7a021afd8ec1a6f375dbc6476cbaa485d5dLi Zeng pipeline_caps->rotation_flags = (1 << VA_ROTATION_NONE); 5548b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng pipeline_caps->rotation_flags |= (1 << VA_ROTATION_90); 5558b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng pipeline_caps->rotation_flags |= (1 << VA_ROTATION_180); 5568b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng pipeline_caps->rotation_flags |= (1 << VA_ROTATION_270); 5578b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng break; 5588b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng 5598b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng default: 5608b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Do NOT support the filter type %d\n", base->type); 56181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_UNKNOWN; 56281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 56381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 56481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zengerr: 56581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng return vaStatus; 56681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng} 567