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"
32c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h"
33437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_surface.h"
34437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_cmdbuf.h"
35437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_MPEG4ES.h"
36437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_hostcode.h"
37437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_hostheader.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_MPEG4_MAX_BITRATE 16000000
45437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
46bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define INIT_CONTEXT_MPEG4ES    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 Jiang
52437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void pnw_MPEG4ES_QueryConfigAttributes(
53cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    VAProfile __maybe_unused profile,
54cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    VAEntrypoint __maybe_unused entrypoint,
55cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    VAConfigAttrib * attrib_list,
56dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int num_attribs)
57437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
58437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
59437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
60c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_QueryConfigAttributes\n");
61437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
62437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* RateControl attributes */
63437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    for (i = 0; i < num_attribs; i++) {
64437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        switch (attrib_list[i].type) {
65437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAConfigAttribRTFormat:
66437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
67dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
68437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAConfigAttribRateControl:
69437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            attrib_list[i].value = VA_RC_NONE | VA_RC_CBR | VA_RC_VBR;
70437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
72437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        default:
73437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
74437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
75437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
76437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
78437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return;
79437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
80437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
81437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
82437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG4ES_ValidateConfig(
83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
84437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
85242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    int i;
86242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    /* Check all attributes */
87242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    for (i = 0; i < obj_config->attrib_count; i++) {
883f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        switch (obj_config->attrib_list[i].type) {
893f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        case VAConfigAttribRTFormat:
903f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            /* Ignore */
913f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            break;
923f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        case VAConfigAttribRateControl:
933f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            break;
943f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        default:
953f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
963f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        }
973f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    }
98242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang
99242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    return VA_STATUS_SUCCESS;
100437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
101437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
102437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
103437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG4ES_CreateContext(
104437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context,
105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
106437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
107437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
108437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    context_ENC_p ctx;
109437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
110437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int eRCmode;
111437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
112c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_CreateContext\n");
113437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
114437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    vaStatus = pnw_CreateContext(obj_context, obj_config, 0);
115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus)
116437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
117437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
118437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx = (context_ENC_p) obj_context->format_data;
119437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
120437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    for (i = 0; i < obj_config->attrib_count; i++) {
121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (obj_config->attrib_list[i].type == VAConfigAttribRateControl)
122437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
123437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
124437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
125437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (i >= obj_config->attrib_count)
126437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        eRCmode = VA_RC_NONE;
127437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    else
128437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        eRCmode = obj_config->attrib_list[i].value;
129437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
130437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
131437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (eRCmode == VA_RC_VBR) {
132437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->eCodec = IMG_CODEC_MPEG4_VBR;
133437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->sRCParams.RCEnable = IMG_TRUE;
134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (eRCmode == VA_RC_CBR) {
135437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->eCodec = IMG_CODEC_MPEG4_CBR;
136437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->sRCParams.RCEnable = IMG_TRUE;
137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (eRCmode == VA_RC_NONE) {
138437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->eCodec = IMG_CODEC_MPEG4_NO_RC;
139437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->sRCParams.RCEnable = IMG_FALSE;
140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else
141437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
142437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->eFormat = IMG_CODEC_PL12;
143437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
144437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->Slices = 1;
145437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->ParallelCores = 1;
146437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
147437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->IPEControl = pnw__get_ipe_control(ctx->eCodec);
148437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (obj_config->profile) {
150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileMPEG4Simple:
151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->profile_idc = 2;
152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileMPEG4AdvancedSimple:
154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->profile_idc = 3;
155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->profile_idc = 2;
158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
159437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
160437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
161437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
162437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
163437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
165437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void pnw_MPEG4ES_DestroyContext(
166437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context)
167437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
168c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_DestroyPicture\n");
169437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_DestroyContext(obj_context);
171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
173437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG4ES_BeginPicture(
174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context)
175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
176437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_CONTEXT_MPEG4ES;
177437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
178437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
179c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_BeginPicture\n");
180437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
181437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    vaStatus = pnw_BeginPicture(ctx);
182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
183437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
184437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
185437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
186437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__MPEG4ES_process_sequence_param(context_ENC_p ctx, object_buffer_p obj_buffer)
187437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
188437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
189437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAEncSequenceParameterBufferMPEG4 *seq_params;
190437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf;
191437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MPEG4_PROFILE_TYPE profile;
192e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying    int i, vop_time_increment_resolution;
193176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    unsigned frame_size;
194437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
195437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->type == VAEncSequenceParameterBufferType);
196437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->num_elements == 1);
197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->size == sizeof(VAEncSequenceParameterBufferMPEG4));
198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
199f31d5416a60f83e184b0906a7ec77ba021840531hding    //initialize the frame_rate and qp
200f31d5416a60f83e184b0906a7ec77ba021840531hding    ctx->sRCParams.InitialQp = 15;
201f31d5416a60f83e184b0906a7ec77ba021840531hding    ctx->sRCParams.MinQP = 1;
202f31d5416a60f83e184b0906a7ec77ba021840531hding    ctx->sRCParams.FrameRate = 30;
203f31d5416a60f83e184b0906a7ec77ba021840531hding
204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if ((obj_buffer->num_elements != 1) ||
205bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (obj_buffer->size != sizeof(VAEncSequenceParameterBufferMPEG4))) {
206437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_UNKNOWN;
207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
209437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    seq_params = (VAEncSequenceParameterBufferMPEG4 *) obj_buffer->buffer_data;
210437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->buffer_data = NULL;
211437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->size = 0;
212437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (seq_params->bits_per_second > TOPAZ_MPEG4_MAX_BITRATE) {
214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->sRCParams.BitsPerSecond = TOPAZ_MPEG4_MAX_BITRATE;
215c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, " bits_per_second(%d) exceeds \
216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun		the maximum bitrate, set it with %d\n",
217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 seq_params->bits_per_second,
218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 TOPAZ_MPEG4_MAX_BITRATE);
219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else
220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->sRCParams.BitsPerSecond = seq_params->bits_per_second;
221437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
222e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying    ctx->sRCParams.FrameRate = (seq_params->frame_rate < 1) ?
223e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying        1 : ((65535 < seq_params->frame_rate) ? 65535 : seq_params->frame_rate);
224437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->sRCParams.InitialQp = seq_params->initial_qp;
225437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->sRCParams.MinQP = seq_params->min_qp;
226bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    ctx->sRCParams.BUSize = 0;  /* default 0, and will be set in pnw__setup_busize */
227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
228437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->sRCParams.Slices = 1;
229437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->sRCParams.QCPOffset = 0;/* FIXME */
2305cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang
2315cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang    if (ctx->sRCParams.IntraFreq != seq_params->intra_period
2325cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang            && ctx->raw_frame_count != 0
2335cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang            && ctx->sRCParams.IntraFreq != 0
2345cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang            && ((ctx->obj_context->frame_count + 1) % ctx->sRCParams.IntraFreq) != 0
2355cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang            && (!ctx->sRCParams.bDisableFrameSkipping)) {
2365cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang        drv_debug_msg(VIDEO_DEBUG_ERROR,
2375cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang                "Changing intra period value in the middle of a GOP is\n"
2385cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang                "not allowed if frame skip isn't disabled.\n"
2395cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang                "it can cause I frame been skipped\n");
2405cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang        free(seq_params);
2415cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang        return VA_STATUS_ERROR_INVALID_PARAMETER;
2425cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang    }
2435cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang    else
2445cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang        ctx->sRCParams.IntraFreq = seq_params->intra_period;
2455cea36530c5b4364179fb49c0728966457ef0e3dElaine Wang
246437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->sRCParams.IntraFreq = seq_params->intra_period;
247437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
248176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    frame_size = ctx->sRCParams.BitsPerSecond / ctx->sRCParams.FrameRate;
249437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
2502befccec034c13d34746a9e87149889d59ac767bFei Jiang    ctx->sRCParams.BufferSize = ctx->sRCParams.BitsPerSecond;
251176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    /* Header buffersize is specified in 16384 units, so ensure conformance
252176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding       of parameters. InitialLevel in units of 64, assured by this */
253176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding
254176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    ctx->sRCParams.BufferSize /= 16384;
255176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    ctx->sRCParams.BufferSize *= 16384;
256437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
257176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    ctx->sRCParams.InitialLevel = (3 * ctx->sRCParams.BufferSize) >> 4;
258176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    /* Aligned with target frame size */
259176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    ctx->sRCParams.InitialLevel += (frame_size / 2);
260176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    ctx->sRCParams.InitialLevel /= frame_size;
261176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    ctx->sRCParams.InitialLevel *= frame_size;
262176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    ctx->sRCParams.InitialDelay = ctx->sRCParams.BufferSize - ctx->sRCParams.InitialLevel;
263176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    ctx->buffer_size = ctx->sRCParams.BufferSize;
264176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding
265176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding    if (ctx->raw_frame_count == 0) { /* Add Register IO behind begin Picture */
266176e0a50d1dc1d3cc1ea7fc456007a1816fee7fchding        for (i = (ctx->ParallelCores - 1); i >= 0; i--)
267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_set_bias(ctx, i);
268437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
269437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
270437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf = ctx->obj_context->pnw_cmdbuf;
271437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (ctx->profile_idc) {
273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case 2:
274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        profile = SP;
275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case 3:
277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        profile = ASP;
278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        profile = SP;
281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
282437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
284e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang    memset(cmdbuf->header_mem_p + ctx->seq_header_ofs,
285dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun           0,
286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun           HEADER_SIZE);
287e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang
288e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying    vop_time_increment_resolution = (seq_params->vop_time_increment_resolution < 1) ? 1 :
289e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying        ((65535 < seq_params->vop_time_increment_resolution) ? 65535 : seq_params->vop_time_increment_resolution);
290437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw__MPEG4_prepare_sequence_header(
291437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        cmdbuf->header_mem_p + ctx->seq_header_ofs,
292437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        0, /* BFrame? */
293437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        profile, /* sProfile */
294437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        seq_params->profile_and_level_indication, /* */
295437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        seq_params->fixed_vop_time_increment, /*3,*/  /* sFixed_vop_time_increment */
296437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        seq_params->video_object_layer_width,/* Picture_Width_Pixels */
297437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        seq_params->video_object_layer_height, /* Picture_Height_Pixels */
298437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        NULL,
299e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying        vop_time_increment_resolution); /* VopTimeResolution */
300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
301e6cdcd21f696e120f24e2841c94d4b95fc441dceChang Ying    ctx->MPEG4_vop_time_increment_resolution = vop_time_increment_resolution;
302437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
303437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_insert_command_package(ctx->obj_context,
304437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      ctx->ParallelCores - 1, /* Send to the last core as this will complete first */
305437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      MTX_CMDID_DO_HEADER,
306437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      &cmdbuf->header_mem,
307437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      ctx->seq_header_ofs);
308437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
309437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    free(seq_params);
310437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
311437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
312437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
313437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
314437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__MPEG4ES_process_picture_param(context_ENC_p ctx, object_buffer_p obj_buffer)
315437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
316437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
317437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAEncPictureParameterBufferMPEG4 *pBuffer;
318437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf;
319e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned int *pPictureHeaderMem;
320437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MTX_HEADER_PARAMS *psPicHeader;
321437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
3222befccec034c13d34746a9e87149889d59ac767bFei Jiang    IMG_BOOL bIsVOPCoded = IMG_TRUE;
323437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
324437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->type == VAEncPictureParameterBufferType);
325437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((obj_buffer->num_elements != 1) ||
327bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (obj_buffer->size != sizeof(VAEncPictureParameterBufferMPEG4))) {
328437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_UNKNOWN;
329437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
330437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
331437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Transfer ownership of VAEncPictureParameterBufferMPEG4 data */
332437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pBuffer = (VAEncPictureParameterBufferMPEG4 *) obj_buffer->buffer_data;
333437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->buffer_data = NULL;
334437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->size = 0;
335437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
336437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->ref_surface = SURFACE(pBuffer->reference_picture);
337437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->dest_surface = SURFACE(pBuffer->reconstructed_picture);
338437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->coded_buf = BUFFER(pBuffer->coded_buf);
339437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
340437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(ctx->Width == pBuffer->picture_width);
341437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(ctx->Height == pBuffer->picture_height);
342437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
3432befccec034c13d34746a9e87149889d59ac767bFei Jiang    /*if (ctx->sRCParams.RCEnable && ctx->sRCParams.FrameSkip)
344bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        bIsVOPCoded = IMG_FALSE;*/
3452befccec034c13d34746a9e87149889d59ac767bFei Jiang
346437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->FCode = 4 - 1; /* 4 is default value of "ui8Search_range" */
347437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
348e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    pPictureHeaderMem = (unsigned int *)(cmdbuf->header_mem_p + ctx->pic_header_ofs);
349437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psPicHeader = (MTX_HEADER_PARAMS *)pPictureHeaderMem;
350437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
351e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang    memset(pPictureHeaderMem, 0, HEADER_SIZE);
352e968fbfc452194dd51c12901ffa338c312a5e3c7Fei Jiang
353e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    pnw__MPEG4_prepare_vop_header((unsigned char *)pPictureHeaderMem,
3542befccec034c13d34746a9e87149889d59ac767bFei Jiang                                  bIsVOPCoded,
355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  pBuffer->vop_time_increment, /* In testbench, this should be FrameNum */
356437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                  4,/* default value is 4,search range */
357437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                  pBuffer->picture_type,
358437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                  ctx->MPEG4_vop_time_increment_resolution/* defaule value */);
359437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
360437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Mark this header as a complex header */
361437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psPicHeader->Elements |= 0x100;
362dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pPictureHeaderMem += ((HEADER_SIZE)  >> 3);
363437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
364e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    pnw__MPEG4_prepare_vop_header((unsigned char *)pPictureHeaderMem,
365437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                  IMG_FALSE,
366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  pBuffer->vop_time_increment, /* In testbench, this should be FrameNum */
367437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                  4,/* default value is 4,search range */
368437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                  pBuffer->picture_type,
369437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                  ctx->MPEG4_vop_time_increment_resolution/* defaule value */);
370437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
371437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_insert_command_package(ctx->obj_context,
372437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      ctx->ParallelCores - 1, /* Send to the last core as this will complete first */
373437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      MTX_CMDID_DO_HEADER,
374437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      &cmdbuf->header_mem,
375437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      ctx->pic_header_ofs);
376437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
377437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Prepare START_PICTURE params */
378dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = (ctx->ParallelCores - 1); i >= 0; i--)
379437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = pnw_RenderPictureParameter(ctx, i);
380437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
381437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    free(pBuffer);
382437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
383437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
384437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
385437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__MPEG4ES_process_slice_param(context_ENC_p ctx, object_buffer_p obj_buffer)
386437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
387437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
388437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAEncSliceParameterBuffer *pBuffer;
389437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf;
390437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    PIC_PARAMS *psPicParams = (PIC_PARAMS *)(cmdbuf->pic_params_p);
391e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned int i;
3924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int slice_param_idx;
393437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
394437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->type == VAEncSliceParameterBufferType);
395437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
396437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pBuffer = (VAEncSliceParameterBuffer *) obj_buffer->buffer_data;
3972befccec034c13d34746a9e87149889d59ac767bFei Jiang
3984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*In case the slice number changes*/
399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((ctx->slice_param_cache != NULL) && (obj_buffer->num_elements != ctx->slice_param_num)) {
400c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Slice number changes. Previous value is %d. Now it's %d\n",
401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 ctx->slice_param_num, obj_buffer->num_elements);
402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(ctx->slice_param_cache);
403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_cache = NULL;
404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_num = 0;
4054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
4064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx->slice_param_cache) {
408c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate %d VAEncSliceParameterBuffer cache buffers\n", 2 * ctx->slice_param_num);
409dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_num = obj_buffer->num_elements;
410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->slice_param_cache = calloc(2 * ctx->slice_param_num, sizeof(VAEncSliceParameterBuffer));
411dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (NULL == ctx->slice_param_cache) {
412c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "Run out of memory!\n");
413dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(obj_buffer->buffer_data);
414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_ALLOCATION_FAILED;
415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
4174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
419dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < obj_buffer->num_elements; i++) {
420437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
421437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        unsigned char deblock_idc;
422437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
423437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        deblock_idc = pBuffer->slice_flags.bits.disable_deblocking_filter_idc;
424437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
425437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if ((pBuffer->start_row_number == 0) && pBuffer->slice_flags.bits.is_intra) {
426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_reset_encoder_params(ctx);
427dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->BelowParamsBufIdx = (ctx->BelowParamsBufIdx + 1) & 0x1;
428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /*The corresponding slice buffer cache*/
431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        slice_param_idx = (pBuffer->slice_flags.bits.is_intra ? 0 : 1) * ctx->slice_param_num + i;
432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
433dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (VAEncSliceParameter_Equal(&ctx->slice_param_cache[slice_param_idx], pBuffer) == 0) {
434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* cache current param parameters */
435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            memcpy(&ctx->slice_param_cache[slice_param_idx],
436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                   pBuffer, sizeof(VAEncSliceParameterBuffer));
437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* Setup InParams value*/
439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_setup_slice_params(ctx,
440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   pBuffer->start_row_number * 16,
441bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                   pBuffer->slice_height * 16,
442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   pBuffer->slice_flags.bits.is_intra,
443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   ctx->obj_context->frame_count > 0,
444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   psPicParams->sInParams.SeInitQP);
445437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
446437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pnw__send_encode_slice_params(ctx,
448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                      pBuffer->slice_flags.bits.is_intra,
449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                      pBuffer->start_row_number * 16,
450437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      deblock_idc,
451437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      ctx->obj_context->frame_count,
452bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                      pBuffer->slice_height * 16,
453437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                      ctx->obj_context->slice_count);
454437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
455c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Now frame_count/slice_count is %d/%d\n",
456437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                 ctx->obj_context->frame_count, ctx->obj_context->slice_count);
457437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
458437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->obj_context->slice_count++;
459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pBuffer++;
460437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ASSERT(ctx->obj_context->slice_count < MAX_SLICES_PER_PICTURE);
462437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
463437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    free(obj_buffer->buffer_data);
465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->buffer_data = NULL;
466dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
471437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG4ES_RenderPicture(
472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context,
473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_buffer_p *buffers,
474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int num_buffers)
475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
476437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_CONTEXT_MPEG4ES;
477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
480c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_RenderPicture\n");
481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
482dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < num_buffers; i++) {
483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        object_buffer_p obj_buffer = buffers[i];
484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
485437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        switch (obj_buffer->type) {
486437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAEncSequenceParameterBufferType:
487c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_RenderPicture got VAEncSequenceParameterBufferType\n");
488437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = pnw__MPEG4ES_process_sequence_param(ctx, obj_buffer);
489437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
490437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
491dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAEncPictureParameterBufferType:
493c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_RenderPicture got VAEncPictureParameterBufferType\n");
494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = pnw__MPEG4ES_process_picture_param(ctx, obj_buffer);
495437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
496437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
498437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAEncSliceParameterBufferType:
499c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_RenderPicture got VAEncSliceParameterBufferType\n");
500437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = pnw__MPEG4ES_process_slice_param(ctx, obj_buffer);
501437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
502437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
503437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        default:
504437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = VA_STATUS_ERROR_UNKNOWN;
505437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
506437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
507437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
509437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
510437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
511437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
512437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG4ES_EndPicture(
513437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context)
514437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
515437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_CONTEXT_MPEG4ES;
516437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
517c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4ES_EndPicture\n");
518437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return pnw_EndPicture(ctx);
519437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
520437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
521437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
522437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstruct format_vtable_s pnw_MPEG4ES_vtable = {
523dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunqueryConfigAttributes:
524dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG4ES_QueryConfigAttributes,
525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvalidateConfig:
526dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG4ES_ValidateConfig,
527dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuncreateContext:
528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG4ES_CreateContext,
529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkundestroyContext:
530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG4ES_DestroyContext,
531dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunbeginPicture:
532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG4ES_BeginPicture,
533dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunrenderPicture:
534dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG4ES_RenderPicture,
535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunendPicture:
536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG4ES_EndPicture
537437b3eda28a4bf098efa80598cab67f190275266Fei Jiang};
538