1437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK
4437b3eda28a4bf098efa80598cab67f190275266Fei 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 *    Elaine Wang <elaine.wang@intel.com>
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Zeng Li <zeng.li@intel.com>
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
30437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
31437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_def.h"
32437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_surface.h"
33437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_cmdbuf.h"
34437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_H263ES.h"
35437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_hostcode.h"
36437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_hostheader.h"
37c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h"
38437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
39437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdlib.h>
40437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdint.h>
41437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <string.h>
42437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
43437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
44437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define TOPAZ_H263_MAX_BITRATE 16000000
45437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
46437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define INIT_CONTEXT_H263ES    context_ENC_p ctx = (context_ENC_p) (obj_context->format_data)
47437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SURFACE(id)    ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id ))
48437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define BUFFER(id)  ((object_buffer_p) object_heap_lookup( &ctx->obj_context->driver_data->buffer_heap, id ))
49437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
50437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
51437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void pnw_H263ES_QueryConfigAttributes(
52cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    VAProfile __maybe_unused profile,
53cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    VAEntrypoint __maybe_unused entrypoint,
54437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAConfigAttrib *attrib_list,
55dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int num_attribs)
56437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
57437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
58c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_QueryConfigAttributes\n");
59437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
60437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* RateControl attributes */
61437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    for (i = 0; i < num_attribs; i++) {
62437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        switch (attrib_list[i].type) {
63437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAConfigAttribRTFormat:
64437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
65437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
66437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAConfigAttribRateControl:
67437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            attrib_list[i].value = VA_RC_NONE | VA_RC_CBR | VA_RC_VBR;
68437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
69437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
70437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        default:
71437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
72437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
73437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
74437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
75437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
76437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
77437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
78437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
79437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_H263ES_ValidateConfig(
80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
81437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
82242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    int i;
83242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    /* Check all attributes */
84242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    for (i = 0; i < obj_config->attrib_count; i++) {
853f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        switch (obj_config->attrib_list[i].type) {
863f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        case VAConfigAttribRTFormat:
873f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            /* Ignore */
883f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            break;
893f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        case VAConfigAttribRateControl:
903f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            break;
913f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        default:
923f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
933f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        }
943f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    }
95242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang
96242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    return VA_STATUS_SUCCESS;
97437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
98437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
99437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
100437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_H263ES_CreateContext(
101437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context,
102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
103437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
104437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
105437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int eRCmode;
106437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    context_ENC_p ctx;
107437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
108437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
109c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_CreateContext\n");
110437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
111437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    vaStatus = pnw_CreateContext(obj_context, obj_config, 0);/* alloc context_ENC_s and BO */
112437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus)
114437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
115437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
116437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx = (context_ENC_p) obj_context->format_data;
117437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < obj_config->attrib_count; i++) {
119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (obj_config->attrib_list[i].type == VAConfigAttribRateControl)
120437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
121437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
122437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (i >= obj_config->attrib_count)
124437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        eRCmode = VA_RC_NONE;
125437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    else
126437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        eRCmode = obj_config->attrib_list[i].value;
127437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
128437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (eRCmode == VA_RC_VBR) {
130437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->eCodec = IMG_CODEC_H263_VBR;
131437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->sRCParams.RCEnable = IMG_TRUE;
132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (eRCmode == VA_RC_CBR) {
133437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->eCodec = IMG_CODEC_H263_CBR;
134437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->sRCParams.RCEnable = IMG_TRUE;
135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (eRCmode == VA_RC_NONE) {
136437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->eCodec = IMG_CODEC_H263_NO_RC;
137437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->sRCParams.RCEnable = IMG_FALSE;
138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else
139437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
140437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->eFormat = IMG_CODEC_PL12;
141437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
142437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->Slices = ctx->Height / 16;
143437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->ParallelCores = 1; /* H263 encode use only one core from DDKv186 */
144437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
145437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->IPEControl = pnw__get_ipe_control(ctx->eCodec);
146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
147437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
148437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
149437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
150437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
151437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
152437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
153437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void pnw_H263ES_DestroyContext(
154437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context)
155437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
156437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
157c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_DestroyContext\n");
158437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
159437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_DestroyContext(obj_context);
160437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
161437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
162437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_H263ES_BeginPicture(
163437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context)
164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
165437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
166437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
167437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_CONTEXT_H263ES;
168437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
169c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_BeginPicture\n");
170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    vaStatus = pnw_BeginPicture(ctx);
172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
173437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
176437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
177437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__H263ES_process_sequence_param(context_ENC_p ctx, object_buffer_p obj_buffer)
178437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
179437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /*
180437b3eda28a4bf098efa80598cab67f190275266Fei Jiang     * process rate control parameters
181437b3eda28a4bf098efa80598cab67f190275266Fei Jiang     */
182437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAEncSequenceParameterBufferH263 *pSequenceParams;
183437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
184176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    unsigned int frame_size;
185437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
186437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->type == VAEncSequenceParameterBufferType);
187437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->num_elements == 1);
188437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->size == sizeof(VAEncSequenceParameterBufferH263));
189f31d5416a60f83e184b0906a7ec77ba021840531hding    //initialize the frame_rate and qp
190f31d5416a60f83e184b0906a7ec77ba021840531hding    ctx->sRCParams.InitialQp = 15;
191f31d5416a60f83e184b0906a7ec77ba021840531hding    ctx->sRCParams.MinQP = 1;
192f31d5416a60f83e184b0906a7ec77ba021840531hding    ctx->sRCParams.FrameRate = 30;
193437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
194437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if ((obj_buffer->num_elements != 1) ||
195bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (obj_buffer->size != sizeof(VAEncSequenceParameterBufferH263))) {
196437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_UNKNOWN;
197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pSequenceParams = (VAEncSequenceParameterBufferH263 *) obj_buffer->buffer_data;
200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->buffer_data = NULL;
201437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->size = 0;
202437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSequenceParams->bits_per_second > TOPAZ_H263_MAX_BITRATE) {
204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->sRCParams.BitsPerSecond = TOPAZ_H263_MAX_BITRATE;
205c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \
206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun		the maximum bitrate, set it with %d\n",
207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 pSequenceParams->bits_per_second,
208dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 TOPAZ_H263_MAX_BITRATE);
209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else
210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->sRCParams.BitsPerSecond = pSequenceParams->bits_per_second;
211437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
212e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying    ctx->sRCParams.FrameRate = (pSequenceParams->frame_rate < 1) ? 1 :
213e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying        ((65535 < pSequenceParams->frame_rate) ? 65535 : pSequenceParams->frame_rate);
214437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->sRCParams.InitialQp = pSequenceParams->initial_qp;
215437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->sRCParams.MinQP = pSequenceParams->min_qp;
216437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->sRCParams.BUSize = 0; /* default 0, and will be set in pnw__setup_busize */
217437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
218786232ae58944b036adf11e551edfc8dd092af03Elaine Wang    ctx->sRCParams.BufferSize = ctx->sRCParams.BitsPerSecond;
219176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    frame_size = ctx->sRCParams.BitsPerSecond / ctx->sRCParams.FrameRate;
220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*
221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_UINT16 MBRows = 0;
222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if(ctx->Height <= 400)
223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            MBRows = 1;
224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        else if (ctx->Height < 800)
225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            MBRows = 2;
226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    */
227437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->sRCParams.Slices = ctx->Slices;
228437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->sRCParams.QCPOffset = 0;/* FIXME */
2295cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang    if (ctx->sRCParams.IntraFreq != pSequenceParams->intra_period
2305cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang            && ctx->raw_frame_count != 0
2315cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang            && ctx->sRCParams.IntraFreq != 0
2325cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang            && ((ctx->obj_context->frame_count + 1) % ctx->sRCParams.IntraFreq) != 0
2335cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang            && (!ctx->sRCParams.bDisableFrameSkipping)) {
2345cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang        drv_debug_msg(VIDEO_DEBUG_ERROR,
2355cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang                "Changing intra period value in the middle of a GOP is\n"
2365cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang                "not allowed if frame skip isn't disabled.\n"
2375cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang                "it can cause I frame been skipped\n");
2385cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang        return VA_STATUS_ERROR_INVALID_PARAMETER;
2395cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang    }
2405cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang    else
2415cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang        ctx->sRCParams.IntraFreq = pSequenceParams->intra_period;
2425cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang
243437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->sRCParams.InitialLevel = (3 * ctx->sRCParams.BufferSize) >> 4;
244176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    /* Aligned with target frame size */
245176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    ctx->sRCParams.InitialLevel += (frame_size / 2);
246176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    ctx->sRCParams.InitialLevel /= frame_size;
247176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    ctx->sRCParams.InitialLevel *= frame_size;
248176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    ctx->sRCParams.InitialDelay = ctx->sRCParams.BufferSize - ctx->sRCParams.InitialLevel;
249176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    ctx->buffer_size = ctx->sRCParams.BufferSize;
250437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
2512befccec034c13d34746a9e87149889d59ac767bFei Jiang    /*if (ctx->sRCParams.BitsPerSecond < 256000)
252437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->sRCParams.BufferSize = (9 * ctx->sRCParams.BitsPerSecond) >> 1;
253437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    else
254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->sRCParams.BufferSize = (5 * ctx->sRCParams.BitsPerSecond) >> 1;*/
255437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
256176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    if (ctx->raw_frame_count == 0) { /* Add Register IO behind begin Picture */
257176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding        for (i = (ctx->ParallelCores - 1); i >= 0; i--)
258dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_set_bias(ctx, i);
259437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
260437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
261437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    free(pSequenceParams);
262437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return VA_STATUS_SUCCESS;
263437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
264437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
265437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
266437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* Work done by the followinig funcs in testbench should be done here.
267437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * IMG_C_StartPicture()
268437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * IMG_C_InsertSync()
269437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * APP_H263_SendPictureHeader()
270437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Frame skip must be taken into consideration
271437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * */
272437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__H263ES_process_picture_param(context_ENC_p ctx, object_buffer_p obj_buffer)
273437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
274437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
275437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAEncPictureParameterBufferH263 *pBuffer;
276437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf;
277437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    H263_SOURCE_FORMAT_TYPE SourceFormatType;
278437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
279437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
280437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->type == VAEncPictureParameterBufferType);
281437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
282437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if ((obj_buffer->num_elements != 1) ||
283bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (obj_buffer->size != sizeof(VAEncPictureParameterBufferH263))) {
284437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_UNKNOWN;
285437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
286437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
287437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Transfer ownership of VAEncPictureParameterBufferH263 data */
288437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pBuffer = (VAEncPictureParameterBufferH263 *) obj_buffer->buffer_data;
289437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->buffer_data = NULL;
290437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->size = 0;
291437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
292437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->ref_surface = SURFACE(pBuffer->reference_picture);
293437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->dest_surface = SURFACE(pBuffer->reconstructed_picture);
294437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->coded_buf = BUFFER(pBuffer->coded_buf);
295437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
29688c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    ctx->RawWidth = pBuffer->picture_width;
29788c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang    ctx->RawHeight = pBuffer->picture_height;
298437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
299437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Insert do_header command here */
300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((ctx->Width == 128) && (ctx->Height == 96))
302437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        SourceFormatType = _128x96_SubQCIF;
303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    else if ((ctx->Width == 176) && (ctx->Height == 144))
304437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        SourceFormatType = _176x144_QCIF;
305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    else if ((ctx->Width == 352) && (ctx->Height == 288))
306437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        SourceFormatType = _352x288_CIF;
307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    else if ((ctx->Width == 704) && (ctx->Height == 576))
308437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        SourceFormatType = _704x576_4CIF;
309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    else if ((ctx->Width <= 720) && (ctx->Height <= 576))
310437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        SourceFormatType = 7;
311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    else {
312c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Unsupported resolution!\n");
313437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
314437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
315437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
316e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang    memset(cmdbuf->header_mem_p + ctx->pic_header_ofs,
317dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun           0,
318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun           HEADER_SIZE);
319437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw__H263_prepare_picture_header(cmdbuf->header_mem_p + ctx->pic_header_ofs,
320437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                     ctx->obj_context->frame_count,
321437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                     pBuffer->picture_type,
322437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                     SourceFormatType,
323437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                     ctx->sRCParams.FrameRate,
32488c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang                                     ctx->RawWidth,
32588c877ee20e8d71ac211a44103e4a9e80083de83Kun Wang                                     ctx->RawHeight);
326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
327437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_insert_command_package(ctx->obj_context,
328437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      ctx->ParallelCores - 1, /* Send to the last core as this will complete first */
329437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      MTX_CMDID_DO_HEADER,
330437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      &cmdbuf->header_mem,
331437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      ctx->pic_header_ofs);
332437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
333437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
334437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Prepare START_PICTURE params */
335437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Actually H263 only use 1 core from DDKv186 */
336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = (ctx->ParallelCores - 1); i >= 0; i--)
337437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = pnw_RenderPictureParameter(ctx, i);
338437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
339437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    free(pBuffer);
340437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
341437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
342437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
343437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
344437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__H263ES_process_slice_param(context_ENC_p ctx, object_buffer_p obj_buffer)
345437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
346437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Prepare InParams for macros of current slice, insert slice header, insert do slice command */
347437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAEncSliceParameterBuffer *pBuffer;
348dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf;
349437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    PIC_PARAMS *psPicParams = (PIC_PARAMS *)(cmdbuf->pic_params_p);
350e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned int i;
3514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int slice_param_idx;
352437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
353437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->type == VAEncSliceParameterBufferType);
354dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
355437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Transfer ownership of VAEncPictureParameterBufferH263 data */
356437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pBuffer = (VAEncSliceParameterBuffer *) obj_buffer->buffer_data;
357437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->size = 0;
358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*In case the slice number changes*/
360dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((ctx->slice_param_cache != NULL) && (obj_buffer->num_elements != ctx->slice_param_num)) {
361c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Slice number changes. Previous value is %d. Now it's %d\n",
362dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 ctx->slice_param_num, obj_buffer->num_elements);
363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(ctx->slice_param_cache);
364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_cache = NULL;
365dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_num = 0;
366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
367dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
368dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx->slice_param_cache) {
369dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_num = obj_buffer->num_elements;
370c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate %d VAEncSliceParameterBuffer cache buffers\n", 2 * ctx->slice_param_num);
371dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_cache = calloc(2 * ctx->slice_param_num, sizeof(VAEncSliceParameterBuffer));
372dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (NULL == ctx->slice_param_cache) {
373c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "Run out of memory!\n");
374dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(obj_buffer->buffer_data);
375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_ALLOCATION_FAILED;
376dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
3774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
3784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < obj_buffer->num_elements; i++) {
380437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /*Todo list:
381437b3eda28a4bf098efa80598cab67f190275266Fei Jiang         *1.Insert Do header command
382437b3eda28a4bf098efa80598cab67f190275266Fei Jiang         *2.setup InRowParams
383437b3eda28a4bf098efa80598cab67f190275266Fei Jiang         *3.setup Slice params
384437b3eda28a4bf098efa80598cab67f190275266Fei Jiang         *4.Insert Do slice command
385437b3eda28a4bf098efa80598cab67f190275266Fei Jiang         * */
386437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        unsigned char deblock_idc;
387437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
388437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        deblock_idc = pBuffer->slice_flags.bits.disable_deblocking_filter_idc;
389437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
390437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /* Insert Do Header command, relocation is needed */
391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->obj_context->slice_count) {  /*First slice of a frame need not slice header*/
392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            memset(cmdbuf->header_mem_p + ctx->slice_header_ofs
393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   + ctx->obj_context->slice_count * HEADER_SIZE,
394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   0,
395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   HEADER_SIZE);
396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw__H263_prepare_GOBslice_header(
398e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang                cmdbuf->header_mem_p + ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE,
399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->obj_context->slice_count,
400dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->obj_context->frame_count);
401e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang
402437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            ctx->LastSliceNum[ctx->SliceToCore] = ctx->obj_context->slice_count;
403437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
404437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            pnw_cmdbuf_insert_command_package(ctx->obj_context,
405437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                              ctx->SliceToCore,
406437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                              MTX_CMDID_DO_HEADER,
407437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                              &cmdbuf->header_mem,
408437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                              ctx->slice_header_ofs + ctx->obj_context->slice_count * HEADER_SIZE);
409437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (0 == ctx->SliceToCore) {
411437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                ctx->SliceToCore = ctx->ParallelCores;
412437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            }
413437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            ctx->SliceToCore--;
414437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
415437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((pBuffer->start_row_number == 0) && pBuffer->slice_flags.bits.is_intra) {
418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_reset_encoder_params(ctx); /* originally do in BeginPicture, but beginpicture has no intra info */
419437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            ctx->BelowParamsBufIdx = (ctx->BelowParamsBufIdx + 1) & 0x1;
420437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
421437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
422dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        slice_param_idx = (pBuffer->slice_flags.bits.is_intra ? 0 : 1) * ctx->slice_param_num + i;
423dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (VAEncSliceParameter_Equal(&ctx->slice_param_cache[slice_param_idx], pBuffer) == 0) {
424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* cache current param parameters */
425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            memcpy(&ctx->slice_param_cache[slice_param_idx],
426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   pBuffer, sizeof(VAEncSliceParameterBuffer));
427dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* Setup InParams value*/
429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_setup_slice_params(ctx,
430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   pBuffer->start_row_number * 16,
431bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                   pBuffer->slice_height * 16,
432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   pBuffer->slice_flags.bits.is_intra,
433dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   ctx->obj_context->frame_count > 0,
434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   psPicParams->sInParams.SeInitQP);
435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* Insert do slice command and setup related buffer value */
438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        pnw__send_encode_slice_params(ctx,
439437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      pBuffer->slice_flags.bits.is_intra,
440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      pBuffer->start_row_number * 16,
441437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      deblock_idc,
442437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      ctx->obj_context->frame_count,
443bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                      pBuffer->slice_height * 16,
444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      ctx->obj_context->slice_count);
445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
446c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Now frame_count/slice_count is %d/%d\n",
447437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                 ctx->obj_context->frame_count, ctx->obj_context->slice_count);
448437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
449437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->obj_context->slice_count++;
450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pBuffer++;        /*Move to the next buffer*/
451437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
452437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ASSERT(ctx->obj_context->slice_count < MAX_SLICES_PER_PICTURE);
453437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
454437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    free(obj_buffer->buffer_data);
456437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->buffer_data = NULL;
457437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return VA_STATUS_SUCCESS;
458437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
459437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
460437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
461437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
462437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_H263ES_RenderPicture(
463437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context,
464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_buffer_p *buffers,
465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int num_buffers)
466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_CONTEXT_H263ES;
469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
471c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_RenderPicture\n");
472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < num_buffers; i++) {
474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        object_buffer_p obj_buffer = buffers[i];
475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (obj_buffer->type) {
477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAEncSequenceParameterBufferType:
478c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263_RenderPicture got VAEncSequenceParameterBufferType\n");
479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = pnw__H263ES_process_sequence_param(ctx, obj_buffer);
480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
482437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAEncPictureParameterBufferType:
484c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263_RenderPicture got VAEncPictureParameterBuffer\n");
485437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = pnw__H263ES_process_picture_param(ctx, obj_buffer);
486437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
487437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
488437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
489437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAEncSliceParameterBufferType:
490c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263_RenderPicture got VAEncSliceParameterBufferType\n");
491437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = pnw__H263ES_process_slice_param(ctx, obj_buffer);
492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
493437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
495437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        default:
496437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = VA_STATUS_ERROR_UNKNOWN;
497437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
498437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
499dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (vaStatus != VA_STATUS_SUCCESS) {
500437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
501437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
502437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
503437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
504437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
505437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
506437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
507437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
508437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_H263ES_EndPicture(
509437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context)
510437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
511437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
512437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_CONTEXT_H263ES;
513437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
514c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_H263ES_EndPicture\n");
515437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
516437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    vaStatus = pnw_EndPicture(ctx);
517437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
518437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
519437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
520437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
521437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
522437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstruct format_vtable_s pnw_H263ES_vtable = {
523dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunqueryConfigAttributes:
524dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_H263ES_QueryConfigAttributes,
525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvalidateConfig:
526dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_H263ES_ValidateConfig,
527dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuncreateContext:
528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_H263ES_CreateContext,
529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkundestroyContext:
530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_H263ES_DestroyContext,
531dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunbeginPicture:
532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_H263ES_BeginPicture,
533dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunrenderPicture:
534dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_H263ES_RenderPicture,
535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunendPicture:
536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_H263ES_EndPicture
537437b3eda28a4bf098efa80598cab67f190275266Fei Jiang};
538