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