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#define LOG_TAG "OMXVideoEncoderAVC"
18e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu#include "OMXVideoEncoderAVC.h"
1928516617d7c679a9d1c4d1a5a29af157eb25cc29Chang Ying#include "IntelMetadataBuffer.h"
20e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
2119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sangstatic const char *AVC_MIME_TYPE = "video/h264";
22e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
2330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liangstruct ProfileMap {
2430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    OMX_VIDEO_AVCPROFILETYPE key;
2530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    VAProfile value;
2630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    const char *name;
2730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang};
2830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
2930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liangstruct LevelMap {
3030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    OMX_VIDEO_AVCLEVELTYPE key;
3130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    uint32_t value;
3230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    const char *name;
3330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang};
3430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
3530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liangstatic ProfileMap ProfileTable[] = {
3630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    { OMX_VIDEO_AVCProfileBaseline, VAProfileH264Baseline, "AVC Baseline" },
3730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    { OMX_VIDEO_AVCProfileMain, VAProfileH264Main, "AVC Main" },
3830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    { OMX_VIDEO_AVCProfileHigh, VAProfileH264High, "AVC High" },
3930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    { (OMX_VIDEO_AVCPROFILETYPE) 0, (VAProfile) 0, "Not Supported" },
4030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang};
4130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
4230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liangstatic LevelMap LevelTable[] = {
4330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    { OMX_VIDEO_AVCLevel4, 40, "AVC Level4" },
4430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    { OMX_VIDEO_AVCLevel41, 41, "AVC Level41" },
4530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    { OMX_VIDEO_AVCLevel42, 42, "AVC Level42" },
4630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    { OMX_VIDEO_AVCLevel5, 50, "AVC Level5" },
4730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    { OMX_VIDEO_AVCLevel51, 51, "AVC Level51" },
4830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    { (OMX_VIDEO_AVCLEVELTYPE) 0, 0, "Not Supported" },
4930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang};
5030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
5130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang#define FIND_BYKEY(table, x, y)  {\
5230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        for(int ii = 0; ; ii++) { \
5330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            if (table[ii].key == x || table[ii].key == 0) { \
5430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang                y = ii; \
5530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang                break; \
5630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            } \
5730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        } \
5830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    }\
5930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
6030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang#define FIND_BYVALUE(table, x, y)  {\
6130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        for(int ii = 0; ; ii++) { \
6230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            if (table[ii].value == x || table[ii].value == 0) { \
6330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang                y = ii; \
6430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang                break; \
6530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            } \
6630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        } \
6730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    } \
6830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
69e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMXVideoEncoderAVC::OMXVideoEncoderAVC() {
70e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    BuildHandlerList();
7119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    mVideoEncoder = createVideoEncoder(AVC_MIME_TYPE);
7230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    if (!mVideoEncoder) {
7330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        LOGE("OMX_ErrorInsufficientResources");
7430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        return;
7530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    }
7619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
7719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    mAVCParams = new VideoParamsAVC();
7830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    if (!mAVCParams) {
7930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        LOGE("OMX_ErrorInsufficientResources");
8030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        return;
8130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    }
8230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
8330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    //Query supported Profile/Level
8430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    mPLTableCount = 0;
8530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
8630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    VAProfile profiles[MAX_H264_PROFILE] = {VAProfileH264High, VAProfileH264Main, VAProfileH264Baseline};
8730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
8830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    VideoParamsProfileLevel pl;
8930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    for (int i=0; i < MAX_H264_PROFILE; i++) {
9030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        pl.profile = profiles[i];
9130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        pl.level = 0;
9230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        pl.isSupported = false;
9330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
9430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        mVideoEncoder->getParameters(&pl);
9530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        if (pl.isSupported) {
9630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            uint32_t profile_index;
9730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            uint32_t level_index;
9830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
9930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            FIND_BYVALUE(ProfileTable, pl.profile,  profile_index);
10030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            if (ProfileTable[profile_index].key == (OMX_VIDEO_AVCPROFILETYPE) 0)
10130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang                continue;
10230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
10330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            FIND_BYVALUE(LevelTable, pl.level,  level_index);
10430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            if (LevelTable[level_index].key == (OMX_VIDEO_AVCLEVELTYPE) 0)
10530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang                continue;
10630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
10730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            mPLTable[mPLTableCount].profile = ProfileTable[profile_index].key;
10830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            mPLTable[mPLTableCount].level = LevelTable[level_index].key;
10930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            mPLTableCount ++;
11030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            LOGV("Support Profile:%s, Level:%s\n", ProfileTable[profile_index].name, LevelTable[level_index].name);
11130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        }
11230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    }
113dc8fe1fa4719615fe23bf24bf54925a5ff5f7fdaliubolun
11421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    mEmptyEOSBuf = OMX_FALSE;
115e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
116e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
117e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMXVideoEncoderAVC::~OMXVideoEncoderAVC() {
11819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    if(mAVCParams) {
11919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang        delete mAVCParams;
12019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang        mAVCParams = NULL;
12119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    }
122e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
123e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
124e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::InitOutputPortFormatSpecific(OMX_PARAM_PORTDEFINITIONTYPE *paramPortDefinitionOutput) {
125e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // OMX_VIDEO_PARAM_AVCTYPE
126e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    memset(&mParamAvc, 0, sizeof(mParamAvc));
127e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    SetTypeHeader(&mParamAvc, sizeof(mParamAvc));
128e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mParamAvc.nPortIndex = OUTPORT_INDEX;
12930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
13030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    if (mPLTableCount > 0) {
13130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        mParamAvc.eProfile = (OMX_VIDEO_AVCPROFILETYPE) mPLTable[0].profile;
13230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        mParamAvc.eLevel = (OMX_VIDEO_AVCLEVELTYPE)mPLTable[0].level;
13330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    } else {
13430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        LOGE("No supported profile/level\n");
13530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        return OMX_ErrorUndefined;
13630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    }
13730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    mParamAvc.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP;
13830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    mParamAvc.nPFrames = 29;
139dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    mParamAvc.nBFrames = 0;
140e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
141e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // OMX_NALSTREAMFORMATTYPE
142e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    memset(&mNalStreamFormat, 0, sizeof(mNalStreamFormat));
143e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    SetTypeHeader(&mNalStreamFormat, sizeof(mNalStreamFormat));
144e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mNalStreamFormat.nPortIndex = OUTPORT_INDEX;
145e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO: check if this is desired Nalu Format
14615e74b4bab492385ae63009b6d6bbe3dcb2ccf84Zhao Liang    //mNalStreamFormat.eNaluFormat = OMX_NaluFormatLengthPrefixedSeparateFirstHeader;
147e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // OMX_VIDEO_CONFIG_AVCINTRAPERIOD
148e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    memset(&mConfigAvcIntraPeriod, 0, sizeof(mConfigAvcIntraPeriod));
149e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    SetTypeHeader(&mConfigAvcIntraPeriod, sizeof(mConfigAvcIntraPeriod));
150e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mConfigAvcIntraPeriod.nPortIndex = OUTPORT_INDEX;
151e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO: need to be populated from Video Encoder
15219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    mConfigAvcIntraPeriod.nIDRPeriod = 1;
15330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    mConfigAvcIntraPeriod.nPFrames = 29;
154e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
155e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // OMX_VIDEO_CONFIG_NALSIZE
156e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    memset(&mConfigNalSize, 0, sizeof(mConfigNalSize));
157e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    SetTypeHeader(&mConfigNalSize, sizeof(mConfigNalSize));
158e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mConfigNalSize.nPortIndex = OUTPORT_INDEX;
159e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mConfigNalSize.nNaluBytes = 0;
160e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
161e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // OMX_VIDEO_PARAM_INTEL_AVCVUI
162e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    memset(&mParamIntelAvcVui, 0, sizeof(mParamIntelAvcVui));
163e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    SetTypeHeader(&mParamIntelAvcVui, sizeof(mParamIntelAvcVui));
164e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mParamIntelAvcVui.nPortIndex = OUTPORT_INDEX;
165e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mParamIntelAvcVui.bVuiGeneration = OMX_FALSE;
166e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
16719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    // OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS
16819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    memset(&mConfigIntelSliceNumbers, 0, sizeof(mConfigIntelSliceNumbers));
16919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    SetTypeHeader(&mConfigIntelSliceNumbers, sizeof(mConfigIntelSliceNumbers));
17019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    mConfigIntelSliceNumbers.nPortIndex = OUTPORT_INDEX;
171c2a698e6f8c510e0660eedf5ca1efcdeed2dcebcywan    mConfigIntelSliceNumbers.nISliceNumber = 1;
172c2a698e6f8c510e0660eedf5ca1efcdeed2dcebcywan    mConfigIntelSliceNumbers.nPSliceNumber = 1;
17319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
17419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    // Override OMX_PARAM_PORTDEFINITIONTYPE
175e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    paramPortDefinitionOutput->nBufferCountActual = OUTPORT_ACTUAL_BUFFER_COUNT;
176e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    paramPortDefinitionOutput->nBufferCountMin = OUTPORT_MIN_BUFFER_COUNT;
177e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    paramPortDefinitionOutput->nBufferSize = OUTPORT_BUFFER_SIZE;
178e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    paramPortDefinitionOutput->format.video.cMIMEType = (OMX_STRING)AVC_MIME_TYPE;
179e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    paramPortDefinitionOutput->format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
180e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
18119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    // Override OMX_VIDEO_PARAM_PROFILELEVELTYPE
182e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO: check if profile/level supported is correct
183e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mParamProfileLevel.eProfile = mParamAvc.eProfile;
184e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mParamProfileLevel.eLevel = mParamAvc.eLevel;
185e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
18619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    // Override OMX_VIDEO_PARAM_BITRATETYPE
187e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mParamBitrate.nTargetBitrate = 192000;
188e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
18919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    // Override OMX_VIDEO_CONFIG_INTEL_BITRATETYPE
190d128eedd844b44fa32ae952216d74d64b3b58a4fJi Guoliang    mConfigIntelBitrate.nInitialQP = 0;  // Initial QP for I frames
19119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
19219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    return OMX_ErrorNone;
19319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang}
19419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
19519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo SangOMX_ERRORTYPE OMXVideoEncoderAVC::SetVideoEncoderParam(void) {
19619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
19719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    Encode_Status ret = ENCODE_SUCCESS;
19819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    LOGV("OMXVideoEncoderAVC::SetVideoEncoderParam");
19919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
20019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    if (!mEncoderParams) {
20119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang        LOGE("NULL pointer: mEncoderParams");
20219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang        return OMX_ErrorBadParameter;
20319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    }
20419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
20519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    mVideoEncoder->getParameters(mEncoderParams);
20630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    uint32_t index;
20730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    FIND_BYKEY(ProfileTable, mParamAvc.eProfile, index);
20830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    if (ProfileTable[index].value != 0)
20930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        mEncoderParams->profile = ProfileTable[index].value;
21030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
21130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    if (mParamAvc.nAllowedPictureTypes & OMX_VIDEO_PictureTypeB)
21230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        mEncoderParams->intraPeriod = mParamAvc.nPFrames + mParamAvc.nBFrames;
21330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    else
21430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        mEncoderParams->intraPeriod = mParamAvc.nPFrames + 1;
21530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
21613bdc6512d6b7ee90de2ced4459b76e05ce797afChang Ying    // 0 - all luma and chroma block edges of the slice are filtered
21713bdc6512d6b7ee90de2ced4459b76e05ce797afChang Ying    // 1 - deblocking is disabled for all block edges of the slice
21813bdc6512d6b7ee90de2ced4459b76e05ce797afChang Ying    // 2 - all luma and chroma block edges of the slice are filtered
21913bdc6512d6b7ee90de2ced4459b76e05ce797afChang Ying    // with exception of the block edges that coincide with slice boundaries
22013bdc6512d6b7ee90de2ced4459b76e05ce797afChang Ying    mEncoderParams->disableDeblocking = 0;
221dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
22219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    OMXVideoEncoderBase::SetVideoEncoderParam();
22319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
22419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    mVideoEncoder->getParameters(mAVCParams);
22519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    if(mParamIntelAvcVui.bVuiGeneration == OMX_TRUE) {
22619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang        mAVCParams->VUIFlag = 1;
22719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    }
22813bdc6512d6b7ee90de2ced4459b76e05ce797afChang Ying    // For resolution below VGA, single core can hit the performance target and provide VQ gain
22913bdc6512d6b7ee90de2ced4459b76e05ce797afChang Ying    if (mEncoderParams->resolution.width <= 640 && mEncoderParams->resolution.height <= 480) {
23013bdc6512d6b7ee90de2ced4459b76e05ce797afChang Ying        mConfigIntelSliceNumbers.nISliceNumber = 1;
23113bdc6512d6b7ee90de2ced4459b76e05ce797afChang Ying        mConfigIntelSliceNumbers.nPSliceNumber = 1;
23213bdc6512d6b7ee90de2ced4459b76e05ce797afChang Ying    }
23319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    mAVCParams->sliceNum.iSliceNum = mConfigIntelSliceNumbers.nISliceNumber;
23419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    mAVCParams->sliceNum.pSliceNum = mConfigIntelSliceNumbers.nPSliceNumber;
23519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    mAVCParams->maxSliceSize = mConfigNalSize.nNaluBytes * 8;
23630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
237dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    if (mEncoderParams->intraPeriod == 0) {
238dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        mAVCParams->idrInterval = 0;
23930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        mAVCParams->ipPeriod = 1;
240e4876b874be60356322ca55b467fd0ee096ee7abJuan Antonio Gozalvez Herrero    } else {
241dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        mAVCParams->idrInterval = mConfigAvcIntraPeriod.nIDRPeriod; //idrinterval
24230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        if (mParamAvc.nAllowedPictureTypes & OMX_VIDEO_PictureTypeB)
24330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            mAVCParams->ipPeriod = mEncoderParams->intraPeriod / mParamAvc.nPFrames;
24430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        else
24530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            mAVCParams->ipPeriod = 1;
246e4876b874be60356322ca55b467fd0ee096ee7abJuan Antonio Gozalvez Herrero    }
24730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
248dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    ret = mVideoEncoder ->setParameters(mAVCParams);
249dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    CHECK_ENCODE_STATUS("setParameters");
250e4876b874be60356322ca55b467fd0ee096ee7abJuan Antonio Gozalvez Herrero
25119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    LOGV("VUIFlag = %d\n", mAVCParams->VUIFlag);
25219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    LOGV("sliceNum.iSliceNum = %d\n", mAVCParams->sliceNum.iSliceNum);
25319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    LOGV("sliceNum.pSliceNum = %d\n", mAVCParams->sliceNum.pSliceNum);
254e4876b874be60356322ca55b467fd0ee096ee7abJuan Antonio Gozalvez Herrero    LOGV("maxSliceSize = %d\n ", mAVCParams->maxSliceSize);
255dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    LOGV("intraPeriod = %d\n ", mEncoderParams->intraPeriod);
256dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    LOGV("idrInterval = %d\n ", mAVCParams->idrInterval);
257dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    LOGV("ipPeriod = %d\n ", mAVCParams->ipPeriod);
258e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
259e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
260e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
261e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::ProcessorInit(void) {
26221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    mCSDOutputted = OMX_FALSE;
263dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    mInputPictureCount = 0;
264dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    mFrameEncodedCount = 0;
26519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    return  OMXVideoEncoderBase::ProcessorInit();
266e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
267e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
268e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::ProcessorDeinit(void) {
269e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMXVideoEncoderBase::ProcessorDeinit();
270e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
271e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
272dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao LiangOMX_ERRORTYPE OMXVideoEncoderAVC::ProcessorStop(void) {
273dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    OMX_BUFFERHEADERTYPE *omxbuf = NULL;
27419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
275dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    while(!mBFrameList.empty()) {
276dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        omxbuf = * mBFrameList.begin();
277dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        this->ports[INPORT_INDEX]->ReturnThisBuffer(omxbuf);
278dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        mBFrameList.erase(mBFrameList.begin());
279e4876b874be60356322ca55b467fd0ee096ee7abJuan Antonio Gozalvez Herrero    }
280e4876b874be60356322ca55b467fd0ee096ee7abJuan Antonio Gozalvez Herrero
28121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    mEmptyEOSBuf = OMX_FALSE;
282dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    return OMXVideoEncoderBase::ProcessorStop();
283dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang}
284e4876b874be60356322ca55b467fd0ee096ee7abJuan Antonio Gozalvez Herrero
285dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao LiangOMX_ERRORTYPE OMXVideoEncoderAVC::ProcessorPreEmptyBuffer(OMX_BUFFERHEADERTYPE* buffer) {
286dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    OMX_U32 EncodeInfo = 0;
287dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    OMX_U32 EncodeFrameType = 0;
288dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
289dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    uint32_t poc = 0;
290dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    uint32_t idrPeriod = mAVCParams->idrInterval;
29130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    uint32_t IntraPeriod = mEncoderParams->intraPeriod;
29230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    uint32_t IpPeriod = mAVCParams->ipPeriod;
293dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    bool BFrameEnabled = IpPeriod > 1;
29430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    uint32_t GOP = 0;
29530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
29630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    if (idrPeriod == 0 || IntraPeriod == 0) {
29730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        GOP = 0xFFFFFFFF;
29830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        if (IntraPeriod == 0)
29930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            IntraPeriod = 0xFFFFFFFF;
30030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    } else if (BFrameEnabled)
30130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        GOP = IntraPeriod*idrPeriod + 1;
30230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    else
30330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        GOP = IntraPeriod*idrPeriod;
304dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
305dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    LOGV("ProcessorPreEmptyBuffer idrPeriod=%d, IntraPeriod=%d, IpPeriod=%d, BFrameEnabled=%d\n", idrPeriod, IntraPeriod, IpPeriod, BFrameEnabled);
306dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
30730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    //decide frame type, refer Merrifield Video Encoder Driver HLD Chapter 3.17
30830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    poc = mInputPictureCount % GOP;
309dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
310dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    if (poc == 0 /*IDR*/) {
311dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            EncodeFrameType = F_IDR;
31230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    } else if (IntraPeriod == 1) {
313dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            EncodeFrameType = F_I;
314dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    }else if ((poc > IpPeriod) && ((poc - IpPeriod) % IntraPeriod == 0))/*I*/{
315dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            EncodeFrameType = F_I;
316dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            if (BFrameEnabled)
317dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang                SET_CO(EncodeInfo, CACHE_POP);
318dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    } else if ((poc % IpPeriod == 0) /*P*/ || (buffer->nFlags & OMX_BUFFERFLAG_EOS)/*EOS,always P*/) {
319dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            EncodeFrameType = F_P;
320dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            if (BFrameEnabled)
321dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang                SET_CO(EncodeInfo, CACHE_POP);
322dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    } else { /*B*/
323dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            EncodeFrameType = F_B;
324dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            SET_CO(EncodeInfo, CACHE_PUSH);
32519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    }
32619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
327dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    SET_FT(EncodeInfo, EncodeFrameType);
328dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    SET_FC(EncodeInfo, mInputPictureCount);
32919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
330dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    buffer->pPlatformPrivate = (OMX_PTR) EncodeInfo;
3313b0173bed5cf2c4044399cd2466425c39c62e597Liu Bolun
332dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    LOGV("ProcessorPreEmptyBuffer Frame %d, Type %s, EncodeInfo %x\n", mInputPictureCount, FrameTypeStr[EncodeFrameType], EncodeInfo);
33319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
334dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    mInputPictureCount ++;
335dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    return OMX_ErrorNone;
336dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang}
33719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
33821ef2953a5795040584bea50bf5fb8dd7051a224Zhao LiangOMX_BOOL OMXVideoEncoderAVC::ProcessCacheOperation(OMX_BUFFERHEADERTYPE **buffers) {
33915e74b4bab492385ae63009b6d6bbe3dcb2ccf84Zhao Liang
34021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    OMX_BOOL Cached = OMX_FALSE;
34121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang
34221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    //get frame encode info
34321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    Encode_Info eInfo;
34421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    uint32_t encodeInfo 	= (uint32_t) buffers[INPORT_INDEX]->pPlatformPrivate;
34521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    eInfo.FrameType 		   = GET_FT(encodeInfo);
34621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang
34721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    eInfo.CacheOperation	= GET_CO(encodeInfo);
34821ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    eInfo.NotStopFrame		= encodeInfo & ENC_NSTOP;
34921ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    eInfo.FrameCount		 = GET_FC(encodeInfo);
35021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang
35121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    LOGV("ProcessCacheOperation Frame %d, type:%s, CacheOps:%s, NoSTOP=%d, EOS=%d\n",
35221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            eInfo.FrameCount, FrameTypeStr[eInfo.FrameType], CacheOperationStr[eInfo.CacheOperation],
35321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            eInfo.NotStopFrame, buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS);
35421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang
35521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    OMX_BOOL emptyEOSBuf = OMX_FALSE;
35621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    if (buffers[INPORT_INDEX]->nFilledLen == 0 && buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS) {
35721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        //meet an empty EOS buffer
35821ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        emptyEOSBuf = OMX_TRUE;
35921ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        LOGV("ProcessCacheOperation: This frame is Empty EOS buffer\n");
36021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    }
36121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang
36221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    if (eInfo.CacheOperation == CACHE_NONE) {
36321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        //nothing to do
36421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    } else if (eInfo.CacheOperation == CACHE_PUSH) {
365dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        mBFrameList.push_front(buffers[INPORT_INDEX]);
36621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        Cached = OMX_TRUE;
36721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        LOGV("ProcessCacheOperation: This B frame is cached\n");
36819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
36921ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    } else if (eInfo.CacheOperation == CACHE_POP) {
37021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        eInfo.NotStopFrame = true;  //it is also a nstop frame
37119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
372dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        OMX_BUFFERHEADERTYPE *omxbuf = NULL;
373dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        uint32_t i = 0;
37421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        uint32_t bframecount = mBFrameList.size();
37519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
37621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        LOGV("BFrameList size = %d\n", bframecount);
37719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
378dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        while(!mBFrameList.empty()) {
37921ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            /*TODO: need to handle null data buffer with EOS
38021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                     !NULL EOS case:   B1 B2 P(EOS)     ->    P B1 B2(EOS)
38121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                     NULL EOS case: B1 B2 NULL(EOS)    ->    B2 B1 NULL(EOS)
38221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            */
38321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang
38421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            if (emptyEOSBuf) {
38521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                omxbuf = *mBFrameList.begin();
38621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                ports[INPORT_INDEX]->PushThisBuffer(omxbuf);
38721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                mBFrameList.erase(mBFrameList.begin()); //clear it from internal queue
38819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
38919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang            } else {
39021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                omxbuf = *mBFrameList.begin();
39121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang
39221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                if (buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS && i == 0 )  {
39321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                    //this is final encode frame, mark it is new EOS and remove original EOS
39421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                    omxbuf->nFlags |= OMX_BUFFERFLAG_EOS;
39521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang				    buffers[INPORT_INDEX]->nFlags &= ~OMX_BUFFERFLAG_EOS;
39621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                } else {
39721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                    //all these frames except final B frame in miniGOP can't be stopped at any time
39821ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                    //to avoid not breaking miniGOP integrity
39921ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                    if (i > 0) {
40021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                        uint32_t tmp = (uint32_t) omxbuf->pPlatformPrivate;
40121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                        tmp |= ENC_NSTOP;
40221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                        omxbuf->pPlatformPrivate = (OMX_PTR) tmp;
40321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                    }
404dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang                }
40521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                ports[INPORT_INDEX]->RetainThisBuffer(omxbuf, false); //push bufferq head
40621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang
40721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                mBFrameList.erase(mBFrameList.begin()); //clear it from internal queue
40819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang            }
40919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
410dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            i++;
411dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        }
41219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
41321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        if (emptyEOSBuf)
41421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            ports[INPORT_INDEX]->PushThisBuffer(buffers[INPORT_INDEX]); //put it at the tail
41521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang
41621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    } else if (eInfo.CacheOperation == CACHE_RESET) {
417dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang//        mBFrameList.clear();
418dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    }
41919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
42021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    eInfo.CacheOperation = CACHE_NONE;
42119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
42221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    /* restore all states into input OMX buffer
42321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    */
42421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    if (eInfo.NotStopFrame)
42521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        encodeInfo |= ENC_NSTOP;
42621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    else
42721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        encodeInfo &= ~ENC_NSTOP;
42821ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang
42921ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    SET_CO(encodeInfo, eInfo.CacheOperation);
43021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    buffers[INPORT_INDEX]->pPlatformPrivate = (OMX_PTR) encodeInfo;
43121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang
43221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    LOGV("ProcessCacheOperation Completed return %d\n", Cached);
43321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    return Cached;
434dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang}
43519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
436dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao LiangOMX_ERRORTYPE OMXVideoEncoderAVC::ProcessDataRetrieve(
43721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    OMX_BUFFERHEADERTYPE **buffers, OMX_BOOL *outBufReturned) {
43819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
439dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    OMX_NALUFORMATSTYPE NaluFormat = mNalStreamFormat.eNaluFormat;
44019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
441aaefabb42927db20baba7e55bf7e16e607e581e2Khanh V. Nguyen    // NaluFormat not set, setting default
442aaefabb42927db20baba7e55bf7e16e607e581e2Khanh V. Nguyen    if (NaluFormat == 0) {
443f4b681dd65a754a7bb8551a1c9088bfaa6c3ef46Zhao Liang        NaluFormat = (OMX_NALUFORMATSTYPE)OMX_NaluFormatStartCodesSeparateFirstHeader;
444aaefabb42927db20baba7e55bf7e16e607e581e2Khanh V. Nguyen        mNalStreamFormat.eNaluFormat = NaluFormat;
445aaefabb42927db20baba7e55bf7e16e607e581e2Khanh V. Nguyen    }
44619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
447dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    VideoEncOutputBuffer outBuf;
448f4b681dd65a754a7bb8551a1c9088bfaa6c3ef46Zhao Liang    outBuf.data = buffers[OUTPORT_INDEX]->pBuffer;
449f4b681dd65a754a7bb8551a1c9088bfaa6c3ef46Zhao Liang    outBuf.bufferSize = buffers[OUTPORT_INDEX]->nAllocLen;
450dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    outBuf.dataSize = 0;
451dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    outBuf.remainingSize = 0;
452dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    outBuf.flag = 0;
453dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    outBuf.timeStamp = 0;
454f4b681dd65a754a7bb8551a1c9088bfaa6c3ef46Zhao Liang    outBuf.offset = 0;
45519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
456dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    switch (NaluFormat) {
457dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        case OMX_NaluFormatStartCodes:
458dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            outBuf.format = OUTPUT_EVERYTHING;
459dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            break;
46019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
461dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        case OMX_NaluFormatOneNaluPerBuffer:
462dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            outBuf.format = OUTPUT_ONE_NAL;
46319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang            break;
464e4876b874be60356322ca55b467fd0ee096ee7abJuan Antonio Gozalvez Herrero
4650541f11be2f78b558476772f1f877e140f9d844bywan        default:
4660541f11be2f78b558476772f1f877e140f9d844bywan            if (NaluFormat == (OMX_NALUFORMATSTYPE)OMX_NaluFormatStartCodesSeparateFirstHeader||
4670541f11be2f78b558476772f1f877e140f9d844bywan                NaluFormat == (OMX_NALUFORMATSTYPE)OMX_NaluFormatLengthPrefixedSeparateFirstHeader){
4680541f11be2f78b558476772f1f877e140f9d844bywan                if(!mCSDOutputted) {
4690541f11be2f78b558476772f1f877e140f9d844bywan                    LOGV("Output codec data for first frame\n");
4700541f11be2f78b558476772f1f877e140f9d844bywan                    outBuf.format = OUTPUT_CODEC_DATA;
4710541f11be2f78b558476772f1f877e140f9d844bywan                } else {
4720541f11be2f78b558476772f1f877e140f9d844bywan                    if (NaluFormat == (OMX_NALUFORMATSTYPE)OMX_NaluFormatStartCodesSeparateFirstHeader)
4730541f11be2f78b558476772f1f877e140f9d844bywan                        outBuf.format = OUTPUT_EVERYTHING;
4740541f11be2f78b558476772f1f877e140f9d844bywan                    else
4750541f11be2f78b558476772f1f877e140f9d844bywan                        outBuf.format = OUTPUT_NALULENGTHS_PREFIXED;
4760541f11be2f78b558476772f1f877e140f9d844bywan                }
4770541f11be2f78b558476772f1f877e140f9d844bywan                break;
478dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            } else {
4790541f11be2f78b558476772f1f877e140f9d844bywan                return OMX_ErrorUndefined;
480dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            }
481dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    }
48219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
483dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    //start getOutput
48421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    Encode_Status ret = mVideoEncoder->getOutput(&outBuf, FUNC_NONBLOCK);
48519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
486dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    if (ret < ENCODE_SUCCESS) {
48721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        LOGE("libMIX getOutput Failed. ret = 0x%08x\n", ret);
488dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        outBuf.dataSize = 0;
489dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        outBuf.flag |= ENCODE_BUFFERFLAG_ENDOFFRAME;
49021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        if (ret == ENCODE_NO_REQUEST_DATA) {
49121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            if (mEmptyEOSBuf) {
49221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                //make sure no data encoding in HW, then emit one empty out buffer with EOS
49321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                outBuf.flag |= ENCODE_BUFFERFLAG_ENDOFSTREAM;
49421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                LOGV("no more data encoding, will signal empty EOS output buf\n");
49521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            } else {
49621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                //if not meet Empty EOS buffer, shouldn't get this error
49721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                LOGE("sever error, should not happend here\n");
49821ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang                //return OMX_ErrorUndefined; //not return error here to avoid omxcodec crash
49921ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            }
50021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        }
50119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
50221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    } else if (ret == ENCODE_BUFFER_TOO_SMALL) {
50321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        LOGE("output buffer too small\n");
50421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        // Return code could not be ENCODE_BUFFER_TOO_SMALL, or we will have dead lock issue
50521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        return OMX_ErrorUndefined;
50621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    } else if (ret == ENCODE_DATA_NOT_READY) {
50721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        LOGV("Call libMIX getOutput againe due to 'data not ready'\n");
50821ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        ret = mVideoEncoder->getOutput(&outBuf);
50921ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    }
51019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
511dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    LOGV("libMIX getOutput data size= %d, flag=0x%08x", outBuf.dataSize, outBuf.flag);
512dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    OMX_U32 outfilledlen = outBuf.dataSize;
513f4b681dd65a754a7bb8551a1c9088bfaa6c3ef46Zhao Liang    OMX_U32 outoffset = outBuf.offset;
514dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    OMX_S64 outtimestamp = outBuf.timeStamp;
515dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    OMX_U32 outflags = 0;
51619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
517dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    //if codecconfig
518dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    if (outBuf.flag & ENCODE_BUFFERFLAG_CODECCONFIG)
519dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        outflags |= OMX_BUFFERFLAG_CODECCONFIG;
520dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
521dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    //if syncframe
522dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    if (outBuf.flag & ENCODE_BUFFERFLAG_SYNCFRAME)
523dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        outflags |= OMX_BUFFERFLAG_SYNCFRAME;
524dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
525dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    //if eos
526dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    if (outBuf.flag & ENCODE_BUFFERFLAG_ENDOFSTREAM)
527dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        outflags |= OMX_BUFFERFLAG_EOS;
528dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
529dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    //if full encoded data retrieved
530dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    if(outBuf.flag & ENCODE_BUFFERFLAG_ENDOFFRAME) {
53121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        LOGV("got a complete libmix Frame\n");
532dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        outflags |= OMX_BUFFERFLAG_ENDOFFRAME;
533dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
5340541f11be2f78b558476772f1f877e140f9d844bywan        if ((NaluFormat == (OMX_NALUFORMATSTYPE)OMX_NaluFormatStartCodesSeparateFirstHeader
5350541f11be2f78b558476772f1f877e140f9d844bywan             || NaluFormat == (OMX_NALUFORMATSTYPE)OMX_NaluFormatLengthPrefixedSeparateFirstHeader )
53621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang             && !mCSDOutputted && outfilledlen > 0) {
53721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            mCSDOutputted = OMX_TRUE;
538dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
539dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        } else {
54021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            ports[INPORT_INDEX]->ReturnOneRetainedBuffer();  //return one retained frame from head
541dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            mFrameOutputCount  ++;
542dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        }
54321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    }
54419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
54521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    if (outfilledlen == 0) {
54621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        if (mEmptyEOSBuf) {
54721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            //emit empty EOS out buf since meet empty EOS input buf
54821ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            buffers[OUTPORT_INDEX]->nFilledLen = 0;
54921ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            buffers[OUTPORT_INDEX]->nTimeStamp = 0;
55021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            buffers[OUTPORT_INDEX]->nFlags = outflags;
55121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            *outBufReturned = OMX_TRUE;
55221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            LOGV("emit one empty EOS OMX output buf = %p:%d, flag = 0x%08x, ts=%lld", buffers[OUTPORT_INDEX]->pBuffer, outfilledlen, outflags, outtimestamp);
55321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        } else
55421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            //not emit out buf since something wrong
55521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            *outBufReturned = OMX_FALSE;
55619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
55721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    } else {
558f4b681dd65a754a7bb8551a1c9088bfaa6c3ef46Zhao Liang        buffers[OUTPORT_INDEX]->nOffset = outoffset;
559dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen;
560dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp;
561dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        buffers[OUTPORT_INDEX]->nFlags = outflags;
562dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        if (outBuf.flag & ENCODE_BUFFERFLAG_NSTOPFRAME)
563dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            buffers[OUTPORT_INDEX]->pPlatformPrivate = (OMX_PTR) 0x00000001;  //indicate it is nstop frame
56421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        *outBufReturned = OMX_TRUE;
56521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        LOGV("emit one OMX output buf = %p:%d, flag = 0x%08x, ts=%lld", buffers[OUTPORT_INDEX]->pBuffer, outfilledlen, outflags, outtimestamp);
56621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang
567dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    }
56819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
56921ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    LOGV("ProcessDataRetrieve OK, mFrameEncodedCount=%d , mFrameOutputCount=%d\n", mFrameEncodedCount, mFrameOutputCount);
570dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    return OMX_ErrorNone;
571dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang}
57280114224b110cdd1707292e6283e970e08b513f0Weian Chen
573dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao LiangOMX_ERRORTYPE OMXVideoEncoderAVC::ProcessorProcess(
574dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    OMX_BUFFERHEADERTYPE **buffers,
575dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    buffer_retain_t *retains,
5760541f11be2f78b558476772f1f877e140f9d844bywan    OMX_U32) {
57780114224b110cdd1707292e6283e970e08b513f0Weian Chen
578dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    OMX_ERRORTYPE oret = OMX_ErrorNone;
579dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    Encode_Status ret = ENCODE_SUCCESS;
58080114224b110cdd1707292e6283e970e08b513f0Weian Chen
58121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    bool FrameEncoded = false;
58219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
58321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    if (buffers[INPORT_INDEX]) {
58421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        LOGV("input buffer has new frame\n");
585dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
58621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        //get frame encode info
58721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        Encode_Info eInfo;
58821ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        uint32_t encodeInfo 	= (uint32_t) buffers[INPORT_INDEX]->pPlatformPrivate;
58921ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        eInfo.FrameType 		   = GET_FT(encodeInfo);
59021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        eInfo.CacheOperation	= GET_CO(encodeInfo);
59121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        eInfo.NotStopFrame		= encodeInfo & ENC_NSTOP;
59221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        eInfo.FrameCount		 = GET_FC(encodeInfo);
59321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang
59421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        //handle frame cache operation
59521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        if (ProcessCacheOperation(buffers)) {
59621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            //frame is cached, nothing should be done in this case, just store status and return
59721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            retains[INPORT_INDEX] = BUFFER_RETAIN_CACHE;
59821ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
599f6e051517175c02fb493a6a75e7d92a328df6e91liubolun            return OMX_ErrorNone;
600f6e051517175c02fb493a6a75e7d92a328df6e91liubolun        }
601f6e051517175c02fb493a6a75e7d92a328df6e91liubolun
60221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        //try encode if frame is not cached
60321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        VideoEncRawBuffer inBuf;
604f6e051517175c02fb493a6a75e7d92a328df6e91liubolun
60521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        inBuf.data = buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset;
60621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        inBuf.size = buffers[INPORT_INDEX]->nFilledLen;
60721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        inBuf.flag = 0;
60821ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        inBuf.timeStamp = buffers[INPORT_INDEX]->nTimeStamp;
60919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
61021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        if (inBuf.size == 0 && buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS) {
61121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            //meet an empty EOS buffer, retain it directly and return from here
61221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE;
61321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
61421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            mEmptyEOSBuf = OMX_TRUE;
61521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            return OMX_ErrorNone;
61621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        }
617dc8fe1fa4719615fe23bf24bf54925a5ff5f7fdaliubolun
61821ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        if (buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS)
619dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            inBuf.flag |= ENCODE_BUFFERFLAG_ENDOFSTREAM;
620dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        if (eInfo.NotStopFrame)
621dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            inBuf.flag |= ENCODE_BUFFERFLAG_NSTOPFRAME;
622dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        inBuf.type = (FrameType) eInfo.FrameType;
62319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
62421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        LOGV("start libmix encoding\n");
62521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        // encode and setConfig need to be thread safe
626dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        pthread_mutex_lock(&mSerializationLock);
62721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        ret = mVideoEncoder->encode(&inBuf, FUNC_NONBLOCK);
628dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        pthread_mutex_unlock(&mSerializationLock);
62921ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        LOGV("end libmix encoding\n");
63019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
63121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang		retains[INPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN;
63221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        if (ret == ENCODE_DEVICE_BUSY) {
63321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang			//encoder is busy, put buf back and come again
63421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            LOGV("encoder is busy, push buffer back to get again\n");
63521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
63621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        } else {
63721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            //if error, this buf will be returned
63821ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            CHECK_ENCODE_STATUS("encode");
63988c8d2ab4d97fe48ed25c3adff105f2cef5a2d36Zhao Liang
64021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            LOGV("put buffer to encoder and retain this buffer\n");
64121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            mFrameEncodedCount ++;
64221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            FrameEncoded = true;
643dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang            retains[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE;
644dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        }
645dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
64621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    } else {
64721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        //no new coming frames, but maybe still have frames not outputted
64821ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        LOGV("input buffer is null\n");
649e4876b874be60356322ca55b467fd0ee096ee7abJuan Antonio Gozalvez Herrero    }
6500d275ff362298b443c828f09f593bfb674112bbdZhao Liang
65121ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; //set to default value
65221ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    //just call getoutput if no frame encoded in this cycle to avoid retained buffer queue wrong state
65321ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    if (!FrameEncoded) {
65421ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        OMX_BOOL OutBufReturned = OMX_FALSE;
65521ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        oret = ProcessDataRetrieve(buffers, &OutBufReturned);
65621ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang        if (OutBufReturned)
65721ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang            retains[OUTPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN;
658e4876b874be60356322ca55b467fd0ee096ee7abJuan Antonio Gozalvez Herrero    }
65919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
66021ef2953a5795040584bea50bf5fb8dd7051a224Zhao Liang    LOGV("ProcessorProcess ret=%x", oret);
66119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    return oret;
662e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
663e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
664e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
665e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::BuildHandlerList(void) {
666e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMXVideoEncoderBase::BuildHandlerList();
667e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    AddHandler(OMX_IndexParamVideoAvc, GetParamVideoAvc, SetParamVideoAvc);
668e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    AddHandler((OMX_INDEXTYPE)OMX_IndexParamNalStreamFormat, GetParamNalStreamFormat, SetParamNalStreamFormat);
669e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    AddHandler((OMX_INDEXTYPE)OMX_IndexParamNalStreamFormatSupported, GetParamNalStreamFormatSupported, SetParamNalStreamFormatSupported);
670e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    AddHandler((OMX_INDEXTYPE)OMX_IndexParamNalStreamFormatSelect, GetParamNalStreamFormatSelect, SetParamNalStreamFormatSelect);
671e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    AddHandler(OMX_IndexConfigVideoAVCIntraPeriod, GetConfigVideoAVCIntraPeriod, SetConfigVideoAVCIntraPeriod);
672e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    AddHandler(OMX_IndexConfigVideoNalSize, GetConfigVideoNalSize, SetConfigVideoNalSize);
67319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    AddHandler((OMX_INDEXTYPE)OMX_IndexConfigIntelSliceNumbers, GetConfigIntelSliceNumbers, SetConfigIntelSliceNumbers);
67419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    AddHandler((OMX_INDEXTYPE)OMX_IndexParamIntelAVCVUI, GetParamIntelAVCVUI, SetParamIntelAVCVUI);
675e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    AddHandler((OMX_INDEXTYPE)OMX_IndexParamVideoBytestream, GetParamVideoBytestream, SetParamVideoBytestream);
676cae415b84125ffc14bfdb121394a60b74d506f48Yanli    AddHandler((OMX_INDEXTYPE)OMX_IndexParamVideoProfileLevelQuerySupported, GetParamVideoProfileLevelQuerySupported, SetParamVideoProfileLevelQuerySupported);
677e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
678e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
679e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
680cae415b84125ffc14bfdb121394a60b74d506f48YanliOMX_ERRORTYPE OMXVideoEncoderAVC::GetParamVideoProfileLevelQuerySupported(OMX_PTR pStructure) {
681cae415b84125ffc14bfdb121394a60b74d506f48Yanli    OMX_ERRORTYPE ret;
682cae415b84125ffc14bfdb121394a60b74d506f48Yanli    OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pStructure;
683cae415b84125ffc14bfdb121394a60b74d506f48Yanli    CHECK_TYPE_HEADER(p);
684cae415b84125ffc14bfdb121394a60b74d506f48Yanli    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
685cae415b84125ffc14bfdb121394a60b74d506f48Yanli
68630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    CHECK_ENUMERATION_RANGE(p->nProfileIndex,mPLTableCount);
687cae415b84125ffc14bfdb121394a60b74d506f48Yanli
68830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    p->eProfile = mPLTable[p->nProfileIndex].profile;
68930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    p->eLevel = mPLTable[p->nProfileIndex].level;
690cae415b84125ffc14bfdb121394a60b74d506f48Yanli
691cae415b84125ffc14bfdb121394a60b74d506f48Yanli    return OMX_ErrorNone;
692cae415b84125ffc14bfdb121394a60b74d506f48Yanli}
693cae415b84125ffc14bfdb121394a60b74d506f48Yanli
6940541f11be2f78b558476772f1f877e140f9d844bywanOMX_ERRORTYPE OMXVideoEncoderAVC::SetParamVideoProfileLevelQuerySupported(OMX_PTR) {
695cae415b84125ffc14bfdb121394a60b74d506f48Yanli    LOGW("SetParamVideoAVCProfileLevel is not supported.");
696cae415b84125ffc14bfdb121394a60b74d506f48Yanli    return OMX_ErrorUnsupportedSetting;
697cae415b84125ffc14bfdb121394a60b74d506f48Yanli}
698cae415b84125ffc14bfdb121394a60b74d506f48Yanli
699e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetParamVideoAvc(OMX_PTR pStructure) {
700e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
701e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_VIDEO_PARAM_AVCTYPE *p = (OMX_VIDEO_PARAM_AVCTYPE *)pStructure;
702e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
703e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
704e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
705828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mVideoEncoder->getParameters(mAVCParams);
70688e64cfe7880b3ee81c3e5e34b37a408eb855680gji    if(mParamAvc.eProfile == OMX_VIDEO_AVCProfileHigh)
70788e64cfe7880b3ee81c3e5e34b37a408eb855680gji    {
70888e64cfe7880b3ee81c3e5e34b37a408eb855680gji        mAVCParams->bEntropyCodingCABAC = 1;
70988e64cfe7880b3ee81c3e5e34b37a408eb855680gji        mAVCParams->bDirect8x8Inference = 1;
71088e64cfe7880b3ee81c3e5e34b37a408eb855680gji    }
711828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mParamAvc.bEntropyCodingCABAC = (OMX_BOOL)mAVCParams->bEntropyCodingCABAC;
712828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mParamAvc.bWeightedPPrediction = (OMX_BOOL)mAVCParams->bWeightedPPrediction;
713828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mParamAvc.nRefIdx10ActiveMinus1 = mAVCParams->refIdx10ActiveMinus1;
714828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mParamAvc.nRefIdx11ActiveMinus1 = mAVCParams->refIdx11ActiveMinus1;
715828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mParamAvc.nWeightedBipredicitonMode = mAVCParams->weightedBipredicitonMode;
716828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mParamAvc.bDirect8x8Inference = (OMX_BOOL)mAVCParams->bDirect8x8Inference;
717828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mParamAvc.bDirectSpatialTemporal = (OMX_BOOL)mAVCParams->bDirectSpatialTemporal;
718828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mParamAvc.nCabacInitIdc = mAVCParams->cabacInitIdc;
719828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mParamAvc.bFrameMBsOnly = (OMX_BOOL)mAVCParams->bFrameMBsOnly;
720828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mParamAvc.bconstIpred = (OMX_BOOL)mAVCParams->bConstIpred;
721e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    memcpy(p, &mParamAvc, sizeof(*p));
722e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
723e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
724e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
725e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetParamVideoAvc(OMX_PTR pStructure) {
726e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
727e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_VIDEO_PARAM_AVCTYPE *p = (OMX_VIDEO_PARAM_AVCTYPE *)pStructure;
728e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
729e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
730e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_SET_PARAM_STATE();
731e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
73230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    //Check if parameters are valid
73330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
734dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    if(p->bEnableASO == OMX_TRUE)
735dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        return OMX_ErrorUnsupportedSetting;
736dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
737dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    if(p->bEnableFMO == OMX_TRUE)
738dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        return OMX_ErrorUnsupportedSetting;
739dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
740dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    if(p->bEnableUEP == OMX_TRUE)
741dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        return OMX_ErrorUnsupportedSetting;
742dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
743dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    if(p->bEnableRS == OMX_TRUE)
744dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        return OMX_ErrorUnsupportedSetting;
745dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
74630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    if (p->eProfile == OMX_VIDEO_AVCProfileBaseline &&
74730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            (p->nAllowedPictureTypes & OMX_VIDEO_PictureTypeB) )
74830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        return OMX_ErrorBadParameter;
74930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
75030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    if (p->nAllowedPictureTypes & OMX_VIDEO_PictureTypeP && (p->nPFrames == 0))
75130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        return OMX_ErrorBadParameter;
75230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
75330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    if (p->nAllowedPictureTypes & OMX_VIDEO_PictureTypeB ) {
75430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        if (p->nBFrames == 0)
75530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            return OMX_ErrorBadParameter;
75630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
75730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        //IpPeriod must be integer
75830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        uint32_t IntraPeriod = mParamAvc.nPFrames + mParamAvc.nBFrames ;
75930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        if (IntraPeriod % mParamAvc.nPFrames != 0)
76030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            return OMX_ErrorBadParameter;
76130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
76230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        //IntraPeriod must be multipe of IpPeriod.
76330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        uint32_t IpPeriod = IntraPeriod /mParamAvc.nPFrames;
76430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        if (IntraPeriod % IpPeriod != 0)
76530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            return OMX_ErrorBadParameter;
76630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    }
76730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
768e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO: do we need to check if port is enabled?
769e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO: see SetPortAvcParam implementation - Can we make simple copy????
770e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    memcpy(&mParamAvc, p, sizeof(mParamAvc));
771828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mVideoEncoder->getParameters(mAVCParams);
772828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mAVCParams->bEntropyCodingCABAC = mParamAvc.bEntropyCodingCABAC;
773d6909bc46ae314eb3cf17b411c095ede37c7465egji    mAVCParams->bDirect8x8Inference = mParamAvc.bDirect8x8Inference;
77488e64cfe7880b3ee81c3e5e34b37a408eb855680gji    if(mParamAvc.eProfile == OMX_VIDEO_AVCProfileBaseline){
77588e64cfe7880b3ee81c3e5e34b37a408eb855680gji        mAVCParams->bEntropyCodingCABAC = 0;
77688e64cfe7880b3ee81c3e5e34b37a408eb855680gji        mAVCParams->bDirect8x8Inference = 0;
77788e64cfe7880b3ee81c3e5e34b37a408eb855680gji    }
778828a2823300f3e2c8b95a3d00957145942572288jiguoliang    mVideoEncoder->setParameters(mAVCParams);
779828a2823300f3e2c8b95a3d00957145942572288jiguoliang
78030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
781e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
782e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
783e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
784e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetParamNalStreamFormat(OMX_PTR pStructure) {
785e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
786e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_NALSTREAMFORMATTYPE *p = (OMX_NALSTREAMFORMATTYPE *)pStructure;
787e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
788e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
789e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
790e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO: check if this is desired format
79119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    p->eNaluFormat = mNalStreamFormat.eNaluFormat; //OMX_NaluFormatStartCodes;
792e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
793e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
794e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
795e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetParamNalStreamFormat(OMX_PTR pStructure) {
79619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    OMX_ERRORTYPE ret;
79719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    OMX_NALSTREAMFORMATTYPE *p = (OMX_NALSTREAMFORMATTYPE *)pStructure;
79819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
79919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    CHECK_TYPE_HEADER(p);
80019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
80119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    LOGV("p->eNaluFormat =%d\n",p->eNaluFormat);
80219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    if(p->eNaluFormat != OMX_NaluFormatStartCodes &&
8030541f11be2f78b558476772f1f877e140f9d844bywan            p->eNaluFormat != (OMX_NALUFORMATSTYPE)OMX_NaluFormatStartCodesSeparateFirstHeader &&
80480114224b110cdd1707292e6283e970e08b513f0Weian Chen            p->eNaluFormat != OMX_NaluFormatOneNaluPerBuffer &&
8050541f11be2f78b558476772f1f877e140f9d844bywan            p->eNaluFormat != (OMX_NALUFORMATSTYPE)OMX_NaluFormatLengthPrefixedSeparateFirstHeader) {
80619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang        LOGE("Format not support\n");
80719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang        return OMX_ErrorUnsupportedSetting;
80819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    }
80919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    mNalStreamFormat.eNaluFormat = p->eNaluFormat;
81019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    return OMX_ErrorNone;
811e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
812e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
813e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetParamNalStreamFormatSupported(OMX_PTR pStructure) {
814e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
815e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_NALSTREAMFORMATTYPE *p = (OMX_NALSTREAMFORMATTYPE *)pStructure;
816e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
817e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
818e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
819e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    p->eNaluFormat = (OMX_NALUFORMATSTYPE)
82019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang                     (OMX_NaluFormatStartCodes |
82119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang                      OMX_NaluFormatStartCodesSeparateFirstHeader |
82280114224b110cdd1707292e6283e970e08b513f0Weian Chen                      OMX_NaluFormatOneNaluPerBuffer|
82380114224b110cdd1707292e6283e970e08b513f0Weian Chen                      OMX_NaluFormatLengthPrefixedSeparateFirstHeader);
824e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
825e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO: check if this is desired format
82619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    // OMX_NaluFormatFourByteInterleaveLength |
82780114224b110cdd1707292e6283e970e08b513f0Weian Chen    // OMX_NaluFormatZeroByteInterleaveLength);
828e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
829e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
830e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
8310541f11be2f78b558476772f1f877e140f9d844bywanOMX_ERRORTYPE OMXVideoEncoderAVC::SetParamNalStreamFormatSupported(OMX_PTR) {
832e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    LOGW("SetParamNalStreamFormatSupported is not supported.");
833e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorUnsupportedSetting;
834e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
835e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
8360541f11be2f78b558476772f1f877e140f9d844bywanOMX_ERRORTYPE OMXVideoEncoderAVC::GetParamNalStreamFormatSelect(OMX_PTR) {
837e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    LOGW("GetParamNalStreamFormatSelect is not supported.");
838e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorUnsupportedSetting;
839e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
840e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
841e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetParamNalStreamFormatSelect(OMX_PTR pStructure) {
842e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
843e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_NALSTREAMFORMATTYPE *p = (OMX_NALSTREAMFORMATTYPE *)pStructure;
844e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
845e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
846e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
847e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // return OMX_ErrorIncorrectStateOperation if not in Loaded state
848e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_SET_PARAM_STATE();
849e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
850e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    if (p->eNaluFormat != OMX_NaluFormatStartCodes &&
8510541f11be2f78b558476772f1f877e140f9d844bywan            p->eNaluFormat != (OMX_NALUFORMATSTYPE)OMX_NaluFormatStartCodesSeparateFirstHeader &&
85280114224b110cdd1707292e6283e970e08b513f0Weian Chen            p->eNaluFormat != OMX_NaluFormatOneNaluPerBuffer&&
8530541f11be2f78b558476772f1f877e140f9d844bywan            p->eNaluFormat != (OMX_NALUFORMATSTYPE)OMX_NaluFormatLengthPrefixedSeparateFirstHeader) {
854e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu        //p->eNaluFormat != OMX_NaluFormatFourByteInterleaveLength &&
855e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu        //p->eNaluFormat != OMX_NaluFormatZeroByteInterleaveLength) {
856e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu        // TODO: check if this is desried
857e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu        return OMX_ErrorBadParameter;
858e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    }
859e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
860e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mNalStreamFormat = *p;
861e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
862e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
863e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
864e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetConfigVideoAVCIntraPeriod(OMX_PTR pStructure) {
865e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
866e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_VIDEO_CONFIG_AVCINTRAPERIOD *p = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *)pStructure;
867e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
868e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
869e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
870e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO: populate mConfigAvcIntraPeriod from VideoEncoder
871e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // return OMX_ErrorNotReady if VideoEncoder is not created.
872e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    memcpy(p, &mConfigAvcIntraPeriod, sizeof(*p));
873e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
874e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
875e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
876e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetConfigVideoAVCIntraPeriod(OMX_PTR pStructure) {
877e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
87819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    Encode_Status retStatus = ENCODE_SUCCESS;
879e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_VIDEO_CONFIG_AVCINTRAPERIOD *p = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *)pStructure;
880e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
881e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
882e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
883e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // return OMX_ErrorNone if not in Executing state
884e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO:  return OMX_ErrorIncorrectStateOperation?
885e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_SET_CONFIG_STATE();
886e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
88730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    //check if parameters are valid
88830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    if ( ( (mParamAvc.nAllowedPictureTypes & OMX_VIDEO_PictureTypeP) ||
88930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang           (mParamAvc.nAllowedPictureTypes & OMX_VIDEO_PictureTypeB) ) &&
89030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang         p->nPFrames == 0 )
89130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        return OMX_ErrorBadParameter;
89230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
893e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO: apply AVC Intra Period configuration in Executing state
89419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    VideoConfigAVCIntraPeriod avcIntraPreriod;
89530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
89630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    if (mParamAvc.nAllowedPictureTypes & OMX_VIDEO_PictureTypeB) {
89730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        avcIntraPreriod.intraPeriod = p->nPFrames;
89830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        if (p->nPFrames % mParamAvc.nBFrames != 0)
89930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            return OMX_ErrorBadParameter;
90030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        avcIntraPreriod.ipPeriod = p->nPFrames / mParamAvc.nBFrames;
90130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
90230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        if (avcIntraPreriod.intraPeriod % avcIntraPreriod.ipPeriod != 0)
90330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            return OMX_ErrorBadParameter;
90430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
90530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        avcIntraPreriod.idrInterval = p->nIDRPeriod;
906dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    } else {
90730736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        avcIntraPreriod.intraPeriod = p->nPFrames + 1;
90830736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        avcIntraPreriod.ipPeriod = 1;
90930736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        if (avcIntraPreriod.intraPeriod == 0)
91030736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            avcIntraPreriod.idrInterval = 0;
91130736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang        else
91230736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang            avcIntraPreriod.idrInterval = p->nIDRPeriod;
913dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    }
91430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
91519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    retStatus = mVideoEncoder->setConfig(&avcIntraPreriod);
91619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    if(retStatus !=  ENCODE_SUCCESS) {
917dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang        LOGW("set avc intra period config failed");
91819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    }
919dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang
920dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    mEncoderParams->intraPeriod = avcIntraPreriod.intraPeriod;
921dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    mAVCParams->idrInterval = avcIntraPreriod.idrInterval;
922dbb4b89361b47ddf1988c654c5cc8e07818dd5ecZhao Liang    mAVCParams->ipPeriod = avcIntraPreriod.ipPeriod;
92330736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
92430736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    mConfigAvcIntraPeriod = *p;
92530736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang    mConfigAvcIntraPeriod.nIDRPeriod = avcIntraPreriod.idrInterval;
92630736b960fca5337c0e89021f2ff8779475b4ef8Zhao Liang
927e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
928e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
929e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
930e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetConfigVideoNalSize(OMX_PTR pStructure) {
931e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
932e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_VIDEO_CONFIG_NALSIZE *p = (OMX_VIDEO_CONFIG_NALSIZE *)pStructure;
933e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
934e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
935e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
936e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    memcpy(p, &mConfigNalSize, sizeof(*p));
937e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
938e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
939e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
940e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetConfigVideoNalSize(OMX_PTR pStructure) {
941e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
94219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    Encode_Status retStatus = ENCODE_SUCCESS;
94312654b707eb7c53bff659edcd04aba32b14a5849gji    if (mParamBitrate.eControlRate == OMX_Video_ControlRateMax) {
944e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu        LOGE("SetConfigVideoNalSize failed. Feature is disabled.");
945e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu        return OMX_ErrorUnsupportedIndex;
946e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    }
947e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_VIDEO_CONFIG_NALSIZE *p = (OMX_VIDEO_CONFIG_NALSIZE *)pStructure;
948e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
949e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
950e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
951e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // set in either Loaded  state (ComponentSetParam) or Executing state (ComponentSetConfig)
952e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mConfigNalSize = *p;
953e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
954e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // return OMX_ErrorNone if not in Executing state
955e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // TODO: return OMX_ErrorIncorrectStateOperation?
956e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_SET_CONFIG_STATE();
957e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
9580541f11be2f78b558476772f1f877e140f9d844bywan    if (mParamBitrate.eControlRate != (OMX_VIDEO_CONTROLRATETYPE)OMX_Video_Intel_ControlRateVideoConferencingMode) {
959e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu        LOGE("SetConfigVideoNalSize failed. Feature is supported only in VCM.");
960e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu        return OMX_ErrorUnsupportedSetting;
961e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    }
96219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    VideoConfigNALSize configNalSize;
96319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    configNalSize.maxSliceSize = mConfigNalSize.nNaluBytes * 8;
96419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    retStatus = mVideoEncoder->setConfig(&configNalSize);
96519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    if(retStatus != ENCODE_SUCCESS) {
96619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang        LOGW("set NAL size config failed");
96719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    }
968e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
969e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
970e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
97119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo SangOMX_ERRORTYPE OMXVideoEncoderAVC::GetConfigIntelSliceNumbers(OMX_PTR pStructure) {
97219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    OMX_ERRORTYPE ret;
97319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *p = (OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *)pStructure;
97419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
97519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    CHECK_TYPE_HEADER(p);
97619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
97719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    memcpy(p, &mConfigIntelSliceNumbers, sizeof(*p));
97819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    return OMX_ErrorNone;
97919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang}
98019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
98119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo SangOMX_ERRORTYPE OMXVideoEncoderAVC::SetConfigIntelSliceNumbers(OMX_PTR pStructure) {
98219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    OMX_ERRORTYPE ret;
98319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    Encode_Status retStatus = ENCODE_SUCCESS;
98412654b707eb7c53bff659edcd04aba32b14a5849gji    if (mParamBitrate.eControlRate == OMX_Video_ControlRateMax) {
98519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang        LOGE("SetConfigIntelSliceNumbers failed. Feature is disabled.");
98619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang        return OMX_ErrorUnsupportedIndex;
98719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    }
98819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *p = (OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *)pStructure;
98919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    CHECK_TYPE_HEADER(p);
99019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
99119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
99219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    // set in either Loaded  state (ComponentSetParam) or Executing state (ComponentSetConfig)
99319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    mConfigIntelSliceNumbers = *p;
99419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
99519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    // return OMX_ErrorNone if not in Executing state
99619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    // TODO: return OMX_ErrorIncorrectStateOperation?
99719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    CHECK_SET_CONFIG_STATE();
99819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
9990541f11be2f78b558476772f1f877e140f9d844bywan    if (mParamBitrate.eControlRate != (OMX_VIDEO_CONTROLRATETYPE)OMX_Video_Intel_ControlRateVideoConferencingMode) {
100019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang        LOGE("SetConfigIntelSliceNumbers failed. Feature is supported only in VCM.");
100119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang        return OMX_ErrorUnsupportedSetting;
100219b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    }
100319b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    VideoConfigSliceNum sliceNum;
100419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    sliceNum.sliceNum.iSliceNum = mConfigIntelSliceNumbers.nISliceNumber;
100519b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    sliceNum.sliceNum.pSliceNum = mConfigIntelSliceNumbers.nPSliceNumber;
100619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    retStatus = mVideoEncoder->setConfig(&sliceNum);
100719b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    if(retStatus != ENCODE_SUCCESS) {
100819b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang        LOGW("set silce num config failed!\n");
100919b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    }
101019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    return OMX_ErrorNone;
101119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang}
1012e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
1013e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::GetParamIntelAVCVUI(OMX_PTR pStructure) {
101419b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
1015e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
1016e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_VIDEO_PARAM_INTEL_AVCVUI *p = (OMX_VIDEO_PARAM_INTEL_AVCVUI *)pStructure;
1017e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
1018e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
1019e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
102019b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang    memcpy(p, &mParamIntelAvcVui, sizeof(*p));
102119b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
1022e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
1023e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
1024e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
1025e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetParamIntelAVCVUI(OMX_PTR pStructure) {
102619b2ab9f325bdbf3afe530e943fa5a0c0020b308Shuduo Sang
1027e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
1028e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_VIDEO_PARAM_INTEL_AVCVUI *p = (OMX_VIDEO_PARAM_INTEL_AVCVUI *)pStructure;
1029e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
1030e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
1031e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
1032e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // set only in Loaded state (ComponentSetParam)
1033e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_SET_PARAM_STATE();
1034e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
1035e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    mParamIntelAvcVui = *p;
1036e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
1037e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
1038e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
10390541f11be2f78b558476772f1f877e140f9d844bywanOMX_ERRORTYPE OMXVideoEncoderAVC::GetParamVideoBytestream(OMX_PTR) {
1040e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorUnsupportedSetting;
1041e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
1042e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
1043e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy QiuOMX_ERRORTYPE OMXVideoEncoderAVC::SetParamVideoBytestream(OMX_PTR pStructure) {
1044e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_ERRORTYPE ret;
1045e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    OMX_VIDEO_PARAM_BYTESTREAMTYPE *p = (OMX_VIDEO_PARAM_BYTESTREAMTYPE *)pStructure;
1046e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_TYPE_HEADER(p);
1047e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_PORT_INDEX(p, OUTPORT_INDEX);
1048e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
1049e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    // set only in Loaded state (ComponentSetParam)
1050e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    CHECK_SET_PARAM_STATE();
1051e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
1052e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    if (p->bBytestream == OMX_TRUE) {
1053e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu        mNalStreamFormat.eNaluFormat = OMX_NaluFormatStartCodes;
1054e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    } else {
1055e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu        // TODO: do we need to override the Nalu format?
1056c9d4c8ce4a28d852e006427a1f01ee334e022938ywan        mNalStreamFormat.eNaluFormat = (OMX_NALUFORMATSTYPE)OMX_NaluFormatZeroByteInterleaveLength;
1057e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    }
1058e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
1059e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu    return OMX_ErrorNone;
1060e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu}
1061e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
1062e7ace334fb7c64f7b32aa3746e5a11bcefa60bfbAndy Qiu
106311c1c17fed35585f9256031ee70db1c6c18d0219Yuanjun HuangDECLARE_OMX_COMPONENT("OMX.Intel.VideoEncoder.AVC", "video_encoder.avc", OMXVideoEncoderAVC);
1064