17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK
47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a
6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the
7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including
8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish,
9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to
10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to
11f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions:
123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the
14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions
15f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software.
163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *
25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors:
26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Zeng Li <zeng.li@intel.com>
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Shengquan Yuan  <shengquan.yuan@intel.com>
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Binglin Chen <binglin.chen@intel.com>
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h"
337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_surface.h"
347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_cmdbuf.h"
357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "lnc_H263ES.h"
367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "lnc_hostheader.h"
372befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "lnc_hostcode.h"
38f31d5416a60f83e184b0906a7ec77ba021840531hding#include "psb_drv_debug.h"
397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h>
417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdint.h>
427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h>
437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define TOPAZ_H263_MAX_BITRATE 16000000
467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define INIT_CONTEXT_H263ES    context_ENC_p ctx = (context_ENC_p) (obj_context->format_data)
487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SURFACE(id)    ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id ))
497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define BUFFER(id)  ((object_buffer_p) object_heap_lookup( &ctx->obj_context->driver_data->buffer_heap, id ))
507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc_H263ES_QueryConfigAttributes(
537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAProfile profile,
547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAEntrypoint entrypoint,
557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAConfigAttrib *attrib_list,
56dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int num_attribs)
577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
59c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_QueryConfigAttributes\n");
607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* RateControl attributes */
627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for (i = 0; i < num_attribs; i++) {
637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        switch (attrib_list[i].type) {
647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        case VAConfigAttribRTFormat:
657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        case VAConfigAttribRateControl:
687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            attrib_list[i].value = VA_RC_NONE | VA_RC_CBR | VA_RC_VBR;
697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#if 0
71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAConfigAttribEncMaxSliceSize:
72dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            attrib_list[i].value = 0;
73dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#endif
757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        default:
767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H263ES_ValidateConfig(
85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
87242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    int i;
88242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    /* Check all attributes */
89242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    for (i = 0; i < obj_config->attrib_count; i++) {
903f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        switch (obj_config->attrib_list[i].type) {
913f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        case VAConfigAttribRTFormat:
923f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            /* Ignore */
933f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            break;
943f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        case VAConfigAttribRateControl:
953f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            break;
963f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        default:
973f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
983f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        }
993f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    }
100242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang
101242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    return VA_STATUS_SUCCESS;
1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H263ES_CreateContext(
1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_context_p obj_context,
107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int eRCmode;
1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    context_ENC_p ctx;
1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
114c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_CreateContext\n");
1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaStatus = lnc_CreateContext(obj_context, obj_config);/* alloc context_ENC_s and BO */
1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus)
1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx = (context_ENC_p) obj_context->format_data;
1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1232f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    ctx->max_slice_size = 0;
1242f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    eRCmode = VA_RC_NONE;
1252f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < obj_config->attrib_count; i++) {
1272f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#if 0
128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (obj_config->attrib_list[i].type == VAConfigAttribEncMaxSliceSize)
129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->max_slice_size = obj_config->attrib_list[i].value;
130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else if (obj_config->attrib_list[i].type == VAConfigAttribRateControl)
131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            eRCmode = obj_config->attrib_list[i].value;
1322f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#else
133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (obj_config->attrib_list[i].type == VAConfigAttribRateControl)
134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            eRCmode = obj_config->attrib_list[i].value;
1352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#endif
1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (eRCmode == VA_RC_VBR) {
1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->eCodec = IMG_CODEC_H263_VBR;
1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->sRCParams.RCEnable = IMG_TRUE;
141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (eRCmode == VA_RC_CBR) {
1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->eCodec = IMG_CODEC_H263_CBR;
1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->sRCParams.RCEnable = IMG_TRUE;
144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (eRCmode == VA_RC_NONE) {
1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->eCodec = IMG_CODEC_H263_NO_RC;
1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->sRCParams.RCEnable = IMG_FALSE;
147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else
1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->eFormat = IMG_CODEC_PL12;
1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->IPEControl = lnc__get_ipe_control(ctx->eCodec);
1522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
1532f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    ctx->OptionalCustomPCF = 0;
154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc_H263ES_DestroyContext(
1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_context_p obj_context)
1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
165c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_DestroyContext\n");
1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc_DestroyContext(obj_context);
1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H263ES_BeginPicture(
1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_context_p obj_context)
1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_CONTEXT_H263ES;
1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
177c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_BeginPicture\n");
1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaStatus = lnc_BeginPicture(ctx);
1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc__H263ES_process_sequence_param(context_ENC_p ctx, object_buffer_p obj_buffer)
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * process rate control parameters
1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAEncSequenceParameterBufferH263 *pSequenceParams;
1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->type == VAEncSequenceParameterBufferType);
1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->num_elements == 1);
1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->size == sizeof(VAEncSequenceParameterBufferH263));
1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((obj_buffer->num_elements != 1) ||
197bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (obj_buffer->size != sizeof(VAEncSequenceParameterBufferH263))) {
1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_UNKNOWN;
1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pSequenceParams = (VAEncSequenceParameterBufferH263 *) obj_buffer->buffer_data;
2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->buffer_data = NULL;
2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->size = 0;
2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2052f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    if ((ctx->obj_context->frame_count != 0) &&
206bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (ctx->sRCParams.BitsPerSecond != pSequenceParams->bits_per_second))
207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->update_rc_control = 1;
208dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSequenceParams->bits_per_second > TOPAZ_H263_MAX_BITRATE) {
210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->sRCParams.BitsPerSecond = TOPAZ_H263_MAX_BITRATE;
211c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \
212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun		the maximum bitrate, set it with %d\n",
213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 pSequenceParams->bits_per_second,
214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 TOPAZ_H263_MAX_BITRATE);
215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else
216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->sRCParams.BitsPerSecond = pSequenceParams->bits_per_second;
217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSequenceParams->initial_qp < 3)
219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pSequenceParams->initial_qp = 3;
2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->sRCParams.FrameRate = pSequenceParams->frame_rate;
2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->sRCParams.InitialQp = pSequenceParams->initial_qp;
2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->sRCParams.MinQP = pSequenceParams->min_qp;
2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->sRCParams.BUSize = 0; /* default 0, and will be set in lnc__setup_busize */
2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT16 MBRows = 0;
228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->Height <= 400)
2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        MBRows = 1;
2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else if (ctx->Height < 800)
2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        MBRows = 2;
2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->sRCParams.Slices = (ctx->Height + 15) >> (4 + (MBRows >> 1));
2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->sRCParams.IntraFreq = pSequenceParams->intra_period;
2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    free(pSequenceParams);
2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Work done by the followinig funcs in testbench should be done here.
2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * IMG_C_StartPicture()
2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * IMG_C_InsertSync()
2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * APP_H263_SendPictureHeader()
2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Frame skip must be taken into consideration
2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * */
2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc__H263ES_process_picture_param(context_ENC_p ctx, object_buffer_p obj_buffer)
2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus;
2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAEncPictureParameterBufferH263 *pBuffer;
2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc_cmdbuf_p cmdbuf = ctx->obj_context->lnc_cmdbuf;
2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H263_SOURCE_FORMAT_TYPE SourceFormatType;
2547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->type == VAEncPictureParameterBufferType);
2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((obj_buffer->num_elements != 1) ||
258bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (obj_buffer->size != sizeof(VAEncPictureParameterBufferH263))) {
2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_UNKNOWN;
2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Transfer ownership of VAEncPictureParameterBufferH263 data */
2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pBuffer = (VAEncPictureParameterBufferH263 *) obj_buffer->buffer_data;
2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->buffer_data = NULL;
2657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->size = 0;
2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->ref_surface = SURFACE(pBuffer->reference_picture);
2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->dest_surface = SURFACE(pBuffer->reconstructed_picture);
2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->coded_buf = BUFFER(pBuffer->coded_buf);
2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(ctx->Width == pBuffer->picture_width);
2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(ctx->Height == pBuffer->picture_height);
2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Insert do_header command here */
2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((ctx->Width == 128) && (ctx->Height == 96))
2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        SourceFormatType = _128x96_SubQCIF;
278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    else if ((ctx->Width == 176) && (ctx->Height == 144))
2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        SourceFormatType = _176x144_QCIF;
280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    else if ((ctx->Width == 352) && (ctx->Height == 288))
2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        SourceFormatType = _352x288_CIF;
282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    else if ((ctx->Width == 704) && (ctx->Height == 576))
2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        SourceFormatType = _704x576_4CIF;
284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    else if ((ctx->Width <= 720) && (ctx->Height <= 576))
2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        SourceFormatType = 7;
286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    else {
287c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Unsupported resolution!\n");
2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* save current cmdbuf write pointer for H263 frameskip redo
2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * for H263, for a skipped frame, picture header/slice header both needn't
2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx_saved_frameskip = cmdbuf->cmd_idx;
2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!(ctx->sRCParams.RCEnable && ctx->sRCParams.FrameSkip)) {
296e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        lnc__H263_prepare_picture_header((IMG_UINT32 *)(cmdbuf->header_mem_p + ctx->pic_header_ofs),
2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                         ctx->obj_context->frame_count,
2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                         pBuffer->picture_type,
2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                         SourceFormatType,
3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                         ctx->sRCParams.FrameRate,
3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                         ctx->Width,
3022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang                                         ctx->Height,
303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                         &ctx->OptionalCustomPCF);
304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, 1);
3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->pic_header_ofs, &cmdbuf->header_mem);
3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaStatus = lnc_RenderPictureParameter(ctx);
3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    free(pBuffer);
3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc__H263ES_process_slice_param(context_ENC_p ctx, object_buffer_p obj_buffer)
3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Prepare InParams for macros of current slice, insert slice header, insert do slice command */
3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAEncSliceParameterBuffer *pBuffer;
320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_cmdbuf_p cmdbuf = ctx->obj_context->lnc_cmdbuf;
3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    PIC_PARAMS *psPicParams = (PIC_PARAMS *)(cmdbuf->pic_params_p);
322e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned int i;
3234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int slice_param_idx;
3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->type == VAEncSliceParameterBufferType);
326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* do nothing for skip frame if RC enabled */
3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((ctx->sRCParams.RCEnable && ctx->sRCParams.FrameSkip)) {
329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(obj_buffer->buffer_data);
330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        obj_buffer->buffer_data = NULL;
3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_SUCCESS;
3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Transfer ownership of VAEncPictureParameterBufferH263 data */
3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pBuffer = (VAEncSliceParameterBuffer *) obj_buffer->buffer_data;
3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->size = 0;
337dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
338dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (0 == pBuffer->start_row_number) {
339dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pBuffer->slice_flags.bits.is_intra)
340dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            RELOC_PIC_PARAMS(&psPicParams->InParamsBase, ctx->in_params_ofs, cmdbuf->topaz_in_params_I);
341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else
342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            RELOC_PIC_PARAMS(&psPicParams->InParamsBase, ctx->in_params_ofs, cmdbuf->topaz_in_params_P);
3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*In case the slice number changes*/
346dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((ctx->slice_param_cache != NULL) && (obj_buffer->num_elements != ctx->slice_param_num)) {
347c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Slice number changes. Previous value is %d. Now it's %d\n",
348dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 ctx->slice_param_num, obj_buffer->num_elements);
349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(ctx->slice_param_cache);
350dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_cache = NULL;
351dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_num = 0;
3524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
3534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
354dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx->slice_param_cache) {
355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_num = obj_buffer->num_elements;
356c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate %d VAEncSliceParameterBuffer cache buffers\n", 2 * ctx->slice_param_num);
357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_cache = calloc(2 * ctx->slice_param_num, sizeof(VAEncSliceParameterBuffer));
358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (NULL == ctx->slice_param_cache) {
359c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "Run out of memory!\n");
360dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(obj_buffer->buffer_data);
361dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_ALLOCATION_FAILED;
362dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
365dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < obj_buffer->num_elements; i++) {
366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /*Todo list:
367dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             *1.Insert Do header command
368dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             *2.setup InRowParams
369dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             *3.setup Slice params
370dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             *4.Insert Do slice command
371dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             * */
372dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Insert Do Header command, relocation is needed */
374dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->obj_context->slice_count) {  /*First slice of a frame need not slice header*/
375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc__H263_prepare_GOBslice_header(
376e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang                (IMG_UINT32 *)(cmdbuf->header_mem_p + ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE),
377dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->obj_context->slice_count,
378dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->obj_context->frame_count);
379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
380dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, (ctx->obj_context->slice_count << 2) | 2);
3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            RELOC_CMDBUF(cmdbuf->cmd_idx++,
3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                         ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE,
3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                         &cmdbuf->header_mem);
3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((ctx->obj_context->frame_count == 0) && (pBuffer->start_row_number == 0) && pBuffer->slice_flags.bits.is_intra)
387dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc_reset_encoder_params(ctx);
388dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /*The corresponding slice buffer cache*/
390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        slice_param_idx = (pBuffer->slice_flags.bits.is_intra ? 0 : 1) * ctx->slice_param_num + i;
391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (VAEncSliceParameter_Equal(&ctx->slice_param_cache[slice_param_idx], pBuffer) == 0) {
393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* cache current param parameters */
394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            memcpy(&ctx->slice_param_cache[slice_param_idx],
395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   pBuffer, sizeof(VAEncSliceParameterBuffer));
396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* Setup InParams value*/
398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc_setup_slice_params(ctx,
399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   pBuffer->start_row_number * 16,
400bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                   pBuffer->slice_height * 16,
401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   pBuffer->slice_flags.bits.is_intra,
402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   ctx->obj_context->frame_count > 0,
403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   psPicParams->sInParams.SeInitQP);
404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
406dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* Insert do slice command and setup related buffer value */
4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        lnc__send_encode_slice_params(ctx,
4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      pBuffer->slice_flags.bits.is_intra,
4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      pBuffer->start_row_number * 16,
4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      0, /* no deblock for H263 */
4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      ctx->obj_context->frame_count,
412bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                      pBuffer->slice_height * 16,
4132f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang                                      ctx->obj_context->slice_count,
414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                      ctx->max_slice_size);
415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
416c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Now frame_count/slice_count is %d/%d\n",
4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 ctx->obj_context->frame_count, ctx->obj_context->slice_count);
4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->obj_context->slice_count++;
420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pBuffer++;        /*Move to the next buffer*/
4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(ctx->obj_context->slice_count < MAX_SLICES_PER_PICTURE);
4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    free(obj_buffer->buffer_data);
4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->buffer_data = NULL;
4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4302f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiangstatic VAStatus lnc__H263ES_process_misc_param(context_ENC_p ctx, object_buffer_p obj_buffer)
4312f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{
4322f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /* Prepare InParams for macros of current slice, insert slice header, insert do slice command */
4332f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    VAEncMiscParameterBuffer *pBuffer;
4344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VAEncMiscParameterRateControl *rate_control_param;
4352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    VAEncMiscParameterAIR *air_param;
4362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    VAEncMiscParameterMaxSliceSize *max_slice_size_param;
4372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    VAEncMiscParameterFrameRate *frame_rate_param;
4382f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
4392f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
4402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
4412f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    ASSERT(obj_buffer->type == VAEncMiscParameterBufferType);
4422f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
4434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pBuffer = (VAEncMiscParameterBuffer *) obj_buffer->buffer_data;
4442f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    obj_buffer->size = 0;
4452f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
4462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    switch (pBuffer->type) {
4472f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    case VAEncMiscParameterTypeFrameRate:
448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        frame_rate_param = (VAEncMiscParameterFrameRate *)pBuffer->data;
449c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: frame rate changed to %d\n",
450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 frame_rate_param->framerate);
451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
4522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
4534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    case VAEncMiscParameterTypeRateControl:
454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        rate_control_param = (VAEncMiscParameterRateControl *)pBuffer->data;
455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
456c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: bit rate changed to %d\n",
457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 rate_control_param->bits_per_second);
458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (rate_control_param->bits_per_second == ctx->sRCParams.BitsPerSecond)
460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else
462dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->update_rc_control = 1;
463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
464dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (rate_control_param->bits_per_second > TOPAZ_H263_MAX_BITRATE) {
465dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->sRCParams.BitsPerSecond = TOPAZ_H263_MAX_BITRATE;
466c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \
467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun		the maximum bitrate, set it with %d\n",
468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     rate_control_param->bits_per_second,
469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     TOPAZ_H263_MAX_BITRATE);
470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else
471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->sRCParams.BitsPerSecond = rate_control_param->bits_per_second;
472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
4742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
4752f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    case VAEncMiscParameterTypeMaxSliceSize:
476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        max_slice_size_param = (VAEncMiscParameterMaxSliceSize *)pBuffer->data;
4772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->max_slice_size == max_slice_size_param->max_slice_size)
479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
4802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
481c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: max slice size changed to %d\n",
482dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 max_slice_size_param->max_slice_size);
4832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->max_slice_size = max_slice_size_param->max_slice_size;
4852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
486dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
4872f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
4882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    case VAEncMiscParameterTypeAIR:
489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        air_param = (VAEncMiscParameterAIR *)pBuffer->data;
4902f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
491c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: air slice size changed to num_air_mbs %d "
492dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 "air_threshold %d, air_auto %d\n",
493dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 air_param->air_num_mbs, air_param->air_threshold,
494dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 air_param->air_auto);
4952f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->num_air_mbs = air_param->air_num_mbs;
497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->air_threshold = air_param->air_threshold;
498dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->autotune_air_flag = air_param->air_auto;
4992f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
500dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
5012f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
5022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    default:
503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_UNKNOWN;
504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DEBUG_FAILURE;
505dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
5062f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
5072f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    free(obj_buffer->buffer_data);
5092f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    obj_buffer->buffer_data = NULL;
510dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5112f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    return VA_STATUS_SUCCESS;
5122f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang}
5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H263ES_RenderPicture(
5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_context_p obj_context,
5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_buffer_p *buffers,
5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int num_buffers)
5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_CONTEXT_H263ES;
5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
523c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_RenderPicture\n");
5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < num_buffers; i++) {
5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        object_buffer_p obj_buffer = buffers[i];
5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (obj_buffer->type) {
5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        case VAEncSequenceParameterBufferType:
530c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263_RenderPicture got VAEncSequenceParameterBufferType\n");
5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            vaStatus = lnc__H263ES_process_sequence_param(ctx, obj_buffer);
5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DEBUG_FAILURE;
5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        case VAEncPictureParameterBufferType:
536c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263_RenderPicture got VAEncPictureParameterBuffer\n");
5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            vaStatus = lnc__H263ES_process_picture_param(ctx, obj_buffer);
5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DEBUG_FAILURE;
5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        case VAEncSliceParameterBufferType:
542c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263_RenderPicture got VAEncSliceParameterBufferType\n");
5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            vaStatus = lnc__H263ES_process_slice_param(ctx, obj_buffer);
5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DEBUG_FAILURE;
5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAEncMiscParameterBufferType:
548c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_RenderPicture got VAEncMiscParameterBufferType\n");
549dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = lnc__H263ES_process_misc_param(ctx, obj_buffer);
550dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
5522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        default:
5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            vaStatus = VA_STATUS_ERROR_UNKNOWN;
5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DEBUG_FAILURE;
5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
557dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (vaStatus != VA_STATUS_SUCCESS) {
5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H263ES_EndPicture(
5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_context_p obj_context)
5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_CONTEXT_H263ES;
5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
572c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H263ES_EndPicture\n");
5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaStatus = lnc_EndPicture(ctx);
5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct format_vtable_s lnc_H263ES_vtable = {
581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunqueryConfigAttributes:
582dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H263ES_QueryConfigAttributes,
583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvalidateConfig:
584dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H263ES_ValidateConfig,
585dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuncreateContext:
586dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H263ES_CreateContext,
587dc1209519284865899ca8d990b3a2c7dbca8ae08wangkundestroyContext:
588dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H263ES_DestroyContext,
589dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunbeginPicture:
590dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H263ES_BeginPicture,
591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunrenderPicture:
592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H263ES_RenderPicture,
593dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunendPicture:
594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H263ES_EndPicture
5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
596