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
337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h"
347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_surface.h"
357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_cmdbuf.h"
367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "lnc_hostcode.h"
377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "lnc_H264ES.h"
387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "lnc_hostheader.h"
39f31d5416a60f83e184b0906a7ec77ba021840531hding#include "va/va_enc_h264.h"
40f31d5416a60f83e184b0906a7ec77ba021840531hding#include "psb_drv_debug.h"
417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h>
437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdint.h>
447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h>
45bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#include <limits.h>
467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
48437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define TOPAZ_H264_MAX_BITRATE 14000000 /* FIXME ?? */
49dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#define WORST_CASE_SLICE_HEADER_SIZE 200
507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
51bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define INIT_CONTEXT_H264ES     context_ENC_p ctx = (context_ENC_p) obj_context->format_data
527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SURFACE(id)    ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id ))
537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define BUFFER(id)  ((object_buffer_p) object_heap_lookup( &ctx->obj_context->driver_data->buffer_heap, id ))
547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5554752e65b02b1a84c491e3f9c964046faeea306eKun Wang
567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc_H264ES_QueryConfigAttributes(
587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAProfile profile,
597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAEntrypoint entrypoint,
607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAConfigAttrib *attrib_list,
61dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int num_attribs)
627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
65c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_QueryConfigAttributes\n");
667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* RateControl attributes */
687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for (i = 0; i < num_attribs; i++) {
697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        switch (attrib_list[i].type) {
707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        case VAConfigAttribRTFormat:
717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
72dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        case VAConfigAttribRateControl:
742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang            attrib_list[i].value = VA_RC_NONE | VA_RC_CBR | VA_RC_VBR | VA_RC_VCM;
757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
762f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#if 0
77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAConfigAttribEncMaxSliceSize:
78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            attrib_list[i].value = 0;
79dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#endif
817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        default:
827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H264ES_ValidateConfig(
90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
92242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    int i;
93242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    /* Check all attributes */
94242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    for (i = 0; i < obj_config->attrib_count; i++) {
953f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        switch (obj_config->attrib_list[i].type) {
963f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        case VAConfigAttribRTFormat:
973f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            /* Ignore */
983f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            break;
993f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        case VAConfigAttribRateControl:
1003f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            break;
1013f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        default:
1023f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1033f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        }
1043f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    }
105242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang
106242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    return VA_STATUS_SUCCESS;
1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H264ES_CreateContext(
1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_context_p obj_context,
112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    context_ENC_p ctx;
1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
1172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    unsigned int eRCmode = 0;
1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
119c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_CreateContext\n");
1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    vaStatus = lnc_CreateContext(obj_context, obj_config);
1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus)
1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx = (context_ENC_p) obj_context->format_data;
1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1282f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    ctx->max_slice_size = 0;
129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ctx->delta_change = 1;
1302f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    eRCMode = VA_RC_NONE;
131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < obj_config->attrib_count; i++) {
1322f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#if 0
133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (obj_config->attrib_list[i].type == VAConfigAttribEncMaxSliceSize)
134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->max_slice_size = obj_config->attrib_list[i].value;
135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else if (obj_config->attrib_list[i].type == VAConfigAttribRateControl)
136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            eRCmode = obj_config->attrib_list[i].value;
1372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#else
138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (obj_config->attrib_list[i].type == VAConfigAttribRateControl)
139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            eRCmode = obj_config->attrib_list[i].value;
1402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#endif
1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
143c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_CreateContext: max slice size %d\n", ctx->max_slice_size);
1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (eRCmode == VA_RC_VBR) {
1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->eCodec = IMG_CODEC_H264_VBR;
1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->sRCParams.RCEnable = IMG_TRUE;
148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (eRCmode == VA_RC_CBR) {
1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->eCodec = IMG_CODEC_H264_CBR;
1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->sRCParams.RCEnable = IMG_TRUE;
151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (eRCmode == VA_RC_VCM) {
1522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        ctx->eCodec = IMG_CODEC_H264_VCM;
1532f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        ctx->sRCParams.RCEnable = IMG_TRUE;
154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (eRCmode == VA_RC_NONE) {
1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->eCodec = IMG_CODEC_H264_NO_RC;
1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->sRCParams.RCEnable = IMG_FALSE;
157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else
1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
159bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    ctx->eFormat = IMG_CODEC_PL12;      /* use default */
1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->IPEControl = lnc__get_ipe_control(ctx->eCodec);
162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ctx->idr_pic_id = 1;
163dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (obj_config->profile) {
165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileH264Baseline:
166dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->profile_idc = 5;
167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileH264Main:
169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->profile_idc = 6;
170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->profile_idc = 6;
173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void lnc_H264ES_DestroyContext(
1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_context_p obj_context)
1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    struct coded_buf_aux_info *p_aux_info;
1842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    INIT_CONTEXT_H264ES;
185c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_DestroyPicture\n");
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while (ctx->p_coded_buf_info != NULL) {
188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p_aux_info = ctx->p_coded_buf_info->next;
189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(ctx->p_coded_buf_info);
190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->p_coded_buf_info = p_aux_info;
1912f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc_DestroyContext(obj_context);
1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H264ES_BeginPicture(
1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_context_p obj_context)
1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_CONTEXT_H264ES;
1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
201c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_BeginPicture\n");
2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaStatus = lnc_BeginPicture(ctx);
2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc__H264ES_process_sequence_param(context_ENC_p ctx, object_buffer_p obj_buffer)
2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAEncSequenceParameterBufferH264 *pSequenceParams;
211dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_cmdbuf_p cmdbuf = ctx->obj_context->lnc_cmdbuf;
2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_VUI_PARAMS VUI_Params;
2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    H264_CROP_PARAMS sCrop;
214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    char hardcoded_qp[4];
2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->type == VAEncSequenceParameterBufferType);
2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->num_elements == 1);
2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->size == sizeof(VAEncSequenceParameterBufferH264));
2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((obj_buffer->num_elements != 1) ||
221bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (obj_buffer->size != sizeof(VAEncSequenceParameterBufferH264))) {
2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_UNKNOWN;
2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ctx->obj_context->frame_count = 0;
226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pSequenceParams = (VAEncSequenceParameterBufferH264 *) obj_buffer->buffer_data;
2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->buffer_data = NULL;
2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->size = 0;
2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2312f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    if ((ctx->obj_context->frame_count != 0) &&
232bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (ctx->sRCParams.BitsPerSecond != pSequenceParams->bits_per_second))
233dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->update_rc_control = 1;
2342f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
2352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /* a new sequence and IDR need reset frame_count */
2362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    ctx->obj_context->frame_count = 0;
2372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
238dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSequenceParams->bits_per_second > TOPAZ_H264_MAX_BITRATE) {
239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->sRCParams.BitsPerSecond = TOPAZ_H264_MAX_BITRATE;
240c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \
241dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun		the maximum bitrate, set it with %d\n",
242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 pSequenceParams->bits_per_second,
243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 TOPAZ_H264_MAX_BITRATE);
244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else
245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->sRCParams.BitsPerSecond = pSequenceParams->bits_per_second;
2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->sRCParams.Slices = 1;
248dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->sRCParams.IntraFreq = pSequenceParams->intra_period;
250643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    if (ctx->sRCParams.IntraFreq == 0)
251643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        ctx->sRCParams.IntraFreq = 1000;
252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
253643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    ctx->sRCParams.IDRFreq = pSequenceParams->intra_idr_period;
254c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "IntraFreq: %d\n, intra_idr_period: %d\n",
255dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             ctx->sRCParams.IntraFreq, ctx->sRCParams.IDRFreq);
2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
257dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VUI_Params.Time_Scale = ctx->sRCParams.FrameRate * 2;
258dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VUI_Params.bit_rate_value_minus1 = ctx->sRCParams.BitsPerSecond / 64 - 1;
259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VUI_Params.cbp_size_value_minus1 = ctx->sRCParams.BufferSize / 64 - 1;
2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VUI_Params.CBR = 1;
2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VUI_Params.initial_cpb_removal_delay_length_minus1 = 0;
2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VUI_Params.cpb_removal_delay_length_minus1 = 0;
2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VUI_Params.dpb_output_delay_length_minus1 = 0;
2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VUI_Params.time_offset_length = 0;
2657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    sCrop.bClip = IMG_FALSE;
2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    sCrop.LeftCropOffset = 0;
2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    sCrop.RightCropOffset = 0;
2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    sCrop.TopCropOffset = 0;
2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    sCrop.BottomCropOffset = 0;
2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->RawHeight & 0xf) {
273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        sCrop.bClip = IMG_TRUE;
274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        sCrop.BottomCropOffset = (((ctx->RawHeight + 0xf) & (~0xf)) - ctx->RawHeight) / 2;
2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->RawWidth & 0xf) {
2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        sCrop.bClip = IMG_TRUE;
278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        sCrop.RightCropOffset = (((ctx->RawWidth + 0xf) & (~0xf)) - ctx->RawWidth) / 2;
2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2802befccec034c13d34746a9e87149889d59ac767bFei Jiang
2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* sequence header is always inserted */
282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->eCodec == IMG_CODEC_H264_NO_RC)
283643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        VUI_Params.CBR = 0;
2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
285e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    lnc__H264_prepare_sequence_header((IMG_UINT32 *)(cmdbuf->header_mem_p + ctx->seq_header_ofs), pSequenceParams->max_num_ref_frames,
286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                      pSequenceParams->picture_width_in_mbs,
287dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                      pSequenceParams->picture_height_in_mbs,
288f31d5416a60f83e184b0906a7ec77ba021840531hding                                      pSequenceParams->vui_parameters_present_flag,
289f31d5416a60f83e184b0906a7ec77ba021840531hding                                      pSequenceParams->vui_parameters_present_flag ? (&VUI_Params) : NULL,
290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                      &sCrop,
2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      pSequenceParams->level_idc, ctx->profile_idc);
2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, 0); /* sequence header */
2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->seq_header_ofs, &cmdbuf->header_mem);
295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (0 != ctx->sRCParams.IDRFreq) {
297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (NULL == ctx->save_seq_header_p) {
298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->save_seq_header_p = malloc(HEADER_SIZE);
299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (NULL == ctx->save_seq_header_p) {
300c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_ERROR, "Ran out of memory!\n");
301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                free(pSequenceParams);
302dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                return VA_STATUS_ERROR_ALLOCATION_FAILED;
303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
304e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang            memcpy((unsigned char *)ctx->save_seq_header_p,
305e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang                   (unsigned char *)(cmdbuf->header_mem_p + ctx->seq_header_ofs),
306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   HEADER_SIZE);
307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    free(pSequenceParams);
3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc__H264ES_process_picture_param(context_ENC_p ctx, object_buffer_p obj_buffer)
3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus;
3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAEncPictureParameterBufferH264 *pBuffer;
3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc_cmdbuf_p cmdbuf = ctx->obj_context->lnc_cmdbuf;
3192f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    struct coded_buf_aux_info *p_aux_info;
3204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int need_sps = 0;
321dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->type == VAEncPictureParameterBufferType);
3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((obj_buffer->num_elements != 1) ||
325bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (obj_buffer->size != sizeof(VAEncPictureParameterBufferH264))) {
3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_UNKNOWN;
3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Transfer ownership of VAEncPictureParameterBufferH264 data */
3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pBuffer = (VAEncPictureParameterBufferH264 *) obj_buffer->buffer_data;
3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->buffer_data = NULL;
3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->size = 0;
3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
334f31d5416a60f83e184b0906a7ec77ba021840531hding	ctx->ref_surface = SURFACE(pBuffer->ReferenceFrames[0].picture_id);
335f31d5416a60f83e184b0906a7ec77ba021840531hding    ctx->dest_surface = SURFACE(pBuffer->CurrPic.picture_id);
3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->coded_buf = BUFFER(pBuffer->coded_buf);
3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
338f31d5416a60f83e184b0906a7ec77ba021840531hding    //ASSERT(ctx->Width == pBuffer->picture_width);
339f31d5416a60f83e184b0906a7ec77ba021840531hding    //ASSERT(ctx->Height == pBuffer->picture_height);
3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((ctx->sRCParams.IntraFreq != 0) && (ctx->sRCParams.IDRFreq != 0)) { /* period IDR is desired */
342643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        unsigned int is_intra = 0;
343643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        unsigned int intra_cnt = 0;
344643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
345643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        ctx->force_idr_h264 = 0;
346dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
347643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        if ((ctx->obj_context->frame_count % ctx->sRCParams.IntraFreq) == 0) {
348643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang            is_intra = 1; /* suppose current frame is I frame */
349643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang            intra_cnt = ctx->obj_context->frame_count / ctx->sRCParams.IntraFreq;
350643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        }
351643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang
352dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* current frame is I frame (suppose), and an IDR frame is desired*/
353643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        if ((is_intra) && ((intra_cnt % ctx->sRCParams.IDRFreq) == 0)) {
354643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang            ctx->force_idr_h264 = 1;
355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*When two consecutive access units in decoding order are both IDR access
356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            * units, the value of idr_pic_id in the slices of the first such IDR
357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            * access unit shall differ from the idr_pic_id in the second such IDR
358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            * access unit. We set it with 1 or 0 alternately.*/
359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->idr_pic_id = 1 - ctx->idr_pic_id;
3604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            /* it is periodic IDR in the middle of one sequence encoding, need SPS */
3624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            if (ctx->obj_context->frame_count > 0)
3634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                need_sps = 1;
364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
365643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang            ctx->obj_context->frame_count = 0;
366643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        }
367643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    }
368dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* For H264, PicHeader only needed in the first picture*/
3702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    if (!ctx->obj_context->frame_count) {
3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf = ctx->obj_context->lnc_cmdbuf;
3724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        if (need_sps) {
3744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            /* reuse the previous SPS */
375c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "TOPAZ: insert a SPS before IDR frame\n");
376e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang            memcpy((unsigned char *)(cmdbuf->header_mem_p + ctx->seq_header_ofs),
377e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang                   (unsigned char *)ctx->save_seq_header_p,
378dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   HEADER_SIZE);
379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, 0); /* sequence header */
3814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->seq_header_ofs, &cmdbuf->header_mem);
3824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
3834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
384e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        lnc__H264_prepare_picture_header((IMG_UINT32 *)(cmdbuf->header_mem_p + ctx->pic_header_ofs));
385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, 1);/* picture header */
3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        RELOC_CMDBUF(cmdbuf->cmd_idx++, ctx->pic_header_ofs, &cmdbuf->header_mem);
3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3902f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /*Record if EOSEQ or EOSTREAM should be appended to the coded buffer.*/
391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (0 != pBuffer->last_picture) {
392c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "It's the last picture in sequence or stream."
393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 " Will append EOSEQ/EOSTREAM to the coded buffer.\n");
394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p_aux_info = calloc(1, sizeof(struct coded_buf_aux_info));
395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (NULL == p_aux_info) {
396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(pBuffer);
397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_ALLOCATION_FAILED;
398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p_aux_info->buf = ctx->coded_buf;
400dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p_aux_info->aux_flag = pBuffer->last_picture;
401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (NULL != ctx->p_coded_buf_info)
402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_aux_info->next = ctx->p_coded_buf_info;
403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else
404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_aux_info->next = NULL;
405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
406dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->p_coded_buf_info = p_aux_info;
4072f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
4082f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaStatus = lnc_RenderPictureParameter(ctx);
4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    free(pBuffer);
4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc__H264ES_process_slice_param(context_ENC_p ctx, object_buffer_p obj_buffer)
4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Prepare InParams for macros of current slice, insert slice header, insert do slice command */
4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAEncSliceParameterBuffer *pBuffer;
4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    lnc_cmdbuf_p cmdbuf = ctx->obj_context->lnc_cmdbuf;
4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int MBSkipRun, FirstMBAddress;
4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    PIC_PARAMS *psPicParams = (PIC_PARAMS *)(cmdbuf->pic_params_p);
422e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned int i;
4234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int slice_param_idx;
4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->type == VAEncSliceParameterBufferType);
4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf = ctx->obj_context->lnc_cmdbuf;
428e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    psPicParams = (PIC_PARAMS *)cmdbuf->pic_params_p;
4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Transfer ownership of VAEncPictureParameterBufferH264 data */
4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pBuffer = (VAEncSliceParameterBuffer *) obj_buffer->buffer_data;
4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->size = 0;
4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* save current cmdbuf write pointer for H264 frameskip redo
4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * for H264, only slice header need to repatch
4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx_saved_frameskip = cmdbuf->cmd_idx;
438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (0 == pBuffer->start_row_number) {
440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pBuffer->slice_flags.bits.is_intra)
441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            RELOC_PIC_PARAMS(&psPicParams->InParamsBase, ctx->in_params_ofs, cmdbuf->topaz_in_params_I);
442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else
443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            RELOC_PIC_PARAMS(&psPicParams->InParamsBase, ctx->in_params_ofs, cmdbuf->topaz_in_params_P);
4447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*In case the slice number changes*/
447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((ctx->slice_param_cache != NULL) && (obj_buffer->num_elements != ctx->slice_param_num)) {
448c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Slice number changes. Previous value is %d. Now it's %d\n",
449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 ctx->slice_param_num, obj_buffer->num_elements);
450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(ctx->slice_param_cache);
451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_cache = NULL;
452dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_num = 0;
453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx->slice_param_cache) {
456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_num = obj_buffer->num_elements;
457c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate %d VAEncSliceParameterBuffer cache buffers\n", 2 * ctx->slice_param_num);
458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_cache = calloc(2 * ctx->slice_param_num, sizeof(VAEncSliceParameterBuffer));
459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (NULL == ctx->slice_param_cache) {
460c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "Run out of memory!\n");
461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(obj_buffer->buffer_data);
462dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_ALLOCATION_FAILED;
463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
4644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
4654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
466dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < obj_buffer->num_elements; i++) {
4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*Todo list:
4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         *1.Insert Do header command
4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         *2.setup InRowParams
4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         *3.setup Slice params
4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         *4.Insert Do slice command
4727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * */
473643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        int deblock_on, force_idr = 0;
4747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((pBuffer->slice_height == 0) || (pBuffer->start_row_number >= ctx->Height)) {
476c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "slice number is %d, but it seems the last %d buffers are empty\n",
4774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                     obj_buffer->num_elements, obj_buffer->num_elements - i);
478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(obj_buffer->buffer_data);
4794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            obj_buffer->buffer_data = NULL;
4804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            return VA_STATUS_SUCCESS;
4814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
4824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
483643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        /* set to INTRA frame */
4842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        if (ctx->force_idr_h264 || (ctx->obj_context->frame_count == 0)) {
485643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang            force_idr = 1;
486643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang            pBuffer->slice_flags.bits.is_intra = 1;
487643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang        }
488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((pBuffer->slice_flags.bits.disable_deblocking_filter_idc == 0)
490bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            || (pBuffer->slice_flags.bits.disable_deblocking_filter_idc == 2))
4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            deblock_on = IMG_TRUE;
4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        else
4937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            deblock_on = IMG_FALSE;
494dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
495dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->sRCParams.RCEnable && ctx->sRCParams.FrameSkip)
4967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            MBSkipRun = (ctx->Width * ctx->Height) / 256;
497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else
498dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            MBSkipRun = 0;
4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
500dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        FirstMBAddress = (pBuffer->start_row_number * ctx->Width) / 16;
5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Insert Do Header command, relocation is needed */
502e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        lnc__H264_prepare_slice_header((IMG_UINT32 *)(cmdbuf->header_mem_p + ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE),
503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       pBuffer->slice_flags.bits.is_intra,
504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       pBuffer->slice_flags.bits.disable_deblocking_filter_idc,
5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                       ctx->obj_context->frame_count,
5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                       FirstMBAddress,
507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       MBSkipRun, force_idr,
508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       pBuffer->slice_flags.bits.uses_long_term_ref,
509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       pBuffer->slice_flags.bits.is_long_term_ref,
510dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       ctx->idr_pic_id);
5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc_cmdbuf_insert_command(cmdbuf, MTX_CMDID_DO_HEADER, 2, (ctx->obj_context->slice_count << 2) | 2);
5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        RELOC_CMDBUF(cmdbuf->cmd_idx++,
5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                     ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE,
5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                     &cmdbuf->header_mem);
5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (!(ctx->sRCParams.RCEnable && ctx->sRCParams.FrameSkip)) {
518dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if ((ctx->obj_context->frame_count == 0) && (pBuffer->start_row_number == 0) && pBuffer->slice_flags.bits.is_intra)
5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                lnc_reset_encoder_params(ctx);
5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
521dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*The corresponding slice buffer cache*/
522dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            slice_param_idx = (pBuffer->slice_flags.bits.is_intra ? 0 : 1) * ctx->slice_param_num + i;
523dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
524dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (VAEncSliceParameter_Equal(&ctx->slice_param_cache[slice_param_idx], pBuffer) == 0) {
525c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cache slice%d's parameter buffer at index %d\n", i, slice_param_idx);
526dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
527dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                /* cache current param parameters */
528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                memcpy(&ctx->slice_param_cache[slice_param_idx],
529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       pBuffer, sizeof(VAEncSliceParameterBuffer));
530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
531dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                /* Setup InParams value*/
532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                lnc_setup_slice_params(ctx,
533dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       pBuffer->start_row_number * 16,
534bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                       pBuffer->slice_height * 16,
535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       pBuffer->slice_flags.bits.is_intra,
536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       ctx->obj_context->frame_count > 0,
537dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       psPicParams->sInParams.SeInitQP);
538dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
540dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* Insert do slice command and setup related buffer value */
5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            lnc__send_encode_slice_params(ctx,
5427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                          pBuffer->slice_flags.bits.is_intra,
5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                          pBuffer->start_row_number * 16,
5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                          deblock_on,
5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                          ctx->obj_context->frame_count,
546bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                          pBuffer->slice_height * 16,
547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                          ctx->obj_context->slice_count, ctx->max_slice_size);
548dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
549c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Now frame_count/slice_count is %d/%d\n",
5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                     ctx->obj_context->frame_count, ctx->obj_context->slice_count);
5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->obj_context->slice_count++;
5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pBuffer++; /* Move to the next buffer */
5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(ctx->obj_context->slice_count < MAX_SLICES_PER_PICTURE);
5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
558dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    free(obj_buffer->buffer_data);
5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->buffer_data = NULL;
560dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5642f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiangstatic VAStatus lnc__H264ES_process_misc_param(context_ENC_p ctx, object_buffer_p obj_buffer)
5652f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{
5662f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /* Prepare InParams for macros of current slice, insert slice header, insert do slice command */
5672f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    VAEncMiscParameterBuffer *pBuffer;
5684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VAEncMiscParameterRateControl *rate_control_param;
5692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    VAEncMiscParameterAIR *air_param;
5702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    VAEncMiscParameterMaxSliceSize *max_slice_size_param;
5712f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    VAEncMiscParameterFrameRate *frame_rate_param;
572dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned int bit_rate;
573dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    char hardcoded_qp[4];
5742f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
5752f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
5762f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
5772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    ASSERT(obj_buffer->type == VAEncMiscParameterBufferType);
5782f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
5792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /* Transfer ownership of VAEncMiscParameterBuffer data */
5802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    pBuffer = (VAEncMiscParameterBuffer *) obj_buffer->buffer_data;
5812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    obj_buffer->size = 0;
5822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
583f31d5416a60f83e184b0906a7ec77ba021840531hding	//initialize the frame_rate and qp
584f31d5416a60f83e184b0906a7ec77ba021840531hding	rate_control_param->initial_qp=26;
585f31d5416a60f83e184b0906a7ec77ba021840531hding	rate_control_param->min_qp=3;
586f31d5416a60f83e184b0906a7ec77ba021840531hding	frame_rate_param->framerate=30;
587f31d5416a60f83e184b0906a7ec77ba021840531hding
5882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    switch (pBuffer->type) {
5892f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    case VAEncMiscParameterTypeFrameRate:
590dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        frame_rate_param = (VAEncMiscParameterFrameRate *)pBuffer->data;
591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (frame_rate_param->framerate > 65535) {
593dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
595dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
596dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
597c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: frame rate changed to %d\n", __FUNCTION__,
598dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 frame_rate_param->framerate);
599dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
600dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->sRCParams.FrameRate == frame_rate_param->framerate)
601dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
602dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
603dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->sRCParams.FrameRate = frame_rate_param->framerate;
604dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->sRCParams.BitsPerSecond += ctx->delta_change;
605dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->delta_change *= -1;
606dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->update_rc_control = 1;
607dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
608dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
6092f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
6104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    case VAEncMiscParameterTypeRateControl:
611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        rate_control_param = (VAEncMiscParameterRateControl *)pBuffer->data;
612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (psb_parse_config("PSB_VIDEO_IQP", hardcoded_qp) == 0)
614dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            rate_control_param->initial_qp = atoi(hardcoded_qp);
615dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
616dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (psb_parse_config("PSB_VIDEO_MQP", hardcoded_qp) == 0)
617dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            rate_control_param->min_qp = atoi(hardcoded_qp);
618dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
619dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (rate_control_param->initial_qp > 65535 ||
620bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            rate_control_param->min_qp > 65535 ||
621bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            rate_control_param->target_percentage > 65535) {
622dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
623dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
625dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
626c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Rate control parameter initial_qp=%d, min_qp=%d\n",
627dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 rate_control_param->initial_qp,
628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 rate_control_param->min_qp);
629dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
630dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (rate_control_param->bits_per_second > TOPAZ_H264_MAX_BITRATE) {
631dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            bit_rate = TOPAZ_H264_MAX_BITRATE;
632c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \
633dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                             the maximum bitrate, set it with %d\n",
634dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     rate_control_param->bits_per_second,
635dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     TOPAZ_H264_MAX_BITRATE);
636dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            bit_rate = rate_control_param->bits_per_second;
638dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
639dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
640c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "rate control changed to %d\n",
641dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 rate_control_param->bits_per_second);
642dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
643dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((rate_control_param->bits_per_second == ctx->sRCParams.BitsPerSecond) &&
644bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            (ctx->sRCParams.VCMBitrateMargin == rate_control_param->target_percentage * 128 / 100) &&
645bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            (ctx->sRCParams.BufferSize == ctx->sRCParams.BitsPerSecond / 1000 * rate_control_param->window_size) &&
646bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            (ctx->sRCParams.MinQP == rate_control_param->min_qp) &&
647bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            (ctx->sRCParams.InitialQp == rate_control_param->initial_qp))
648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else
650dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->update_rc_control = 1;
651dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
652dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (rate_control_param->target_percentage != 0)
653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->sRCParams.VCMBitrateMargin = rate_control_param->target_percentage * 128 / 100;
654dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (rate_control_param->window_size != 0)
655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->sRCParams.BufferSize = ctx->sRCParams.BitsPerSecond * rate_control_param->window_size / 1000;
656dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (rate_control_param->initial_qp != 0)
657dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->sRCParams.InitialQp = rate_control_param->initial_qp;
658dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (rate_control_param->min_qp != 0)
659dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->sRCParams.MinQP = rate_control_param->min_qp;
660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
661dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((bit_rate == ctx->sRCParams.BitsPerSecond) || (bit_rate == 0)) {
662dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->sRCParams.BitsPerSecond += ctx->delta_change;
663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->delta_change *= -1;
664dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
665dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->sRCParams.BitsPerSecond = bit_rate;
666dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
668dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
6692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
6702f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    case VAEncMiscParameterTypeMaxSliceSize:
671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        max_slice_size_param = (VAEncMiscParameterMaxSliceSize *)pBuffer->data;
6722f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
673bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        if (max_slice_size_param->max_slice_size > INT_MAX ||
674bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            (max_slice_size_param->max_slice_size != 0 &&
675bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang             max_slice_size_param->max_slice_size < WORST_CASE_SLICE_HEADER_SIZE)) {
676dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
677dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
678dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6803f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        if (max_slice_size_param->max_slice_size != 0)
6813f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            max_slice_size_param->max_slice_size -= WORST_CASE_SLICE_HEADER_SIZE;
6822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
683dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->max_slice_size == max_slice_size_param->max_slice_size)
684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
685dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
686c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Max slice size changed to %d\n",
687dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 max_slice_size_param->max_slice_size);
6882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->max_slice_size = max_slice_size_param->max_slice_size;
6902f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
691dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
6922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
6932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    case VAEncMiscParameterTypeAIR:
694dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        air_param = (VAEncMiscParameterAIR *)pBuffer->data;
695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
696dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (air_param->air_num_mbs > 65535 ||
697bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            air_param->air_threshold > 65535) {
698dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
699dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
700dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
7012f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
702c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "air slice size changed to num_air_mbs %d "
703dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 "air_threshold %d, air_auto %d\n",
704dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 air_param->air_num_mbs, air_param->air_threshold,
705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 air_param->air_auto);
7062f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
707dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (((ctx->Height * ctx->Width) >> 8) < air_param->air_num_mbs)
708dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            air_param->air_num_mbs = ((ctx->Height * ctx->Width) >> 8);
709dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (air_param->air_threshold == 0)
710c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: air threshold is set to zero\n",
711dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     __FUNCTION__);
712dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->num_air_mbs = air_param->air_num_mbs;
713dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->air_threshold = air_param->air_threshold;
714dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->autotune_air_flag = air_param->air_auto;
7152f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
716dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
7172f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
7182f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    default:
719dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_UNKNOWN;
720dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DEBUG_FAILURE;
721dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
7222f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
7232f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
724dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    free(obj_buffer->buffer_data);
7252f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    obj_buffer->buffer_data = NULL;
726dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return vaStatus;
7282f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang}
7292f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
7307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H264ES_RenderPicture(
7317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_context_p obj_context,
7327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_buffer_p *buffers,
7337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int num_buffers)
7347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
7357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_CONTEXT_H264ES;
7367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
7377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
738dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
739c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_RenderPicture\n");
7407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
741dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < num_buffers; i++) {
7427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        object_buffer_p obj_buffer = buffers[i];
7437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
744dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (obj_buffer->type) {
7457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        case VAEncSequenceParameterBufferType:
746c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264_RenderPicture got VAEncSequenceParameterBufferType\n");
7477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            vaStatus = lnc__H264ES_process_sequence_param(ctx, obj_buffer);
7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DEBUG_FAILURE;
7497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
7507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        case VAEncPictureParameterBufferType:
752c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264_RenderPicture got VAEncPictureParameterBuffer\n");
7537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            vaStatus = lnc__H264ES_process_picture_param(ctx, obj_buffer);
7547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DEBUG_FAILURE;
7557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
7567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        case VAEncSliceParameterBufferType:
758c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264_RenderPicture got VAEncSliceParameterBufferType\n");
7597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            vaStatus = lnc__H264ES_process_slice_param(ctx, obj_buffer);
7607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DEBUG_FAILURE;
7617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
7627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
763dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAEncMiscParameterBufferType:
764c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264_RenderPicture got VAEncMiscParameterBufferType\n");
765dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = lnc__H264ES_process_misc_param(ctx, obj_buffer);
766dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
767dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
7682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
7697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        default:
7707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            vaStatus = VA_STATUS_ERROR_UNKNOWN;
7717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DEBUG_FAILURE;
7727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
773dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (vaStatus != VA_STATUS_SUCCESS) {
7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
7757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
7797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
7807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus lnc_H264ES_EndPicture(
7827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    object_context_p obj_context)
7837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
7847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_CONTEXT_H264ES;
7857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
7867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
787c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "lnc_H264ES_EndPicture\n");
7887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaStatus = lnc_EndPicture(ctx);
7907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
7927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
7937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct format_vtable_s lnc_H264ES_vtable = {
796dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunqueryConfigAttributes:
797dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H264ES_QueryConfigAttributes,
798dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvalidateConfig:
799dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H264ES_ValidateConfig,
800dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuncreateContext:
801dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H264ES_CreateContext,
802dc1209519284865899ca8d990b3a2c7dbca8ae08wangkundestroyContext:
803dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H264ES_DestroyContext,
804dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunbeginPicture:
805dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H264ES_BeginPicture,
806dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunrenderPicture:
807dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H264ES_RenderPicture,
808dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunendPicture:
809dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lnc_H264ES_EndPicture
8107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
8112f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
8124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic inline void lnc_H264_append_EOSEQ(unsigned char *p_buf, unsigned int *p_size)
8132f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{
8142f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /*nal_ref_idc should be 0 and nal_ref_idc should be 10 for End of Sequence RBSP*/
8152f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    const unsigned char EOSEQ[] = {0x00, 0x00, 0x00, 0x01, 0xa};
816c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Append %d bytes of End of Sequence RBSP at offset %d\n",
817dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             sizeof(EOSEQ), *p_size);
818c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Previous 4 bytes: %x %x %x %x\n", *(p_buf - 3), *(p_buf - 2), *(p_buf - 1), *(p_buf));
8192f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    p_buf += *p_size;
8202f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    memcpy(p_buf, &EOSEQ[0], sizeof(EOSEQ));
821c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "After 4 bytes: %x %x %x %x\n", *(p_buf + 1), *(p_buf + 2), *(p_buf + 3), *(p_buf + 4));
8222f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    *p_size += sizeof(EOSEQ);
8232f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang}
8242f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
8254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic inline void lnc_H264_append_EOSTREAM(unsigned char *p_buf, unsigned int *p_size)
8262f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{
8272f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /*nal_ref_idc should be 0 and nal_ref_idc should be 11 for End of Stream RBSP*/
8282f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    const unsigned char EOSTREAM[] = {0x00, 0x00, 0x00, 0x01, 0xb};
829c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Append %d bytes of End of Stream RBSP.\n",
830dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             sizeof(EOSTREAM));
8312f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    p_buf += *p_size;
8322f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    memcpy(p_buf, EOSTREAM, sizeof(EOSTREAM));
8332f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    *p_size += sizeof(EOSTREAM);
8342f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang}
8352f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
8362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei JiangVAStatus lnc_H264_append_aux_info(object_context_p obj_context,
837dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  object_buffer_p obj_buffer,
838dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  unsigned char *buf,
839dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  unsigned int *p_size)
8402f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{
8412f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    INIT_CONTEXT_H264ES;
8422f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    struct coded_buf_aux_info *p_aux_info;
8432f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    struct coded_buf_aux_info *p_prev_aux_info;
8442f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
845dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx->p_coded_buf_info ||
846bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (ctx->eCodec != IMG_CODEC_H264_VBR
847bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang         && ctx->eCodec != IMG_CODEC_H264_CBR
848bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang         && ctx->eCodec != IMG_CODEC_H264_NO_RC))
849dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_SUCCESS;
8502f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
8512f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    ASSERT(obj_buffer);
8522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    ASSERT(buf);
8532f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    ASSERT(p_size);
8542f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
8552f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    p_aux_info = ctx->p_coded_buf_info;
8562f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    p_prev_aux_info = ctx->p_coded_buf_info;
857dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while (p_aux_info != NULL) {
858dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /*Check if we need to append NAL to this coded buffer*/
859dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (p_aux_info->buf == obj_buffer)
860dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
861dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p_prev_aux_info = p_aux_info;
862dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p_aux_info = p_aux_info->next;
8632f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
8642f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
865dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL != p_aux_info) {
866c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded_buf_aux_info 0x%08x\n", p_aux_info->aux_flag);
867dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (0 != (p_aux_info->aux_flag & CODED_BUFFER_EOSEQ_FLAG))
868dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc_H264_append_EOSEQ(buf, p_size);
8692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
870dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (0 != (p_aux_info->aux_flag & CODED_BUFFER_EOSTREAM_FLAG))
871dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            lnc_H264_append_EOSTREAM(buf, p_size);
8722f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
873dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (p_aux_info == ctx->p_coded_buf_info)
874dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->p_coded_buf_info = p_aux_info->next;
875dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else
876dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p_prev_aux_info->next = p_aux_info->next;
8772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
878dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(p_aux_info);
8792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
8802f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    return VA_STATUS_SUCCESS;
8812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang}
882