11cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ------------------------------------------------------------------
21cc31e629e8132df390ae692873c847d1c2f62c0James Dong * Copyright (C) 1998-2009 PacketVideo
31cc31e629e8132df390ae692873c847d1c2f62c0James Dong *
41cc31e629e8132df390ae692873c847d1c2f62c0James Dong * Licensed under the Apache License, Version 2.0 (the "License");
51cc31e629e8132df390ae692873c847d1c2f62c0James Dong * you may not use this file except in compliance with the License.
61cc31e629e8132df390ae692873c847d1c2f62c0James Dong * You may obtain a copy of the License at
71cc31e629e8132df390ae692873c847d1c2f62c0James Dong *
81cc31e629e8132df390ae692873c847d1c2f62c0James Dong *      http://www.apache.org/licenses/LICENSE-2.0
91cc31e629e8132df390ae692873c847d1c2f62c0James Dong *
101cc31e629e8132df390ae692873c847d1c2f62c0James Dong * Unless required by applicable law or agreed to in writing, software
111cc31e629e8132df390ae692873c847d1c2f62c0James Dong * distributed under the License is distributed on an "AS IS" BASIS,
121cc31e629e8132df390ae692873c847d1c2f62c0James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
131cc31e629e8132df390ae692873c847d1c2f62c0James Dong * express or implied.
141cc31e629e8132df390ae692873c847d1c2f62c0James Dong * See the License for the specific language governing permissions
151cc31e629e8132df390ae692873c847d1c2f62c0James Dong * and limitations under the License.
161cc31e629e8132df390ae692873c847d1c2f62c0James Dong * -------------------------------------------------------------------
171cc31e629e8132df390ae692873c847d1c2f62c0James Dong */
181cc31e629e8132df390ae692873c847d1c2f62c0James Dong#include "avcenc_api.h"
191cc31e629e8132df390ae692873c847d1c2f62c0James Dong#include "avcenc_lib.h"
201cc31e629e8132df390ae692873c847d1c2f62c0James Dong
211cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
221cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Function : PVAVCGetNALType()                                            */
231cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Date     : 11/4/2003                                                    */
241cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Purpose  : Sniff NAL type from the bitstream                            */
251cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  In/out   :                                                              */
261cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Return   : AVCENC_SUCCESS if succeed, AVCENC_FAIL if fail.              */
271cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Modified :                                                              */
281cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
291cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncGetNALType(unsigned char *bitstream, int size,
301cc31e629e8132df390ae692873c847d1c2f62c0James Dong        int *nal_type, int *nal_ref_idc)
311cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
321cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int forbidden_zero_bit;
331cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (size > 0)
341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
351cc31e629e8132df390ae692873c847d1c2f62c0James Dong        forbidden_zero_bit = bitstream[0] >> 7;
361cc31e629e8132df390ae692873c847d1c2f62c0James Dong        if (forbidden_zero_bit != 0)
371cc31e629e8132df390ae692873c847d1c2f62c0James Dong            return AVCENC_FAIL;
381cc31e629e8132df390ae692873c847d1c2f62c0James Dong        *nal_ref_idc = (bitstream[0] & 0x60) >> 5;
391cc31e629e8132df390ae692873c847d1c2f62c0James Dong        *nal_type = bitstream[0] & 0x1F;
401cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_SUCCESS;
411cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
421cc31e629e8132df390ae692873c847d1c2f62c0James Dong
431cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return AVCENC_FAIL;
441cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
451cc31e629e8132df390ae692873c847d1c2f62c0James Dong
461cc31e629e8132df390ae692873c847d1c2f62c0James Dong
471cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
481cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Function : PVAVCEncInitialize()                                         */
491cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Date     : 3/18/2004                                                    */
501cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Purpose  : Initialize the encoder library, allocate memory and verify   */
511cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*              the profile/level support/settings.                         */
521cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  In/out   : Encoding parameters.                                         */
531cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Return   : AVCENC_SUCCESS for success.                                  */
541cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Modified :                                                              */
551cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
561cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncInitialize(AVCHandle *avcHandle, AVCEncParams *encParam,
571cc31e629e8132df390ae692873c847d1c2f62c0James Dong        void* extSPS, void* extPPS)
581cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
591cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status status;
601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEncObject *encvid;
611cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCCommonObj *video;
621cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint32 *userData = (uint32*) avcHandle->userData;
631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    int framesize;
641cc31e629e8132df390ae692873c847d1c2f62c0James Dong
651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (avcHandle->AVCObject != NULL)
661cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
671cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_ALREADY_INITIALIZED; /* It's already initialized, need to cleanup first */
681cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
691cc31e629e8132df390ae692873c847d1c2f62c0James Dong
701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* not initialized */
711cc31e629e8132df390ae692873c847d1c2f62c0James Dong
721cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* allocate videoObject */
731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    avcHandle->AVCObject = (void*)avcHandle->CBAVC_Malloc(userData, sizeof(AVCEncObject), DEFAULT_ATTR);
741cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (avcHandle->AVCObject == NULL)
751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
761cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
771cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
781cc31e629e8132df390ae692873c847d1c2f62c0James Dong
791cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid = (AVCEncObject*) avcHandle->AVCObject;
801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    memset(encvid, 0, sizeof(AVCEncObject)); /* reset everything */
811cc31e629e8132df390ae692873c847d1c2f62c0James Dong
821cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->enc_state = AVCEnc_Initializing;
831cc31e629e8132df390ae692873c847d1c2f62c0James Dong
841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->avcHandle = avcHandle;
851cc31e629e8132df390ae692873c847d1c2f62c0James Dong
861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->common = (AVCCommonObj*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCCommonObj), DEFAULT_ATTR);
871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid->common == NULL)
881cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
891cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
911cc31e629e8132df390ae692873c847d1c2f62c0James Dong
921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    video = encvid->common;
931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    memset(video, 0, sizeof(AVCCommonObj));
941cc31e629e8132df390ae692873c847d1c2f62c0James Dong
951cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* allocate bitstream structure */
961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->bitstream = (AVCEncBitstream*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCEncBitstream), DEFAULT_ATTR);
971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid->bitstream == NULL)
981cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
991cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
1001cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
1011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->bitstream->encvid = encvid; /* to point back for reallocation */
1021cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* allocate sequence parameter set structure */
1041cc31e629e8132df390ae692873c847d1c2f62c0James Dong    video->currSeqParams = (AVCSeqParamSet*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCSeqParamSet), DEFAULT_ATTR);
1051cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (video->currSeqParams == NULL)
1061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
1071cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
1081cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
1091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    memset(video->currSeqParams, 0, sizeof(AVCSeqParamSet));
1101cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* allocate picture parameter set structure */
1121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    video->currPicParams = (AVCPicParamSet*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCPicParamSet), DEFAULT_ATTR);
1131cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (video->currPicParams == NULL)
1141cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
1151cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
1161cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
1171cc31e629e8132df390ae692873c847d1c2f62c0James Dong    memset(video->currPicParams, 0, sizeof(AVCPicParamSet));
1181cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1191cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* allocate slice header structure */
1201cc31e629e8132df390ae692873c847d1c2f62c0James Dong    video->sliceHdr = (AVCSliceHeader*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCSliceHeader), DEFAULT_ATTR);
1211cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (video->sliceHdr == NULL)
1221cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
1231cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
1241cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
1251cc31e629e8132df390ae692873c847d1c2f62c0James Dong    memset(video->sliceHdr, 0, sizeof(AVCSliceHeader));
1261cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* allocate encoded picture buffer structure*/
1281cc31e629e8132df390ae692873c847d1c2f62c0James Dong    video->decPicBuf = (AVCDecPicBuffer*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCDecPicBuffer), DEFAULT_ATTR);
1291cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (video->decPicBuf == NULL)
1301cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
1311cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
1321cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
1331cc31e629e8132df390ae692873c847d1c2f62c0James Dong    memset(video->decPicBuf, 0, sizeof(AVCDecPicBuffer));
1341cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* allocate rate control structure */
1361cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->rateCtrl = (AVCRateControl*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCRateControl), DEFAULT_ATTR);
1371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid->rateCtrl == NULL)
1381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
1391cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
1401cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
1411cc31e629e8132df390ae692873c847d1c2f62c0James Dong    memset(encvid->rateCtrl, 0, sizeof(AVCRateControl));
1421cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1431cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* reset frame list, not really needed */
1441cc31e629e8132df390ae692873c847d1c2f62c0James Dong    video->currPic = NULL;
1451cc31e629e8132df390ae692873c847d1c2f62c0James Dong    video->currFS = NULL;
1461cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->currInput = NULL;
1471cc31e629e8132df390ae692873c847d1c2f62c0James Dong    video->prevRefPic = NULL;
1481cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1491cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* now read encParams, and allocate dimension-dependent variables */
1501cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* such as mblock */
1511cc31e629e8132df390ae692873c847d1c2f62c0James Dong    status = SetEncodeParam(avcHandle, encParam, extSPS, extPPS); /* initialized variables to be used in SPS*/
1521cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (status != AVCENC_SUCCESS)
1531cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
1541cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return status;
1551cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
1561cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encParam->use_overrun_buffer == AVC_ON)
1581cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
1591cc31e629e8132df390ae692873c847d1c2f62c0James Dong        /* allocate overrun buffer */
1601cc31e629e8132df390ae692873c847d1c2f62c0James Dong        encvid->oBSize = encvid->rateCtrl->cpbSize;
1611cc31e629e8132df390ae692873c847d1c2f62c0James Dong        if (encvid->oBSize > DEFAULT_OVERRUN_BUFFER_SIZE)
1621cc31e629e8132df390ae692873c847d1c2f62c0James Dong        {
1631cc31e629e8132df390ae692873c847d1c2f62c0James Dong            encvid->oBSize = DEFAULT_OVERRUN_BUFFER_SIZE;
1641cc31e629e8132df390ae692873c847d1c2f62c0James Dong        }
1651cc31e629e8132df390ae692873c847d1c2f62c0James Dong        encvid->overrunBuffer = (uint8*) avcHandle->CBAVC_Malloc(userData, encvid->oBSize, DEFAULT_ATTR);
1661cc31e629e8132df390ae692873c847d1c2f62c0James Dong        if (encvid->overrunBuffer == NULL)
1671cc31e629e8132df390ae692873c847d1c2f62c0James Dong        {
1681cc31e629e8132df390ae692873c847d1c2f62c0James Dong            return AVCENC_MEMORY_FAIL;
1691cc31e629e8132df390ae692873c847d1c2f62c0James Dong        }
1701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
1711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    else
1721cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
1731cc31e629e8132df390ae692873c847d1c2f62c0James Dong        encvid->oBSize = 0;
1741cc31e629e8132df390ae692873c847d1c2f62c0James Dong        encvid->overrunBuffer = NULL;
1751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
1761cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1771cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* allocate frame size dependent structures */
1781cc31e629e8132df390ae692873c847d1c2f62c0James Dong    framesize = video->FrameHeightInMbs * video->PicWidthInMbs;
1791cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    video->mblock = (AVCMacroblock*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCMacroblock) * framesize, DEFAULT_ATTR);
1811cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (video->mblock == NULL)
1821cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
1831cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
1841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
1851cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    video->MbToSliceGroupMap = (int*) avcHandle->CBAVC_Malloc(userData, sizeof(uint) * video->PicSizeInMapUnits * 2, DEFAULT_ATTR);
1871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (video->MbToSliceGroupMap == NULL)
1881cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
1891cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
1901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
1911cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1921cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->mot16x16 = (AVCMV*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCMV) * framesize, DEFAULT_ATTR);
1931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid->mot16x16 == NULL)
1941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
1951cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
1961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
1971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    memset(encvid->mot16x16, 0, sizeof(AVCMV)*framesize);
1981cc31e629e8132df390ae692873c847d1c2f62c0James Dong
1991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->intraSearch = (uint8*) avcHandle->CBAVC_Malloc(userData, sizeof(uint8) * framesize, DEFAULT_ATTR);
2001cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid->intraSearch == NULL)
2011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
2021cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
2031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
2041cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2051cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->min_cost = (int*) avcHandle->CBAVC_Malloc(userData, sizeof(int) * framesize, DEFAULT_ATTR);
2061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid->min_cost == NULL)
2071cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
2081cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
2091cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
2101cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* initialize motion search related memory */
2121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (AVCENC_SUCCESS != InitMotionSearchModule(avcHandle))
2131cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
2141cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
2151cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
2161cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2171cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (AVCENC_SUCCESS != InitRateControlModule(avcHandle))
2181cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
2191cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
2201cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
2211cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2221cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* intialize function pointers */
2231cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->functionPointer = (AVCEncFuncPtr*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCEncFuncPtr), DEFAULT_ATTR);
2241cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid->functionPointer == NULL)
2251cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
2261cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_MEMORY_FAIL;
2271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
2281cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->functionPointer->SAD_Macroblock = &AVCSAD_Macroblock_C;
2291cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->functionPointer->SAD_MB_HalfPel[0] = NULL;
2301cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->functionPointer->SAD_MB_HalfPel[1] = &AVCSAD_MB_HalfPel_Cxh;
2311cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->functionPointer->SAD_MB_HalfPel[2] = &AVCSAD_MB_HalfPel_Cyh;
2321cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->functionPointer->SAD_MB_HalfPel[3] = &AVCSAD_MB_HalfPel_Cxhyh;
2331cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* initialize timing control */
2351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->modTimeRef = 0;     /* ALWAYS ASSUME THAT TIMESTAMP START FROM 0 !!!*/
2361cc31e629e8132df390ae692873c847d1c2f62c0James Dong    video->prevFrameNum = 0;
2371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->prevCodedFrameNum = 0;
2381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->dispOrdPOCRef = 0;
2391cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2401cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid->outOfBandParamSet == TRUE)
2411cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
2421cc31e629e8132df390ae692873c847d1c2f62c0James Dong        encvid->enc_state = AVCEnc_Encoding_SPS;
2431cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
2441cc31e629e8132df390ae692873c847d1c2f62c0James Dong    else
2451cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
2461cc31e629e8132df390ae692873c847d1c2f62c0James Dong        encvid->enc_state = AVCEnc_Analyzing_Frame;
2471cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
2481cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2491cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return AVCENC_SUCCESS;
2501cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
2511cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2521cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
2531cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Function : PVAVCEncGetMaxOutputSize()                                   */
2541cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Date     : 11/29/2008                                                   */
2551cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Purpose  : Return max output buffer size that apps should allocate for  */
2561cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*              output buffer.                                              */
2571cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  In/out   :                                                              */
2581cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Return   : AVCENC_SUCCESS for success.                                  */
2591cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Modified :   size                                                       */
2601cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
2611cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2621cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncGetMaxOutputBufferSize(AVCHandle *avcHandle, int* size)
2631cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
2641cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEncObject *encvid = (AVCEncObject*)avcHandle->AVCObject;
2651cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2661cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid == NULL)
2671cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
2681cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_UNINITIALIZED;
2691cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
2701cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    *size = encvid->rateCtrl->cpbSize;
2721cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return AVCENC_SUCCESS;
2741cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
2751cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2761cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
2771cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Function : PVAVCEncSetInput()                                           */
2781cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Date     : 4/18/2004                                                    */
2791cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Purpose  : To feed an unencoded original frame to the encoder library.  */
2801cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  In/out   :                                                              */
2811cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Return   : AVCENC_SUCCESS for success.                                  */
2821cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Modified :                                                              */
2831cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
2841cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncSetInput(AVCHandle *avcHandle, AVCFrameIO *input)
2851cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
2861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEncObject *encvid = (AVCEncObject*)avcHandle->AVCObject;
2871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCCommonObj *video = encvid->common;
2881cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCRateControl *rateCtrl = encvid->rateCtrl;
2891cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2901cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status status;
2911cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint frameNum;
2921cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2931cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid == NULL)
2941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
2951cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_UNINITIALIZED;
2961cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
2971cc31e629e8132df390ae692873c847d1c2f62c0James Dong
2981cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid->enc_state == AVCEnc_WaitingForBuffer)
2991cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
3001cc31e629e8132df390ae692873c847d1c2f62c0James Dong        goto RECALL_INITFRAME;
3011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
3021cc31e629e8132df390ae692873c847d1c2f62c0James Dong    else if (encvid->enc_state != AVCEnc_Analyzing_Frame)
3031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
3041cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_FAIL;
3051cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
3061cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3071cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (input->pitch > 0xFFFF)
3081cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
3091cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_NOT_SUPPORTED; // we use 2-bytes for pitch
3101cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
3111cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /***********************************/
3131cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3141cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* Let's rate control decide whether to encode this frame or not */
3151cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* Also set video->nal_unit_type, sliceHdr->slice_type, video->slice_type */
3161cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (AVCENC_SUCCESS != RCDetermineFrameNum(encvid, rateCtrl, input->coding_timestamp, &frameNum))
3171cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
3181cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_SKIPPED_PICTURE; /* not time to encode, thus skipping */
3191cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
3201cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3211cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* we may not need this line */
3221cc31e629e8132df390ae692873c847d1c2f62c0James Dong    //nextFrmModTime = (uint32)((((frameNum+1)*1000)/rateCtrl->frame_rate) + modTimeRef); /* rec. time */
3231cc31e629e8132df390ae692873c847d1c2f62c0James Dong    //encvid->nextModTime = nextFrmModTime - (encvid->frameInterval>>1) - 1; /* between current and next frame */
3241cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3251cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->currInput = input;
3261cc31e629e8132df390ae692873c847d1c2f62c0James Dong    encvid->currInput->coding_order = frameNum;
3271cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3281cc31e629e8132df390ae692873c847d1c2f62c0James DongRECALL_INITFRAME:
3291cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* initialize and analyze the frame */
3301cc31e629e8132df390ae692873c847d1c2f62c0James Dong    status = InitFrame(encvid);
3311cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3321cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (status == AVCENC_SUCCESS)
3331cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
3341cc31e629e8132df390ae692873c847d1c2f62c0James Dong        encvid->enc_state = AVCEnc_Encoding_Frame;
3351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
3361cc31e629e8132df390ae692873c847d1c2f62c0James Dong    else if (status == AVCENC_NEW_IDR)
3371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
3381cc31e629e8132df390ae692873c847d1c2f62c0James Dong        if (encvid->outOfBandParamSet == TRUE)
3391cc31e629e8132df390ae692873c847d1c2f62c0James Dong        {
3401cc31e629e8132df390ae692873c847d1c2f62c0James Dong            encvid->enc_state = AVCEnc_Encoding_Frame;
3411cc31e629e8132df390ae692873c847d1c2f62c0James Dong        }
3421cc31e629e8132df390ae692873c847d1c2f62c0James Dong        else // assuming that in-band paramset keeps sending new SPS and PPS.
3431cc31e629e8132df390ae692873c847d1c2f62c0James Dong        {
3441cc31e629e8132df390ae692873c847d1c2f62c0James Dong            encvid->enc_state = AVCEnc_Encoding_SPS;
3451cc31e629e8132df390ae692873c847d1c2f62c0James Dong            //video->currSeqParams->seq_parameter_set_id++;
3461cc31e629e8132df390ae692873c847d1c2f62c0James Dong            //if(video->currSeqParams->seq_parameter_set_id > 31) // range check
3471cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
3481cc31e629e8132df390ae692873c847d1c2f62c0James Dong                video->currSeqParams->seq_parameter_set_id = 0;  // reset
3491cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
3501cc31e629e8132df390ae692873c847d1c2f62c0James Dong        }
3511cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3521cc31e629e8132df390ae692873c847d1c2f62c0James Dong        video->sliceHdr->idr_pic_id++;
3531cc31e629e8132df390ae692873c847d1c2f62c0James Dong        if (video->sliceHdr->idr_pic_id > 65535) // range check
3541cc31e629e8132df390ae692873c847d1c2f62c0James Dong        {
3551cc31e629e8132df390ae692873c847d1c2f62c0James Dong            video->sliceHdr->idr_pic_id = 0;  // reset
3561cc31e629e8132df390ae692873c847d1c2f62c0James Dong        }
3571cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
3581cc31e629e8132df390ae692873c847d1c2f62c0James Dong    /* the following logics need to be revisited */
3591cc31e629e8132df390ae692873c847d1c2f62c0James Dong    else if (status == AVCENC_PICTURE_READY) // no buffers returned back to the encoder
3601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
3611cc31e629e8132df390ae692873c847d1c2f62c0James Dong        encvid->enc_state = AVCEnc_WaitingForBuffer; // Input accepted but can't continue
3621cc31e629e8132df390ae692873c847d1c2f62c0James Dong        // need to free up some memory before proceeding with Encode
3631cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
3641cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return status; // return status, including the AVCENC_FAIL case and all 3 above.
3661cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
3671cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3681cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
3691cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Function : PVAVCEncodeNAL()                                             */
3701cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Date     : 4/29/2004                                                    */
3711cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Purpose  : To encode one NAL/slice.                                     */
3721cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  In/out   :                                                              */
3731cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Return   : AVCENC_SUCCESS for success.                                  */
3741cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Modified :                                                              */
3751cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
3761cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncodeNAL(AVCHandle *avcHandle, unsigned char *buffer, unsigned int *buf_nal_size, int *nal_type)
3771cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
3781cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEncObject *encvid = (AVCEncObject*)avcHandle->AVCObject;
3791cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCCommonObj *video = encvid->common;
3801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEncBitstream *bitstream = encvid->bitstream;
3811cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEnc_Status status;
3821cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3831cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid == NULL)
3841cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
3851cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_UNINITIALIZED;
3861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
3871cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3881cc31e629e8132df390ae692873c847d1c2f62c0James Dong    switch (encvid->enc_state)
3891cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
3901cc31e629e8132df390ae692873c847d1c2f62c0James Dong        case AVCEnc_Initializing:
3911cc31e629e8132df390ae692873c847d1c2f62c0James Dong            return AVCENC_UNINITIALIZED;
3921cc31e629e8132df390ae692873c847d1c2f62c0James Dong        case AVCEnc_Encoding_SPS:
3931cc31e629e8132df390ae692873c847d1c2f62c0James Dong            /* initialized the structure */
3941cc31e629e8132df390ae692873c847d1c2f62c0James Dong            BitstreamEncInit(bitstream, buffer, *buf_nal_size, NULL, 0);
3951cc31e629e8132df390ae692873c847d1c2f62c0James Dong            BitstreamWriteBits(bitstream, 8, (1 << 5) | AVC_NALTYPE_SPS);
3961cc31e629e8132df390ae692873c847d1c2f62c0James Dong
3971cc31e629e8132df390ae692873c847d1c2f62c0James Dong            /* encode SPS */
3981cc31e629e8132df390ae692873c847d1c2f62c0James Dong            status = EncodeSPS(encvid, bitstream);
3991cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (status != AVCENC_SUCCESS)
4001cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
4011cc31e629e8132df390ae692873c847d1c2f62c0James Dong                return status;
4021cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
4031cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4041cc31e629e8132df390ae692873c847d1c2f62c0James Dong            /* closing the NAL with trailing bits */
4051cc31e629e8132df390ae692873c847d1c2f62c0James Dong            status = BitstreamTrailingBits(bitstream, buf_nal_size);
4061cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (status == AVCENC_SUCCESS)
4071cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
4081cc31e629e8132df390ae692873c847d1c2f62c0James Dong                encvid->enc_state = AVCEnc_Encoding_PPS;
4091cc31e629e8132df390ae692873c847d1c2f62c0James Dong                video->currPicParams->seq_parameter_set_id = video->currSeqParams->seq_parameter_set_id;
4101cc31e629e8132df390ae692873c847d1c2f62c0James Dong                video->currPicParams->pic_parameter_set_id++;
4111cc31e629e8132df390ae692873c847d1c2f62c0James Dong                *nal_type = AVC_NALTYPE_SPS;
4121cc31e629e8132df390ae692873c847d1c2f62c0James Dong                *buf_nal_size = bitstream->write_pos;
4131cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
4141cc31e629e8132df390ae692873c847d1c2f62c0James Dong            break;
4151cc31e629e8132df390ae692873c847d1c2f62c0James Dong        case AVCEnc_Encoding_PPS:
4161cc31e629e8132df390ae692873c847d1c2f62c0James Dong            /* initialized the structure */
4171cc31e629e8132df390ae692873c847d1c2f62c0James Dong            BitstreamEncInit(bitstream, buffer, *buf_nal_size, NULL, 0);
4181cc31e629e8132df390ae692873c847d1c2f62c0James Dong            BitstreamWriteBits(bitstream, 8, (1 << 5) | AVC_NALTYPE_PPS);
4191cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4201cc31e629e8132df390ae692873c847d1c2f62c0James Dong            /* encode PPS */
4211cc31e629e8132df390ae692873c847d1c2f62c0James Dong            status = EncodePPS(encvid, bitstream);
4221cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (status != AVCENC_SUCCESS)
4231cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
4241cc31e629e8132df390ae692873c847d1c2f62c0James Dong                return status;
4251cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
4261cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4271cc31e629e8132df390ae692873c847d1c2f62c0James Dong            /* closing the NAL with trailing bits */
4281cc31e629e8132df390ae692873c847d1c2f62c0James Dong            status = BitstreamTrailingBits(bitstream, buf_nal_size);
4291cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (status == AVCENC_SUCCESS)
4301cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
4311cc31e629e8132df390ae692873c847d1c2f62c0James Dong                if (encvid->outOfBandParamSet == TRUE) // already extract PPS, SPS
4321cc31e629e8132df390ae692873c847d1c2f62c0James Dong                {
4331cc31e629e8132df390ae692873c847d1c2f62c0James Dong                    encvid->enc_state = AVCEnc_Analyzing_Frame;
4341cc31e629e8132df390ae692873c847d1c2f62c0James Dong                }
4351cc31e629e8132df390ae692873c847d1c2f62c0James Dong                else    // SetInput has been called before SPS and PPS.
4361cc31e629e8132df390ae692873c847d1c2f62c0James Dong                {
4371cc31e629e8132df390ae692873c847d1c2f62c0James Dong                    encvid->enc_state = AVCEnc_Encoding_Frame;
4381cc31e629e8132df390ae692873c847d1c2f62c0James Dong                }
4391cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4401cc31e629e8132df390ae692873c847d1c2f62c0James Dong                *nal_type = AVC_NALTYPE_PPS;
4411cc31e629e8132df390ae692873c847d1c2f62c0James Dong                *buf_nal_size = bitstream->write_pos;
4421cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
4431cc31e629e8132df390ae692873c847d1c2f62c0James Dong            break;
4441cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4451cc31e629e8132df390ae692873c847d1c2f62c0James Dong        case AVCEnc_Encoding_Frame:
4461cc31e629e8132df390ae692873c847d1c2f62c0James Dong            /* initialized the structure */
4471cc31e629e8132df390ae692873c847d1c2f62c0James Dong            BitstreamEncInit(bitstream, buffer, *buf_nal_size, encvid->overrunBuffer, encvid->oBSize);
4481cc31e629e8132df390ae692873c847d1c2f62c0James Dong            BitstreamWriteBits(bitstream, 8, (video->nal_ref_idc << 5) | (video->nal_unit_type));
4491cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4501cc31e629e8132df390ae692873c847d1c2f62c0James Dong            /* Re-order the reference list according to the ref_pic_list_reordering() */
4511cc31e629e8132df390ae692873c847d1c2f62c0James Dong            /* We don't have to reorder the list for the encoder here. This can only be done
4521cc31e629e8132df390ae692873c847d1c2f62c0James Dong            after we encode this slice. We can run thru a second-pass to see if new ordering
4531cc31e629e8132df390ae692873c847d1c2f62c0James Dong            would save more bits. Too much delay !! */
4541cc31e629e8132df390ae692873c847d1c2f62c0James Dong            /* status = ReOrderList(video);*/
4551cc31e629e8132df390ae692873c847d1c2f62c0James Dong            status = InitSlice(encvid);
4561cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (status != AVCENC_SUCCESS)
4571cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
4581cc31e629e8132df390ae692873c847d1c2f62c0James Dong                return status;
4591cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
4601cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4611cc31e629e8132df390ae692873c847d1c2f62c0James Dong            /* when we have everything, we encode the slice header */
4621cc31e629e8132df390ae692873c847d1c2f62c0James Dong            status = EncodeSliceHeader(encvid, bitstream);
4631cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (status != AVCENC_SUCCESS)
4641cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
4651cc31e629e8132df390ae692873c847d1c2f62c0James Dong                return status;
4661cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
4671cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4681cc31e629e8132df390ae692873c847d1c2f62c0James Dong            status = AVCEncodeSlice(encvid);
4691cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4701cc31e629e8132df390ae692873c847d1c2f62c0James Dong            video->slice_id++;
4711cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4721cc31e629e8132df390ae692873c847d1c2f62c0James Dong            /* closing the NAL with trailing bits */
4731cc31e629e8132df390ae692873c847d1c2f62c0James Dong            BitstreamTrailingBits(bitstream, buf_nal_size);
4741cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4751cc31e629e8132df390ae692873c847d1c2f62c0James Dong            *buf_nal_size = bitstream->write_pos;
4761cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4771cc31e629e8132df390ae692873c847d1c2f62c0James Dong            encvid->rateCtrl->numFrameBits += ((*buf_nal_size) << 3);
4781cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4791cc31e629e8132df390ae692873c847d1c2f62c0James Dong            *nal_type = video->nal_unit_type;
4801cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4811cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (status == AVCENC_PICTURE_READY)
4821cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
4831cc31e629e8132df390ae692873c847d1c2f62c0James Dong                status = RCUpdateFrame(encvid);
4841cc31e629e8132df390ae692873c847d1c2f62c0James Dong                if (status == AVCENC_SKIPPED_PICTURE) /* skip current frame */
4851cc31e629e8132df390ae692873c847d1c2f62c0James Dong                {
4861cc31e629e8132df390ae692873c847d1c2f62c0James Dong                    DPBReleaseCurrentFrame(avcHandle, video);
4871cc31e629e8132df390ae692873c847d1c2f62c0James Dong                    encvid->enc_state = AVCEnc_Analyzing_Frame;
4881cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4891cc31e629e8132df390ae692873c847d1c2f62c0James Dong                    return status;
4901cc31e629e8132df390ae692873c847d1c2f62c0James Dong                }
4911cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4921cc31e629e8132df390ae692873c847d1c2f62c0James Dong                /* perform loop-filtering on the entire frame */
4931cc31e629e8132df390ae692873c847d1c2f62c0James Dong                DeblockPicture(video);
4941cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4951cc31e629e8132df390ae692873c847d1c2f62c0James Dong                /* update the original frame array */
4961cc31e629e8132df390ae692873c847d1c2f62c0James Dong                encvid->prevCodedFrameNum = encvid->currInput->coding_order;
4971cc31e629e8132df390ae692873c847d1c2f62c0James Dong
4981cc31e629e8132df390ae692873c847d1c2f62c0James Dong                /* store the encoded picture in the DPB buffer */
4991cc31e629e8132df390ae692873c847d1c2f62c0James Dong                StorePictureInDPB(avcHandle, video);
5001cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5011cc31e629e8132df390ae692873c847d1c2f62c0James Dong                if (video->currPic->isReference)
5021cc31e629e8132df390ae692873c847d1c2f62c0James Dong                {
5031cc31e629e8132df390ae692873c847d1c2f62c0James Dong                    video->PrevRefFrameNum = video->sliceHdr->frame_num;
5041cc31e629e8132df390ae692873c847d1c2f62c0James Dong                }
5051cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5061cc31e629e8132df390ae692873c847d1c2f62c0James Dong                /* update POC related variables */
5071cc31e629e8132df390ae692873c847d1c2f62c0James Dong                PostPOC(video);
5081cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5091cc31e629e8132df390ae692873c847d1c2f62c0James Dong                encvid->enc_state = AVCEnc_Analyzing_Frame;
5101cc31e629e8132df390ae692873c847d1c2f62c0James Dong                status = AVCENC_PICTURE_READY;
5111cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5121cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
5131cc31e629e8132df390ae692873c847d1c2f62c0James Dong            break;
5141cc31e629e8132df390ae692873c847d1c2f62c0James Dong        default:
5151cc31e629e8132df390ae692873c847d1c2f62c0James Dong            status = AVCENC_WRONG_STATE;
5161cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
5171cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5181cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return status;
5191cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
5201cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5211cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
5221cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Function : PVAVCEncGetOverrunBuffer()                                   */
5231cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Purpose  : To retrieve the overrun buffer. Check whether overrun buffer */
5241cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*              is used or not before returning                             */
5251cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  In/out   :                                                              */
5261cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Return   : Pointer to the internal overrun buffer.                      */
5271cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Modified :                                                              */
5281cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
5291cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF uint8* PVAVCEncGetOverrunBuffer(AVCHandle* avcHandle)
5301cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
5311cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEncObject *encvid = (AVCEncObject*)avcHandle->AVCObject;
5321cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEncBitstream *bitstream = encvid->bitstream;
5331cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (bitstream->overrunBuffer == bitstream->bitstreamBuffer) /* OB is used */
5351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
5361cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return encvid->overrunBuffer;
5371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
5381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    else
5391cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
5401cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return NULL;
5411cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
5421cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
5431cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5441cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5451cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
5461cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Function : PVAVCEncGetRecon()                                           */
5471cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Date     : 4/29/2004                                                    */
5481cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Purpose  : To retrieve the most recently encoded frame.                 */
5491cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*              assume that user will make a copy if they want to hold on   */
5501cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*              to it. Otherwise, it is not guaranteed to be reserved.      */
5511cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*              Most applications prefer to see original frame rather than  */
5521cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*              reconstructed frame. So, we are staying aware from complex  */
5531cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*              buffering mechanism. If needed, can be added later.         */
5541cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  In/out   :                                                              */
5551cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Return   : AVCENC_SUCCESS for success.                                  */
5561cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Modified :                                                              */
5571cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
5581cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncGetRecon(AVCHandle *avcHandle, AVCFrameIO *recon)
5591cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
5601cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEncObject *encvid = (AVCEncObject*)avcHandle->AVCObject;
5611cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCCommonObj *video = encvid->common;
5621cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCFrameStore *currFS = video->currFS;
5631cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5641cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid == NULL)
5651cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
5661cc31e629e8132df390ae692873c847d1c2f62c0James Dong        return AVCENC_UNINITIALIZED;
5671cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
5681cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5691cc31e629e8132df390ae692873c847d1c2f62c0James Dong    recon->YCbCr[0] = currFS->frame.Sl;
5701cc31e629e8132df390ae692873c847d1c2f62c0James Dong    recon->YCbCr[1] = currFS->frame.Scb;
5711cc31e629e8132df390ae692873c847d1c2f62c0James Dong    recon->YCbCr[2] = currFS->frame.Scr;
5721cc31e629e8132df390ae692873c847d1c2f62c0James Dong    recon->height = currFS->frame.height;
5731cc31e629e8132df390ae692873c847d1c2f62c0James Dong    recon->pitch = currFS->frame.pitch;
5741cc31e629e8132df390ae692873c847d1c2f62c0James Dong    recon->disp_order = currFS->PicOrderCnt;
5751cc31e629e8132df390ae692873c847d1c2f62c0James Dong    recon->coding_order = currFS->FrameNum;
5761cc31e629e8132df390ae692873c847d1c2f62c0James Dong    recon->id = (uint32) currFS->base_dpb; /* use the pointer as the id */
5771cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5781cc31e629e8132df390ae692873c847d1c2f62c0James Dong    currFS->IsOutputted |= 1;
5791cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5801cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return AVCENC_SUCCESS;
5811cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
5821cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5831cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncReleaseRecon(AVCHandle *avcHandle, AVCFrameIO *recon)
5841cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
5851cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OSCL_UNUSED_ARG(avcHandle);
5861cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OSCL_UNUSED_ARG(recon);
5871cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5881cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return AVCENC_SUCCESS; //for now
5891cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
5901cc31e629e8132df390ae692873c847d1c2f62c0James Dong
5911cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
5921cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Function : PVAVCCleanUpEncoder()                                        */
5931cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Date     : 4/18/2004                                                    */
5941cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Purpose  : To clean up memories allocated by PVAVCEncInitialize()       */
5951cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  In/out   :                                                              */
5961cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Return   : AVCENC_SUCCESS for success.                                  */
5971cc31e629e8132df390ae692873c847d1c2f62c0James Dong/*  Modified :                                                              */
5981cc31e629e8132df390ae692873c847d1c2f62c0James Dong/* ======================================================================== */
5991cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF void    PVAVCCleanUpEncoder(AVCHandle *avcHandle)
6001cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
6011cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEncObject *encvid = (AVCEncObject*) avcHandle->AVCObject;
6021cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCCommonObj *video;
6031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    uint32 *userData = (uint32*) avcHandle->userData;
6041cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6051cc31e629e8132df390ae692873c847d1c2f62c0James Dong    if (encvid != NULL)
6061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    {
6071cc31e629e8132df390ae692873c847d1c2f62c0James Dong        CleanMotionSearchModule(avcHandle);
6081cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6091cc31e629e8132df390ae692873c847d1c2f62c0James Dong        CleanupRateControlModule(avcHandle);
6101cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6111cc31e629e8132df390ae692873c847d1c2f62c0James Dong        if (encvid->functionPointer != NULL)
6121cc31e629e8132df390ae692873c847d1c2f62c0James Dong        {
6131cc31e629e8132df390ae692873c847d1c2f62c0James Dong            avcHandle->CBAVC_Free(userData, (int)encvid->functionPointer);
6141cc31e629e8132df390ae692873c847d1c2f62c0James Dong        }
6151cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6161cc31e629e8132df390ae692873c847d1c2f62c0James Dong        if (encvid->min_cost)
6171cc31e629e8132df390ae692873c847d1c2f62c0James Dong        {
6181cc31e629e8132df390ae692873c847d1c2f62c0James Dong            avcHandle->CBAVC_Free(userData, (int)encvid->min_cost);
6191cc31e629e8132df390ae692873c847d1c2f62c0James Dong        }
6201cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6211cc31e629e8132df390ae692873c847d1c2f62c0James Dong        if (encvid->intraSearch)
6221cc31e629e8132df390ae692873c847d1c2f62c0James Dong        {
6231cc31e629e8132df390ae692873c847d1c2f62c0James Dong            avcHandle->CBAVC_Free(userData, (int)encvid->intraSearch);
6241cc31e629e8132df390ae692873c847d1c2f62c0James Dong        }
6251cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6261cc31e629e8132df390ae692873c847d1c2f62c0James Dong        if (encvid->mot16x16)
6271cc31e629e8132df390ae692873c847d1c2f62c0James Dong        {
6281cc31e629e8132df390ae692873c847d1c2f62c0James Dong            avcHandle->CBAVC_Free(userData, (int)encvid->mot16x16);
6291cc31e629e8132df390ae692873c847d1c2f62c0James Dong        }
6301cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6311cc31e629e8132df390ae692873c847d1c2f62c0James Dong        if (encvid->rateCtrl)
6321cc31e629e8132df390ae692873c847d1c2f62c0James Dong        {
6331cc31e629e8132df390ae692873c847d1c2f62c0James Dong            avcHandle->CBAVC_Free(userData, (int)encvid->rateCtrl);
6341cc31e629e8132df390ae692873c847d1c2f62c0James Dong        }
6351cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6361cc31e629e8132df390ae692873c847d1c2f62c0James Dong        if (encvid->overrunBuffer)
6371cc31e629e8132df390ae692873c847d1c2f62c0James Dong        {
6381cc31e629e8132df390ae692873c847d1c2f62c0James Dong            avcHandle->CBAVC_Free(userData, (int)encvid->overrunBuffer);
6391cc31e629e8132df390ae692873c847d1c2f62c0James Dong        }
6401cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6411cc31e629e8132df390ae692873c847d1c2f62c0James Dong        video = encvid->common;
6421cc31e629e8132df390ae692873c847d1c2f62c0James Dong        if (video != NULL)
6431cc31e629e8132df390ae692873c847d1c2f62c0James Dong        {
6441cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (video->MbToSliceGroupMap)
6451cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
6461cc31e629e8132df390ae692873c847d1c2f62c0James Dong                avcHandle->CBAVC_Free(userData, (int)video->MbToSliceGroupMap);
6471cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
6481cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (video->mblock != NULL)
6491cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
6501cc31e629e8132df390ae692873c847d1c2f62c0James Dong                avcHandle->CBAVC_Free(userData, (int)video->mblock);
6511cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
6521cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (video->decPicBuf != NULL)
6531cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
6541cc31e629e8132df390ae692873c847d1c2f62c0James Dong                CleanUpDPB(avcHandle, video);
6551cc31e629e8132df390ae692873c847d1c2f62c0James Dong                avcHandle->CBAVC_Free(userData, (int)video->decPicBuf);
6561cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
6571cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (video->sliceHdr != NULL)
6581cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
6591cc31e629e8132df390ae692873c847d1c2f62c0James Dong                avcHandle->CBAVC_Free(userData, (int)video->sliceHdr);
6601cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
6611cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (video->currPicParams != NULL)
6621cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
6631cc31e629e8132df390ae692873c847d1c2f62c0James Dong                if (video->currPicParams->slice_group_id)
6641cc31e629e8132df390ae692873c847d1c2f62c0James Dong                {
6651cc31e629e8132df390ae692873c847d1c2f62c0James Dong                    avcHandle->CBAVC_Free(userData, (int)video->currPicParams->slice_group_id);
6661cc31e629e8132df390ae692873c847d1c2f62c0James Dong                }
6671cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6681cc31e629e8132df390ae692873c847d1c2f62c0James Dong                avcHandle->CBAVC_Free(userData, (int)video->currPicParams);
6691cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
6701cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (video->currSeqParams != NULL)
6711cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
6721cc31e629e8132df390ae692873c847d1c2f62c0James Dong                avcHandle->CBAVC_Free(userData, (int)video->currSeqParams);
6731cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
6741cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (encvid->bitstream != NULL)
6751cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
6761cc31e629e8132df390ae692873c847d1c2f62c0James Dong                avcHandle->CBAVC_Free(userData, (int)encvid->bitstream);
6771cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
6781cc31e629e8132df390ae692873c847d1c2f62c0James Dong            if (video != NULL)
6791cc31e629e8132df390ae692873c847d1c2f62c0James Dong            {
6801cc31e629e8132df390ae692873c847d1c2f62c0James Dong                avcHandle->CBAVC_Free(userData, (int)video);
6811cc31e629e8132df390ae692873c847d1c2f62c0James Dong            }
6821cc31e629e8132df390ae692873c847d1c2f62c0James Dong        }
6831cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6841cc31e629e8132df390ae692873c847d1c2f62c0James Dong        avcHandle->CBAVC_Free(userData, (int)encvid);
6851cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6861cc31e629e8132df390ae692873c847d1c2f62c0James Dong        avcHandle->AVCObject = NULL;
6871cc31e629e8132df390ae692873c847d1c2f62c0James Dong    }
6881cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6891cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return ;
6901cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
6911cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6921cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncUpdateBitRate(AVCHandle *avcHandle, uint32 bitrate)
6931cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
6941cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OSCL_UNUSED_ARG(avcHandle);
6951cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OSCL_UNUSED_ARG(bitrate);
6961cc31e629e8132df390ae692873c847d1c2f62c0James Dong
6971cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return AVCENC_FAIL;
6981cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
6991cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7001cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncUpdateFrameRate(AVCHandle *avcHandle, uint32 num, uint32 denom)
7011cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
7021cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OSCL_UNUSED_ARG(avcHandle);
7031cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OSCL_UNUSED_ARG(num);
7041cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OSCL_UNUSED_ARG(denom);
7051cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7061cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return AVCENC_FAIL;
7071cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
7081cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7091cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncUpdateIDRInterval(AVCHandle *avcHandle, int IDRInterval)
7101cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
7111cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OSCL_UNUSED_ARG(avcHandle);
7121cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OSCL_UNUSED_ARG(IDRInterval);
7131cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7141cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return AVCENC_FAIL;
7151cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
7161cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7171cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncIDRRequest(AVCHandle *avcHandle)
7181cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
7191cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OSCL_UNUSED_ARG(avcHandle);
7201cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7211cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return AVCENC_FAIL;
7221cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
7231cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7241cc31e629e8132df390ae692873c847d1c2f62c0James DongOSCL_EXPORT_REF AVCEnc_Status PVAVCEncUpdateIMBRefresh(AVCHandle *avcHandle, int numMB)
7251cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
7261cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OSCL_UNUSED_ARG(avcHandle);
7271cc31e629e8132df390ae692873c847d1c2f62c0James Dong    OSCL_UNUSED_ARG(numMB);
7281cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7291cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return AVCENC_FAIL;
7301cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
7311cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7321cc31e629e8132df390ae692873c847d1c2f62c0James Dongvoid PVAVCEncGetFrameStats(AVCHandle *avcHandle, AVCEncFrameStats *avcStats)
7331cc31e629e8132df390ae692873c847d1c2f62c0James Dong{
7341cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCEncObject *encvid = (AVCEncObject*) avcHandle->AVCObject;
7351cc31e629e8132df390ae692873c847d1c2f62c0James Dong    AVCRateControl *rateCtrl = encvid->rateCtrl;
7361cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7371cc31e629e8132df390ae692873c847d1c2f62c0James Dong    avcStats->avgFrameQP = GetAvgFrameQP(rateCtrl);
7381cc31e629e8132df390ae692873c847d1c2f62c0James Dong    avcStats->numIntraMBs = encvid->numIntraMB;
7391cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7401cc31e629e8132df390ae692873c847d1c2f62c0James Dong    return ;
7411cc31e629e8132df390ae692873c847d1c2f62c0James Dong}
7421cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7431cc31e629e8132df390ae692873c847d1c2f62c0James Dong
7441cc31e629e8132df390ae692873c847d1c2f62c0James Dong
745