tng_vld_dec.c revision a7634d944fe745c4061b4b5c0d425cc585b923a2
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
3906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#define GET_SURFACE_INFO_colocated_index(psb_surface) ((int) (psb_surface->extra_info[3]))
4006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#define SET_SURFACE_INFO_colocated_index(psb_surface, val) psb_surface->extra_info[3] = (uint32_t) val;
4106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
4206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/* Set MSVDX Front end register */
4306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_FE_state(object_context_p obj_context, psb_buffer_p buf)
4406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
4506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
4606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    context_DEC_p ctx = (context_DEC_p) obj_context->format_data;
4706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    CTRL_ALLOC_HEADER *cmd_header = (CTRL_ALLOC_HEADER *)psb_cmdbuf_alloc_space(cmdbuf, sizeof(CTRL_ALLOC_HEADER));
4806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
4906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32Cmd_AdditionalParams = CMD_CTRL_ALLOC_HEADER;
5006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32ExternStateBuffAddr = 0;
5106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (buf)
5206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        RELOC(cmd_header->ui32ExternStateBuffAddr, 0, buf);
5306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32MacroblockParamAddr = 0; /* Only EC needs to set this */
5406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
5506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->cmd_params = &cmd_header->ui32Cmd_AdditionalParams;
5606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->p_slice_params = &cmd_header->ui32SliceParams;
5706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32SliceParams = 0;
5806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
5906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_first_pic_last = &cmd_header->uiSliceFirstMbYX_uiPicLastMbYX;
6056ada57fd5c4a41fbf281589526d47850bed05fdhding    *ctx->slice_first_pic_last = 0;
6106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
6206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->p_range_mapping_base0 = &cmd_header->ui32AltOutputAddr[0];
6306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->p_range_mapping_base1 = &cmd_header->ui32AltOutputAddr[1];
6406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
6506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->alt_output_flags = &cmd_header->ui32AltOutputFlags;
6606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
6706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32AltOutputFlags = 0;
6806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32AltOutputAddr[0] = 0;
6906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd_header->ui32AltOutputAddr[1] = 0;
7006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
7106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
7206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/* Programme the Alt output if there is a rotation*/
7306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_setup_alternative_frame(object_context_p obj_context)
7406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
7506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    uint32_t cmd = 0;
7606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
7706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    context_DEC_p ctx = (context_DEC_p) obj_context->format_data;
7881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng    psb_surface_p src_surface = obj_context->current_render_target->psb_surface;
794d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng    psb_surface_p out_loop_surface = obj_context->current_render_target->out_loop_surface;
804d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng    int ved_scaling = (CONTEXT_SCALING(obj_context) && !ctx->yuv_ctx);
81a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe    uint32_t startX = 0, startY = 0, luma_addr_offset = 0, chroma_addr_offset = 0;
8206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
8381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng    /*  In VPP ctx, current_render_target is rotated surface */
844d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng    if (ctx->yuv_ctx && (VAEntrypointVideoProc == obj_context->entry_point)) {
85925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Setup second-pass rotation\n");
86925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix        out_loop_surface = src_surface;
8781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng        src_surface = ctx->yuv_ctx->src_surface;
8881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng    }
8981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng
9039eff7a021afd8ec1a6f375dbc6476cbaa485d5dLi Zeng    if (CONTEXT_ALTERNATIVE_OUTPUT(obj_context) || obj_context->entry_point == VAEntrypointVideoProc) {
914d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng        if (ved_scaling) {
924d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng            out_loop_surface = obj_context->current_render_target->scaling_surface;
934d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng#ifndef BAYTRAIL
944d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng            tng_ved_write_scale_reg(obj_context);
954d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng
964d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng            REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS,ALTERNATIVE_OUTPUT_PICTURE_ROTATION, SCALE_INPUT_SIZE_SEL, 1);
974d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng            REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS,ALTERNATIVE_OUTPUT_PICTURE_ROTATION, SCALE_ENABLE, 1);
984d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng#endif
99a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe        } else {
100a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe            startX = ((uint32_t)obj_context->current_render_target->offset_x_s + 0x3f) & ~0x3f;
101a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe            startY = ((uint32_t)obj_context->current_render_target->offset_y_s + 0x1) & ~0x1;
102a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe            luma_addr_offset = (((uint32_t)(startX + out_loop_surface->stride * startY))  + 0x3f ) & ~0x3f;
103a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe            chroma_addr_offset = (((uint32_t)(startX + out_loop_surface->stride * startY / 2))  + 0x3f ) & ~0x3f;
1044d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng        }
1054d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng
106925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix        if (out_loop_surface == NULL) {
107a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe            drv_debug_msg(VIDEO_DEBUG_ERROR, "out-loop surface is NULL, abort msvdx alternative output\n");
10806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            return;
10906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
11006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
1114d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng        if (GET_SURFACE_INFO_rotate(out_loop_surface) != obj_context->msvdx_rotate && !ved_scaling)
112925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix            drv_debug_msg(VIDEO_DEBUG_WARNING, "Display rotate mode does not match surface rotate mode!\n");
11306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
11406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        /* CRendecBlock    RendecBlk( mCtrlAlloc , RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS) ); */
11506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS));
11606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
117a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe        psb_cmdbuf_rendec_write_address(cmdbuf, &out_loop_surface->buf, out_loop_surface->buf.buffer_ofs + luma_addr_offset);
118a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe        psb_cmdbuf_rendec_write_address(cmdbuf, &out_loop_surface->buf, out_loop_surface->buf.buffer_ofs + chroma_addr_offset + out_loop_surface->chroma_offset);
11906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
12006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb_cmdbuf_rendec_end(cmdbuf);
12106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
12206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ALT_PICTURE_ENABLE, 1);
123925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_ROW_STRIDE, out_loop_surface->stride_mode);
12406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , RECON_WRITE_DISABLE, 0); /* FIXME Always generate Rec */
125925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_MODE, GET_SURFACE_INFO_rotate(out_loop_surface));
12606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
127a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe        RELOC(*ctx->p_range_mapping_base0, out_loop_surface->buf.buffer_ofs + luma_addr_offset, &out_loop_surface->buf);
128a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe        RELOC(*ctx->p_range_mapping_base1, out_loop_surface->buf.buffer_ofs + chroma_addr_offset + out_loop_surface->chroma_offset, &out_loop_surface->buf);
12906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
13006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
13106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (obj_context->profile == VAProfileVP8Version0_3 ||
13256ada57fd5c4a41fbf281589526d47850bed05fdhding        obj_context->profile == VAProfileJPEGBaseline || ctx->yuv_ctx) {
13306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb_cmdbuf_rendec_start(cmdbuf, (REG_MSVDX_CMD_OFFSET + MSVDX_CMDS_AUX_LINE_BUFFER_BASE_ADDRESS_OFFSET));
13406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->aux_line_buffer_vld, ctx->aux_line_buffer_vld.buffer_ofs);
13506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb_cmdbuf_rendec_end(cmdbuf);
13606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
13706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION, USE_AUX_LINE_BUF, 1);
13856ada57fd5c4a41fbf281589526d47850bed05fdhding        if (ctx->yuv_ctx)
13956ada57fd5c4a41fbf281589526d47850bed05fdhding            REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , RECON_WRITE_DISABLE, 1);
14006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
14106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
14206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    /* Set the rotation registers */
14306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION));
14406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_rendec_write(cmdbuf, cmd);
14506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    *ctx->alt_output_flags = cmd;
14606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
14706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    cmd = 0;
14881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng    REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, EXTENDED_ROW_STRIDE, EXT_ROW_STRIDE, src_surface->stride / 64);
14906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_rendec_write(cmdbuf, cmd);
15006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
15106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_rendec_end(cmdbuf);
15206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
15306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
15406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengint vld_dec_slice_parameter_size(object_context_p obj_context)
15506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
15606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int size;
15706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
15806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    switch (obj_context->profile) {
15906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileMPEG2Simple:
16006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileMPEG2Main:
16106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        size = sizeof(VASliceParameterBufferMPEG2);
16206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        break;
16306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileMPEG4Simple:
16406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileMPEG4AdvancedSimple:
16506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileMPEG4Main:
16606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileH263Baseline:
16706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        size = sizeof(VASliceParameterBufferMPEG4);
16806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        break;
16906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileH264Baseline:
17006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileH264Main:
17106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileH264High:
17206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileH264ConstrainedBaseline:
17306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        size = sizeof(VASliceParameterBufferH264);
17406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        break;
17506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileVC1Simple:
17606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileVC1Main:
17706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileVC1Advanced:
17806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        size = sizeof(VASliceParameterBufferVC1);
17906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        break;
18006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileVP8Version0_3:
181d4b3bda95f2efc571b057ca9ece5ea076a55cdb0Tianmi Chen        size = sizeof(VASliceParameterBufferVP8);
18206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAProfileJPEGBaseline:
183a52334a05d2be04432b1f8b2bccf9e90768a218aNana GUo        size = sizeof(VASliceParameterBufferJPEGBaseline);
18406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    default:
18506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        size = 0;
18606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        break;
18706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
18806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
18906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return size;
19006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
19106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
19206c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_process_slice_data(context_DEC_p ctx, object_buffer_p obj_buffer)
19306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
19406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VAStatus vaStatus = VA_STATUS_SUCCESS;
19506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    void *slice_param;
19606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int buffer_idx = 0;
19706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    unsigned int element_idx = 0, element_size;
19806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
19906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType));
20006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
20106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ASSERT(ctx->pic_params);
20206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ASSERT(ctx->slice_param_list_idx);
20306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
20406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#if 0
20506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (!ctx->pic_params) {
20606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        /* Picture params missing */
20706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        return VA_STATUS_ERROR_UNKNOWN;
20806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
20906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#endif
21006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if ((NULL == obj_buffer->psb_buffer) ||
21106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        (0 == obj_buffer->size)) {
21206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        /* We need to have data in the bitstream buffer */
21306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        return VA_STATUS_ERROR_UNKNOWN;
21406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
21506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
21606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    element_size = vld_dec_slice_parameter_size(ctx->obj_context);
21706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
21806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    while (buffer_idx < ctx->slice_param_list_idx) {
21906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        object_buffer_p slice_buf = ctx->slice_param_list[buffer_idx];
22006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (element_idx >= slice_buf->num_elements) {
22106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            /* Move to next buffer */
22206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            element_idx = 0;
22306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            buffer_idx++;
22406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            continue;
22506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
22606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
22706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        slice_param = slice_buf->buffer_data;
22806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        slice_param += element_idx * element_size;
22906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        element_idx++;
23006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vaStatus = vld_dec_process_slice(ctx, slice_param, obj_buffer);
23106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (vaStatus != VA_STATUS_SUCCESS) {
23206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            DEBUG_FAILURE;
23306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            break;
23406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
23506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
23606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_param_list_idx = 0;
23706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
23806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return vaStatus;
23906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
24006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng/*
24106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng * Adds a VASliceParameterBuffer to the list of slice params
24206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng */
24306c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_add_slice_param(context_DEC_p ctx, object_buffer_p obj_buffer)
24406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
24506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ASSERT(obj_buffer->type == VASliceParameterBufferType);
24606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (ctx->slice_param_list_idx >= ctx->slice_param_list_size) {
24706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        unsigned char *new_list;
24806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->slice_param_list_size += 8;
24906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        new_list = realloc(ctx->slice_param_list,
25006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                           sizeof(object_buffer_p) * ctx->slice_param_list_size);
25106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (NULL == new_list) {
25206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            return VA_STATUS_ERROR_ALLOCATION_FAILED;
25306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
25406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->slice_param_list = (object_buffer_p*) new_list;
25506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
25606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_param_list[ctx->slice_param_list_idx] = obj_buffer;
25706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_param_list_idx++;
25806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return VA_STATUS_SUCCESS;
25906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
26006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
26106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_write_kick(object_context_p obj_context)
26206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
26306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
26406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    *cmdbuf->cmd_idx++ = CMD_COMPLETION;
26506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
26606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
26706c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_process_slice(context_DEC_p ctx,
26806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                        void *vld_slice_param,
26906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                        object_buffer_p obj_buffer)
27006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
27106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VAStatus vaStatus = VA_STATUS_SUCCESS;
27206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VASliceParameterBufferBase *slice_param = (VASliceParameterBufferBase *) vld_slice_param;
27306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
27406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType));
27506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
27606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) ||
27706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL)) {
278e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifndef SLICE_HEADER_PARSING
27906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (0 == slice_param->slice_data_size) {
28006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = VA_STATUS_ERROR_UNKNOWN;
28106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            DEBUG_FAILURE;
28206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            return vaStatus;
28306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
284e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif
28506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ASSERT(!ctx->split_buffer_pending);
28606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
28706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (psb_context_get_next_cmdbuf(ctx->obj_context)) {
28806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = VA_STATUS_ERROR_UNKNOWN;
28906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            DEBUG_FAILURE;
29006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            return vaStatus;
29106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
29206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vld_dec_FE_state(ctx->obj_context, ctx->preload_buffer);
2931b8d958031a6ae24789addf7ff073316b89aff87Nana GUo        ctx->begin_slice(ctx, slice_param);
29406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->slice_data_buffer = obj_buffer->psb_buffer;
295e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifdef SLICE_HEADER_PARSING
296e853beb775a5de607bd080d7d43e638f95199e68Nana GUo        if (ctx->parse_enabled == 1)
297e853beb775a5de607bd080d7d43e638f95199e68Nana GUo            psb_cmdbuf_dma_write_key(ctx->obj_context->cmdbuf,
298e853beb775a5de607bd080d7d43e638f95199e68Nana GUo                                         ctx->SR_flags,
299e853beb775a5de607bd080d7d43e638f95199e68Nana GUo                                         ctx->parse_key);
300e853beb775a5de607bd080d7d43e638f95199e68Nana GUo        else
301e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif
302e853beb775a5de607bd080d7d43e638f95199e68Nana GUo            psb_cmdbuf_dma_write_bitstream(ctx->obj_context->cmdbuf,
30306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                         obj_buffer->psb_buffer,
30406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                         obj_buffer->psb_buffer->buffer_ofs + slice_param->slice_data_offset,
30506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                         slice_param->slice_data_size,
30606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                         ctx->bits_offset,
30706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                                         ctx->SR_flags);
30806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
30906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) {
31006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            ctx->split_buffer_pending = TRUE;
31106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
31206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    } else {
31306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ASSERT(ctx->split_buffer_pending);
31406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ASSERT(0 == slice_param->slice_data_offset);
31506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (slice_param->slice_data_size) {
31606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            psb_cmdbuf_dma_write_bitstream_chained(ctx->obj_context->cmdbuf,
31706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                    obj_buffer->psb_buffer,
31806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                    slice_param->slice_data_size);
31906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
32006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
32106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
32206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL) ||
32306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END)) {
32406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END) {
32506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            ASSERT(ctx->split_buffer_pending);
32606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
32706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
32806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->process_slice(ctx, slice_param);
32906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vld_dec_write_kick(ctx->obj_context);
33006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
33106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->split_buffer_pending = FALSE;
33206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->obj_context->video_op = psb_video_vld;
33306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->obj_context->flags = 0;
33406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
33506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->end_slice(ctx);
33606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
33706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (psb_context_submit_cmdbuf(ctx->obj_context)) {
33806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = VA_STATUS_ERROR_UNKNOWN;
33906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
34006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
34106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return vaStatus;
34206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
34306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
34406c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_allocate_colocated_buffer(context_DEC_p ctx, object_surface_p obj_surface, uint32_t size)
34506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
34606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_buffer_p buf;
34706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VAStatus vaStatus;
34806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb_surface_p surface = obj_surface->psb_surface;
34906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int index = GET_SURFACE_INFO_colocated_index(surface);
35006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
35106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (!index) {
35206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        index = ctx->colocated_buffers_idx;
35306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (index >= ctx->colocated_buffers_size) {
35406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            return VA_STATUS_ERROR_UNKNOWN;
35506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
35606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
35706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocating colocated buffer for surface %08x size = %08x\n", surface, size);
35806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
35906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        buf = &(ctx->colocated_buffers[index]);
36006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vaStatus = psb_buffer_create(ctx->obj_context->driver_data, size, psb_bt_vpu_only, buf);
36106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (VA_STATUS_SUCCESS != vaStatus) {
36206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            return vaStatus;
36306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
36406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->colocated_buffers_idx++;
36506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        SET_SURFACE_INFO_colocated_index(surface, index + 1); /* 0 means unset, index is offset by 1 */
36606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    } else {
36706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        buf = &(ctx->colocated_buffers[index - 1]);
36806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (buf->size < size) {
36906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            psb_buffer_destroy(buf);
37006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = psb_buffer_create(ctx->obj_context->driver_data, size, psb_bt_vpu_only, buf);
37106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            if (VA_STATUS_SUCCESS != vaStatus) {
37206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng                return vaStatus;
37306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            }
37406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            SET_SURFACE_INFO_colocated_index(surface, index); /* replace the original buffer */
37506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
37606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
37706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return VA_STATUS_SUCCESS;
37806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
37906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
38006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengpsb_buffer_p vld_dec_lookup_colocated_buffer(context_DEC_p ctx, psb_surface_p surface)
38106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
38206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int index = GET_SURFACE_INFO_colocated_index(surface);
38306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (!index) {
38406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        return NULL;
38506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
38606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return &(ctx->colocated_buffers[index-1]); /* 0 means unset, index is offset by 1 */
38706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
38806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
38906c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_CreateContext(context_DEC_p ctx, object_context_p obj_context)
39006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
39106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VAStatus vaStatus = VA_STATUS_SUCCESS;
39206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
39306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->obj_context = obj_context;
39406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->split_buffer_pending = FALSE;
39506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_param_list_size = 8;
39606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_param_list = (object_buffer_p*) calloc(1, sizeof(object_buffer_p) * ctx->slice_param_list_size);
39706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->slice_param_list_idx = 0;
39806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
39906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (NULL == ctx->slice_param_list) {
40006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
40106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        DEBUG_FAILURE;
40206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        return vaStatus;
40306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
40406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
40506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->colocated_buffers_size = obj_context->num_render_targets;
40606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->colocated_buffers_idx = 0;
40706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->colocated_buffers = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s) * ctx->colocated_buffers_size);
40806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (NULL == ctx->colocated_buffers) {
40906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
41006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        DEBUG_FAILURE;
41106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        free(ctx->slice_param_list);
41206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
41381826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng
41481826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng    if (vaStatus == VA_STATUS_SUCCESS) {
41581826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng        vaStatus = psb_buffer_create(obj_context->driver_data,
41681826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng                                     AUX_LINE_BUFFER_VLD_SIZE,
41781826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng                                     psb_bt_cpu_vpu,
41881826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng                                     &ctx->aux_line_buffer_vld);
41981826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng        DEBUG_FAILURE;
42081826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng    }
42181826d3ab4c9cf28ea853f1545042aa53a0f0abfLi Zeng
42206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return vaStatus;
42306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
42406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
42506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengvoid vld_dec_DestroyContext(context_DEC_p ctx)
42606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
42706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int i;
42806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->preload_buffer = NULL;
42906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
430feee186c19ae8213aad756baeb51d2fa11f36730Li Zeng    psb_buffer_destroy(&ctx->aux_line_buffer_vld);
431feee186c19ae8213aad756baeb51d2fa11f36730Li Zeng
43206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (ctx->slice_param_list) {
43306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        free(ctx->slice_param_list);
43406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->slice_param_list = NULL;
43506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
43606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
43706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (ctx->colocated_buffers) {
43806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        for (i = 0; i < ctx->colocated_buffers_idx; ++i)
43906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            psb_buffer_destroy(&(ctx->colocated_buffers[i]));
44006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
44106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        free(ctx->colocated_buffers);
44206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->colocated_buffers = NULL;
44306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
44406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
44506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
44606c7c30796be2e6b18a6263956a0ca308616ecdeLi ZengVAStatus vld_dec_RenderPicture(
44706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    object_context_p obj_context,
44806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    object_buffer_p *buffers,
44906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int num_buffers)
45006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
45106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    int i;
45206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    context_DEC_p ctx = (context_DEC_p) obj_context->format_data;
45306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VAStatus vaStatus = VA_STATUS_SUCCESS;
45406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
45506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    for (i = 0; i < num_buffers; i++) {
45606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        object_buffer_p obj_buffer = buffers[i];
45706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__dump_va_buffers_verbose(obj_buffer);
45806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
45906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        switch (obj_buffer->type) {
46006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        case VASliceParameterBufferType:
46106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = vld_dec_add_slice_param(ctx, obj_buffer);
46206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            DEBUG_FAILURE;
46306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            break;
46406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
46506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        case VASliceDataBufferType:
46606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        case VAProtectedSliceDataBufferType:
46706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = vld_dec_process_slice_data(ctx, obj_buffer);
46806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            DEBUG_FAILURE;
46906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            break;
47006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
47106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        default:
47206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            vaStatus = ctx->process_buffer(ctx, obj_buffer);
47306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            DEBUG_FAILURE;
47406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
47506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        if (vaStatus != VA_STATUS_SUCCESS) {
47606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            break;
47706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        }
47806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
47906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
48006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    return vaStatus;
48106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
48256ada57fd5c4a41fbf281589526d47850bed05fdhding
483a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpevoid vld_dec_yuv_rotate(object_context_p obj_context)
48456ada57fd5c4a41fbf281589526d47850bed05fdhding{
48556ada57fd5c4a41fbf281589526d47850bed05fdhding    VAStatus vaStatus = VA_STATUS_SUCCESS;
48656ada57fd5c4a41fbf281589526d47850bed05fdhding    struct format_vtable_s *vtable = &tng_yuv_processor_vtable;
48756ada57fd5c4a41fbf281589526d47850bed05fdhding    struct surface_param_s surface_param;
48856ada57fd5c4a41fbf281589526d47850bed05fdhding    struct object_buffer_s buffer;
48956ada57fd5c4a41fbf281589526d47850bed05fdhding    object_buffer_p buffer_p = &buffer;
49056ada57fd5c4a41fbf281589526d47850bed05fdhding
491a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe    surface_param.src_surface = obj_context->current_render_target->scaling_surface;
492a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe    surface_param.display_width =	obj_context->current_render_target->buffer_width_s;
493a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe    surface_param.display_height = obj_context->current_render_target->buffer_height_s;
494a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe    surface_param.coded_width = obj_context->current_render_target->width_s;
495a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe    surface_param.coded_height = obj_context->current_render_target->height_s;
49656ada57fd5c4a41fbf281589526d47850bed05fdhding
49756ada57fd5c4a41fbf281589526d47850bed05fdhding    buffer.num_elements = 1;
49856ada57fd5c4a41fbf281589526d47850bed05fdhding    buffer.type = YUVProcessorSurfaceType;
49956ada57fd5c4a41fbf281589526d47850bed05fdhding    buffer.size = sizeof(struct surface_param_s);
50056ada57fd5c4a41fbf281589526d47850bed05fdhding    buffer.buffer_data = &surface_param;
50156ada57fd5c4a41fbf281589526d47850bed05fdhding
50256ada57fd5c4a41fbf281589526d47850bed05fdhding    vtable->createContext(obj_context, NULL);
50356ada57fd5c4a41fbf281589526d47850bed05fdhding    vtable->beginPicture(obj_context);
50456ada57fd5c4a41fbf281589526d47850bed05fdhding    vtable->renderPicture(obj_context, &buffer_p, 1);
50556ada57fd5c4a41fbf281589526d47850bed05fdhding    vtable->endPicture(obj_context);
50656ada57fd5c4a41fbf281589526d47850bed05fdhding    vtable->destroyContext(obj_context);
50756ada57fd5c4a41fbf281589526d47850bed05fdhding}
508