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