129a84457aed4c45bc900998b5e11c03023264208James Dong/* ------------------------------------------------------------------
229a84457aed4c45bc900998b5e11c03023264208James Dong * Copyright (C) 1998-2009 PacketVideo
329a84457aed4c45bc900998b5e11c03023264208James Dong *
429a84457aed4c45bc900998b5e11c03023264208James Dong * Licensed under the Apache License, Version 2.0 (the "License");
529a84457aed4c45bc900998b5e11c03023264208James Dong * you may not use this file except in compliance with the License.
629a84457aed4c45bc900998b5e11c03023264208James Dong * You may obtain a copy of the License at
729a84457aed4c45bc900998b5e11c03023264208James Dong *
829a84457aed4c45bc900998b5e11c03023264208James Dong *      http://www.apache.org/licenses/LICENSE-2.0
929a84457aed4c45bc900998b5e11c03023264208James Dong *
1029a84457aed4c45bc900998b5e11c03023264208James Dong * Unless required by applicable law or agreed to in writing, software
1129a84457aed4c45bc900998b5e11c03023264208James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1229a84457aed4c45bc900998b5e11c03023264208James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
1329a84457aed4c45bc900998b5e11c03023264208James Dong * express or implied.
1429a84457aed4c45bc900998b5e11c03023264208James Dong * See the License for the specific language governing permissions
1529a84457aed4c45bc900998b5e11c03023264208James Dong * and limitations under the License.
1629a84457aed4c45bc900998b5e11c03023264208James Dong * -------------------------------------------------------------------
1729a84457aed4c45bc900998b5e11c03023264208James Dong */
1829a84457aed4c45bc900998b5e11c03023264208James Dong#include "avcenc_api.h"
1929a84457aed4c45bc900998b5e11c03023264208James Dong#include "avcenc_lib.h"
2029a84457aed4c45bc900998b5e11c03023264208James Dong
2129a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
2229a84457aed4c45bc900998b5e11c03023264208James Dong/*  Function : PVAVCGetNALType()                                            */
2329a84457aed4c45bc900998b5e11c03023264208James Dong/*  Date     : 11/4/2003                                                    */
2429a84457aed4c45bc900998b5e11c03023264208James Dong/*  Purpose  : Sniff NAL type from the bitstream                            */
2529a84457aed4c45bc900998b5e11c03023264208James Dong/*  In/out   :                                                              */
2629a84457aed4c45bc900998b5e11c03023264208James Dong/*  Return   : AVCENC_SUCCESS if succeed, AVCENC_FAIL if fail.              */
2729a84457aed4c45bc900998b5e11c03023264208James Dong/*  Modified :                                                              */
2829a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
2929a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncGetNALType(unsigned char *bitstream, int size,
3029a84457aed4c45bc900998b5e11c03023264208James Dong        int *nal_type, int *nal_ref_idc)
3129a84457aed4c45bc900998b5e11c03023264208James Dong{
3229a84457aed4c45bc900998b5e11c03023264208James Dong    int forbidden_zero_bit;
3329a84457aed4c45bc900998b5e11c03023264208James Dong    if (size > 0)
3429a84457aed4c45bc900998b5e11c03023264208James Dong    {
3529a84457aed4c45bc900998b5e11c03023264208James Dong        forbidden_zero_bit = bitstream[0] >> 7;
3629a84457aed4c45bc900998b5e11c03023264208James Dong        if (forbidden_zero_bit != 0)
3729a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_FAIL;
3829a84457aed4c45bc900998b5e11c03023264208James Dong        *nal_ref_idc = (bitstream[0] & 0x60) >> 5;
3929a84457aed4c45bc900998b5e11c03023264208James Dong        *nal_type = bitstream[0] & 0x1F;
4029a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_SUCCESS;
4129a84457aed4c45bc900998b5e11c03023264208James Dong    }
4229a84457aed4c45bc900998b5e11c03023264208James Dong
4329a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_FAIL;
4429a84457aed4c45bc900998b5e11c03023264208James Dong}
4529a84457aed4c45bc900998b5e11c03023264208James Dong
4629a84457aed4c45bc900998b5e11c03023264208James Dong
4729a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
4829a84457aed4c45bc900998b5e11c03023264208James Dong/*  Function : PVAVCEncInitialize()                                         */
4929a84457aed4c45bc900998b5e11c03023264208James Dong/*  Date     : 3/18/2004                                                    */
5029a84457aed4c45bc900998b5e11c03023264208James Dong/*  Purpose  : Initialize the encoder library, allocate memory and verify   */
5129a84457aed4c45bc900998b5e11c03023264208James Dong/*              the profile/level support/settings.                         */
5229a84457aed4c45bc900998b5e11c03023264208James Dong/*  In/out   : Encoding parameters.                                         */
5329a84457aed4c45bc900998b5e11c03023264208James Dong/*  Return   : AVCENC_SUCCESS for success.                                  */
5429a84457aed4c45bc900998b5e11c03023264208James Dong/*  Modified :                                                              */
5529a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
5629a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncInitialize(AVCHandle *avcHandle, AVCEncParams *encParam,
5729a84457aed4c45bc900998b5e11c03023264208James Dong        void* extSPS, void* extPPS)
5829a84457aed4c45bc900998b5e11c03023264208James Dong{
5929a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status;
6029a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEncObject *encvid;
6129a84457aed4c45bc900998b5e11c03023264208James Dong    AVCCommonObj *video;
6229a84457aed4c45bc900998b5e11c03023264208James Dong    uint32 *userData = (uint32*) avcHandle->userData;
6329a84457aed4c45bc900998b5e11c03023264208James Dong    int framesize;
6429a84457aed4c45bc900998b5e11c03023264208James Dong
6529a84457aed4c45bc900998b5e11c03023264208James Dong    if (avcHandle->AVCObject != NULL)
6629a84457aed4c45bc900998b5e11c03023264208James Dong    {
6729a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_ALREADY_INITIALIZED; /* It's already initialized, need to cleanup first */
6829a84457aed4c45bc900998b5e11c03023264208James Dong    }
6929a84457aed4c45bc900998b5e11c03023264208James Dong
7029a84457aed4c45bc900998b5e11c03023264208James Dong    /* not initialized */
7129a84457aed4c45bc900998b5e11c03023264208James Dong
7229a84457aed4c45bc900998b5e11c03023264208James Dong    /* allocate videoObject */
7329a84457aed4c45bc900998b5e11c03023264208James Dong    avcHandle->AVCObject = (void*)avcHandle->CBAVC_Malloc(userData, sizeof(AVCEncObject), DEFAULT_ATTR);
7429a84457aed4c45bc900998b5e11c03023264208James Dong    if (avcHandle->AVCObject == NULL)
7529a84457aed4c45bc900998b5e11c03023264208James Dong    {
7629a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
7729a84457aed4c45bc900998b5e11c03023264208James Dong    }
7829a84457aed4c45bc900998b5e11c03023264208James Dong
7929a84457aed4c45bc900998b5e11c03023264208James Dong    encvid = (AVCEncObject*) avcHandle->AVCObject;
8029a84457aed4c45bc900998b5e11c03023264208James Dong
8129a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->enc_state = AVCEnc_Initializing;
8229a84457aed4c45bc900998b5e11c03023264208James Dong
8329a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->avcHandle = avcHandle;
8429a84457aed4c45bc900998b5e11c03023264208James Dong
8529a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->common = (AVCCommonObj*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCCommonObj), DEFAULT_ATTR);
8629a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid->common == NULL)
8729a84457aed4c45bc900998b5e11c03023264208James Dong    {
8829a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
8929a84457aed4c45bc900998b5e11c03023264208James Dong    }
9029a84457aed4c45bc900998b5e11c03023264208James Dong
9129a84457aed4c45bc900998b5e11c03023264208James Dong    video = encvid->common;
9229a84457aed4c45bc900998b5e11c03023264208James Dong
9329a84457aed4c45bc900998b5e11c03023264208James Dong    /* allocate bitstream structure */
9429a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->bitstream = (AVCEncBitstream*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCEncBitstream), DEFAULT_ATTR);
9529a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid->bitstream == NULL)
9629a84457aed4c45bc900998b5e11c03023264208James Dong    {
9729a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
9829a84457aed4c45bc900998b5e11c03023264208James Dong    }
9929a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->bitstream->encvid = encvid; /* to point back for reallocation */
10029a84457aed4c45bc900998b5e11c03023264208James Dong
10129a84457aed4c45bc900998b5e11c03023264208James Dong    /* allocate sequence parameter set structure */
10229a84457aed4c45bc900998b5e11c03023264208James Dong    video->currSeqParams = (AVCSeqParamSet*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCSeqParamSet), DEFAULT_ATTR);
10329a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->currSeqParams == NULL)
10429a84457aed4c45bc900998b5e11c03023264208James Dong    {
10529a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
10629a84457aed4c45bc900998b5e11c03023264208James Dong    }
10729a84457aed4c45bc900998b5e11c03023264208James Dong
10829a84457aed4c45bc900998b5e11c03023264208James Dong    /* allocate picture parameter set structure */
10929a84457aed4c45bc900998b5e11c03023264208James Dong    video->currPicParams = (AVCPicParamSet*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCPicParamSet), DEFAULT_ATTR);
11029a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->currPicParams == NULL)
11129a84457aed4c45bc900998b5e11c03023264208James Dong    {
11229a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
11329a84457aed4c45bc900998b5e11c03023264208James Dong    }
11429a84457aed4c45bc900998b5e11c03023264208James Dong
11529a84457aed4c45bc900998b5e11c03023264208James Dong    /* allocate slice header structure */
11629a84457aed4c45bc900998b5e11c03023264208James Dong    video->sliceHdr = (AVCSliceHeader*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCSliceHeader), DEFAULT_ATTR);
11729a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->sliceHdr == NULL)
11829a84457aed4c45bc900998b5e11c03023264208James Dong    {
11929a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
12029a84457aed4c45bc900998b5e11c03023264208James Dong    }
12129a84457aed4c45bc900998b5e11c03023264208James Dong
12229a84457aed4c45bc900998b5e11c03023264208James Dong    /* allocate encoded picture buffer structure*/
12329a84457aed4c45bc900998b5e11c03023264208James Dong    video->decPicBuf = (AVCDecPicBuffer*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCDecPicBuffer), DEFAULT_ATTR);
12429a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->decPicBuf == NULL)
12529a84457aed4c45bc900998b5e11c03023264208James Dong    {
12629a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
12729a84457aed4c45bc900998b5e11c03023264208James Dong    }
12829a84457aed4c45bc900998b5e11c03023264208James Dong
12929a84457aed4c45bc900998b5e11c03023264208James Dong    /* allocate rate control structure */
13029a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->rateCtrl = (AVCRateControl*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCRateControl), DEFAULT_ATTR);
13129a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid->rateCtrl == NULL)
13229a84457aed4c45bc900998b5e11c03023264208James Dong    {
13329a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
13429a84457aed4c45bc900998b5e11c03023264208James Dong    }
13529a84457aed4c45bc900998b5e11c03023264208James Dong
13629a84457aed4c45bc900998b5e11c03023264208James Dong    /* reset frame list, not really needed */
13729a84457aed4c45bc900998b5e11c03023264208James Dong    video->currPic = NULL;
13829a84457aed4c45bc900998b5e11c03023264208James Dong    video->currFS = NULL;
13929a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->currInput = NULL;
14029a84457aed4c45bc900998b5e11c03023264208James Dong    video->prevRefPic = NULL;
14129a84457aed4c45bc900998b5e11c03023264208James Dong
14229a84457aed4c45bc900998b5e11c03023264208James Dong    /* now read encParams, and allocate dimension-dependent variables */
14329a84457aed4c45bc900998b5e11c03023264208James Dong    /* such as mblock */
14429a84457aed4c45bc900998b5e11c03023264208James Dong    status = SetEncodeParam(avcHandle, encParam, extSPS, extPPS); /* initialized variables to be used in SPS*/
14529a84457aed4c45bc900998b5e11c03023264208James Dong    if (status != AVCENC_SUCCESS)
14629a84457aed4c45bc900998b5e11c03023264208James Dong    {
14729a84457aed4c45bc900998b5e11c03023264208James Dong        return status;
14829a84457aed4c45bc900998b5e11c03023264208James Dong    }
14929a84457aed4c45bc900998b5e11c03023264208James Dong
15029a84457aed4c45bc900998b5e11c03023264208James Dong    if (encParam->use_overrun_buffer == AVC_ON)
15129a84457aed4c45bc900998b5e11c03023264208James Dong    {
15229a84457aed4c45bc900998b5e11c03023264208James Dong        /* allocate overrun buffer */
15329a84457aed4c45bc900998b5e11c03023264208James Dong        encvid->oBSize = encvid->rateCtrl->cpbSize;
15429a84457aed4c45bc900998b5e11c03023264208James Dong        if (encvid->oBSize > DEFAULT_OVERRUN_BUFFER_SIZE)
15529a84457aed4c45bc900998b5e11c03023264208James Dong        {
15629a84457aed4c45bc900998b5e11c03023264208James Dong            encvid->oBSize = DEFAULT_OVERRUN_BUFFER_SIZE;
15729a84457aed4c45bc900998b5e11c03023264208James Dong        }
15829a84457aed4c45bc900998b5e11c03023264208James Dong        encvid->overrunBuffer = (uint8*) avcHandle->CBAVC_Malloc(userData, encvid->oBSize, DEFAULT_ATTR);
15929a84457aed4c45bc900998b5e11c03023264208James Dong        if (encvid->overrunBuffer == NULL)
16029a84457aed4c45bc900998b5e11c03023264208James Dong        {
16129a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_MEMORY_FAIL;
16229a84457aed4c45bc900998b5e11c03023264208James Dong        }
16329a84457aed4c45bc900998b5e11c03023264208James Dong    }
16429a84457aed4c45bc900998b5e11c03023264208James Dong    else
16529a84457aed4c45bc900998b5e11c03023264208James Dong    {
16629a84457aed4c45bc900998b5e11c03023264208James Dong        encvid->oBSize = 0;
16729a84457aed4c45bc900998b5e11c03023264208James Dong        encvid->overrunBuffer = NULL;
16829a84457aed4c45bc900998b5e11c03023264208James Dong    }
16929a84457aed4c45bc900998b5e11c03023264208James Dong
17029a84457aed4c45bc900998b5e11c03023264208James Dong    /* allocate frame size dependent structures */
17129a84457aed4c45bc900998b5e11c03023264208James Dong    framesize = video->FrameHeightInMbs * video->PicWidthInMbs;
17229a84457aed4c45bc900998b5e11c03023264208James Dong
17329a84457aed4c45bc900998b5e11c03023264208James Dong    video->mblock = (AVCMacroblock*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCMacroblock) * framesize, DEFAULT_ATTR);
17429a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->mblock == NULL)
17529a84457aed4c45bc900998b5e11c03023264208James Dong    {
17629a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
17729a84457aed4c45bc900998b5e11c03023264208James Dong    }
17829a84457aed4c45bc900998b5e11c03023264208James Dong
17929a84457aed4c45bc900998b5e11c03023264208James Dong    video->MbToSliceGroupMap = (int*) avcHandle->CBAVC_Malloc(userData, sizeof(uint) * video->PicSizeInMapUnits * 2, DEFAULT_ATTR);
18029a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->MbToSliceGroupMap == NULL)
18129a84457aed4c45bc900998b5e11c03023264208James Dong    {
18229a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
18329a84457aed4c45bc900998b5e11c03023264208James Dong    }
18429a84457aed4c45bc900998b5e11c03023264208James Dong
18529a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->mot16x16 = (AVCMV*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCMV) * framesize, DEFAULT_ATTR);
18629a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid->mot16x16 == NULL)
18729a84457aed4c45bc900998b5e11c03023264208James Dong    {
18829a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
18929a84457aed4c45bc900998b5e11c03023264208James Dong    }
19029a84457aed4c45bc900998b5e11c03023264208James Dong
19129a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->intraSearch = (uint8*) avcHandle->CBAVC_Malloc(userData, sizeof(uint8) * framesize, DEFAULT_ATTR);
19229a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid->intraSearch == NULL)
19329a84457aed4c45bc900998b5e11c03023264208James Dong    {
19429a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
19529a84457aed4c45bc900998b5e11c03023264208James Dong    }
19629a84457aed4c45bc900998b5e11c03023264208James Dong
19729a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->min_cost = (int*) avcHandle->CBAVC_Malloc(userData, sizeof(int) * framesize, DEFAULT_ATTR);
19829a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid->min_cost == NULL)
19929a84457aed4c45bc900998b5e11c03023264208James Dong    {
20029a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
20129a84457aed4c45bc900998b5e11c03023264208James Dong    }
20229a84457aed4c45bc900998b5e11c03023264208James Dong
20329a84457aed4c45bc900998b5e11c03023264208James Dong    /* initialize motion search related memory */
20429a84457aed4c45bc900998b5e11c03023264208James Dong    if (AVCENC_SUCCESS != InitMotionSearchModule(avcHandle))
20529a84457aed4c45bc900998b5e11c03023264208James Dong    {
20629a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
20729a84457aed4c45bc900998b5e11c03023264208James Dong    }
20829a84457aed4c45bc900998b5e11c03023264208James Dong
20929a84457aed4c45bc900998b5e11c03023264208James Dong    if (AVCENC_SUCCESS != InitRateControlModule(avcHandle))
21029a84457aed4c45bc900998b5e11c03023264208James Dong    {
21129a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
21229a84457aed4c45bc900998b5e11c03023264208James Dong    }
21329a84457aed4c45bc900998b5e11c03023264208James Dong
21429a84457aed4c45bc900998b5e11c03023264208James Dong    /* intialize function pointers */
21529a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->functionPointer = (AVCEncFuncPtr*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCEncFuncPtr), DEFAULT_ATTR);
21629a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid->functionPointer == NULL)
21729a84457aed4c45bc900998b5e11c03023264208James Dong    {
21829a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_MEMORY_FAIL;
21929a84457aed4c45bc900998b5e11c03023264208James Dong    }
22029a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->functionPointer->SAD_Macroblock = &AVCSAD_Macroblock_C;
22129a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->functionPointer->SAD_MB_HalfPel[0] = NULL;
22229a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->functionPointer->SAD_MB_HalfPel[1] = &AVCSAD_MB_HalfPel_Cxh;
22329a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->functionPointer->SAD_MB_HalfPel[2] = &AVCSAD_MB_HalfPel_Cyh;
22429a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->functionPointer->SAD_MB_HalfPel[3] = &AVCSAD_MB_HalfPel_Cxhyh;
22529a84457aed4c45bc900998b5e11c03023264208James Dong
22629a84457aed4c45bc900998b5e11c03023264208James Dong    /* initialize timing control */
22729a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->modTimeRef = 0;     /* ALWAYS ASSUME THAT TIMESTAMP START FROM 0 !!!*/
22829a84457aed4c45bc900998b5e11c03023264208James Dong    video->prevFrameNum = 0;
22929a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->prevCodedFrameNum = 0;
23029a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->dispOrdPOCRef = 0;
23129a84457aed4c45bc900998b5e11c03023264208James Dong
23229a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid->outOfBandParamSet == TRUE)
23329a84457aed4c45bc900998b5e11c03023264208James Dong    {
23429a84457aed4c45bc900998b5e11c03023264208James Dong        encvid->enc_state = AVCEnc_Encoding_SPS;
23529a84457aed4c45bc900998b5e11c03023264208James Dong    }
23629a84457aed4c45bc900998b5e11c03023264208James Dong    else
23729a84457aed4c45bc900998b5e11c03023264208James Dong    {
23829a84457aed4c45bc900998b5e11c03023264208James Dong        encvid->enc_state = AVCEnc_Analyzing_Frame;
23929a84457aed4c45bc900998b5e11c03023264208James Dong    }
24029a84457aed4c45bc900998b5e11c03023264208James Dong
24129a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_SUCCESS;
24229a84457aed4c45bc900998b5e11c03023264208James Dong}
24329a84457aed4c45bc900998b5e11c03023264208James Dong
24429a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
24529a84457aed4c45bc900998b5e11c03023264208James Dong/*  Function : PVAVCEncGetMaxOutputSize()                                   */
24629a84457aed4c45bc900998b5e11c03023264208James Dong/*  Date     : 11/29/2008                                                   */
24729a84457aed4c45bc900998b5e11c03023264208James Dong/*  Purpose  : Return max output buffer size that apps should allocate for  */
24829a84457aed4c45bc900998b5e11c03023264208James Dong/*              output buffer.                                              */
24929a84457aed4c45bc900998b5e11c03023264208James Dong/*  In/out   :                                                              */
25029a84457aed4c45bc900998b5e11c03023264208James Dong/*  Return   : AVCENC_SUCCESS for success.                                  */
25129a84457aed4c45bc900998b5e11c03023264208James Dong/*  Modified :   size                                                       */
25229a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
25329a84457aed4c45bc900998b5e11c03023264208James Dong
25429a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncGetMaxOutputBufferSize(AVCHandle *avcHandle, int* size)
25529a84457aed4c45bc900998b5e11c03023264208James Dong{
25629a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEncObject *encvid = (AVCEncObject*)avcHandle->AVCObject;
25729a84457aed4c45bc900998b5e11c03023264208James Dong
25829a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid == NULL)
25929a84457aed4c45bc900998b5e11c03023264208James Dong    {
26029a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_UNINITIALIZED;
26129a84457aed4c45bc900998b5e11c03023264208James Dong    }
26229a84457aed4c45bc900998b5e11c03023264208James Dong
26329a84457aed4c45bc900998b5e11c03023264208James Dong    *size = encvid->rateCtrl->cpbSize;
26429a84457aed4c45bc900998b5e11c03023264208James Dong
26529a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_SUCCESS;
26629a84457aed4c45bc900998b5e11c03023264208James Dong}
26729a84457aed4c45bc900998b5e11c03023264208James Dong
26829a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
26929a84457aed4c45bc900998b5e11c03023264208James Dong/*  Function : PVAVCEncSetInput()                                           */
27029a84457aed4c45bc900998b5e11c03023264208James Dong/*  Date     : 4/18/2004                                                    */
27129a84457aed4c45bc900998b5e11c03023264208James Dong/*  Purpose  : To feed an unencoded original frame to the encoder library.  */
27229a84457aed4c45bc900998b5e11c03023264208James Dong/*  In/out   :                                                              */
27329a84457aed4c45bc900998b5e11c03023264208James Dong/*  Return   : AVCENC_SUCCESS for success.                                  */
27429a84457aed4c45bc900998b5e11c03023264208James Dong/*  Modified :                                                              */
27529a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
27629a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncSetInput(AVCHandle *avcHandle, AVCFrameIO *input)
27729a84457aed4c45bc900998b5e11c03023264208James Dong{
27829a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEncObject *encvid = (AVCEncObject*)avcHandle->AVCObject;
27929a84457aed4c45bc900998b5e11c03023264208James Dong    AVCCommonObj *video = encvid->common;
28029a84457aed4c45bc900998b5e11c03023264208James Dong    AVCRateControl *rateCtrl = encvid->rateCtrl;
28129a84457aed4c45bc900998b5e11c03023264208James Dong
28229a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status;
28329a84457aed4c45bc900998b5e11c03023264208James Dong    uint frameNum;
28429a84457aed4c45bc900998b5e11c03023264208James Dong
28529a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid == NULL)
28629a84457aed4c45bc900998b5e11c03023264208James Dong    {
28729a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_UNINITIALIZED;
28829a84457aed4c45bc900998b5e11c03023264208James Dong    }
28929a84457aed4c45bc900998b5e11c03023264208James Dong
29029a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid->enc_state == AVCEnc_WaitingForBuffer)
29129a84457aed4c45bc900998b5e11c03023264208James Dong    {
29229a84457aed4c45bc900998b5e11c03023264208James Dong        goto RECALL_INITFRAME;
29329a84457aed4c45bc900998b5e11c03023264208James Dong    }
29429a84457aed4c45bc900998b5e11c03023264208James Dong    else if (encvid->enc_state != AVCEnc_Analyzing_Frame)
29529a84457aed4c45bc900998b5e11c03023264208James Dong    {
29629a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_FAIL;
29729a84457aed4c45bc900998b5e11c03023264208James Dong    }
29829a84457aed4c45bc900998b5e11c03023264208James Dong
29929a84457aed4c45bc900998b5e11c03023264208James Dong    if (input->pitch > 0xFFFF)
30029a84457aed4c45bc900998b5e11c03023264208James Dong    {
30129a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_NOT_SUPPORTED; // we use 2-bytes for pitch
30229a84457aed4c45bc900998b5e11c03023264208James Dong    }
30329a84457aed4c45bc900998b5e11c03023264208James Dong
30429a84457aed4c45bc900998b5e11c03023264208James Dong    /***********************************/
30529a84457aed4c45bc900998b5e11c03023264208James Dong
30629a84457aed4c45bc900998b5e11c03023264208James Dong    /* Let's rate control decide whether to encode this frame or not */
30729a84457aed4c45bc900998b5e11c03023264208James Dong    /* Also set video->nal_unit_type, sliceHdr->slice_type, video->slice_type */
30829a84457aed4c45bc900998b5e11c03023264208James Dong    if (AVCENC_SUCCESS != RCDetermineFrameNum(encvid, rateCtrl, input->coding_timestamp, &frameNum))
30929a84457aed4c45bc900998b5e11c03023264208James Dong    {
31029a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_SKIPPED_PICTURE; /* not time to encode, thus skipping */
31129a84457aed4c45bc900998b5e11c03023264208James Dong    }
31229a84457aed4c45bc900998b5e11c03023264208James Dong
31329a84457aed4c45bc900998b5e11c03023264208James Dong    /* we may not need this line */
31429a84457aed4c45bc900998b5e11c03023264208James Dong    //nextFrmModTime = (uint32)((((frameNum+1)*1000)/rateCtrl->frame_rate) + modTimeRef); /* rec. time */
31529a84457aed4c45bc900998b5e11c03023264208James Dong    //encvid->nextModTime = nextFrmModTime - (encvid->frameInterval>>1) - 1; /* between current and next frame */
31629a84457aed4c45bc900998b5e11c03023264208James Dong
31729a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->currInput = input;
31829a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->currInput->coding_order = frameNum;
31929a84457aed4c45bc900998b5e11c03023264208James Dong
32029a84457aed4c45bc900998b5e11c03023264208James DongRECALL_INITFRAME:
32129a84457aed4c45bc900998b5e11c03023264208James Dong    /* initialize and analyze the frame */
32229a84457aed4c45bc900998b5e11c03023264208James Dong    status = InitFrame(encvid);
32329a84457aed4c45bc900998b5e11c03023264208James Dong
32429a84457aed4c45bc900998b5e11c03023264208James Dong    if (status == AVCENC_SUCCESS)
32529a84457aed4c45bc900998b5e11c03023264208James Dong    {
32629a84457aed4c45bc900998b5e11c03023264208James Dong        encvid->enc_state = AVCEnc_Encoding_Frame;
32729a84457aed4c45bc900998b5e11c03023264208James Dong    }
32829a84457aed4c45bc900998b5e11c03023264208James Dong    else if (status == AVCENC_NEW_IDR)
32929a84457aed4c45bc900998b5e11c03023264208James Dong    {
33029a84457aed4c45bc900998b5e11c03023264208James Dong        if (encvid->outOfBandParamSet == TRUE)
33129a84457aed4c45bc900998b5e11c03023264208James Dong        {
33229a84457aed4c45bc900998b5e11c03023264208James Dong            encvid->enc_state = AVCEnc_Encoding_Frame;
33329a84457aed4c45bc900998b5e11c03023264208James Dong        }
33429a84457aed4c45bc900998b5e11c03023264208James Dong        else // assuming that in-band paramset keeps sending new SPS and PPS.
33529a84457aed4c45bc900998b5e11c03023264208James Dong        {
33629a84457aed4c45bc900998b5e11c03023264208James Dong            encvid->enc_state = AVCEnc_Encoding_SPS;
33729a84457aed4c45bc900998b5e11c03023264208James Dong            //video->currSeqParams->seq_parameter_set_id++;
33829a84457aed4c45bc900998b5e11c03023264208James Dong            //if(video->currSeqParams->seq_parameter_set_id > 31) // range check
33929a84457aed4c45bc900998b5e11c03023264208James Dong            {
34029a84457aed4c45bc900998b5e11c03023264208James Dong                video->currSeqParams->seq_parameter_set_id = 0;  // reset
34129a84457aed4c45bc900998b5e11c03023264208James Dong            }
34229a84457aed4c45bc900998b5e11c03023264208James Dong        }
34329a84457aed4c45bc900998b5e11c03023264208James Dong
34429a84457aed4c45bc900998b5e11c03023264208James Dong        video->sliceHdr->idr_pic_id++;
34529a84457aed4c45bc900998b5e11c03023264208James Dong        if (video->sliceHdr->idr_pic_id > 65535) // range check
34629a84457aed4c45bc900998b5e11c03023264208James Dong        {
34729a84457aed4c45bc900998b5e11c03023264208James Dong            video->sliceHdr->idr_pic_id = 0;  // reset
34829a84457aed4c45bc900998b5e11c03023264208James Dong        }
34929a84457aed4c45bc900998b5e11c03023264208James Dong    }
35029a84457aed4c45bc900998b5e11c03023264208James Dong    /* the following logics need to be revisited */
35129a84457aed4c45bc900998b5e11c03023264208James Dong    else if (status == AVCENC_PICTURE_READY) // no buffers returned back to the encoder
35229a84457aed4c45bc900998b5e11c03023264208James Dong    {
35329a84457aed4c45bc900998b5e11c03023264208James Dong        encvid->enc_state = AVCEnc_WaitingForBuffer; // Input accepted but can't continue
35429a84457aed4c45bc900998b5e11c03023264208James Dong        // need to free up some memory before proceeding with Encode
35529a84457aed4c45bc900998b5e11c03023264208James Dong    }
35629a84457aed4c45bc900998b5e11c03023264208James Dong
35729a84457aed4c45bc900998b5e11c03023264208James Dong    return status; // return status, including the AVCENC_FAIL case and all 3 above.
35829a84457aed4c45bc900998b5e11c03023264208James Dong}
35929a84457aed4c45bc900998b5e11c03023264208James Dong
36029a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
36129a84457aed4c45bc900998b5e11c03023264208James Dong/*  Function : PVAVCEncodeNAL()                                             */
36229a84457aed4c45bc900998b5e11c03023264208James Dong/*  Date     : 4/29/2004                                                    */
36329a84457aed4c45bc900998b5e11c03023264208James Dong/*  Purpose  : To encode one NAL/slice.                                     */
36429a84457aed4c45bc900998b5e11c03023264208James Dong/*  In/out   :                                                              */
36529a84457aed4c45bc900998b5e11c03023264208James Dong/*  Return   : AVCENC_SUCCESS for success.                                  */
36629a84457aed4c45bc900998b5e11c03023264208James Dong/*  Modified :                                                              */
36729a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
36829a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncodeNAL(AVCHandle *avcHandle, unsigned char *buffer, unsigned int *buf_nal_size, int *nal_type)
36929a84457aed4c45bc900998b5e11c03023264208James Dong{
37029a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEncObject *encvid = (AVCEncObject*)avcHandle->AVCObject;
37129a84457aed4c45bc900998b5e11c03023264208James Dong    AVCCommonObj *video = encvid->common;
37229a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEncBitstream *bitstream = encvid->bitstream;
37329a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status;
37429a84457aed4c45bc900998b5e11c03023264208James Dong
37529a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid == NULL)
37629a84457aed4c45bc900998b5e11c03023264208James Dong    {
37729a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_UNINITIALIZED;
37829a84457aed4c45bc900998b5e11c03023264208James Dong    }
37929a84457aed4c45bc900998b5e11c03023264208James Dong
38029a84457aed4c45bc900998b5e11c03023264208James Dong    switch (encvid->enc_state)
38129a84457aed4c45bc900998b5e11c03023264208James Dong    {
38229a84457aed4c45bc900998b5e11c03023264208James Dong        case AVCEnc_Initializing:
38329a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_UNINITIALIZED;
38429a84457aed4c45bc900998b5e11c03023264208James Dong        case AVCEnc_Encoding_SPS:
38529a84457aed4c45bc900998b5e11c03023264208James Dong            /* initialized the structure */
38629a84457aed4c45bc900998b5e11c03023264208James Dong            BitstreamEncInit(bitstream, buffer, *buf_nal_size, NULL, 0);
38729a84457aed4c45bc900998b5e11c03023264208James Dong            BitstreamWriteBits(bitstream, 8, (1 << 5) | AVC_NALTYPE_SPS);
38829a84457aed4c45bc900998b5e11c03023264208James Dong
38929a84457aed4c45bc900998b5e11c03023264208James Dong            /* encode SPS */
39029a84457aed4c45bc900998b5e11c03023264208James Dong            status = EncodeSPS(encvid, bitstream);
39129a84457aed4c45bc900998b5e11c03023264208James Dong            if (status != AVCENC_SUCCESS)
39229a84457aed4c45bc900998b5e11c03023264208James Dong            {
39329a84457aed4c45bc900998b5e11c03023264208James Dong                return status;
39429a84457aed4c45bc900998b5e11c03023264208James Dong            }
39529a84457aed4c45bc900998b5e11c03023264208James Dong
39629a84457aed4c45bc900998b5e11c03023264208James Dong            /* closing the NAL with trailing bits */
39729a84457aed4c45bc900998b5e11c03023264208James Dong            status = BitstreamTrailingBits(bitstream, buf_nal_size);
39829a84457aed4c45bc900998b5e11c03023264208James Dong            if (status == AVCENC_SUCCESS)
39929a84457aed4c45bc900998b5e11c03023264208James Dong            {
40029a84457aed4c45bc900998b5e11c03023264208James Dong                encvid->enc_state = AVCEnc_Encoding_PPS;
40129a84457aed4c45bc900998b5e11c03023264208James Dong                video->currPicParams->seq_parameter_set_id = video->currSeqParams->seq_parameter_set_id;
40229a84457aed4c45bc900998b5e11c03023264208James Dong                video->currPicParams->pic_parameter_set_id++;
40329a84457aed4c45bc900998b5e11c03023264208James Dong                *nal_type = AVC_NALTYPE_SPS;
40429a84457aed4c45bc900998b5e11c03023264208James Dong                *buf_nal_size = bitstream->write_pos;
40529a84457aed4c45bc900998b5e11c03023264208James Dong            }
40629a84457aed4c45bc900998b5e11c03023264208James Dong            break;
40729a84457aed4c45bc900998b5e11c03023264208James Dong        case AVCEnc_Encoding_PPS:
40829a84457aed4c45bc900998b5e11c03023264208James Dong            /* initialized the structure */
40929a84457aed4c45bc900998b5e11c03023264208James Dong            BitstreamEncInit(bitstream, buffer, *buf_nal_size, NULL, 0);
41029a84457aed4c45bc900998b5e11c03023264208James Dong            BitstreamWriteBits(bitstream, 8, (1 << 5) | AVC_NALTYPE_PPS);
41129a84457aed4c45bc900998b5e11c03023264208James Dong
41229a84457aed4c45bc900998b5e11c03023264208James Dong            /* encode PPS */
41329a84457aed4c45bc900998b5e11c03023264208James Dong            status = EncodePPS(encvid, bitstream);
41429a84457aed4c45bc900998b5e11c03023264208James Dong            if (status != AVCENC_SUCCESS)
41529a84457aed4c45bc900998b5e11c03023264208James Dong            {
41629a84457aed4c45bc900998b5e11c03023264208James Dong                return status;
41729a84457aed4c45bc900998b5e11c03023264208James Dong            }
41829a84457aed4c45bc900998b5e11c03023264208James Dong
41929a84457aed4c45bc900998b5e11c03023264208James Dong            /* closing the NAL with trailing bits */
42029a84457aed4c45bc900998b5e11c03023264208James Dong            status = BitstreamTrailingBits(bitstream, buf_nal_size);
42129a84457aed4c45bc900998b5e11c03023264208James Dong            if (status == AVCENC_SUCCESS)
42229a84457aed4c45bc900998b5e11c03023264208James Dong            {
42329a84457aed4c45bc900998b5e11c03023264208James Dong                if (encvid->outOfBandParamSet == TRUE) // already extract PPS, SPS
42429a84457aed4c45bc900998b5e11c03023264208James Dong                {
42529a84457aed4c45bc900998b5e11c03023264208James Dong                    encvid->enc_state = AVCEnc_Analyzing_Frame;
42629a84457aed4c45bc900998b5e11c03023264208James Dong                }
42729a84457aed4c45bc900998b5e11c03023264208James Dong                else    // SetInput has been called before SPS and PPS.
42829a84457aed4c45bc900998b5e11c03023264208James Dong                {
42929a84457aed4c45bc900998b5e11c03023264208James Dong                    encvid->enc_state = AVCEnc_Encoding_Frame;
43029a84457aed4c45bc900998b5e11c03023264208James Dong                }
43129a84457aed4c45bc900998b5e11c03023264208James Dong
43229a84457aed4c45bc900998b5e11c03023264208James Dong                *nal_type = AVC_NALTYPE_PPS;
43329a84457aed4c45bc900998b5e11c03023264208James Dong                *buf_nal_size = bitstream->write_pos;
43429a84457aed4c45bc900998b5e11c03023264208James Dong            }
43529a84457aed4c45bc900998b5e11c03023264208James Dong            break;
43629a84457aed4c45bc900998b5e11c03023264208James Dong
43729a84457aed4c45bc900998b5e11c03023264208James Dong        case AVCEnc_Encoding_Frame:
43829a84457aed4c45bc900998b5e11c03023264208James Dong            /* initialized the structure */
43929a84457aed4c45bc900998b5e11c03023264208James Dong            BitstreamEncInit(bitstream, buffer, *buf_nal_size, encvid->overrunBuffer, encvid->oBSize);
44029a84457aed4c45bc900998b5e11c03023264208James Dong            BitstreamWriteBits(bitstream, 8, (video->nal_ref_idc << 5) | (video->nal_unit_type));
44129a84457aed4c45bc900998b5e11c03023264208James Dong
44229a84457aed4c45bc900998b5e11c03023264208James Dong            /* Re-order the reference list according to the ref_pic_list_reordering() */
44329a84457aed4c45bc900998b5e11c03023264208James Dong            /* We don't have to reorder the list for the encoder here. This can only be done
44429a84457aed4c45bc900998b5e11c03023264208James Dong            after we encode this slice. We can run thru a second-pass to see if new ordering
44529a84457aed4c45bc900998b5e11c03023264208James Dong            would save more bits. Too much delay !! */
44629a84457aed4c45bc900998b5e11c03023264208James Dong            /* status = ReOrderList(video);*/
44729a84457aed4c45bc900998b5e11c03023264208James Dong            status = InitSlice(encvid);
44829a84457aed4c45bc900998b5e11c03023264208James Dong            if (status != AVCENC_SUCCESS)
44929a84457aed4c45bc900998b5e11c03023264208James Dong            {
45029a84457aed4c45bc900998b5e11c03023264208James Dong                return status;
45129a84457aed4c45bc900998b5e11c03023264208James Dong            }
45229a84457aed4c45bc900998b5e11c03023264208James Dong
45329a84457aed4c45bc900998b5e11c03023264208James Dong            /* when we have everything, we encode the slice header */
45429a84457aed4c45bc900998b5e11c03023264208James Dong            status = EncodeSliceHeader(encvid, bitstream);
45529a84457aed4c45bc900998b5e11c03023264208James Dong            if (status != AVCENC_SUCCESS)
45629a84457aed4c45bc900998b5e11c03023264208James Dong            {
45729a84457aed4c45bc900998b5e11c03023264208James Dong                return status;
45829a84457aed4c45bc900998b5e11c03023264208James Dong            }
45929a84457aed4c45bc900998b5e11c03023264208James Dong
46029a84457aed4c45bc900998b5e11c03023264208James Dong            status = AVCEncodeSlice(encvid);
46129a84457aed4c45bc900998b5e11c03023264208James Dong
46229a84457aed4c45bc900998b5e11c03023264208James Dong            video->slice_id++;
46329a84457aed4c45bc900998b5e11c03023264208James Dong
46429a84457aed4c45bc900998b5e11c03023264208James Dong            /* closing the NAL with trailing bits */
46529a84457aed4c45bc900998b5e11c03023264208James Dong            BitstreamTrailingBits(bitstream, buf_nal_size);
46629a84457aed4c45bc900998b5e11c03023264208James Dong
46729a84457aed4c45bc900998b5e11c03023264208James Dong            *buf_nal_size = bitstream->write_pos;
46829a84457aed4c45bc900998b5e11c03023264208James Dong
46929a84457aed4c45bc900998b5e11c03023264208James Dong            encvid->rateCtrl->numFrameBits += ((*buf_nal_size) << 3);
47029a84457aed4c45bc900998b5e11c03023264208James Dong
47129a84457aed4c45bc900998b5e11c03023264208James Dong            *nal_type = video->nal_unit_type;
47229a84457aed4c45bc900998b5e11c03023264208James Dong
47329a84457aed4c45bc900998b5e11c03023264208James Dong            if (status == AVCENC_PICTURE_READY)
47429a84457aed4c45bc900998b5e11c03023264208James Dong            {
47529a84457aed4c45bc900998b5e11c03023264208James Dong                status = RCUpdateFrame(encvid);
47629a84457aed4c45bc900998b5e11c03023264208James Dong                if (status == AVCENC_SKIPPED_PICTURE) /* skip current frame */
47729a84457aed4c45bc900998b5e11c03023264208James Dong                {
47829a84457aed4c45bc900998b5e11c03023264208James Dong                    DPBReleaseCurrentFrame(avcHandle, video);
47929a84457aed4c45bc900998b5e11c03023264208James Dong                    encvid->enc_state = AVCEnc_Analyzing_Frame;
48029a84457aed4c45bc900998b5e11c03023264208James Dong
48129a84457aed4c45bc900998b5e11c03023264208James Dong                    return status;
48229a84457aed4c45bc900998b5e11c03023264208James Dong                }
48329a84457aed4c45bc900998b5e11c03023264208James Dong
48429a84457aed4c45bc900998b5e11c03023264208James Dong                /* perform loop-filtering on the entire frame */
48529a84457aed4c45bc900998b5e11c03023264208James Dong                DeblockPicture(video);
48629a84457aed4c45bc900998b5e11c03023264208James Dong
48729a84457aed4c45bc900998b5e11c03023264208James Dong                /* update the original frame array */
48829a84457aed4c45bc900998b5e11c03023264208James Dong                encvid->prevCodedFrameNum = encvid->currInput->coding_order;
48929a84457aed4c45bc900998b5e11c03023264208James Dong
49029a84457aed4c45bc900998b5e11c03023264208James Dong                /* store the encoded picture in the DPB buffer */
49129a84457aed4c45bc900998b5e11c03023264208James Dong                StorePictureInDPB(avcHandle, video);
49229a84457aed4c45bc900998b5e11c03023264208James Dong
49329a84457aed4c45bc900998b5e11c03023264208James Dong                if (video->currPic->isReference)
49429a84457aed4c45bc900998b5e11c03023264208James Dong                {
49529a84457aed4c45bc900998b5e11c03023264208James Dong                    video->PrevRefFrameNum = video->sliceHdr->frame_num;
49629a84457aed4c45bc900998b5e11c03023264208James Dong                }
49729a84457aed4c45bc900998b5e11c03023264208James Dong
49829a84457aed4c45bc900998b5e11c03023264208James Dong                /* update POC related variables */
49929a84457aed4c45bc900998b5e11c03023264208James Dong                PostPOC(video);
50029a84457aed4c45bc900998b5e11c03023264208James Dong
50129a84457aed4c45bc900998b5e11c03023264208James Dong                encvid->enc_state = AVCEnc_Analyzing_Frame;
50229a84457aed4c45bc900998b5e11c03023264208James Dong                status = AVCENC_PICTURE_READY;
50329a84457aed4c45bc900998b5e11c03023264208James Dong
50429a84457aed4c45bc900998b5e11c03023264208James Dong            }
50529a84457aed4c45bc900998b5e11c03023264208James Dong            break;
50629a84457aed4c45bc900998b5e11c03023264208James Dong        default:
50729a84457aed4c45bc900998b5e11c03023264208James Dong            status = AVCENC_WRONG_STATE;
50829a84457aed4c45bc900998b5e11c03023264208James Dong    }
50929a84457aed4c45bc900998b5e11c03023264208James Dong
51029a84457aed4c45bc900998b5e11c03023264208James Dong    return status;
51129a84457aed4c45bc900998b5e11c03023264208James Dong}
51229a84457aed4c45bc900998b5e11c03023264208James Dong
51329a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
51429a84457aed4c45bc900998b5e11c03023264208James Dong/*  Function : PVAVCEncGetOverrunBuffer()                                   */
51529a84457aed4c45bc900998b5e11c03023264208James Dong/*  Purpose  : To retrieve the overrun buffer. Check whether overrun buffer */
51629a84457aed4c45bc900998b5e11c03023264208James Dong/*              is used or not before returning                             */
51729a84457aed4c45bc900998b5e11c03023264208James Dong/*  In/out   :                                                              */
51829a84457aed4c45bc900998b5e11c03023264208James Dong/*  Return   : Pointer to the internal overrun buffer.                      */
51929a84457aed4c45bc900998b5e11c03023264208James Dong/*  Modified :                                                              */
52029a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
52129a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF uint8* PVAVCEncGetOverrunBuffer(AVCHandle* avcHandle)
52229a84457aed4c45bc900998b5e11c03023264208James Dong{
52329a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEncObject *encvid = (AVCEncObject*)avcHandle->AVCObject;
52429a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEncBitstream *bitstream = encvid->bitstream;
52529a84457aed4c45bc900998b5e11c03023264208James Dong
52629a84457aed4c45bc900998b5e11c03023264208James Dong    if (bitstream->overrunBuffer == bitstream->bitstreamBuffer) /* OB is used */
52729a84457aed4c45bc900998b5e11c03023264208James Dong    {
52829a84457aed4c45bc900998b5e11c03023264208James Dong        return encvid->overrunBuffer;
52929a84457aed4c45bc900998b5e11c03023264208James Dong    }
53029a84457aed4c45bc900998b5e11c03023264208James Dong    else
53129a84457aed4c45bc900998b5e11c03023264208James Dong    {
53229a84457aed4c45bc900998b5e11c03023264208James Dong        return NULL;
53329a84457aed4c45bc900998b5e11c03023264208James Dong    }
53429a84457aed4c45bc900998b5e11c03023264208James Dong}
53529a84457aed4c45bc900998b5e11c03023264208James Dong
53629a84457aed4c45bc900998b5e11c03023264208James Dong
53729a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
53829a84457aed4c45bc900998b5e11c03023264208James Dong/*  Function : PVAVCEncGetRecon()                                           */
53929a84457aed4c45bc900998b5e11c03023264208James Dong/*  Date     : 4/29/2004                                                    */
54029a84457aed4c45bc900998b5e11c03023264208James Dong/*  Purpose  : To retrieve the most recently encoded frame.                 */
54129a84457aed4c45bc900998b5e11c03023264208James Dong/*              assume that user will make a copy if they want to hold on   */
54229a84457aed4c45bc900998b5e11c03023264208James Dong/*              to it. Otherwise, it is not guaranteed to be reserved.      */
54329a84457aed4c45bc900998b5e11c03023264208James Dong/*              Most applications prefer to see original frame rather than  */
54429a84457aed4c45bc900998b5e11c03023264208James Dong/*              reconstructed frame. So, we are staying aware from complex  */
54529a84457aed4c45bc900998b5e11c03023264208James Dong/*              buffering mechanism. If needed, can be added later.         */
54629a84457aed4c45bc900998b5e11c03023264208James Dong/*  In/out   :                                                              */
54729a84457aed4c45bc900998b5e11c03023264208James Dong/*  Return   : AVCENC_SUCCESS for success.                                  */
54829a84457aed4c45bc900998b5e11c03023264208James Dong/*  Modified :                                                              */
54929a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
55029a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncGetRecon(AVCHandle *avcHandle, AVCFrameIO *recon)
55129a84457aed4c45bc900998b5e11c03023264208James Dong{
55229a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEncObject *encvid = (AVCEncObject*)avcHandle->AVCObject;
55329a84457aed4c45bc900998b5e11c03023264208James Dong    AVCCommonObj *video = encvid->common;
55429a84457aed4c45bc900998b5e11c03023264208James Dong    AVCFrameStore *currFS = video->currFS;
55529a84457aed4c45bc900998b5e11c03023264208James Dong
55629a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid == NULL)
55729a84457aed4c45bc900998b5e11c03023264208James Dong    {
55829a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_UNINITIALIZED;
55929a84457aed4c45bc900998b5e11c03023264208James Dong    }
56029a84457aed4c45bc900998b5e11c03023264208James Dong
56129a84457aed4c45bc900998b5e11c03023264208James Dong    recon->YCbCr[0] = currFS->frame.Sl;
56229a84457aed4c45bc900998b5e11c03023264208James Dong    recon->YCbCr[1] = currFS->frame.Scb;
56329a84457aed4c45bc900998b5e11c03023264208James Dong    recon->YCbCr[2] = currFS->frame.Scr;
56429a84457aed4c45bc900998b5e11c03023264208James Dong    recon->height = currFS->frame.height;
56529a84457aed4c45bc900998b5e11c03023264208James Dong    recon->pitch = currFS->frame.pitch;
56629a84457aed4c45bc900998b5e11c03023264208James Dong    recon->disp_order = currFS->PicOrderCnt;
56729a84457aed4c45bc900998b5e11c03023264208James Dong    recon->coding_order = currFS->FrameNum;
5684b43b41eaf8c4c80f66185e13620cf94b8b2ef5bMartin Storsjo    recon->id = (intptr_t) currFS->base_dpb; /* use the pointer as the id */
56929a84457aed4c45bc900998b5e11c03023264208James Dong
57029a84457aed4c45bc900998b5e11c03023264208James Dong    currFS->IsOutputted |= 1;
57129a84457aed4c45bc900998b5e11c03023264208James Dong
57229a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_SUCCESS;
57329a84457aed4c45bc900998b5e11c03023264208James Dong}
57429a84457aed4c45bc900998b5e11c03023264208James Dong
57529a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncReleaseRecon(AVCHandle *avcHandle, AVCFrameIO *recon)
57629a84457aed4c45bc900998b5e11c03023264208James Dong{
57729a84457aed4c45bc900998b5e11c03023264208James Dong    OSCL_UNUSED_ARG(avcHandle);
57829a84457aed4c45bc900998b5e11c03023264208James Dong    OSCL_UNUSED_ARG(recon);
57929a84457aed4c45bc900998b5e11c03023264208James Dong
58029a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_SUCCESS; //for now
58129a84457aed4c45bc900998b5e11c03023264208James Dong}
58229a84457aed4c45bc900998b5e11c03023264208James Dong
58329a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
58429a84457aed4c45bc900998b5e11c03023264208James Dong/*  Function : PVAVCCleanUpEncoder()                                        */
58529a84457aed4c45bc900998b5e11c03023264208James Dong/*  Date     : 4/18/2004                                                    */
58629a84457aed4c45bc900998b5e11c03023264208James Dong/*  Purpose  : To clean up memories allocated by PVAVCEncInitialize()       */
58729a84457aed4c45bc900998b5e11c03023264208James Dong/*  In/out   :                                                              */
58829a84457aed4c45bc900998b5e11c03023264208James Dong/*  Return   : AVCENC_SUCCESS for success.                                  */
58929a84457aed4c45bc900998b5e11c03023264208James Dong/*  Modified :                                                              */
59029a84457aed4c45bc900998b5e11c03023264208James Dong/* ======================================================================== */
59129a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF void    PVAVCCleanUpEncoder(AVCHandle *avcHandle)
59229a84457aed4c45bc900998b5e11c03023264208James Dong{
59329a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEncObject *encvid = (AVCEncObject*) avcHandle->AVCObject;
59429a84457aed4c45bc900998b5e11c03023264208James Dong    AVCCommonObj *video;
59529a84457aed4c45bc900998b5e11c03023264208James Dong    uint32 *userData = (uint32*) avcHandle->userData;
59629a84457aed4c45bc900998b5e11c03023264208James Dong
59729a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid != NULL)
59829a84457aed4c45bc900998b5e11c03023264208James Dong    {
59929a84457aed4c45bc900998b5e11c03023264208James Dong        CleanMotionSearchModule(avcHandle);
60029a84457aed4c45bc900998b5e11c03023264208James Dong
60129a84457aed4c45bc900998b5e11c03023264208James Dong        CleanupRateControlModule(avcHandle);
60229a84457aed4c45bc900998b5e11c03023264208James Dong
60329a84457aed4c45bc900998b5e11c03023264208James Dong        if (encvid->functionPointer != NULL)
60429a84457aed4c45bc900998b5e11c03023264208James Dong        {
60523da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo            avcHandle->CBAVC_Free(userData, encvid->functionPointer);
60629a84457aed4c45bc900998b5e11c03023264208James Dong        }
60729a84457aed4c45bc900998b5e11c03023264208James Dong
60829a84457aed4c45bc900998b5e11c03023264208James Dong        if (encvid->min_cost)
60929a84457aed4c45bc900998b5e11c03023264208James Dong        {
61023da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo            avcHandle->CBAVC_Free(userData, encvid->min_cost);
61129a84457aed4c45bc900998b5e11c03023264208James Dong        }
61229a84457aed4c45bc900998b5e11c03023264208James Dong
61329a84457aed4c45bc900998b5e11c03023264208James Dong        if (encvid->intraSearch)
61429a84457aed4c45bc900998b5e11c03023264208James Dong        {
61523da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo            avcHandle->CBAVC_Free(userData, encvid->intraSearch);
61629a84457aed4c45bc900998b5e11c03023264208James Dong        }
61729a84457aed4c45bc900998b5e11c03023264208James Dong
61829a84457aed4c45bc900998b5e11c03023264208James Dong        if (encvid->mot16x16)
61929a84457aed4c45bc900998b5e11c03023264208James Dong        {
62023da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo            avcHandle->CBAVC_Free(userData, encvid->mot16x16);
62129a84457aed4c45bc900998b5e11c03023264208James Dong        }
62229a84457aed4c45bc900998b5e11c03023264208James Dong
62329a84457aed4c45bc900998b5e11c03023264208James Dong        if (encvid->rateCtrl)
62429a84457aed4c45bc900998b5e11c03023264208James Dong        {
62523da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo            avcHandle->CBAVC_Free(userData, encvid->rateCtrl);
62629a84457aed4c45bc900998b5e11c03023264208James Dong        }
62729a84457aed4c45bc900998b5e11c03023264208James Dong
62829a84457aed4c45bc900998b5e11c03023264208James Dong        if (encvid->overrunBuffer)
62929a84457aed4c45bc900998b5e11c03023264208James Dong        {
63023da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo            avcHandle->CBAVC_Free(userData, encvid->overrunBuffer);
63129a84457aed4c45bc900998b5e11c03023264208James Dong        }
63229a84457aed4c45bc900998b5e11c03023264208James Dong
63329a84457aed4c45bc900998b5e11c03023264208James Dong        video = encvid->common;
63429a84457aed4c45bc900998b5e11c03023264208James Dong        if (video != NULL)
63529a84457aed4c45bc900998b5e11c03023264208James Dong        {
63629a84457aed4c45bc900998b5e11c03023264208James Dong            if (video->MbToSliceGroupMap)
63729a84457aed4c45bc900998b5e11c03023264208James Dong            {
63823da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo                avcHandle->CBAVC_Free(userData, video->MbToSliceGroupMap);
63929a84457aed4c45bc900998b5e11c03023264208James Dong            }
64029a84457aed4c45bc900998b5e11c03023264208James Dong            if (video->mblock != NULL)
64129a84457aed4c45bc900998b5e11c03023264208James Dong            {
64223da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo                avcHandle->CBAVC_Free(userData, video->mblock);
64329a84457aed4c45bc900998b5e11c03023264208James Dong            }
64429a84457aed4c45bc900998b5e11c03023264208James Dong            if (video->decPicBuf != NULL)
64529a84457aed4c45bc900998b5e11c03023264208James Dong            {
64629a84457aed4c45bc900998b5e11c03023264208James Dong                CleanUpDPB(avcHandle, video);
64723da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo                avcHandle->CBAVC_Free(userData, video->decPicBuf);
64829a84457aed4c45bc900998b5e11c03023264208James Dong            }
64929a84457aed4c45bc900998b5e11c03023264208James Dong            if (video->sliceHdr != NULL)
65029a84457aed4c45bc900998b5e11c03023264208James Dong            {
65123da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo                avcHandle->CBAVC_Free(userData, video->sliceHdr);
65229a84457aed4c45bc900998b5e11c03023264208James Dong            }
65329a84457aed4c45bc900998b5e11c03023264208James Dong            if (video->currPicParams != NULL)
65429a84457aed4c45bc900998b5e11c03023264208James Dong            {
65529a84457aed4c45bc900998b5e11c03023264208James Dong                if (video->currPicParams->slice_group_id)
65629a84457aed4c45bc900998b5e11c03023264208James Dong                {
65723da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo                    avcHandle->CBAVC_Free(userData, video->currPicParams->slice_group_id);
65829a84457aed4c45bc900998b5e11c03023264208James Dong                }
65929a84457aed4c45bc900998b5e11c03023264208James Dong
66023da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo                avcHandle->CBAVC_Free(userData, video->currPicParams);
66129a84457aed4c45bc900998b5e11c03023264208James Dong            }
66229a84457aed4c45bc900998b5e11c03023264208James Dong            if (video->currSeqParams != NULL)
66329a84457aed4c45bc900998b5e11c03023264208James Dong            {
66423da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo                avcHandle->CBAVC_Free(userData, video->currSeqParams);
66529a84457aed4c45bc900998b5e11c03023264208James Dong            }
66629a84457aed4c45bc900998b5e11c03023264208James Dong            if (encvid->bitstream != NULL)
66729a84457aed4c45bc900998b5e11c03023264208James Dong            {
66823da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo                avcHandle->CBAVC_Free(userData, encvid->bitstream);
66929a84457aed4c45bc900998b5e11c03023264208James Dong            }
67029a84457aed4c45bc900998b5e11c03023264208James Dong            if (video != NULL)
67129a84457aed4c45bc900998b5e11c03023264208James Dong            {
67223da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo                avcHandle->CBAVC_Free(userData, video);
67329a84457aed4c45bc900998b5e11c03023264208James Dong            }
67429a84457aed4c45bc900998b5e11c03023264208James Dong        }
67529a84457aed4c45bc900998b5e11c03023264208James Dong
67623da4cf305b9bfff07954711a8a2d9ec040865afMartin Storsjo        avcHandle->CBAVC_Free(userData, encvid);
67729a84457aed4c45bc900998b5e11c03023264208James Dong
67829a84457aed4c45bc900998b5e11c03023264208James Dong        avcHandle->AVCObject = NULL;
67929a84457aed4c45bc900998b5e11c03023264208James Dong    }
68029a84457aed4c45bc900998b5e11c03023264208James Dong
68129a84457aed4c45bc900998b5e11c03023264208James Dong    return ;
68229a84457aed4c45bc900998b5e11c03023264208James Dong}
68329a84457aed4c45bc900998b5e11c03023264208James Dong
68429a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncUpdateBitRate(AVCHandle *avcHandle, uint32 bitrate)
68529a84457aed4c45bc900998b5e11c03023264208James Dong{
68629a84457aed4c45bc900998b5e11c03023264208James Dong    OSCL_UNUSED_ARG(avcHandle);
68729a84457aed4c45bc900998b5e11c03023264208James Dong    OSCL_UNUSED_ARG(bitrate);
68829a84457aed4c45bc900998b5e11c03023264208James Dong
68929a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_FAIL;
69029a84457aed4c45bc900998b5e11c03023264208James Dong}
69129a84457aed4c45bc900998b5e11c03023264208James Dong
69229a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncUpdateFrameRate(AVCHandle *avcHandle, uint32 num, uint32 denom)
69329a84457aed4c45bc900998b5e11c03023264208James Dong{
69429a84457aed4c45bc900998b5e11c03023264208James Dong    OSCL_UNUSED_ARG(avcHandle);
69529a84457aed4c45bc900998b5e11c03023264208James Dong    OSCL_UNUSED_ARG(num);
69629a84457aed4c45bc900998b5e11c03023264208James Dong    OSCL_UNUSED_ARG(denom);
69729a84457aed4c45bc900998b5e11c03023264208James Dong
69829a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_FAIL;
69929a84457aed4c45bc900998b5e11c03023264208James Dong}
70029a84457aed4c45bc900998b5e11c03023264208James Dong
70129a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncUpdateIDRInterval(AVCHandle *avcHandle, int IDRInterval)
70229a84457aed4c45bc900998b5e11c03023264208James Dong{
70329a84457aed4c45bc900998b5e11c03023264208James Dong    OSCL_UNUSED_ARG(avcHandle);
70429a84457aed4c45bc900998b5e11c03023264208James Dong    OSCL_UNUSED_ARG(IDRInterval);
70529a84457aed4c45bc900998b5e11c03023264208James Dong
70629a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_FAIL;
70729a84457aed4c45bc900998b5e11c03023264208James Dong}
70829a84457aed4c45bc900998b5e11c03023264208James Dong
70929a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncIDRRequest(AVCHandle *avcHandle)
71029a84457aed4c45bc900998b5e11c03023264208James Dong{
71129a84457aed4c45bc900998b5e11c03023264208James Dong    OSCL_UNUSED_ARG(avcHandle);
71229a84457aed4c45bc900998b5e11c03023264208James Dong
71329a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_FAIL;
71429a84457aed4c45bc900998b5e11c03023264208James Dong}
71529a84457aed4c45bc900998b5e11c03023264208James Dong
71629a84457aed4c45bc900998b5e11c03023264208James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncUpdateIMBRefresh(AVCHandle *avcHandle, int numMB)
71729a84457aed4c45bc900998b5e11c03023264208James Dong{
71829a84457aed4c45bc900998b5e11c03023264208James Dong    OSCL_UNUSED_ARG(avcHandle);
71929a84457aed4c45bc900998b5e11c03023264208James Dong    OSCL_UNUSED_ARG(numMB);
72029a84457aed4c45bc900998b5e11c03023264208James Dong
72129a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_FAIL;
72229a84457aed4c45bc900998b5e11c03023264208James Dong}
72329a84457aed4c45bc900998b5e11c03023264208James Dong
72429a84457aed4c45bc900998b5e11c03023264208James Dongvoid PVAVCEncGetFrameStats(AVCHandle *avcHandle, AVCEncFrameStats *avcStats)
72529a84457aed4c45bc900998b5e11c03023264208James Dong{
72629a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEncObject *encvid = (AVCEncObject*) avcHandle->AVCObject;
72729a84457aed4c45bc900998b5e11c03023264208James Dong    AVCRateControl *rateCtrl = encvid->rateCtrl;
72829a84457aed4c45bc900998b5e11c03023264208James Dong
72929a84457aed4c45bc900998b5e11c03023264208James Dong    avcStats->avgFrameQP = GetAvgFrameQP(rateCtrl);
73029a84457aed4c45bc900998b5e11c03023264208James Dong    avcStats->numIntraMBs = encvid->numIntraMB;
73129a84457aed4c45bc900998b5e11c03023264208James Dong
73229a84457aed4c45bc900998b5e11c03023264208James Dong    return ;
73329a84457aed4c45bc900998b5e11c03023264208James Dong}
73429a84457aed4c45bc900998b5e11c03023264208James Dong
73529a84457aed4c45bc900998b5e11c03023264208James Dong
73629a84457aed4c45bc900998b5e11c03023264208James Dong
737