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 3881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng#define SURFACE(id) ((object_surface_p) object_heap_lookup( &dec_ctx->obj_context->driver_data->surface_heap, id )) 3981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 4056ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic void tng_yuv_processor_QueryConfigAttributes( 41cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VAProfile __maybe_unused rofile, 42cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VAEntrypoint __maybe_unused entrypoint, 43cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan VAConfigAttrib __maybe_unused * attrib_list, 44cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan int __maybe_unused num_attribs) 4556ada57fd5c4a41fbf281589526d47850bed05fdhding{ 4656ada57fd5c4a41fbf281589526d47850bed05fdhding /* No specific attributes */ 4756ada57fd5c4a41fbf281589526d47850bed05fdhding} 4856ada57fd5c4a41fbf281589526d47850bed05fdhding 4956ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic VAStatus tng_yuv_processor_ValidateConfig( 50cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan object_config_p __maybe_unused obj_config) 5156ada57fd5c4a41fbf281589526d47850bed05fdhding{ 5256ada57fd5c4a41fbf281589526d47850bed05fdhding return VA_STATUS_SUCCESS; 5356ada57fd5c4a41fbf281589526d47850bed05fdhding} 5456ada57fd5c4a41fbf281589526d47850bed05fdhding 5581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zengstatic VAStatus tng_yuv_processor_process_buffer( context_DEC_p, object_buffer_p); 5681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 5756ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic VAStatus tng_yuv_processor_CreateContext( 5856ada57fd5c4a41fbf281589526d47850bed05fdhding object_context_p obj_context, 59cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan object_config_p __maybe_unused obj_config) 6056ada57fd5c4a41fbf281589526d47850bed05fdhding{ 6156ada57fd5c4a41fbf281589526d47850bed05fdhding VAStatus vaStatus = VA_STATUS_SUCCESS; 6256ada57fd5c4a41fbf281589526d47850bed05fdhding context_DEC_p dec_ctx = (context_DEC_p) obj_context->format_data; 6356ada57fd5c4a41fbf281589526d47850bed05fdhding context_yuv_processor_p ctx; 6456ada57fd5c4a41fbf281589526d47850bed05fdhding 6556ada57fd5c4a41fbf281589526d47850bed05fdhding ctx = (context_yuv_processor_p) malloc(sizeof(struct context_yuv_processor_s)); 665631a1e01115aeaf179dea4ac98460fd5e0fb7acnguo CHECK_ALLOCATION(ctx); 675631a1e01115aeaf179dea4ac98460fd5e0fb7acnguo 6881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* ctx could be create in/out another dec context */ 6981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->has_dec_ctx = 0; 7081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->src_surface = NULL; 7181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 7281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (!dec_ctx) { 7381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng dec_ctx = (context_DEC_p) malloc(sizeof(struct context_DEC_s)); 7481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng CHECK_ALLOCATION(dec_ctx); 7581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_context->format_data = (void *)dec_ctx; 7681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->has_dec_ctx = 1; 7781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = vld_dec_CreateContext(dec_ctx, obj_context); 7881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng DEBUG_FAILURE; 7981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 8081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 8156ada57fd5c4a41fbf281589526d47850bed05fdhding dec_ctx->yuv_ctx = ctx; 8281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng dec_ctx->process_buffer = tng_yuv_processor_process_buffer; 8356ada57fd5c4a41fbf281589526d47850bed05fdhding 8456ada57fd5c4a41fbf281589526d47850bed05fdhding return vaStatus; 8556ada57fd5c4a41fbf281589526d47850bed05fdhding} 8656ada57fd5c4a41fbf281589526d47850bed05fdhding 8756ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic void tng_yuv_processor_DestroyContext( 8856ada57fd5c4a41fbf281589526d47850bed05fdhding object_context_p obj_context) 8956ada57fd5c4a41fbf281589526d47850bed05fdhding{ 9056ada57fd5c4a41fbf281589526d47850bed05fdhding context_DEC_p dec_ctx = (context_DEC_p) obj_context->format_data; 91c3cdab1ea32ee08500683399971ca87214dddcefmahongpe context_yuv_processor_p yuv_ctx = NULL; 92c3cdab1ea32ee08500683399971ca87214dddcefmahongpe int has_dec_ctx = 0; 93c3cdab1ea32ee08500683399971ca87214dddcefmahongpe 94c3cdab1ea32ee08500683399971ca87214dddcefmahongpe if (dec_ctx == NULL) 95c3cdab1ea32ee08500683399971ca87214dddcefmahongpe return; 96c3cdab1ea32ee08500683399971ca87214dddcefmahongpe 97c3cdab1ea32ee08500683399971ca87214dddcefmahongpe yuv_ctx = dec_ctx->yuv_ctx; 9856ada57fd5c4a41fbf281589526d47850bed05fdhding 9981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (yuv_ctx) { 100c3cdab1ea32ee08500683399971ca87214dddcefmahongpe has_dec_ctx = yuv_ctx->has_dec_ctx; 10181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng free(yuv_ctx); 1025631a1e01115aeaf179dea4ac98460fd5e0fb7acnguo dec_ctx->yuv_ctx = NULL; 1035631a1e01115aeaf179dea4ac98460fd5e0fb7acnguo } 10481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 105c3cdab1ea32ee08500683399971ca87214dddcefmahongpe if (has_dec_ctx) { 10681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng free(dec_ctx); 10781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_context->format_data = NULL; 10881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 10956ada57fd5c4a41fbf281589526d47850bed05fdhding} 11056ada57fd5c4a41fbf281589526d47850bed05fdhding 11156ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic VAStatus tng_yuv_processor_BeginPicture( 112cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan object_context_p __maybe_unused obj_context) 11356ada57fd5c4a41fbf281589526d47850bed05fdhding{ 11456ada57fd5c4a41fbf281589526d47850bed05fdhding return VA_STATUS_SUCCESS; 11556ada57fd5c4a41fbf281589526d47850bed05fdhding} 11656ada57fd5c4a41fbf281589526d47850bed05fdhding 11756ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic void tng__yuv_processor_process(context_DEC_p dec_ctx) 11856ada57fd5c4a41fbf281589526d47850bed05fdhding{ 11956ada57fd5c4a41fbf281589526d47850bed05fdhding context_yuv_processor_p ctx = dec_ctx->yuv_ctx; 12056ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_p cmdbuf = dec_ctx->obj_context->cmdbuf; 12181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* psb_surface_p target_surface = dec_ctx->obj_context->current_render_target->psb_surface; */ 12281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng psb_surface_p src_surface = ctx->src_surface; 12356ada57fd5c4a41fbf281589526d47850bed05fdhding psb_buffer_p buffer; 12456ada57fd5c4a41fbf281589526d47850bed05fdhding uint32_t reg_value; 12556ada57fd5c4a41fbf281589526d47850bed05fdhding 12656ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, DISPLAY_PICTURE_SIZE)); 12756ada57fd5c4a41fbf281589526d47850bed05fdhding 12856ada57fd5c4a41fbf281589526d47850bed05fdhding reg_value = 0; 12956ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_HEIGHT, (ctx->display_height) - 1); 13056ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_WIDTH, (ctx->display_width) - 1); 13156ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_write(cmdbuf, reg_value); 13256ada57fd5c4a41fbf281589526d47850bed05fdhding 13356ada57fd5c4a41fbf281589526d47850bed05fdhding reg_value = 0; 13456ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_HEIGHT, (ctx->coded_height) - 1); 13556ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_WIDTH, (ctx->coded_width) - 1); 13656ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_write(cmdbuf, reg_value); 13756ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_end(cmdbuf); 13856ada57fd5c4a41fbf281589526d47850bed05fdhding 13956ada57fd5c4a41fbf281589526d47850bed05fdhding 14056ada57fd5c4a41fbf281589526d47850bed05fdhding /*TODO add stride and else there*/ 14156ada57fd5c4a41fbf281589526d47850bed05fdhding reg_value = 0; 14256ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, CODEC_MODE, 3); 14356ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, ASYNC_MODE, 1); 14456ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, CODEC_PROFILE, 1); 14581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, CHROMA_FORMAT, 1); 14681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, OPERATING_MODE, ROW_STRIDE, src_surface->stride_mode); 14756ada57fd5c4a41fbf281589526d47850bed05fdhding 14856ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET( MSVDX_CMDS, OPERATING_MODE )); 14956ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_write(cmdbuf, reg_value); 15056ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_end(cmdbuf); 15156ada57fd5c4a41fbf281589526d47850bed05fdhding 15256ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, REFERENCE_PICTURE_BASE_ADDRESSES)); 15381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng buffer = &src_surface->buf; 15456ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_write_address(cmdbuf, buffer, buffer->buffer_ofs); 15556ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_write_address(cmdbuf, buffer, 15656ada57fd5c4a41fbf281589526d47850bed05fdhding buffer->buffer_ofs + 15781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng src_surface->chroma_offset); 15856ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_end(cmdbuf); 15956ada57fd5c4a41fbf281589526d47850bed05fdhding 16056ada57fd5c4a41fbf281589526d47850bed05fdhding reg_value = 0; 16156ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, CONSTRAINED_INTRA_PRED, 0 ); 16256ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, MODE_CONFIG, 0 ); 16356ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, DISABLE_DEBLOCK_FILTER_IDC, 1 ); 16456ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_ALPHA_CO_OFFSET_DIV2, 0 ); 16556ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_BETA_OFFSET_DIV2, 0 ); 16656ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_FIELD_TYPE, 2 ); 16756ada57fd5c4a41fbf281589526d47850bed05fdhding REGIO_WRITE_FIELD_LITE(reg_value, MSVDX_CMDS, SLICE_PARAMS, SLICE_CODE_TYPE, 1 ); // P 16856ada57fd5c4a41fbf281589526d47850bed05fdhding *dec_ctx->p_slice_params = reg_value; 16956ada57fd5c4a41fbf281589526d47850bed05fdhding 17056ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET( MSVDX_CMDS, SLICE_PARAMS ) ); 17156ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_write(cmdbuf, reg_value); 17256ada57fd5c4a41fbf281589526d47850bed05fdhding psb_cmdbuf_rendec_end(cmdbuf); 17356ada57fd5c4a41fbf281589526d47850bed05fdhding 17456ada57fd5c4a41fbf281589526d47850bed05fdhding vld_dec_setup_alternative_frame(dec_ctx->obj_context); 17556ada57fd5c4a41fbf281589526d47850bed05fdhding 17656ada57fd5c4a41fbf281589526d47850bed05fdhding *cmdbuf->cmd_idx++ = CMD_DEBLOCK | CMD_DEBLOCK_TYPE_SKIP; 17756ada57fd5c4a41fbf281589526d47850bed05fdhding *cmdbuf->cmd_idx++ = 0; 17856ada57fd5c4a41fbf281589526d47850bed05fdhding *cmdbuf->cmd_idx++ = ctx->coded_width / 16; 17956ada57fd5c4a41fbf281589526d47850bed05fdhding *cmdbuf->cmd_idx++ = ctx->coded_height / 16; 18056ada57fd5c4a41fbf281589526d47850bed05fdhding *cmdbuf->cmd_idx++ = 0; 18156ada57fd5c4a41fbf281589526d47850bed05fdhding *cmdbuf->cmd_idx++ = 0; 18256ada57fd5c4a41fbf281589526d47850bed05fdhding 18356ada57fd5c4a41fbf281589526d47850bed05fdhding} 18456ada57fd5c4a41fbf281589526d47850bed05fdhding 18556ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic VAStatus tng__yuv_processor_execute(context_DEC_p dec_ctx, object_buffer_p obj_buffer) 18656ada57fd5c4a41fbf281589526d47850bed05fdhding{ 18781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* psb_surface_p target_surface = dec_ctx->obj_context->current_render_target->psb_surface; */ 18856ada57fd5c4a41fbf281589526d47850bed05fdhding context_yuv_processor_p ctx = dec_ctx->yuv_ctx; 18956ada57fd5c4a41fbf281589526d47850bed05fdhding uint32_t reg_value; 19056ada57fd5c4a41fbf281589526d47850bed05fdhding VAStatus vaStatus; 19156ada57fd5c4a41fbf281589526d47850bed05fdhding 19281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ASSERT(obj_buffer->type == YUVProcessorSurfaceType || 19381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_buffer->type == VAProcPipelineParameterBufferType); 19456ada57fd5c4a41fbf281589526d47850bed05fdhding ASSERT(obj_buffer->num_elements == 1); 19556ada57fd5c4a41fbf281589526d47850bed05fdhding ASSERT(obj_buffer->size == sizeof(struct surface_param_s)); 19656ada57fd5c4a41fbf281589526d47850bed05fdhding 19756ada57fd5c4a41fbf281589526d47850bed05fdhding if ((obj_buffer->num_elements != 1) || 19881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ((obj_buffer->size != sizeof(struct surface_param_s)) && 19981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng (obj_buffer->size != sizeof(VAProcPipelineParameterBuffer)))) { 20056ada57fd5c4a41fbf281589526d47850bed05fdhding return VA_STATUS_ERROR_UNKNOWN; 20156ada57fd5c4a41fbf281589526d47850bed05fdhding } 20256ada57fd5c4a41fbf281589526d47850bed05fdhding 20381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* yuv rotation issued from dec driver, TODO removed later */ 20481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (obj_buffer->type == YUVProcessorSurfaceType) { 20581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng surface_param_p surface_params = (surface_param_p) obj_buffer->buffer_data; 206a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe psb_surface_p rotate_surface = dec_ctx->obj_context->current_render_target->out_loop_surface; 207a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe object_context_p obj_context = dec_ctx->obj_context; 208a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe psb_driver_data_p driver_data = obj_context->driver_data; 209a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe 210a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe ctx->display_width = (surface_params->display_width + 0xf) & ~0xf; 211a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe ctx->display_height = (surface_params->display_height + 0xf) & ~0xf; 212a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe ctx->coded_width = (surface_params->coded_width + 0xf) & ~0xf; 213a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe ctx->coded_height = (surface_params->coded_height + 0xf) & ~0xf; 214a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe ctx->src_surface = surface_params->src_surface; 215a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe 21681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->proc_param = NULL; 217a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe dec_ctx->obj_context->msvdx_rotate = obj_context->msvdx_rotate; 218a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe SET_SURFACE_INFO_rotate(rotate_surface, dec_ctx->obj_context->msvdx_rotate); 219a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe 220a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_buffer->buffer_data = NULL; 221a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_buffer->size = 0; 222a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe 223a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe#ifdef PSBVIDEO_MSVDX_DEC_TILING 224a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe if (GET_SURFACE_INFO_tiling(ctx->src_surface)) { 225a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe unsigned long msvdx_tile = psb__tile_stride_log2_256(rotate_surface->stride); 226a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_context->msvdx_tile &= 0xf; /* clear rotate tile */ 227a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_context->msvdx_tile |= (msvdx_tile << 4); 228a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_context->ctp_type &= (~PSB_CTX_TILING_MASK); /* clear tile context */ 229a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_context->ctp_type |= ((obj_context->msvdx_tile & 0xff) << 16); 230a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe psb_update_context(driver_data, obj_context->ctp_type); 231a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe drv_debug_msg(VIDEO_DEBUG_GENERAL, "update tile context, msvdx_tiled is 0x%08x \n", obj_context->msvdx_tile); 232a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe } 233a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe#endif 23481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } else if (obj_buffer->type == VAProcPipelineParameterBufferType) { 23581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAProcPipelineParameterBuffer *vpp_params = (VAProcPipelineParameterBuffer *) obj_buffer->buffer_data; 23681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_surface_p obj_surface = SURFACE(vpp_params->surface); 23781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng psb_surface_p rotate_surface = dec_ctx->obj_context->current_render_target->psb_surface; 23881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 239c3cdab1ea32ee08500683399971ca87214dddcefmahongpe if (obj_surface == NULL){ 240c3cdab1ea32ee08500683399971ca87214dddcefmahongpe vaStatus = VA_STATUS_ERROR_UNKNOWN; 241c3cdab1ea32ee08500683399971ca87214dddcefmahongpe return vaStatus; 242c3cdab1ea32ee08500683399971ca87214dddcefmahongpe } 243c3cdab1ea32ee08500683399971ca87214dddcefmahongpe 24481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng //ctx->display_width = ((vpp_params->surface_region->width + 0xf) & ~0xf); 24581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng //ctx->display_height = ((vpp_params->surface_region->height + 0x1f) & ~0x1f); 24681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->display_width = ((obj_surface->width + 0xf) & ~0xf); 2475c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng ctx->display_height = ((obj_surface->height + 0xf) & ~0xf); 24881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->coded_width = ctx->display_width; 24981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->coded_height = ctx->display_height; 25081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 25181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->src_surface = obj_surface->psb_surface; 25281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng dec_ctx->obj_context->msvdx_rotate = vpp_params->rotation_state; 25381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng SET_SURFACE_INFO_rotate(rotate_surface, dec_ctx->obj_context->msvdx_rotate); 25481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 25581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->proc_param = vpp_params; 25681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_buffer->buffer_data = NULL; 25781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_buffer->size = 0; 2585c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng 2595c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng#ifdef PSBVIDEO_MSVDX_DEC_TILING 2605c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng object_context_p obj_context = dec_ctx->obj_context; 2615c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng psb_driver_data_p driver_data = obj_context->driver_data; 2625c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "attempt to update tile context\n"); 2635c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng if (GET_SURFACE_INFO_tiling(ctx->src_surface)) { 2645c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "update tile context\n"); 2655c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng 2665c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng unsigned long msvdx_tile = psb__tile_stride_log2_256(rotate_surface->stride); 2675c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng obj_context->msvdx_tile &= 0xf; /* clear rotate tile */ 2685c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng obj_context->msvdx_tile |= (msvdx_tile << 4); 2695c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng obj_context->ctp_type &= (~PSB_CTX_TILING_MASK); /* clear tile context */ 2705c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng obj_context->ctp_type |= ((obj_context->msvdx_tile & 0xff) << 16); 2715c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng psb_update_context(driver_data, obj_context->ctp_type); 272dbf2ee864763f6da009b5455943917c72e31e9ecGu, Wangyi drv_debug_msg(VIDEO_DEBUG_GENERAL, "update tile context, msvdx_tiled is 0x%08x \n", obj_context->msvdx_tile); 2735c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng } 2745c3a70e3d110fc71ec9b00955c8885310fdf70aeLi Zeng#endif 27581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 27681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 27756ada57fd5c4a41fbf281589526d47850bed05fdhding#ifdef ADNROID 27881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng LOGV("%s, %d %d %d %d***************************************************\n", 27981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng __func__, ctx->display_width, ctx->display_height, ctx->coded_width, ctx->coded_height); 28056ada57fd5c4a41fbf281589526d47850bed05fdhding#endif 28181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 28256ada57fd5c4a41fbf281589526d47850bed05fdhding vaStatus = VA_STATUS_SUCCESS; 28356ada57fd5c4a41fbf281589526d47850bed05fdhding 28456ada57fd5c4a41fbf281589526d47850bed05fdhding if (psb_context_get_next_cmdbuf(dec_ctx->obj_context)) { 28556ada57fd5c4a41fbf281589526d47850bed05fdhding vaStatus = VA_STATUS_ERROR_UNKNOWN; 28656ada57fd5c4a41fbf281589526d47850bed05fdhding DEBUG_FAILURE; 28756ada57fd5c4a41fbf281589526d47850bed05fdhding return vaStatus; 28856ada57fd5c4a41fbf281589526d47850bed05fdhding } 28956ada57fd5c4a41fbf281589526d47850bed05fdhding /* ctx->begin_slice(ctx, slice_param); */ 29056ada57fd5c4a41fbf281589526d47850bed05fdhding vld_dec_FE_state(dec_ctx->obj_context, NULL); 29156ada57fd5c4a41fbf281589526d47850bed05fdhding 29256ada57fd5c4a41fbf281589526d47850bed05fdhding tng__yuv_processor_process(dec_ctx); 29356ada57fd5c4a41fbf281589526d47850bed05fdhding /* ctx->process_slice(ctx, slice_param); */ 29456ada57fd5c4a41fbf281589526d47850bed05fdhding vld_dec_write_kick(dec_ctx->obj_context); 29556ada57fd5c4a41fbf281589526d47850bed05fdhding 29656ada57fd5c4a41fbf281589526d47850bed05fdhding dec_ctx->obj_context->video_op = psb_video_vld; 29756ada57fd5c4a41fbf281589526d47850bed05fdhding dec_ctx->obj_context->flags = 0; 29856ada57fd5c4a41fbf281589526d47850bed05fdhding 29956ada57fd5c4a41fbf281589526d47850bed05fdhding /* ctx->end_slice(ctx); */ 30056ada57fd5c4a41fbf281589526d47850bed05fdhding dec_ctx->obj_context->flags = FW_VA_RENDER_IS_FIRST_SLICE | FW_VA_RENDER_IS_LAST_SLICE | FW_INTERNAL_CONTEXT_SWITCH; 30156ada57fd5c4a41fbf281589526d47850bed05fdhding 30256ada57fd5c4a41fbf281589526d47850bed05fdhding if (psb_context_submit_cmdbuf(dec_ctx->obj_context)) { 30356ada57fd5c4a41fbf281589526d47850bed05fdhding vaStatus = VA_STATUS_ERROR_UNKNOWN; 30456ada57fd5c4a41fbf281589526d47850bed05fdhding } 30556ada57fd5c4a41fbf281589526d47850bed05fdhding return vaStatus; 30656ada57fd5c4a41fbf281589526d47850bed05fdhding} 30756ada57fd5c4a41fbf281589526d47850bed05fdhding 30856ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic VAStatus tng_yuv_processor_process_buffer( 30956ada57fd5c4a41fbf281589526d47850bed05fdhding context_DEC_p dec_ctx, 31056ada57fd5c4a41fbf281589526d47850bed05fdhding object_buffer_p buffer) 31156ada57fd5c4a41fbf281589526d47850bed05fdhding{ 31256ada57fd5c4a41fbf281589526d47850bed05fdhding VAStatus vaStatus = VA_STATUS_SUCCESS; 31356ada57fd5c4a41fbf281589526d47850bed05fdhding object_buffer_p obj_buffer = buffer; 314cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan unsigned int type = obj_buffer->type; 31556ada57fd5c4a41fbf281589526d47850bed05fdhding { 316cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan switch (type) { 31756ada57fd5c4a41fbf281589526d47850bed05fdhding case YUVProcessorSurfaceType: 31881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng case VAProcPipelineParameterBufferType: 31956ada57fd5c4a41fbf281589526d47850bed05fdhding vaStatus = tng__yuv_processor_execute(dec_ctx, obj_buffer); 32056ada57fd5c4a41fbf281589526d47850bed05fdhding DEBUG_FAILURE; 32156ada57fd5c4a41fbf281589526d47850bed05fdhding break; 32256ada57fd5c4a41fbf281589526d47850bed05fdhding 32356ada57fd5c4a41fbf281589526d47850bed05fdhding default: 32456ada57fd5c4a41fbf281589526d47850bed05fdhding vaStatus = VA_STATUS_ERROR_UNKNOWN; 32556ada57fd5c4a41fbf281589526d47850bed05fdhding DEBUG_FAILURE; 32656ada57fd5c4a41fbf281589526d47850bed05fdhding } 32756ada57fd5c4a41fbf281589526d47850bed05fdhding } 32856ada57fd5c4a41fbf281589526d47850bed05fdhding 32956ada57fd5c4a41fbf281589526d47850bed05fdhding return vaStatus; 33056ada57fd5c4a41fbf281589526d47850bed05fdhding} 33156ada57fd5c4a41fbf281589526d47850bed05fdhding 33256ada57fd5c4a41fbf281589526d47850bed05fdhdingstatic VAStatus tng_yuv_processor_EndPicture( 33356ada57fd5c4a41fbf281589526d47850bed05fdhding object_context_p obj_context) 33456ada57fd5c4a41fbf281589526d47850bed05fdhding{ 33581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng context_DEC_p dec_ctx = (context_DEC_p) obj_context->format_data; 33681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng context_yuv_processor_p ctx = dec_ctx->yuv_ctx; 33756ada57fd5c4a41fbf281589526d47850bed05fdhding 33856ada57fd5c4a41fbf281589526d47850bed05fdhding if (psb_context_flush_cmdbuf(obj_context)) { 33956ada57fd5c4a41fbf281589526d47850bed05fdhding return VA_STATUS_ERROR_UNKNOWN; 34056ada57fd5c4a41fbf281589526d47850bed05fdhding } 34181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 34281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (ctx->proc_param) { 34381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng free(ctx->proc_param); 34481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng ctx->proc_param = NULL; 34581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 34681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 34756ada57fd5c4a41fbf281589526d47850bed05fdhding return VA_STATUS_SUCCESS; 34856ada57fd5c4a41fbf281589526d47850bed05fdhding} 34956ada57fd5c4a41fbf281589526d47850bed05fdhding 35056ada57fd5c4a41fbf281589526d47850bed05fdhdingstruct format_vtable_s tng_yuv_processor_vtable = { 35156ada57fd5c4a41fbf281589526d47850bed05fdhdingqueryConfigAttributes: 35256ada57fd5c4a41fbf281589526d47850bed05fdhding tng_yuv_processor_QueryConfigAttributes, 35356ada57fd5c4a41fbf281589526d47850bed05fdhdingvalidateConfig: 35456ada57fd5c4a41fbf281589526d47850bed05fdhding tng_yuv_processor_ValidateConfig, 35556ada57fd5c4a41fbf281589526d47850bed05fdhdingcreateContext: 35656ada57fd5c4a41fbf281589526d47850bed05fdhding tng_yuv_processor_CreateContext, 35756ada57fd5c4a41fbf281589526d47850bed05fdhdingdestroyContext: 35856ada57fd5c4a41fbf281589526d47850bed05fdhding tng_yuv_processor_DestroyContext, 35956ada57fd5c4a41fbf281589526d47850bed05fdhdingbeginPicture: 36056ada57fd5c4a41fbf281589526d47850bed05fdhding tng_yuv_processor_BeginPicture, 36156ada57fd5c4a41fbf281589526d47850bed05fdhdingrenderPicture: 36281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vld_dec_RenderPicture, 36356ada57fd5c4a41fbf281589526d47850bed05fdhdingendPicture: 36456ada57fd5c4a41fbf281589526d47850bed05fdhding tng_yuv_processor_EndPicture 36556ada57fd5c4a41fbf281589526d47850bed05fdhding}; 36681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 36781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng#define VED_SUPPORTED_FILTERS_NUM 1 36881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData; 36981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng#define CONFIG(id) ((object_config_p) object_heap_lookup( &driver_data->config_heap, id )) 37081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id )) 37181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id )) 37281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 37381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi ZengVAStatus ved_QueryVideoProcFilters( 37481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VADriverContextP ctx, 37581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAContextID context, 37681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAProcFilterType *filters, 37781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng unsigned int *num_filters) 37881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng{ 37981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng INIT_DRIVER_DATA; 38081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 38181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_context_p obj_context; 38281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_config_p obj_config; 38381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAEntrypoint tmp; 38481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng int count; 38581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 38681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if ctx is right */ 38781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_context = CONTEXT(context); 38881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == obj_context) { 38981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 39081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 39181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 39281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 39381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 39481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_config = CONFIG(obj_context->config_id); 39581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == obj_config) { 39681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 39781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 39881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 39981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 40081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 40181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng tmp = obj_config->entrypoint; 40281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (tmp != VAEntrypointVideoProc) { 40381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "current entrypoint is %d, not VAEntrypointVideoProc\n", tmp); 40481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_UNKNOWN; 40581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 40681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 40781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 40881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if filters and num_filters is valid */ 40981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == num_filters || NULL == filters) { 41081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filters, filters); 41181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 41281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 41381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 41481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 41581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if the filter array size is valid */ 41681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (*num_filters < VED_SUPPORTED_FILTERS_NUM) { 41781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "The filters array size(%d) is NOT valid! Supported filters num is %d\n", 41881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng *num_filters, VED_SUPPORTED_FILTERS_NUM); 41981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 42081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng *num_filters = VED_SUPPORTED_FILTERS_NUM; 42181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 42281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 42381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 4248b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng count = 0; 4258b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng filters[count++] = VAProcFilterNone; 4268b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng *num_filters = count; 4278b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng 42881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zengerr: 42981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng return vaStatus; 43081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng} 43181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 43281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi ZengVAStatus ved_QueryVideoProcFilterCaps( 43381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VADriverContextP ctx, 43481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAContextID context, 43581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAProcFilterType type, 43681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng void *filter_caps, 43781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng unsigned int *num_filter_caps) 43881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng{ 43981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng INIT_DRIVER_DATA; 44081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 44181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_context_p obj_context; 44281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_config_p obj_config; 44381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAProcFilterCap *no_cap; 44481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 44581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if context is right */ 44681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_context = CONTEXT(context); 44781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == obj_context) { 44881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 44981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 45081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 45181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 45281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 45381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_config = CONFIG(obj_context->config_id); 45481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == obj_config) { 45581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 45681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 45781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 45881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 45981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 46081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if filter_caps and num_filter_caps is right */ 46181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == num_filter_caps || NULL == filter_caps){ 46281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filter_caps, filter_caps); 46381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 46481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 46581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 46681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 46781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (*num_filter_caps < 1) { 46881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters == %d (> 1)\n", *num_filter_caps); 46981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 47081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 47181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 47281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 47381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if curent HW support and return corresponding caps */ 47481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* FIXME: we should use a constant table to return caps */ 4758b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng switch (type) { 4768b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng case VAProcFilterNone: 4778b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng no_cap = filter_caps; 4788b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng no_cap->range.min_value = 0; 4798b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng no_cap->range.max_value = 0; 4808b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng no_cap->range.default_value = 0; 4818b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng no_cap->range.step = 0; 4828b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng *num_filter_caps = 1; 4838b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng break; 4848b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng default: 4858b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide filter type %d\n", type); 4868b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 48781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng *num_filter_caps = 0; 4888b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng goto err; 48981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 49081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 49181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zengerr: 49281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng return vaStatus; 49381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng} 49481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 49581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi ZengVAStatus ved_QueryVideoProcPipelineCaps( 49681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VADriverContextP ctx, 49781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAContextID context, 49881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VABufferID *filters, 49981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng unsigned int num_filters, 50081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAProcPipelineCaps *pipeline_caps) 50181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng{ 50281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng INIT_DRIVER_DATA; 50381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAStatus vaStatus = VA_STATUS_SUCCESS; 50481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_context_p obj_context; 50581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_config_p obj_config; 50681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng VAProcFilterParameterBufferBase *base; 50781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng object_buffer_p buf; 50881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 50981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if ctx is right */ 51081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_context = CONTEXT(context); 51181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == obj_context) { 51281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 51381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 51481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 51581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 51681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 51781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng obj_config = CONFIG(obj_context->config_id); 51881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == obj_config) { 51981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 52081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 52181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 52281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 52381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 52481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng /* check if filters and num_filters and pipeline-caps are right */ 52581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (num_filters != 1) { 52681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_filters %d\n", num_filters); 52781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 52881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 52981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 53081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 53181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng if (NULL == filters || pipeline_caps == NULL) { 53281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filters %p or pipeline_caps %p\n", filters, pipeline_caps); 53381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 53481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 53581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 53681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 53781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng memset(pipeline_caps, 0, sizeof(*pipeline_caps)); 53881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 5398b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng buf = BUFFER(*(filters)); 540c3cdab1ea32ee08500683399971ca87214dddcefmahongpe 5418b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng if (buf == NULL){ 5428b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter buffer: NULL \n"); 5438b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 5448b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng goto err; 5458b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng } 54681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng 5478b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng base = (VAProcFilterParameterBufferBase *)buf->buffer_data; 5488b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng /* check filter buffer setting */ 5498b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng switch (base->type) { 5508b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng case VAProcFilterNone: 55139eff7a021afd8ec1a6f375dbc6476cbaa485d5dLi Zeng pipeline_caps->rotation_flags = (1 << VA_ROTATION_NONE); 5528b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng pipeline_caps->rotation_flags |= (1 << VA_ROTATION_90); 5538b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng pipeline_caps->rotation_flags |= (1 << VA_ROTATION_180); 5548b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng pipeline_caps->rotation_flags |= (1 << VA_ROTATION_270); 5558b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng break; 5568b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng 5578b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng default: 5588b9d488edafa54dce4d1fa4ae99e493ad840517dLi Zeng drv_debug_msg(VIDEO_DEBUG_ERROR, "Do NOT support the filter type %d\n", base->type); 55981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng vaStatus = VA_STATUS_ERROR_UNKNOWN; 56081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng goto err; 56181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng } 56281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zengerr: 56381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng return vaStatus; 56481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng} 565