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