OMXVideoEncoderAVC.cpp revision 80114224b110cdd1707292e6283e970e08b513f0
1e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu/* 2e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* Copyright (c) 2009-2011 Intel Corporation. All rights reserved. 3e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* 4e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* Licensed under the Apache License, Version 2.0 (the "License"); 5e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* you may not use this file except in compliance with the License. 6e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* You may obtain a copy of the License at 7e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* 8e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* http://www.apache.org/licenses/LICENSE-2.0 9e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* 10e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* Unless required by applicable law or agreed to in writing, software 11e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* distributed under the License is distributed on an "AS IS" BASIS, 12e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* See the License for the specific language governing permissions and 14e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu* limitations under the License. 15e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu*/ 16e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 17e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 1819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang//#define LOG_NDEBUG 0 19e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu#define LOG_TAG "OMXVideoEncoderAVC" 20e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu#include <utils/Log.h> 21e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu#include "OMXVideoEncoderAVC.h" 22e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 2319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sangstatic const char *AVC_MIME_TYPE = "video/h264"; 24e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 25e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMXVideoEncoderAVC::OMXVideoEncoderAVC() { 26e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu BuildHandlerList(); 2719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mVideoEncoder = createVideoEncoder(AVC_MIME_TYPE); 2819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (!mVideoEncoder) LOGE("OMX_ErrorInsufficientResources"); 2919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 3019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mAVCParams = new VideoParamsAVC(); 3119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (!mAVCParams) LOGE("OMX_ErrorInsufficientResources"); 32e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 33e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 34e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMXVideoEncoderAVC::~OMXVideoEncoderAVC() { 3519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if(mAVCParams) { 3619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang delete mAVCParams; 3719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mAVCParams = NULL; 3819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 39e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 40e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 41e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::InitOutputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionOutput) { 42e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // OMX_VIDEO_PARAM_AVCTYPE 43e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memset(&mParamAvc, 0, sizeof(mParamAvc)); 44e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu SetTypeHeader(&mParamAvc, sizeof(mParamAvc)); 45e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamAvc.nPortIndex = OUTPORT_INDEX; 46e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamAvc.eProfile = OMX_VIDEO_AVCProfileBaseline; 47e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamAvc.eLevel = OMX_VIDEO_AVCLevel1; 48e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 49e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // OMX_NALSTREAMFORMATTYPE 50e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memset(&mNalStreamFormat, 0, sizeof(mNalStreamFormat)); 51e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu SetTypeHeader(&mNalStreamFormat, sizeof(mNalStreamFormat)); 52e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mNalStreamFormat.nPortIndex = OUTPORT_INDEX; 53e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: check if this is desired Nalu Format 5480114224b110cdd1707292e6283e970e08b513f0Weian Chen // mNalStreamFormat.eNaluFormat = OMX_NaluFormatStartCodesSeparateFirstHeader; 5580114224b110cdd1707292e6283e970e08b513f0Weian Chen mNalStreamFormat.eNaluFormat = OMX_NaluFormatLengthPrefixedSeparateFirstHeader; 56e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // OMX_VIDEO_CONFIG_AVCINTRAPERIOD 57e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memset(&mConfigAvcIntraPeriod, 0, sizeof(mConfigAvcIntraPeriod)); 58e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu SetTypeHeader(&mConfigAvcIntraPeriod, sizeof(mConfigAvcIntraPeriod)); 59e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mConfigAvcIntraPeriod.nPortIndex = OUTPORT_INDEX; 60e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: need to be populated from Video Encoder 6119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mConfigAvcIntraPeriod.nIDRPeriod = 1; 62e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mConfigAvcIntraPeriod.nPFrames = 0; 63e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 64e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // OMX_VIDEO_CONFIG_NALSIZE 65e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memset(&mConfigNalSize, 0, sizeof(mConfigNalSize)); 66e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu SetTypeHeader(&mConfigNalSize, sizeof(mConfigNalSize)); 67e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mConfigNalSize.nPortIndex = OUTPORT_INDEX; 68e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mConfigNalSize.nNaluBytes = 0; 69e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 70e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // OMX_VIDEO_PARAM_INTEL_AVCVUI 71e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memset(&mParamIntelAvcVui, 0, sizeof(mParamIntelAvcVui)); 72e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu SetTypeHeader(&mParamIntelAvcVui, sizeof(mParamIntelAvcVui)); 73e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamIntelAvcVui.nPortIndex = OUTPORT_INDEX; 74e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamIntelAvcVui.bVuiGeneration = OMX_FALSE; 75e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 7619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS 7719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang memset(&mConfigIntelSliceNumbers, 0, sizeof(mConfigIntelSliceNumbers)); 7819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang SetTypeHeader(&mConfigIntelSliceNumbers, sizeof(mConfigIntelSliceNumbers)); 7919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mConfigIntelSliceNumbers.nPortIndex = OUTPORT_INDEX; 8019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mConfigIntelSliceNumbers.nISliceNumber = 2; 8119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mConfigIntelSliceNumbers.nPSliceNumber = 2; 8219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 8319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // Override OMX_PARAM_PORTDEFINITIONTYPE 84e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu paramPortDefinitionOutput->nBufferCountActual = OUTPORT_ACTUAL_BUFFER_COUNT; 85e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu paramPortDefinitionOutput->nBufferCountMin = OUTPORT_MIN_BUFFER_COUNT; 86e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu paramPortDefinitionOutput->nBufferSize = OUTPORT_BUFFER_SIZE; 87e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu paramPortDefinitionOutput->format.video.cMIMEType = (OMX_STRING)AVC_MIME_TYPE; 88e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu paramPortDefinitionOutput->format.video.eCompressionFormat = OMX_VIDEO_CodingAVC; 89e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 9019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // Override OMX_VIDEO_PARAM_PROFILELEVELTYPE 91e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: check if profile/level supported is correct 92e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamProfileLevel.eProfile = mParamAvc.eProfile; 93e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamProfileLevel.eLevel = mParamAvc.eLevel; 94e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 9519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // Override OMX_VIDEO_PARAM_BITRATETYPE 96e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamBitrate.nTargetBitrate = 192000; 97e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 9819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // Override OMX_VIDEO_CONFIG_INTEL_BITRATETYPE 9919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mConfigIntelBitrate.nInitialQP = 24; // Initial QP for I frames 10019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 10119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang return OMX_ErrorNone; 10219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang} 10319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 10419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo SangOMX_ERRORTYPE OMXVideoEncoderAVC::SetVideoEncoderParam(void) { 10519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 10619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang Encode_Status ret = ENCODE_SUCCESS; 10719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("OMXVideoEncoderAVC::SetVideoEncoderParam"); 10819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 10919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (!mEncoderParams) { 11019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGE("NULL pointer: mEncoderParams"); 11119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang return OMX_ErrorBadParameter; 11219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 11319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 11419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mVideoEncoder->getParameters(mEncoderParams); 11519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mEncoderParams->profile = (VAProfile)VAProfileH264Baseline; 11619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMXVideoEncoderBase::SetVideoEncoderParam(); 11719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 11819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mVideoEncoder->getParameters(mAVCParams); 11919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if(mParamIntelAvcVui.bVuiGeneration == OMX_TRUE) { 12019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mAVCParams->VUIFlag = 1; 12119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 12219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mAVCParams->sliceNum.iSliceNum = mConfigIntelSliceNumbers.nISliceNumber; 12319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mAVCParams->sliceNum.pSliceNum = mConfigIntelSliceNumbers.nPSliceNumber; 12419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mAVCParams->idrInterval = mConfigAvcIntraPeriod.nIDRPeriod; 12519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mAVCParams->maxSliceSize = mConfigNalSize.nNaluBytes * 8; 12619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang ret = mVideoEncoder ->setParameters(mAVCParams); 12719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang CHECK_ENCODE_STATUS("setParameters"); 12819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 12919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("VUIFlag = %d\n", mAVCParams->VUIFlag); 13019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("sliceNum.iSliceNum = %d\n", mAVCParams->sliceNum.iSliceNum); 13119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("sliceNum.pSliceNum = %d\n", mAVCParams->sliceNum.pSliceNum); 13219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("idrInterval = %d\n ", mAVCParams->idrInterval); 13319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("maxSliceSize = %d\n ", mAVCParams->maxSliceSize); 134e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 135e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 136e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 137e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::ProcessorInit(void) { 13819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mFirstFrame = OMX_TRUE; 13919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang return OMXVideoEncoderBase::ProcessorInit(); 140e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 141e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 142e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::ProcessorDeinit(void) { 143e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMXVideoEncoderBase::ProcessorDeinit(); 144e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 145e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 146e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::ProcessorProcess( 14719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMX_BUFFERHEADERTYPE **buffers, 14819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang buffer_retain_t *retains, 14919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMX_U32 numberBuffers) { 15019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 15119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMX_U32 outfilledlen = 0; 15219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMX_S64 outtimestamp = 0; 15319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMX_U32 outflags = 0; 15419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 15519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMX_ERRORTYPE oret = OMX_ErrorNone; 15619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang Encode_Status ret = ENCODE_SUCCESS; 15719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 15819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang VideoEncOutputBuffer outBuf; 15919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang VideoEncRawBuffer inBuf; 16019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 16119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV_IF(buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS, 16219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang "%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__); 16319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 16419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (!buffers[INPORT_INDEX]->nFilledLen) { 16519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGE("%s(),%d: input buffer's nFilledLen is zero\n", __func__, __LINE__); 16619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang goto out; 16719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 16819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 16919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (mBsState != BS_STATE_INVALID) { 17019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV(" Share buffer mode\n"); 17119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang inBuf.size = mSharedBufArray[0].dataSize; 17219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang inBuf.data = 17319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang *(reinterpret_cast<uint8_t **>(buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset)); 17419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } else { 17519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang inBuf.data = buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset; 17619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang inBuf.size = buffers[INPORT_INDEX]->nFilledLen; 17719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 17819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 17919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("inBuf.data=%x, size=%d",(unsigned)inBuf.data, inBuf.size); 18019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 18119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outBuf.data = buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset; 18219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outBuf.dataSize = 0; 18319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outBuf.bufferSize = buffers[OUTPORT_INDEX]->nAllocLen - buffers[OUTPORT_INDEX]->nOffset; 18419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 18519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if(inBuf.size<=0) { 18619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGE("The Input buf size is 0\n"); 18719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang return OMX_ErrorBadParameter; 18819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 18919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 19019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("in buffer = 0x%x ts = %lld", 19119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset, 19219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang buffers[INPORT_INDEX]->nTimeStamp); 19319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 19419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if(mFrameRetrieved) { 19519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // encode and setConfig need to be thread safe 19619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang pthread_mutex_lock(&mSerializationLock); 19719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang ret = mVideoEncoder->encode(&inBuf); 19819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang pthread_mutex_unlock(&mSerializationLock); 19919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang CHECK_ENCODE_STATUS("encode"); 20019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mFrameRetrieved = OMX_FALSE; 20119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 20219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // This is for buffer contention, we won't release current buffer 20319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // but the last input buffer 20419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang ports[INPORT_INDEX]->ReturnAllRetainedBuffers(); 20519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 20619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 20719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang switch (mNalStreamFormat.eNaluFormat) { 20819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang case OMX_NaluFormatStartCodes: 20919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 21019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outBuf.format = OUTPUT_EVERYTHING; 21119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang ret = mVideoEncoder->getOutput(&outBuf); 21219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang CHECK_ENCODE_STATUS("encode"); 21319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 21419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("output data size = %d", outBuf.dataSize); 21519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outfilledlen = outBuf.dataSize; 21619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outtimestamp = buffers[INPORT_INDEX]->nTimeStamp; 21719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 21819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 21919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (outBuf.flag & ENCODE_BUFFERFLAG_SYNCFRAME) { 22019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outflags |= OMX_BUFFERFLAG_SYNCFRAME; 22119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 22219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 22319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if(outBuf.flag & ENCODE_BUFFERFLAG_ENDOFFRAME) { 22419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outflags |= OMX_BUFFERFLAG_ENDOFFRAME; 22519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mFrameRetrieved = OMX_TRUE; 22619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; 22719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 22819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } else { 22919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; //get again 23019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 23119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 23219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 23319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (outfilledlen > 0) { 23419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[OUTPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; 23519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } else { 23619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; 23719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 23819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 23919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang break; 24019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang case OMX_NaluFormatOneNaluPerBuffer: 24119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 24219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outBuf.format = OUTPUT_ONE_NAL; 24319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang ret = mVideoEncoder->getOutput(&outBuf); 24419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang CHECK_ENCODE_STATUS("getOutput"); 24519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // Return code could not be ENCODE_BUFFER_TOO_SMALL 24619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // If we don't return error, we will have dead lock issue 24719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (ret == ENCODE_BUFFER_TOO_SMALL) { 24819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang return OMX_ErrorUndefined; 24919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 25019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 25119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("output codec data size = %d", outBuf.dataSize); 25219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 25319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outfilledlen = outBuf.dataSize; 25419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outtimestamp = buffers[INPORT_INDEX]->nTimeStamp; 25519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 25619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (outBuf.flag & ENCODE_BUFFERFLAG_SYNCFRAME) { 25719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outflags |= OMX_BUFFERFLAG_SYNCFRAME; 25819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 25919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 26019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if(outBuf.flag & ENCODE_BUFFERFLAG_ENDOFFRAME) { 26119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outflags |= OMX_BUFFERFLAG_ENDOFFRAME; 26219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mFrameRetrieved = OMX_TRUE; 26319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; 26419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 26519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } else { 26619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; //get again 26719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 26819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 26919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (outfilledlen > 0) { 27019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[OUTPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; 27119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } else { 27219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; 27319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 27419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 27519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang break; 27619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang case OMX_NaluFormatStartCodesSeparateFirstHeader: 27719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 27819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if(mFirstFrame) { 27919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("mFirstFrame\n"); 28019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outBuf.format = OUTPUT_CODEC_DATA; 28119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang ret = mVideoEncoder->getOutput(&outBuf); 28219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang CHECK_ENCODE_STATUS("getOutput"); 28319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // Return code could not be ENCODE_BUFFER_TOO_SMALL 28419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // If we don't return error, we will have dead lock issue 28519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (ret == ENCODE_BUFFER_TOO_SMALL) { 28619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang return OMX_ErrorUndefined; 28719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 28819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 28919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("output codec data size = %d", outBuf.dataSize); 29019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 29119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outflags |= OMX_BUFFERFLAG_CODECCONFIG; 29219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outflags |= OMX_BUFFERFLAG_ENDOFFRAME; 29319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outflags |= OMX_BUFFERFLAG_SYNCFRAME; 29419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 29519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // This input buffer need to be gotten again 29619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; 29719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outfilledlen = outBuf.dataSize; 29819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mFirstFrame = OMX_FALSE; 29919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } else { 30019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outBuf.format = OUTPUT_EVERYTHING; 30119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mVideoEncoder->getOutput(&outBuf); 30219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang CHECK_ENCODE_STATUS("getOutput"); 30319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 30419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("output data size = %d", outBuf.dataSize); 30519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 30619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outfilledlen = outBuf.dataSize; 30719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outtimestamp = buffers[INPORT_INDEX]->nTimeStamp; 30819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 30919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (outBuf.flag & ENCODE_BUFFERFLAG_SYNCFRAME) { 31019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outflags |= OMX_BUFFERFLAG_SYNCFRAME; 31119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 31219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if(outBuf.flag & ENCODE_BUFFERFLAG_ENDOFFRAME) { 31319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("Get buffer done\n"); 31419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang outflags |= OMX_BUFFERFLAG_ENDOFFRAME; 31519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mFrameRetrieved = OMX_TRUE; 31619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; 31719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 31819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } else { 31919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; //get again 32019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 32119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 32219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 32319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 32419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (outfilledlen > 0) { 32519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[OUTPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; 32619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } else { 32719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; 32819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 32919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang break; 33080114224b110cdd1707292e6283e970e08b513f0Weian Chen case OMX_NaluFormatLengthPrefixedSeparateFirstHeader: 33180114224b110cdd1707292e6283e970e08b513f0Weian Chen 33280114224b110cdd1707292e6283e970e08b513f0Weian Chen if(mFirstFrame) { 33380114224b110cdd1707292e6283e970e08b513f0Weian Chen LOGV("mFirstFrame\n"); 33480114224b110cdd1707292e6283e970e08b513f0Weian Chen outBuf.format = OUTPUT_CODEC_DATA; 33580114224b110cdd1707292e6283e970e08b513f0Weian Chen ret = mVideoEncoder->getOutput(&outBuf); 33680114224b110cdd1707292e6283e970e08b513f0Weian Chen CHECK_ENCODE_STATUS("getOutput"); 33780114224b110cdd1707292e6283e970e08b513f0Weian Chen // Return code could not be ENCODE_BUFFER_TOO_SMALL 33880114224b110cdd1707292e6283e970e08b513f0Weian Chen // If we don't return error, we will have dead lock issue 33980114224b110cdd1707292e6283e970e08b513f0Weian Chen if (ret == ENCODE_BUFFER_TOO_SMALL) { 34080114224b110cdd1707292e6283e970e08b513f0Weian Chen return OMX_ErrorUndefined; 34180114224b110cdd1707292e6283e970e08b513f0Weian Chen } 34280114224b110cdd1707292e6283e970e08b513f0Weian Chen 34380114224b110cdd1707292e6283e970e08b513f0Weian Chen LOGV("output codec data size = %d", outBuf.dataSize); 34480114224b110cdd1707292e6283e970e08b513f0Weian Chen 34580114224b110cdd1707292e6283e970e08b513f0Weian Chen outflags |= OMX_BUFFERFLAG_CODECCONFIG; 34680114224b110cdd1707292e6283e970e08b513f0Weian Chen outflags |= OMX_BUFFERFLAG_ENDOFFRAME; 34780114224b110cdd1707292e6283e970e08b513f0Weian Chen outflags |= OMX_BUFFERFLAG_SYNCFRAME; 34819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 34980114224b110cdd1707292e6283e970e08b513f0Weian Chen // This input buffer need to be gotten again 35080114224b110cdd1707292e6283e970e08b513f0Weian Chen retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; 35180114224b110cdd1707292e6283e970e08b513f0Weian Chen outfilledlen = outBuf.dataSize; 35280114224b110cdd1707292e6283e970e08b513f0Weian Chen mFirstFrame = OMX_FALSE; 35380114224b110cdd1707292e6283e970e08b513f0Weian Chen } else { 35480114224b110cdd1707292e6283e970e08b513f0Weian Chen outBuf.format = OUTPUT_LENGTH_PREFIXED; 35580114224b110cdd1707292e6283e970e08b513f0Weian Chen mVideoEncoder->getOutput(&outBuf); 35680114224b110cdd1707292e6283e970e08b513f0Weian Chen CHECK_ENCODE_STATUS("getOutput"); 35780114224b110cdd1707292e6283e970e08b513f0Weian Chen 35880114224b110cdd1707292e6283e970e08b513f0Weian Chen LOGV("output data size = %d", outBuf.dataSize); 35980114224b110cdd1707292e6283e970e08b513f0Weian Chen 36080114224b110cdd1707292e6283e970e08b513f0Weian Chen outfilledlen = outBuf.dataSize; 36180114224b110cdd1707292e6283e970e08b513f0Weian Chen outtimestamp = buffers[INPORT_INDEX]->nTimeStamp; 36280114224b110cdd1707292e6283e970e08b513f0Weian Chen 36380114224b110cdd1707292e6283e970e08b513f0Weian Chen if (outBuf.flag & ENCODE_BUFFERFLAG_SYNCFRAME) { 36480114224b110cdd1707292e6283e970e08b513f0Weian Chen outflags |= OMX_BUFFERFLAG_SYNCFRAME; 36580114224b110cdd1707292e6283e970e08b513f0Weian Chen } 36680114224b110cdd1707292e6283e970e08b513f0Weian Chen if(outBuf.flag & ENCODE_BUFFERFLAG_ENDOFFRAME) { 36780114224b110cdd1707292e6283e970e08b513f0Weian Chen LOGV("Get buffer done\n"); 36880114224b110cdd1707292e6283e970e08b513f0Weian Chen outflags |= OMX_BUFFERFLAG_ENDOFFRAME; 36980114224b110cdd1707292e6283e970e08b513f0Weian Chen mFrameRetrieved = OMX_TRUE; 37080114224b110cdd1707292e6283e970e08b513f0Weian Chen retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; 37180114224b110cdd1707292e6283e970e08b513f0Weian Chen 37280114224b110cdd1707292e6283e970e08b513f0Weian Chen } else { 37380114224b110cdd1707292e6283e970e08b513f0Weian Chen retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; //get again 37480114224b110cdd1707292e6283e970e08b513f0Weian Chen } 37580114224b110cdd1707292e6283e970e08b513f0Weian Chen } 37680114224b110cdd1707292e6283e970e08b513f0Weian Chen 37780114224b110cdd1707292e6283e970e08b513f0Weian Chen if (outfilledlen > 0) { 37880114224b110cdd1707292e6283e970e08b513f0Weian Chen retains[OUTPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; 37980114224b110cdd1707292e6283e970e08b513f0Weian Chen } else { 38080114224b110cdd1707292e6283e970e08b513f0Weian Chen retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; 38180114224b110cdd1707292e6283e970e08b513f0Weian Chen } 38280114224b110cdd1707292e6283e970e08b513f0Weian Chen break; 38380114224b110cdd1707292e6283e970e08b513f0Weian Chen } 38419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 38519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sangout: 38619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("output buffers = %p:%d, flag = %x", buffers[OUTPORT_INDEX]->pBuffer, outfilledlen, outflags); 38719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 38819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if(retains[OUTPORT_INDEX] != BUFFER_RETAIN_GETAGAIN) { 38919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen; 39019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp; 39119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang buffers[OUTPORT_INDEX]->nFlags = outflags; 39219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 39319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 39419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (retains[INPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN || 39519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retains[INPORT_INDEX] == BUFFER_RETAIN_ACCUMULATE ) { 39619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mFrameInputCount ++; 39719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 39819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 39919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (retains[OUTPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN) mFrameOutputCount ++; 40019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 40119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang#if 0 40219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (avcEncParamIntelBitrateType.eControlRate != OMX_Video_Intel_ControlRateVideoConferencingMode) { 40319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (oret == (OMX_ERRORTYPE) OMX_ErrorIntelExtSliceSizeOverflow) { 40419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang oret = OMX_ErrorNone; 40519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 40619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 40719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang#endif 40819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV_IF(oret == OMX_ErrorNone, "%s(),%d: exit, encode is done\n", __func__, __LINE__); 40919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 41019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang return oret; 411e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 412e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 413e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 414e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::BuildHandlerList(void) { 415e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMXVideoEncoderBase::BuildHandlerList(); 416e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu AddHandler(OMX_IndexParamVideoAvc, GetParamVideoAvc, SetParamVideoAvc); 417e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu AddHandler((OMX_INDEXTYPE)OMX_IndexParamNalStreamFormat, GetParamNalStreamFormat, SetParamNalStreamFormat); 418e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu AddHandler((OMX_INDEXTYPE)OMX_IndexParamNalStreamFormatSupported, GetParamNalStreamFormatSupported, SetParamNalStreamFormatSupported); 419e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu AddHandler((OMX_INDEXTYPE)OMX_IndexParamNalStreamFormatSelect, GetParamNalStreamFormatSelect, SetParamNalStreamFormatSelect); 420e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu AddHandler(OMX_IndexConfigVideoAVCIntraPeriod, GetConfigVideoAVCIntraPeriod, SetConfigVideoAVCIntraPeriod); 421e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu AddHandler(OMX_IndexConfigVideoNalSize, GetConfigVideoNalSize, SetConfigVideoNalSize); 42219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang AddHandler((OMX_INDEXTYPE)OMX_IndexConfigIntelSliceNumbers, GetConfigIntelSliceNumbers, SetConfigIntelSliceNumbers); 42319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang AddHandler((OMX_INDEXTYPE)OMX_IndexParamIntelAVCVUI, GetParamIntelAVCVUI, SetParamIntelAVCVUI); 424e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu AddHandler((OMX_INDEXTYPE)OMX_IndexParamVideoBytestream, GetParamVideoBytestream, SetParamVideoBytestream); 425e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 426e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 427e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 428e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetParamVideoAvc(OMX_PTR pStructure) { 429e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 430e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_PARAM_AVCTYPE *p = (OMX_VIDEO_PARAM_AVCTYPE *)pStructure; 431e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 432e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, OUTPORT_INDEX); 433e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 434e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memcpy(p, &mParamAvc, sizeof(*p)); 435e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 436e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 437e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 438e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetParamVideoAvc(OMX_PTR pStructure) { 439e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 440e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_PARAM_AVCTYPE *p = (OMX_VIDEO_PARAM_AVCTYPE *)pStructure; 441e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 442e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, OUTPORT_INDEX); 443e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_SET_PARAM_STATE(); 444e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 445e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: do we need to check if port is enabled? 446e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: see SetPortAvcParam implementation - Can we make simple copy???? 447e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memcpy(&mParamAvc, p, sizeof(mParamAvc)); 448e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 449e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 450e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 451e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetParamNalStreamFormat(OMX_PTR pStructure) { 452e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 453e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_NALSTREAMFORMATTYPE *p = (OMX_NALSTREAMFORMATTYPE *)pStructure; 454e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 455e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 456e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, OUTPORT_INDEX); 457e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: check if this is desired format 45819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang p->eNaluFormat = mNalStreamFormat.eNaluFormat; //OMX_NaluFormatStartCodes; 459e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 460e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 461e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 462e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetParamNalStreamFormat(OMX_PTR pStructure) { 46319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMX_ERRORTYPE ret; 46419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMX_NALSTREAMFORMATTYPE *p = (OMX_NALSTREAMFORMATTYPE *)pStructure; 46519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 46619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang CHECK_TYPE_HEADER(p); 46719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang CHECK_PORT_INDEX(p, OUTPORT_INDEX); 46819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 46919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGV("p->eNaluFormat =%d\n",p->eNaluFormat); 47019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if(p->eNaluFormat != OMX_NaluFormatStartCodes && 47119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang p->eNaluFormat != OMX_NaluFormatStartCodesSeparateFirstHeader && 47280114224b110cdd1707292e6283e970e08b513f0Weian Chen p->eNaluFormat != OMX_NaluFormatOneNaluPerBuffer && 47380114224b110cdd1707292e6283e970e08b513f0Weian Chen p->eNaluFormat != OMX_NaluFormatLengthPrefixedSeparateFirstHeader) { 47419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGE("Format not support\n"); 47519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang return OMX_ErrorUnsupportedSetting; 47619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 47719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mNalStreamFormat.eNaluFormat = p->eNaluFormat; 47819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang return OMX_ErrorNone; 479e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 480e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 481e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetParamNalStreamFormatSupported(OMX_PTR pStructure) { 482e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 483e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_NALSTREAMFORMATTYPE *p = (OMX_NALSTREAMFORMATTYPE *)pStructure; 484e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 485e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 486e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, OUTPORT_INDEX); 487e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu p->eNaluFormat = (OMX_NALUFORMATSTYPE) 48819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang (OMX_NaluFormatStartCodes | 48919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMX_NaluFormatStartCodesSeparateFirstHeader | 49080114224b110cdd1707292e6283e970e08b513f0Weian Chen OMX_NaluFormatOneNaluPerBuffer| 49180114224b110cdd1707292e6283e970e08b513f0Weian Chen OMX_NaluFormatLengthPrefixedSeparateFirstHeader); 492e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 493e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: check if this is desired format 49419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // OMX_NaluFormatFourByteInterleaveLength | 49580114224b110cdd1707292e6283e970e08b513f0Weian Chen // OMX_NaluFormatZeroByteInterleaveLength); 496e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 497e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 498e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 499e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetParamNalStreamFormatSupported(OMX_PTR pStructure) { 500e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu LOGW("SetParamNalStreamFormatSupported is not supported."); 501e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorUnsupportedSetting; 502e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 503e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 504e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetParamNalStreamFormatSelect(OMX_PTR pStructure) { 505e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu LOGW("GetParamNalStreamFormatSelect is not supported."); 506e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorUnsupportedSetting; 507e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 508e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 509e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetParamNalStreamFormatSelect(OMX_PTR pStructure) { 510e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 511e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_NALSTREAMFORMATTYPE *p = (OMX_NALSTREAMFORMATTYPE *)pStructure; 512e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 513e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, OUTPORT_INDEX); 514e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 515e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // return OMX_ErrorIncorrectStateOperation if not in Loaded state 516e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_SET_PARAM_STATE(); 517e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 518e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu if (p->eNaluFormat != OMX_NaluFormatStartCodes && 51919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang p->eNaluFormat != OMX_NaluFormatStartCodesSeparateFirstHeader && 52080114224b110cdd1707292e6283e970e08b513f0Weian Chen p->eNaluFormat != OMX_NaluFormatOneNaluPerBuffer&& 52180114224b110cdd1707292e6283e970e08b513f0Weian Chen p->eNaluFormat != OMX_NaluFormatLengthPrefixedSeparateFirstHeader) { 522e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu //p->eNaluFormat != OMX_NaluFormatFourByteInterleaveLength && 523e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu //p->eNaluFormat != OMX_NaluFormatZeroByteInterleaveLength) { 524e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: check if this is desried 525e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorBadParameter; 526e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu } 527e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 528e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mNalStreamFormat = *p; 529e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 530e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 531e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 532e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetConfigVideoAVCIntraPeriod(OMX_PTR pStructure) { 533e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 534e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_CONFIG_AVCINTRAPERIOD *p = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *)pStructure; 535e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 536e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 537e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, OUTPORT_INDEX); 538e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: populate mConfigAvcIntraPeriod from VideoEncoder 539e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // return OMX_ErrorNotReady if VideoEncoder is not created. 540e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memcpy(p, &mConfigAvcIntraPeriod, sizeof(*p)); 541e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 542e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 543e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 544e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetConfigVideoAVCIntraPeriod(OMX_PTR pStructure) { 545e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 54619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang Encode_Status retStatus = ENCODE_SUCCESS; 547e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_CONFIG_AVCINTRAPERIOD *p = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *)pStructure; 548e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 549e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, OUTPORT_INDEX); 550e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 551e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // set in either Loaded state (ComponentSetParam) or Executing state (ComponentSetConfig) 552e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mConfigAvcIntraPeriod = *p; 553e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 554e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // return OMX_ErrorNone if not in Executing state 555e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: return OMX_ErrorIncorrectStateOperation? 556e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_SET_CONFIG_STATE(); 557e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 558e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: apply AVC Intra Period configuration in Executing state 55919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang VideoConfigAVCIntraPeriod avcIntraPreriod; 56019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang avcIntraPreriod.idrInterval = mConfigAvcIntraPeriod.nIDRPeriod; 56119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang avcIntraPreriod.intraPeriod = mConfigAvcIntraPeriod.nPFrames; 56219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retStatus = mVideoEncoder->setConfig(&avcIntraPreriod); 56319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if(retStatus != ENCODE_SUCCESS) { 56419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGW("set avc intra prerod config failed"); 56519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 566e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 567e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 568e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 569e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetConfigVideoNalSize(OMX_PTR pStructure) { 570e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 571e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_CONFIG_NALSIZE *p = (OMX_VIDEO_CONFIG_NALSIZE *)pStructure; 572e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 573e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 574e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, OUTPORT_INDEX); 575e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu memcpy(p, &mConfigNalSize, sizeof(*p)); 576e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 577e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 578e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 579e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetConfigVideoNalSize(OMX_PTR pStructure) { 580e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 58119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang Encode_Status retStatus = ENCODE_SUCCESS; 582e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu if (mParamIntelBitrate.eControlRate == OMX_Video_Intel_ControlRateMax) { 583e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu LOGE("SetConfigVideoNalSize failed. Feature is disabled."); 584e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorUnsupportedIndex; 585e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu } 586e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_CONFIG_NALSIZE *p = (OMX_VIDEO_CONFIG_NALSIZE *)pStructure; 587e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 588e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, OUTPORT_INDEX); 589e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 590e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // set in either Loaded state (ComponentSetParam) or Executing state (ComponentSetConfig) 591e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mConfigNalSize = *p; 592e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 593e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // return OMX_ErrorNone if not in Executing state 594e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: return OMX_ErrorIncorrectStateOperation? 595e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_SET_CONFIG_STATE(); 596e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 597e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu if (mParamIntelBitrate.eControlRate != OMX_Video_Intel_ControlRateVideoConferencingMode) { 598e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu LOGE("SetConfigVideoNalSize failed. Feature is supported only in VCM."); 599e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorUnsupportedSetting; 600e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu } 60119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang VideoConfigNALSize configNalSize; 60219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang configNalSize.maxSliceSize = mConfigNalSize.nNaluBytes * 8; 60319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retStatus = mVideoEncoder->setConfig(&configNalSize); 60419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if(retStatus != ENCODE_SUCCESS) { 60519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGW("set NAL size config failed"); 60619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 607e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 608e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 609e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 61019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo SangOMX_ERRORTYPE OMXVideoEncoderAVC::GetConfigIntelSliceNumbers(OMX_PTR pStructure) { 61119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMX_ERRORTYPE ret; 61219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *p = (OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *)pStructure; 61319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 61419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang CHECK_TYPE_HEADER(p); 61519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang CHECK_PORT_INDEX(p, OUTPORT_INDEX); 61619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang memcpy(p, &mConfigIntelSliceNumbers, sizeof(*p)); 61719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang return OMX_ErrorNone; 61819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang} 61919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 62019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo SangOMX_ERRORTYPE OMXVideoEncoderAVC::SetConfigIntelSliceNumbers(OMX_PTR pStructure) { 62119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMX_ERRORTYPE ret; 62219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang Encode_Status retStatus = ENCODE_SUCCESS; 62319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (mParamIntelBitrate.eControlRate == OMX_Video_Intel_ControlRateMax) { 62419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGE("SetConfigIntelSliceNumbers failed. Feature is disabled."); 62519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang return OMX_ErrorUnsupportedIndex; 62619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 62719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *p = (OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *)pStructure; 62819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang CHECK_TYPE_HEADER(p); 62919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang CHECK_PORT_INDEX(p, OUTPORT_INDEX); 63019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 63119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // set in either Loaded state (ComponentSetParam) or Executing state (ComponentSetConfig) 63219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang mConfigIntelSliceNumbers = *p; 63319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 63419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // return OMX_ErrorNone if not in Executing state 63519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang // TODO: return OMX_ErrorIncorrectStateOperation? 63619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang CHECK_SET_CONFIG_STATE(); 63719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 63819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if (mParamIntelBitrate.eControlRate != OMX_Video_Intel_ControlRateVideoConferencingMode) { 63919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGE("SetConfigIntelSliceNumbers failed. Feature is supported only in VCM."); 64019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang return OMX_ErrorUnsupportedSetting; 64119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 64219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang VideoConfigSliceNum sliceNum; 64319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang sliceNum.sliceNum.iSliceNum = mConfigIntelSliceNumbers.nISliceNumber; 64419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang sliceNum.sliceNum.pSliceNum = mConfigIntelSliceNumbers.nPSliceNumber; 64519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang retStatus = mVideoEncoder->setConfig(&sliceNum); 64619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang if(retStatus != ENCODE_SUCCESS) { 64719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang LOGW("set silce num config failed!\n"); 64819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang } 64919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang return OMX_ErrorNone; 65019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang} 651e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 652e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetParamIntelAVCVUI(OMX_PTR pStructure) { 65319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 654e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 655e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_PARAM_INTEL_AVCVUI *p = (OMX_VIDEO_PARAM_INTEL_AVCVUI *)pStructure; 656e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 657e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 658e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, OUTPORT_INDEX); 65919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang memcpy(p, &mParamIntelAvcVui, sizeof(*p)); 66019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 661e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 662e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 663e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 664e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetParamIntelAVCVUI(OMX_PTR pStructure) { 66519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang 666e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 667e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_PARAM_INTEL_AVCVUI *p = (OMX_VIDEO_PARAM_INTEL_AVCVUI *)pStructure; 668e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 669e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, OUTPORT_INDEX); 670e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 671e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // set only in Loaded state (ComponentSetParam) 672e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_SET_PARAM_STATE(); 673e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 674e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mParamIntelAvcVui = *p; 675e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 676e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 677e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 678e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetParamVideoBytestream(OMX_PTR pStructure) { 679e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorUnsupportedSetting; 680e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 681e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 682e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetParamVideoBytestream(OMX_PTR pStructure) { 683e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_ERRORTYPE ret; 684e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu OMX_VIDEO_PARAM_BYTESTREAMTYPE *p = (OMX_VIDEO_PARAM_BYTESTREAMTYPE *)pStructure; 685e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_TYPE_HEADER(p); 686e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_PORT_INDEX(p, OUTPORT_INDEX); 687e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 688e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // set only in Loaded state (ComponentSetParam) 689e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu CHECK_SET_PARAM_STATE(); 690e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 691e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu if (p->bBytestream == OMX_TRUE) { 692e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mNalStreamFormat.eNaluFormat = OMX_NaluFormatStartCodes; 693e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu } else { 694e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu // TODO: do we need to override the Nalu format? 695e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu mNalStreamFormat.eNaluFormat = OMX_NaluFormatZeroByteInterleaveLength; 696e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu } 697e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 698e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu return OMX_ErrorNone; 699e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu} 700e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 701e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu 702e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuDECLARE_OMX_COMPONENT("OMX.Intel.VideoEncoder.AVC", "video_encoder.avc", OMXVideoEncoderAVC); 703