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