106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/*
2ff36d22f039635357d9fced020fa5237cf75be9fhding * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
3ff36d22f039635357d9fced020fa5237cf75be9fhding * Copyright (c) Imagination Technologies Limited, UK
406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng *
5ff36d22f039635357d9fced020fa5237cf75be9fhding * Permission is hereby granted, free of charge, to any person obtaining a
6ff36d22f039635357d9fced020fa5237cf75be9fhding * copy of this software and associated documentation files (the
7ff36d22f039635357d9fced020fa5237cf75be9fhding * "Software"), to deal in the Software without restriction, including
8ff36d22f039635357d9fced020fa5237cf75be9fhding * without limitation the rights to use, copy, modify, merge, publish,
9ff36d22f039635357d9fced020fa5237cf75be9fhding * distribute, sub license, and/or sell copies of the Software, and to
10ff36d22f039635357d9fced020fa5237cf75be9fhding * permit persons to whom the Software is furnished to do so, subject to
11ff36d22f039635357d9fced020fa5237cf75be9fhding * the following conditions:
1206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng *
13ff36d22f039635357d9fced020fa5237cf75be9fhding * The above copyright notice and this permission notice (including the
14ff36d22f039635357d9fced020fa5237cf75be9fhding * next paragraph) shall be included in all copies or substantial portions
15ff36d22f039635357d9fced020fa5237cf75be9fhding * of the Software.
16ff36d22f039635357d9fced020fa5237cf75be9fhding *
17ff36d22f039635357d9fced020fa5237cf75be9fhding * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18ff36d22f039635357d9fced020fa5237cf75be9fhding * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19ff36d22f039635357d9fced020fa5237cf75be9fhding * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20ff36d22f039635357d9fced020fa5237cf75be9fhding * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21ff36d22f039635357d9fced020fa5237cf75be9fhding * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22ff36d22f039635357d9fced020fa5237cf75be9fhding * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23ff36d22f039635357d9fced020fa5237cf75be9fhding * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng */
2506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
2606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/*
2706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng * Authors:
2806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng *    Li Zeng <li.zeng@intel.com>
2906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng */
3006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "tng_vld_dec.h"
3106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "psb_drv_debug.h"
3206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "hwdefs/dxva_fw_ctrl.h"
3306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "hwdefs/reg_io2.h"
3406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "hwdefs/msvdx_offsets.h"
3506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "hwdefs/msvdx_cmds_io2.h"
3606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include "va/va_dec_jpeg.h"
37d4b3bda95f2efc571b057ca9ece5ea076a55cdb0Tianmi Chen#include "va/va_dec_vp8.h"
3806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
394bac5bf335c63740958c98bab11b94dc37def621Elliott Hughes#include <malloc.h>
404bac5bf335c63740958c98bab11b94dc37def621Elliott Hughes
4106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#define GET_SURFACE_INFO_colocated_index(psb_surface) ((int) (psb_surface->extra_info[3]))
4206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#define SET_SURFACE_INFO_colocated_index(psb_surface, val) psb_surface->extra_info[3] = (uint32_t) val;
4306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
4406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/* Set MSVDX Front end register */
4506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_FE_state(object_context_p obj_context, psb_buffer_p buf)
4606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
4706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
4806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    context_DEC_p ctx = (context_DEC_p) obj_context->format_data;
4906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    CTRL_ALLOC_HEADER *cmd_header = (CTRL_ALLOC_HEADER *)psb_cmdbuf_alloc_space(cmdbuf, sizeof(CTRL_ALLOC_HEADER));
5006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
5106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32Cmd_AdditionalParams = CMD_CTRL_ALLOC_HEADER;
5206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32ExternStateBuffAddr = 0;
5306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (buf)
5406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        RELOC(cmd_header->ui32ExternStateBuffAddr, 0, buf);
5506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32MacroblockParamAddr = 0; /* Only EC needs to set this */
5606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
5706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->cmd_params = &cmd_header->ui32Cmd_AdditionalParams;
5806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->p_slice_params = &cmd_header->ui32SliceParams;
5906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32SliceParams = 0;
6006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
6106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_first_pic_last = &cmd_header->uiSliceFirstMbYX_uiPicLastMbYX;
6256ada57fd5c4a41fbf281589526d47850bed05fdhding    *ctx->slice_first_pic_last = 0;
6306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
6406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->p_range_mapping_base0 = &cmd_header->ui32AltOutputAddr[0];
6506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->p_range_mapping_base1 = &cmd_header->ui32AltOutputAddr[1];
6606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
6706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->alt_output_flags = &cmd_header->ui32AltOutputFlags;
6806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
6906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32AltOutputFlags = 0;
7006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32AltOutputAddr[0] = 0;
7106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32AltOutputAddr[1] = 0;
7206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
7306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
7406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/* Programme the Alt output if there is a rotation*/
7506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_setup_alternative_frame(object_context_p obj_context)
7606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
7706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    uint32_t cmd = 0;
7806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
7906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    context_DEC_p ctx = (context_DEC_p) obj_context->format_data;
8081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng    psb_surface_p src_surface = obj_context->current_render_target->psb_surface;
814d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng    psb_surface_p out_loop_surface = obj_context->current_render_target->out_loop_surface;
824d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng    int ved_scaling = (CONTEXT_SCALING(obj_context) && !ctx->yuv_ctx);
83a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe    uint32_t startX = 0, startY = 0, luma_addr_offset = 0, chroma_addr_offset = 0;
8406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
8581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng    /*  In VPP ctx, current_render_target is rotated surface */
864d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng    if (ctx->yuv_ctx && (VAEntrypointVideoProc == obj_context->entry_point)) {
87925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Setup second-pass rotation\n");
88925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix        out_loop_surface = src_surface;
8981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng        src_surface = ctx->yuv_ctx->src_surface;
9081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng    }
9181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng
9239eff7a021afd8ec1a6f375dbc6476cbaa485d5dLi Zeng    if (CONTEXT_ALTERNATIVE_OUTPUT(obj_context) || obj_context->entry_point == VAEntrypointVideoProc) {
934d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng        if (ved_scaling) {
944d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng            out_loop_surface = obj_context->current_render_target->scaling_surface;
954d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng#ifndef BAYTRAIL
964d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng            tng_ved_write_scale_reg(obj_context);
974d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng
984d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng            REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS,ALTERNATIVE_OUTPUT_PICTURE_ROTATION, SCALE_INPUT_SIZE_SEL, 1);
994d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng            REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS,ALTERNATIVE_OUTPUT_PICTURE_ROTATION, SCALE_ENABLE, 1);
1004d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng#endif
101a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe        } else {
102a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe            startX = ((uint32_t)obj_context->current_render_target->offset_x_s + 0x3f) & ~0x3f;
103a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe            startY = ((uint32_t)obj_context->current_render_target->offset_y_s + 0x1) & ~0x1;
104a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe            luma_addr_offset = (((uint32_t)(startX + out_loop_surface->stride * startY))  + 0x3f ) & ~0x3f;
105a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe            chroma_addr_offset = (((uint32_t)(startX + out_loop_surface->stride * startY / 2))  + 0x3f ) & ~0x3f;
1064d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng        }
1074d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng
108925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix        if (out_loop_surface == NULL) {
109a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe            drv_debug_msg(VIDEO_DEBUG_ERROR, "out-loop surface is NULL, abort msvdx alternative output\n");
11006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            return;
11106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
11206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
1134d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng        if (GET_SURFACE_INFO_rotate(out_loop_surface) != obj_context->msvdx_rotate && !ved_scaling)
114925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix            drv_debug_msg(VIDEO_DEBUG_WARNING, "Display rotate mode does not match surface rotate mode!\n");
11506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
11606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        /* CRendecBlock    RendecBlk( mCtrlAlloc , RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS) ); */
11706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS));
11806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
119a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe        psb_cmdbuf_rendec_write_address(cmdbuf, &out_loop_surface->buf, out_loop_surface->buf.buffer_ofs + luma_addr_offset);
120a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe        psb_cmdbuf_rendec_write_address(cmdbuf, &out_loop_surface->buf, out_loop_surface->buf.buffer_ofs + chroma_addr_offset + out_loop_surface->chroma_offset);
12106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
12206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb_cmdbuf_rendec_end(cmdbuf);
12306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
12406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ALT_PICTURE_ENABLE, 1);
125925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_ROW_STRIDE, out_loop_surface->stride_mode);
12606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , RECON_WRITE_DISABLE, 0); /* FIXME Always generate Rec */
127925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_MODE, GET_SURFACE_INFO_rotate(out_loop_surface));
12806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
129a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe        RELOC(*ctx->p_range_mapping_base0, out_loop_surface->buf.buffer_ofs + luma_addr_offset, &out_loop_surface->buf);
130a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe        RELOC(*ctx->p_range_mapping_base1, out_loop_surface->buf.buffer_ofs + chroma_addr_offset + out_loop_surface->chroma_offset, &out_loop_surface->buf);
13106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
13206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
13306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (obj_context->profile == VAProfileVP8Version0_3 ||
13456ada57fd5c4a41fbf281589526d47850bed05fdhding        obj_context->profile == VAProfileJPEGBaseline || ctx->yuv_ctx) {
13506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb_cmdbuf_rendec_start(cmdbuf, (REG_MSVDX_CMD_OFFSET + MSVDX_CMDS_AUX_LINE_BUFFER_BASE_ADDRESS_OFFSET));
13606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->aux_line_buffer_vld, ctx->aux_line_buffer_vld.buffer_ofs);
13706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb_cmdbuf_rendec_end(cmdbuf);
13806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
13906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION, USE_AUX_LINE_BUF, 1);
14056ada57fd5c4a41fbf281589526d47850bed05fdhding        if (ctx->yuv_ctx)
14156ada57fd5c4a41fbf281589526d47850bed05fdhding            REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , RECON_WRITE_DISABLE, 1);
14206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
14306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
14406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    /* Set the rotation registers */
14506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION));
14606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_rendec_write(cmdbuf, cmd);
14706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    *ctx->alt_output_flags = cmd;
14806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
14906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd = 0;
15081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng    REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, EXTENDED_ROW_STRIDE, EXT_ROW_STRIDE, src_surface->stride / 64);
15106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_rendec_write(cmdbuf, cmd);
15206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
15306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_rendec_end(cmdbuf);
15406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
15506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
15606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengint vld_dec_slice_parameter_size(object_context_p obj_context)
15706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
15806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int size;
15906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
16006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    switch (obj_context->profile) {
16106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileMPEG2Simple:
16206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileMPEG2Main:
16306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        size = sizeof(VASliceParameterBufferMPEG2);
16406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        break;
16506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileMPEG4Simple:
16606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileMPEG4AdvancedSimple:
16706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileMPEG4Main:
16806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileH263Baseline:
16906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        size = sizeof(VASliceParameterBufferMPEG4);
17006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        break;
17106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileH264Baseline:
17206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileH264Main:
17306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileH264High:
17406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileH264ConstrainedBaseline:
17506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        size = sizeof(VASliceParameterBufferH264);
17606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        break;
17706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileVC1Simple:
17806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileVC1Main:
17906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileVC1Advanced:
18006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        size = sizeof(VASliceParameterBufferVC1);
18106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        break;
18206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileVP8Version0_3:
183d4b3bda95f2efc571b057ca9ece5ea076a55cdb0Tianmi Chen        size = sizeof(VASliceParameterBufferVP8);
18406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileJPEGBaseline:
185a52334a05d2be04432b1f8b2bccf9e90768a218aNana GUo        size = sizeof(VASliceParameterBufferJPEGBaseline);
18606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    default:
18706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        size = 0;
18806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        break;
18906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
19006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
19106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return size;
19206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
19306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
19406c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_process_slice_data(context_DEC_p ctx, object_buffer_p obj_buffer)
19506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
19606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VAStatus vaStatus = VA_STATUS_SUCCESS;
19706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    void *slice_param;
19806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int buffer_idx = 0;
19906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    unsigned int element_idx = 0, element_size;
20006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
20106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType));
20206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
20306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ASSERT(ctx->pic_params);
20406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ASSERT(ctx->slice_param_list_idx);
20506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
20606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#if 0
20706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (!ctx->pic_params) {
20806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        /* Picture params missing */
20906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        return VA_STATUS_ERROR_UNKNOWN;
21006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
21106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#endif
21206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if ((NULL == obj_buffer->psb_buffer) ||
21306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        (0 == obj_buffer->size)) {
21406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        /* We need to have data in the bitstream buffer */
21506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        return VA_STATUS_ERROR_UNKNOWN;
21606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
21706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
21806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    element_size = vld_dec_slice_parameter_size(ctx->obj_context);
21906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
22006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    while (buffer_idx < ctx->slice_param_list_idx) {
22106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        object_buffer_p slice_buf = ctx->slice_param_list[buffer_idx];
22206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (element_idx >= slice_buf->num_elements) {
22306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            /* Move to next buffer */
22406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            element_idx = 0;
22506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            buffer_idx++;
22606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            continue;
22706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
22806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
22906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        slice_param = slice_buf->buffer_data;
230cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        slice_param = (void *)((unsigned long)slice_param + element_idx * element_size);
23106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        element_idx++;
23206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vaStatus = vld_dec_process_slice(ctx, slice_param, obj_buffer);
23306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (vaStatus != VA_STATUS_SUCCESS) {
23406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            DEBUG_FAILURE;
23506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            break;
23606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
23706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
23806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_param_list_idx = 0;
23906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
24006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return vaStatus;
24106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
24206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/*
24306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng * Adds a VASliceParameterBuffer to the list of slice params
24406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng */
24506c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_add_slice_param(context_DEC_p ctx, object_buffer_p obj_buffer)
24606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
24706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ASSERT(obj_buffer->type == VASliceParameterBufferType);
24806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (ctx->slice_param_list_idx >= ctx->slice_param_list_size) {
24906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        unsigned char *new_list;
25006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->slice_param_list_size += 8;
25106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        new_list = realloc(ctx->slice_param_list,
25206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                           sizeof(object_buffer_p) * ctx->slice_param_list_size);
25306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (NULL == new_list) {
25406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            return VA_STATUS_ERROR_ALLOCATION_FAILED;
25506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
25606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->slice_param_list = (object_buffer_p*) new_list;
25706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
25806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_param_list[ctx->slice_param_list_idx] = obj_buffer;
25906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_param_list_idx++;
26006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return VA_STATUS_SUCCESS;
26106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
26206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
26306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_write_kick(object_context_p obj_context)
26406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
26506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
26606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    *cmdbuf->cmd_idx++ = CMD_COMPLETION;
26706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
26806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
26906c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_process_slice(context_DEC_p ctx,
27006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                        void *vld_slice_param,
27106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                        object_buffer_p obj_buffer)
27206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
27306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VAStatus vaStatus = VA_STATUS_SUCCESS;
27406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VASliceParameterBufferBase *slice_param = (VASliceParameterBufferBase *) vld_slice_param;
27506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
27606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType));
27706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
27806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) ||
27906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL)) {
280e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifndef SLICE_HEADER_PARSING
28106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (0 == slice_param->slice_data_size) {
28206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = VA_STATUS_ERROR_UNKNOWN;
28306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            DEBUG_FAILURE;
28406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            return vaStatus;
28506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
286e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif
28706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ASSERT(!ctx->split_buffer_pending);
28806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
28906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (psb_context_get_next_cmdbuf(ctx->obj_context)) {
29006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = VA_STATUS_ERROR_UNKNOWN;
29106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            DEBUG_FAILURE;
29206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            return vaStatus;
29306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
29406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vld_dec_FE_state(ctx->obj_context, ctx->preload_buffer);
2951b8d958031a6ae24789addf7ff073316b89aff87Nana GUo        ctx->begin_slice(ctx, slice_param);
29606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->slice_data_buffer = obj_buffer->psb_buffer;
297e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifdef SLICE_HEADER_PARSING
298e853beb775a5de607bd080d7d43e638f95199e68Nana GUo        if (ctx->parse_enabled == 1)
299e853beb775a5de607bd080d7d43e638f95199e68Nana GUo            psb_cmdbuf_dma_write_key(ctx->obj_context->cmdbuf,
300e853beb775a5de607bd080d7d43e638f95199e68Nana GUo                                         ctx->SR_flags,
301e853beb775a5de607bd080d7d43e638f95199e68Nana GUo                                         ctx->parse_key);
302e853beb775a5de607bd080d7d43e638f95199e68Nana GUo        else
303e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif
304e853beb775a5de607bd080d7d43e638f95199e68Nana GUo            psb_cmdbuf_dma_write_bitstream(ctx->obj_context->cmdbuf,
30506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                         obj_buffer->psb_buffer,
30606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                         obj_buffer->psb_buffer->buffer_ofs + slice_param->slice_data_offset,
30706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                         slice_param->slice_data_size,
30806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                         ctx->bits_offset,
30906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                         ctx->SR_flags);
31006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
31106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) {
31206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            ctx->split_buffer_pending = TRUE;
31306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
31406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    } else {
31506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ASSERT(ctx->split_buffer_pending);
31606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ASSERT(0 == slice_param->slice_data_offset);
31706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (slice_param->slice_data_size) {
31806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            psb_cmdbuf_dma_write_bitstream_chained(ctx->obj_context->cmdbuf,
31906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                    obj_buffer->psb_buffer,
32006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                    slice_param->slice_data_size);
32106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
32206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
32306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
32406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL) ||
32506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END)) {
32606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END) {
32706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            ASSERT(ctx->split_buffer_pending);
32806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
32906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
33006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->process_slice(ctx, slice_param);
33106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vld_dec_write_kick(ctx->obj_context);
33206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
33306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->split_buffer_pending = FALSE;
33406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->obj_context->video_op = psb_video_vld;
33506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->obj_context->flags = 0;
33606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
33706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->end_slice(ctx);
33806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
33906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (psb_context_submit_cmdbuf(ctx->obj_context)) {
34006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = VA_STATUS_ERROR_UNKNOWN;
34106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
34206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
34306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return vaStatus;
34406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
34506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
34606c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_allocate_colocated_buffer(context_DEC_p ctx, object_surface_p obj_surface, uint32_t size)
34706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
34806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_buffer_p buf;
34906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VAStatus vaStatus;
35006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_surface_p surface = obj_surface->psb_surface;
35106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int index = GET_SURFACE_INFO_colocated_index(surface);
35206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
35306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (!index) {
35406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        index = ctx->colocated_buffers_idx;
35506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (index >= ctx->colocated_buffers_size) {
35606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            return VA_STATUS_ERROR_UNKNOWN;
35706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
35806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
35906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocating colocated buffer for surface %08x size = %08x\n", surface, size);
36006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
36106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        buf = &(ctx->colocated_buffers[index]);
36206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vaStatus = psb_buffer_create(ctx->obj_context->driver_data, size, psb_bt_vpu_only, buf);
36306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (VA_STATUS_SUCCESS != vaStatus) {
36406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            return vaStatus;
36506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
36606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->colocated_buffers_idx++;
36706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        SET_SURFACE_INFO_colocated_index(surface, index + 1); /* 0 means unset, index is offset by 1 */
36806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    } else {
36906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        buf = &(ctx->colocated_buffers[index - 1]);
37006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (buf->size < size) {
37106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            psb_buffer_destroy(buf);
37206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = psb_buffer_create(ctx->obj_context->driver_data, size, psb_bt_vpu_only, buf);
37306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            if (VA_STATUS_SUCCESS != vaStatus) {
37406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                return vaStatus;
37506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            }
37606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            SET_SURFACE_INFO_colocated_index(surface, index); /* replace the original buffer */
37706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
37806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
37906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return VA_STATUS_SUCCESS;
38006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
38106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
38206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengpsb_buffer_p vld_dec_lookup_colocated_buffer(context_DEC_p ctx, psb_surface_p surface)
38306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
38406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int index = GET_SURFACE_INFO_colocated_index(surface);
38506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (!index) {
38606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        return NULL;
38706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
38806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return &(ctx->colocated_buffers[index-1]); /* 0 means unset, index is offset by 1 */
38906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
39006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
39106c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_CreateContext(context_DEC_p ctx, object_context_p obj_context)
39206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
39306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VAStatus vaStatus = VA_STATUS_SUCCESS;
39406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
39506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->obj_context = obj_context;
39606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->split_buffer_pending = FALSE;
39706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_param_list_size = 8;
39806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_param_list = (object_buffer_p*) calloc(1, sizeof(object_buffer_p) * ctx->slice_param_list_size);
39906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_param_list_idx = 0;
40006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
40106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (NULL == ctx->slice_param_list) {
40206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
40306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        DEBUG_FAILURE;
40406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        return vaStatus;
40506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
40606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
40706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->colocated_buffers_size = obj_context->num_render_targets;
40806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->colocated_buffers_idx = 0;
40906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->colocated_buffers = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s) * ctx->colocated_buffers_size);
41006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (NULL == ctx->colocated_buffers) {
41106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
41206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        DEBUG_FAILURE;
41306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        free(ctx->slice_param_list);
41406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
41581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng
41681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng    if (vaStatus == VA_STATUS_SUCCESS) {
41781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng        vaStatus = psb_buffer_create(obj_context->driver_data,
41881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng                                     AUX_LINE_BUFFER_VLD_SIZE,
41981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng                                     psb_bt_cpu_vpu,
42081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng                                     &ctx->aux_line_buffer_vld);
42181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng        DEBUG_FAILURE;
42281826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng    }
42381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng
42406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return vaStatus;
42506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
42606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
42706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_DestroyContext(context_DEC_p ctx)
42806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
42906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int i;
43006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->preload_buffer = NULL;
43106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
432feee186c19ae8213aad756baeb51d2fa11f36730Li Zeng    psb_buffer_destroy(&ctx->aux_line_buffer_vld);
433feee186c19ae8213aad756baeb51d2fa11f36730Li Zeng
43406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (ctx->slice_param_list) {
43506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        free(ctx->slice_param_list);
43606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->slice_param_list = NULL;
43706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
43806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
43906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (ctx->colocated_buffers) {
44006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        for (i = 0; i < ctx->colocated_buffers_idx; ++i)
44106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            psb_buffer_destroy(&(ctx->colocated_buffers[i]));
44206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
44306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        free(ctx->colocated_buffers);
44406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->colocated_buffers = NULL;
44506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
44606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
44706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
44806c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_RenderPicture(
44906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    object_context_p obj_context,
45006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    object_buffer_p *buffers,
45106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int num_buffers)
45206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
45306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int i;
45406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    context_DEC_p ctx = (context_DEC_p) obj_context->format_data;
45506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VAStatus vaStatus = VA_STATUS_SUCCESS;
45606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
45706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    for (i = 0; i < num_buffers; i++) {
45806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        object_buffer_p obj_buffer = buffers[i];
45906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__dump_va_buffers_verbose(obj_buffer);
46006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
46106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        switch (obj_buffer->type) {
46206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        case VASliceParameterBufferType:
46306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = vld_dec_add_slice_param(ctx, obj_buffer);
46406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            DEBUG_FAILURE;
46506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            break;
46606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
46706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        case VASliceDataBufferType:
46806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        case VAProtectedSliceDataBufferType:
46906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = vld_dec_process_slice_data(ctx, obj_buffer);
47006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            DEBUG_FAILURE;
47106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            break;
47206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
47306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        default:
47406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = ctx->process_buffer(ctx, obj_buffer);
47506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            DEBUG_FAILURE;
47606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
47706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (vaStatus != VA_STATUS_SUCCESS) {
47806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            break;
47906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
48006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
48106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
48206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return vaStatus;
48306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
48456ada57fd5c4a41fbf281589526d47850bed05fdhding
485a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpevoid vld_dec_yuv_rotate(object_context_p obj_context)
48656ada57fd5c4a41fbf281589526d47850bed05fdhding{
48756ada57fd5c4a41fbf281589526d47850bed05fdhding    VAStatus vaStatus = VA_STATUS_SUCCESS;
48856ada57fd5c4a41fbf281589526d47850bed05fdhding    struct format_vtable_s *vtable = &tng_yuv_processor_vtable;
48956ada57fd5c4a41fbf281589526d47850bed05fdhding    struct surface_param_s surface_param;
49056ada57fd5c4a41fbf281589526d47850bed05fdhding    struct object_buffer_s buffer;
49156ada57fd5c4a41fbf281589526d47850bed05fdhding    object_buffer_p buffer_p = &buffer;
49256ada57fd5c4a41fbf281589526d47850bed05fdhding
493a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe    surface_param.src_surface = obj_context->current_render_target->scaling_surface;
494a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe    surface_param.display_width =	obj_context->current_render_target->buffer_width_s;
495a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe    surface_param.display_height = obj_context->current_render_target->buffer_height_s;
496a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe    surface_param.coded_width = obj_context->current_render_target->width_s;
497a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe    surface_param.coded_height = obj_context->current_render_target->height_s;
49856ada57fd5c4a41fbf281589526d47850bed05fdhding
49956ada57fd5c4a41fbf281589526d47850bed05fdhding    buffer.num_elements = 1;
50056ada57fd5c4a41fbf281589526d47850bed05fdhding    buffer.type = YUVProcessorSurfaceType;
50156ada57fd5c4a41fbf281589526d47850bed05fdhding    buffer.size = sizeof(struct surface_param_s);
502cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    buffer.buffer_data = (unsigned char *)&surface_param;
50356ada57fd5c4a41fbf281589526d47850bed05fdhding
50456ada57fd5c4a41fbf281589526d47850bed05fdhding    vtable->createContext(obj_context, NULL);
50556ada57fd5c4a41fbf281589526d47850bed05fdhding    vtable->beginPicture(obj_context);
50656ada57fd5c4a41fbf281589526d47850bed05fdhding    vtable->renderPicture(obj_context, &buffer_p, 1);
50756ada57fd5c4a41fbf281589526d47850bed05fdhding    vtable->endPicture(obj_context);
50856ada57fd5c4a41fbf281589526d47850bed05fdhding    vtable->destroyContext(obj_context);
50956ada57fd5c4a41fbf281589526d47850bed05fdhding}
510