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