182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON/* 282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Copyright (c) 2009-2011 Intel Corporation. All rights reserved. 382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* 482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Licensed under the Apache License, Version 2.0 (the "License"); 582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* you may not use this file except in compliance with the License. 682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* You may obtain a copy of the License at 782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* 882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* http://www.apache.org/licenses/LICENSE-2.0 982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* 1082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Unless required by applicable law or agreed to in writing, software 1182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* distributed under the License is distributed on an "AS IS" BASIS, 1282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* See the License for the specific language governing permissions and 1482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* limitations under the License. 1582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON*/ 1682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 1782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <string.h> 1882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <stdlib.h> 1982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include "VideoEncoderLog.h" 2082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include "VideoEncoderAVC.h" 2182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <va/va_tpi.h> 2282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <va/va_enc_h264.h> 2382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <bitstream.h> 2482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 2582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONVideoEncoderAVC::VideoEncoderAVC() 2682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON :VideoEncoderBase() { 2782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(VideoEncoderBase::queryProfileLevelConfig(mVADisplay, VAProfileH264High) == ENCODE_SUCCESS){ 2882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mComParams.profile = VAProfileH264High; 2982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mComParams.level = 42; 3082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON }else if(VideoEncoderBase::queryProfileLevelConfig(mVADisplay, VAProfileH264Main) == ENCODE_SUCCESS){ 3182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mComParams.profile = VAProfileH264Main; 3282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mComParams.level = 41; 3382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 3482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.basicUnitSize = 0; 3582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.VUIFlag = 0; 3682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.sliceNum.iSliceNum = 2; 3782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.sliceNum.pSliceNum = 2; 3882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.idrInterval = 2; 3982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.ipPeriod = 1; 4082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.maxSliceSize = 0; 4182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.delimiterType = AVC_DELIMITER_ANNEXB; 4282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mSliceNum = 2; 4382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.crop.LeftOffset = 0; 4482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.crop.RightOffset = 0; 4582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.crop.TopOffset = 0; 4682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.crop.BottomOffset = 0; 4782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.SAR.SarWidth = 0; 4882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.SAR.SarHeight = 0; 4982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.bEntropyCodingCABAC = 0; 5082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.bWeightedPPrediction = 0; 5182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.bDirect8x8Inference = 0; 5282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.bConstIpred = 0; 5382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mAutoReferenceSurfaceNum = 4; 5482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 5582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON packed_seq_header_param_buf_id = VA_INVALID_ID; 5682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON packed_seq_buf_id = VA_INVALID_ID; 5782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON packed_pic_header_param_buf_id = VA_INVALID_ID; 5882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON packed_pic_buf_id = VA_INVALID_ID; 5982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON packed_sei_header_param_buf_id = VA_INVALID_ID; /* the SEI buffer */ 6082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON packed_sei_buf_id = VA_INVALID_ID; 6182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 6282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 6382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::start() { 6482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 6582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON Encode_Status ret = ENCODE_SUCCESS; 6682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "Begin\n"); 6782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 6882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mComParams.rcMode == VA_RC_VCM) { 6982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // If we are in VCM, we will set slice num to max value 7082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // mVideoParamsAVC.sliceNum.iSliceNum = (mComParams.resolution.height + 15) / 16; 7182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // mVideoParamsAVC.sliceNum.pSliceNum = mVideoParamsAVC.sliceNum.iSliceNum; 7282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 7382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 7482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = VideoEncoderBase::start (); 7582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("VideoEncoderBase::start"); 7682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 7782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "end\n"); 7882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ret; 7982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 8082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 8182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::derivedSetParams(VideoParamConfigSet *videoEncParams) { 8282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 8382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_NULL_RETURN_IFFAIL(videoEncParams); 8482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VideoParamsAVC *encParamsAVC = reinterpret_cast <VideoParamsAVC *> (videoEncParams); 8582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 8682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // AVC parames 8782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (encParamsAVC->size != sizeof (VideoParamsAVC)) { 8882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_PARAMS; 8982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 9082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 9182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(encParamsAVC->ipPeriod == 0 || encParamsAVC->ipPeriod >4) 9282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_PARAMS; 9382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 9482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if((mComParams.intraPeriod >1)&&(mComParams.intraPeriod % encParamsAVC->ipPeriod !=0)) 9582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_PARAMS; 9682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 9782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC = *encParamsAVC; 9882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(mComParams.profile == VAProfileH264Baseline){ 9982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.bEntropyCodingCABAC = 0; 10082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.bDirect8x8Inference = 0; 10182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.bWeightedPPrediction = 0; 10282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 10382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 10482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 10582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 10682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC:: derivedGetParams(VideoParamConfigSet *videoEncParams) { 10782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 10882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_NULL_RETURN_IFFAIL(videoEncParams); 10982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VideoParamsAVC *encParamsAVC = reinterpret_cast <VideoParamsAVC *> (videoEncParams); 11082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 11182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // AVC parames 11282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (encParamsAVC->size != sizeof (VideoParamsAVC)) { 11382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_PARAMS; 11482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 11582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 11682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON *encParamsAVC = mVideoParamsAVC; 11782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 11882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 11982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 12082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 12182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::derivedSetConfig(VideoParamConfigSet *videoEncConfig) { 12282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 12382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_NULL_RETURN_IFFAIL(videoEncConfig); 12467efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("Config type = %d\n", (int)videoEncConfig->type); 12582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 12682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON switch (videoEncConfig->type) { 12782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case VideoConfigTypeAVCIntraPeriod: { 12882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 12982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VideoConfigAVCIntraPeriod *configAVCIntraPeriod = 13082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON reinterpret_cast <VideoConfigAVCIntraPeriod *> (videoEncConfig); 13182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Config Intra Peroid 13282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (configAVCIntraPeriod->size != sizeof (VideoConfigAVCIntraPeriod)) { 13382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_PARAMS; 13482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 13582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 13682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(configAVCIntraPeriod->ipPeriod == 0 || configAVCIntraPeriod->ipPeriod >4) 13782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_PARAMS; 13882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if((configAVCIntraPeriod->intraPeriod >1)&&(configAVCIntraPeriod->intraPeriod % configAVCIntraPeriod->ipPeriod !=0)) 13982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_PARAMS; 14082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 14182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.idrInterval = configAVCIntraPeriod->idrInterval; 14282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.ipPeriod = configAVCIntraPeriod->ipPeriod; 14382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mComParams.intraPeriod = configAVCIntraPeriod->intraPeriod; 14482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mNewHeader = true; 14582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 14682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 14782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case VideoConfigTypeNALSize: { 14882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Config MTU 14982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VideoConfigNALSize *configNALSize = 15082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON reinterpret_cast <VideoConfigNALSize *> (videoEncConfig); 15182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (configNALSize->size != sizeof (VideoConfigNALSize)) { 15282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_PARAMS; 15382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 15482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 15582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.maxSliceSize = configNALSize->maxSliceSize; 15682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mRenderMaxSliceSize = true; 15782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 15882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 15982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case VideoConfigTypeIDRRequest: { 16082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(mVideoParamsAVC.ipPeriod >1) 16182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_FAIL; 16282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else 16382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mNewHeader = true; 16482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 16582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 16682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case VideoConfigTypeSliceNum: { 16782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 16882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VideoConfigSliceNum *configSliceNum = 16982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON reinterpret_cast <VideoConfigSliceNum *> (videoEncConfig); 17082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Config Slice size 17182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (configSliceNum->size != sizeof (VideoConfigSliceNum)) { 17282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_PARAMS; 17382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 17482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 17582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.sliceNum = configSliceNum->sliceNum; 17682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 17782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 17882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON default: { 17982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E ("Invalid Config Type"); 18082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 18182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 18282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 18382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 18482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 18582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 18682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 18782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC:: derivedGetConfig( 18882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VideoParamConfigSet *videoEncConfig) { 18982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 19082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_NULL_RETURN_IFFAIL(videoEncConfig); 19167efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("Config type = %d\n", (int)videoEncConfig->type); 19282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 19382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON switch (videoEncConfig->type) { 19482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 19582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case VideoConfigTypeAVCIntraPeriod: { 19682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 19782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VideoConfigAVCIntraPeriod *configAVCIntraPeriod = 19882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON reinterpret_cast <VideoConfigAVCIntraPeriod *> (videoEncConfig); 19982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (configAVCIntraPeriod->size != sizeof (VideoConfigAVCIntraPeriod)) { 20082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_PARAMS; 20182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 20282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 20382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON configAVCIntraPeriod->idrInterval = mVideoParamsAVC.idrInterval; 20482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON configAVCIntraPeriod->intraPeriod = mComParams.intraPeriod; 20582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON configAVCIntraPeriod->ipPeriod = mVideoParamsAVC.ipPeriod; 20682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 20782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 20882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 20982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case VideoConfigTypeNALSize: { 21082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 21182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VideoConfigNALSize *configNALSize = 21282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON reinterpret_cast <VideoConfigNALSize *> (videoEncConfig); 21382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (configNALSize->size != sizeof (VideoConfigNALSize)) { 21482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_PARAMS; 21582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 21682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 21782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON configNALSize->maxSliceSize = mVideoParamsAVC.maxSliceSize; 21882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 21982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 22082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case VideoConfigTypeIDRRequest: { 22182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 22282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 22382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 22482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case VideoConfigTypeSliceNum: { 22582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 22682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VideoConfigSliceNum *configSliceNum = 22782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON reinterpret_cast <VideoConfigSliceNum *> (videoEncConfig); 22882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (configSliceNum->size != sizeof (VideoConfigSliceNum)) { 22982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_PARAMS; 23082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 23182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 23282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON configSliceNum->sliceNum = mVideoParamsAVC.sliceNum; 23382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 23482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 23582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON default: { 23682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E ("Invalid Config Type"); 23782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 23882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 23982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 24082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 24182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 24282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 24382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 24482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::updateFrameInfo(EncodeTask* task) { 24582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t idrPeroid = mComParams.intraPeriod * mVideoParamsAVC.idrInterval; 24682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON FrameType frametype; 24782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t frame_num = mFrameNum; 24882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t intraPeriod = mComParams.intraPeriod; 24982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 25082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (idrPeroid != 0) { 25182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(mVideoParamsAVC.ipPeriod > 1) 25282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON frame_num = frame_num % (idrPeroid + 1); 25382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else 25482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON frame_num = frame_num % idrPeroid ; 25582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON }else{ 25682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mComParams.intraPeriod == 0) 25782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON intraPeriod = 0xFFFFFFFF; 25882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 25982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 26082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 26182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(frame_num ==0){ 26282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON frametype = FTYPE_IDR; 26382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON }else if(intraPeriod ==1) 26482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // only I frame need intraPeriod=idrInterval=ipPeriod=0 26582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON frametype = FTYPE_I; 26682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else if(mVideoParamsAVC.ipPeriod == 1){ // no B frame 26782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if((frame_num > 1) &&((frame_num -1)%intraPeriod == 0)) 26882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON frametype = FTYPE_I; 26982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else 27082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON frametype = FTYPE_P; 27182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 27282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(((frame_num-1)%intraPeriod == 0)&&(frame_num >intraPeriod)) 27382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON frametype = FTYPE_I; 27482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else{ 27582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON frame_num = frame_num%intraPeriod; 27682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(frame_num == 0) 27782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON frametype = FTYPE_B; 27882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else if((frame_num-1)%mVideoParamsAVC.ipPeriod == 0) 27982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON frametype = FTYPE_P; 28082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else 28182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON frametype = FTYPE_B; 28282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 28382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 28482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 28582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (frametype == FTYPE_IDR || frametype == FTYPE_I) 28682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON task->flag |= ENCODE_BUFFERFLAG_SYNCFRAME; 28782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 28882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (frametype != task->type) { 28982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON const char* FrameTypeStr[10] = {"UNKNOWN", "I", "P", "B", "SI", "SP", "EI", "EP", "S", "IDR"}; 29082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if ((uint32_t) task->type < 9) 29182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("libMIX thinks it is %s Frame, the input is %s Frame", FrameTypeStr[frametype], FrameTypeStr[task->type]); 29282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else 29382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("Wrong Frame type %d, type may not be initialized ?\n", task->type); 29482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 29582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 29682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON//temparily comment out to avoid uninitialize error 29782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON// if (task->type == FTYPE_UNKNOWN || (uint32_t) task->type > 9) 29882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON task->type = frametype; 29982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 30082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 30182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 30282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 30382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::getExtFormatOutput(VideoEncOutputBuffer *outBuffer) { 30482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 30582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON Encode_Status ret = ENCODE_SUCCESS; 30682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 30782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("Begin\n"); 30882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 30982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON switch (outBuffer->format) { 31082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case OUTPUT_CODEC_DATA: { 31182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Output the codec data 31282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = outputCodecData(outBuffer); 31382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_CLEANUP("outputCodecData"); 31482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 31582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 31682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 31782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case OUTPUT_ONE_NAL: { 31882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Output only one NAL unit 31982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = outputOneNALU(outBuffer, true); 32082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_CLEANUP("outputOneNALU"); 32182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 32282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 32382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 32482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case OUTPUT_ONE_NAL_WITHOUT_STARTCODE: { 32582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = outputOneNALU(outBuffer, false); 32682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_CLEANUP("outputOneNALU"); 32782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 32882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 32982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 33082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case OUTPUT_LENGTH_PREFIXED: { 33182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Output length prefixed 33282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = outputLengthPrefixed(outBuffer); 33382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_CLEANUP("outputLengthPrefixed"); 33482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 33582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 33682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 33782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case OUTPUT_NALULENGTHS_PREFIXED: { 33882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Output nalu lengths ahead of bitstream 33982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = outputNaluLengthsPrefixed(outBuffer); 34082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_CLEANUP("outputNaluLengthsPrefixed"); 34182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 34282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 34382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 34482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON default: 34582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("Invalid buffer mode\n"); 34682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = ENCODE_FAIL; 34782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 34882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 34982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 35067efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("out size is = %d\n", outBuffer->dataSize); 35182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 35282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 35382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONCLEAN_UP: 35482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 35582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 35682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("End\n"); 35782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ret; 35882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 35982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 36082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::getOneNALUnit( 36182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t *inBuffer, uint32_t bufSize, uint32_t *nalSize, 36282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t *nalType, uint32_t *nalOffset, uint32_t status) { 36382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t pos = 0; 36482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t zeroByteCount = 0; 36582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t singleByteTable[3][2] = {{1,0},{2,0},{2,3}}; 36682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t dataRemaining = 0; 36782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t *dataPtr; 36882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 36982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Don't need to check parameters here as we just checked by caller 37082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON while ((inBuffer[pos++] == 0x00)) { 37182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON zeroByteCount ++; 37282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (pos >= bufSize) //to make sure the buffer to be accessed is valid 37382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 37482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 37582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 37682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (inBuffer[pos - 1] != 0x01 || zeroByteCount < 2) { 37782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("The stream is not AnnexB format \n"); 37882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("segment status is %x \n", status); 37982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_FAIL; //not AnnexB, we won't process it 38082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 38182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 38282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON *nalType = (*(inBuffer + pos)) & 0x1F; 38367efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V ("NAL type = 0x%x\n", *nalType); 38482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 38582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON zeroByteCount = 0; 38682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON *nalOffset = pos; 38782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 38882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (status & VA_CODED_BUF_STATUS_SINGLE_NALU) { 38982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON *nalSize = bufSize - pos; 39082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 39182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 39282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 39382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON dataPtr = inBuffer + pos; 39482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON dataRemaining = bufSize - pos + 1; 39582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 39682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON while ((dataRemaining > 0) && (zeroByteCount < 3)) { 39782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (((((intptr_t)dataPtr) & 0xF ) == 0) && (0 == zeroByteCount) 39882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON && (dataRemaining > 0xF)) { 39982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 40082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON __asm__ ( 40182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //Data input 40282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "movl %1, %%ecx\n\t"//data_ptr=>ecx 40382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "movl %0, %%eax\n\t"//data_remaing=>eax 40482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //Main compare loop 40582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // 40682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "0:\n\t" //MATCH_8_ZERO: 40782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "pxor %%xmm0,%%xmm0\n\t"//set 0=>xmm0 40882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "pcmpeqb (%%ecx),%%xmm0\n\t"//data_ptr=xmm0,(byte==0)?0xFF:0x00 40982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "pmovmskb %%xmm0, %%edx\n\t"//edx[0]=xmm0[7],edx[1]=xmm0[15],...,edx[15]=xmm0[127] 41082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "test $0xAAAA, %%edx\n\t"//edx& 1010 1010 1010 1010b 41182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "jnz 2f\n\t"//Not equal to zero means that at least one byte 0x00 41282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 41382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "1:\n\t" //PREPARE_NEXT_MATCH: 41482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "sub $0x10, %%eax\n\t"//16 + ecx --> ecx 41582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "add $0x10, %%ecx\n\t"//eax-16 --> eax 41682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "cmp $0x10, %%eax\n\t" 41782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "jge 0b\n\t"//search next 16 bytes 41882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 41982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "2:\n\t" //DATA_RET: 42082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "movl %%ecx, %1\n\t"//output ecx->data_ptr 42182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON "movl %%eax, %0\n\t"//output eax->data_remaining 42282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON : "+m"(dataRemaining), "+m"(dataPtr) 42382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON : 42482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON :"eax", "ecx", "edx", "xmm0" 42582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ); 42682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (0 >= dataRemaining) { 42782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 42882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 42982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 43082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 43182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //check the value of each byte 43282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if ((*dataPtr) >= 2) { 43382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 43482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON zeroByteCount = 0; 43582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 43682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 43782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else { 43882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON zeroByteCount = singleByteTable[zeroByteCount][*dataPtr]; 43982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 44082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 44182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON dataPtr ++; 44282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON dataRemaining --; 44382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 44482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 44582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if ((3 == zeroByteCount) && (dataRemaining > 0)) { 44682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 44782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON *nalSize = bufSize - dataRemaining - *nalOffset - 3; 44882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 44982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else if (0 == dataRemaining) { 45082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 45182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON *nalSize = bufSize - *nalOffset; 45282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 45382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 45482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 45582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 45682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::getHeader( 45782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t *inBuffer, uint32_t bufSize, uint32_t *headerSize, uint32_t status) { 45882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 45982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t nalType = 0; 46082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t nalSize = 0; 46182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t nalOffset = 0; 46282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t size = 0; 46382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t *buf = inBuffer; 46482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON Encode_Status ret = ENCODE_SUCCESS; 46582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 46682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON *headerSize = 0; 46782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_NULL_RETURN_IFFAIL(inBuffer); 46882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 46982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (bufSize == 0) { 47082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //bufSize shoule not be 0, error happens 47182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("Buffer size is 0\n"); 47282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_FAIL; 47382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 47482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 47582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON while (1) { 47682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON nalType = nalSize = nalOffset = 0; 47782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = getOneNALUnit(buf, bufSize, &nalSize, &nalType, &nalOffset, status); 47882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("getOneNALUnit"); 47982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 48067efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("NAL type = %d, NAL size = %d, offset = %d\n", nalType, nalSize, nalOffset); 48182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON size = nalSize + nalOffset; 48282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 48382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Codec_data should be SPS or PPS 48482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (nalType == 7 || nalType == 8) { 48582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON *headerSize += size; 48682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON buf += size; 48782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON bufSize -= size; 48882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 48982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("No header found or no header anymore\n"); 49082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 49182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 49282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 49382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 49482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 49582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 49682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 49782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::outputCodecData( 49882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VideoEncOutputBuffer *outBuffer) { 49982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 50082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON Encode_Status ret = ENCODE_SUCCESS; 50182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t headerSize = 0; 50282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 50382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = getHeader((uint8_t *)mCurSegment->buf + mOffsetInSeg, 50482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mCurSegment->size - mOffsetInSeg, &headerSize, mCurSegment->status); 50582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("getHeader"); 50682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (headerSize == 0) { 50782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->dataSize = 0; 50882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mCurSegment = NULL; 50982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_NO_REQUEST_DATA; 51082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 51182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 51282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (headerSize <= outBuffer->bufferSize) { 51382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON memcpy(outBuffer->data, (uint8_t *)mCurSegment->buf + mOffsetInSeg, headerSize); 51482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mTotalSizeCopied += headerSize; 51582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mOffsetInSeg += headerSize; 51682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->dataSize = headerSize; 51782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->remainingSize = 0; 51882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->flag |= ENCODE_BUFFERFLAG_ENDOFFRAME; 51982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->flag |= ENCODE_BUFFERFLAG_CODECCONFIG; 52082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->flag |= ENCODE_BUFFERFLAG_SYNCFRAME; 52182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 52282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // we need a big enough buffer, otherwise we won't output anything 52382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->dataSize = 0; 52482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->remainingSize = headerSize; 52582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->flag |= ENCODE_BUFFERFLAG_DATAINVALID; 52682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("Buffer size too small\n"); 52782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_BUFFER_TOO_SMALL; 52882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 52982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 53082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ret; 53182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 53282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 53382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::outputOneNALU( 53482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VideoEncOutputBuffer *outBuffer, bool startCode) { 53582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 53682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t nalType = 0; 53782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t nalSize = 0; 53882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t nalOffset = 0; 53982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t sizeToBeCopied = 0; 54082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 54182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON Encode_Status ret = ENCODE_SUCCESS; 54282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_NULL_RETURN_IFFAIL(mCurSegment->buf); 54382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 54482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = getOneNALUnit((uint8_t *)mCurSegment->buf + mOffsetInSeg, 54582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mCurSegment->size - mOffsetInSeg, &nalSize, &nalType, &nalOffset, mCurSegment->status); 54682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("getOneNALUnit"); 54782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 54882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // check if we need startcode along with the payload 54982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (startCode) { 55082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeToBeCopied = nalSize + nalOffset; 55182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 55282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeToBeCopied = nalSize; 55382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 55482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 55582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (sizeToBeCopied <= outBuffer->bufferSize) { 55682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (startCode) { 55782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON memcpy(outBuffer->data, (uint8_t *)mCurSegment->buf + mOffsetInSeg, sizeToBeCopied); 55882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 55982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON memcpy(outBuffer->data, (uint8_t *)mCurSegment->buf + mOffsetInSeg + nalOffset, 56082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeToBeCopied); 56182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 56282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mTotalSizeCopied += sizeToBeCopied; 56382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mOffsetInSeg += (nalSize + nalOffset); 56482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->dataSize = sizeToBeCopied; 56582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->flag |= ENCODE_BUFFERFLAG_PARTIALFRAME; 56682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->remainingSize = 0; 56782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 56882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // if nothing to be copied out, set flag to invalid 56982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->dataSize = 0; 57082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->flag |= ENCODE_BUFFERFLAG_DATAINVALID; 57182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->remainingSize = sizeToBeCopied; 57282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_W("Buffer size too small\n"); 57382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_BUFFER_TOO_SMALL; 57482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 57582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 57682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // check if all data in current segment has been copied out 57782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mCurSegment->size == mOffsetInSeg) { 57882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mCurSegment->next != NULL) { 57982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mCurSegment = (VACodedBufferSegment *)mCurSegment->next; 58082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mOffsetInSeg = 0; 58182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 58282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("End of stream\n"); 58382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->flag |= ENCODE_BUFFERFLAG_ENDOFFRAME; 58482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mCurSegment = NULL; 58582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 58682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 58782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 58882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 58982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 59082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 59182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::outputLengthPrefixed(VideoEncOutputBuffer *outBuffer) { 59282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 59382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON Encode_Status ret = ENCODE_SUCCESS; 59482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t nalType = 0; 59582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t nalSize = 0; 59682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t nalOffset = 0; 59782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t sizeCopiedHere = 0; 59882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 59982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_NULL_RETURN_IFFAIL(mCurSegment->buf); 60082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 60182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON while (1) { 60282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 60382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mCurSegment->size < mOffsetInSeg || outBuffer->bufferSize < sizeCopiedHere) { 60482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("mCurSegment->size < mOffsetInSeg || outBuffer->bufferSize < sizeCopiedHere\n"); 60582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_FAIL; 60682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 60782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 60882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // we need to handle the whole bitstream NAL by NAL 60982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = getOneNALUnit( 61082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON (uint8_t *)mCurSegment->buf + mOffsetInSeg, 61182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mCurSegment->size - mOffsetInSeg, &nalSize, &nalType, &nalOffset, mCurSegment->status); 61282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("getOneNALUnit"); 61382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 61482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (nalSize + 4 <= outBuffer->bufferSize - sizeCopiedHere) { 61582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // write the NAL length to bit stream 61682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->data[sizeCopiedHere] = (nalSize >> 24) & 0xff; 61782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->data[sizeCopiedHere + 1] = (nalSize >> 16) & 0xff; 61882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->data[sizeCopiedHere + 2] = (nalSize >> 8) & 0xff; 61982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->data[sizeCopiedHere + 3] = nalSize & 0xff; 62082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 62182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeCopiedHere += 4; 62282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mTotalSizeCopied += 4; 62382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 62482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON memcpy(outBuffer->data + sizeCopiedHere, 62582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON (uint8_t *)mCurSegment->buf + mOffsetInSeg + nalOffset, nalSize); 62682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 62782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeCopiedHere += nalSize; 62882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mTotalSizeCopied += nalSize; 62982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mOffsetInSeg += (nalSize + nalOffset); 63082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 63182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 63282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->dataSize = sizeCopiedHere; 63382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // In case the start code is 3-byte length but we use 4-byte for length prefixed 63482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // so the remainingSize size may larger than the remaining data size 63582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->remainingSize = mTotalSize - mTotalSizeCopied + 100; 63682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->flag |= ENCODE_BUFFERFLAG_PARTIALFRAME; 63782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("Buffer size too small\n"); 63882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_BUFFER_TOO_SMALL; 63982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 64082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 64182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // check if all data in current segment has been copied out 64282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mCurSegment->size == mOffsetInSeg) { 64382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mCurSegment->next != NULL) { 64482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mCurSegment = (VACodedBufferSegment *)mCurSegment->next; 64582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mOffsetInSeg = 0; 64682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 64782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("End of stream\n"); 64882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->dataSize = sizeCopiedHere; 64982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->remainingSize = 0; 65082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->flag |= ENCODE_BUFFERFLAG_ENDOFFRAME; 65182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mCurSegment = NULL; 65282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 65382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 65482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 65582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 65682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 65782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 65882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 65982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 66082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::outputNaluLengthsPrefixed(VideoEncOutputBuffer *outBuffer) { 66182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 66282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON Encode_Status ret = ENCODE_SUCCESS; 66382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t nalType = 0; 66482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t nalSize = 0; 66582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t nalOffset = 0; 66682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t sizeCopiedHere = 0; 66782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON const uint32_t NALUINFO_OFFSET = 256; 66882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t nalNum = 0; 66982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 67082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_NULL_RETURN_IFFAIL(mCurSegment->buf); 67182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 67282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON while (1) { 67382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 67482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mCurSegment->size < mOffsetInSeg || outBuffer->bufferSize < sizeCopiedHere) { 67582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("mCurSegment->size < mOffsetInSeg || outBuffer->bufferSize < sizeCopiedHere\n"); 67682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_FAIL; 67782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 67882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 67982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // we need to handle the whole bitstream NAL by NAL 68082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = getOneNALUnit( 68182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON (uint8_t *)mCurSegment->buf + mOffsetInSeg, 68282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mCurSegment->size - mOffsetInSeg, &nalSize, &nalType, &nalOffset, mCurSegment->status); 68382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("getOneNALUnit"); 68482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 68582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (nalSize + 4 <= outBuffer->bufferSize - NALUINFO_OFFSET - sizeCopiedHere) { 68682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 68782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON memcpy(outBuffer->data + NALUINFO_OFFSET + sizeCopiedHere, 68882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON (uint8_t *)mCurSegment->buf + mOffsetInSeg, nalSize + nalOffset); 68982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 69082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeCopiedHere += nalSize + nalOffset; 69182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mTotalSizeCopied += nalSize + nalOffset; 69282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mOffsetInSeg += (nalSize + nalOffset); 69382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 69482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 69582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->dataSize = sizeCopiedHere; 69682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // In case the start code is 3-byte length but we use 4-byte for length prefixed 69782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // so the remainingSize size may larger than the remaining data size 69882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->remainingSize = mTotalSize - mTotalSizeCopied + 100; 69982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->flag |= ENCODE_BUFFERFLAG_PARTIALFRAME; 70082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("Buffer size too small\n"); 70182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_BUFFER_TOO_SMALL; 70282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 70382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 70482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON nalNum ++; 70582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t *nalLength = (uint32_t *) (outBuffer->data + (nalNum+1) * 4); 70682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 70782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON *nalLength = nalSize + nalOffset; 70882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 70982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // check if all data in current segment has been copied out 71082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mCurSegment->size == mOffsetInSeg) { 71182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mCurSegment->next != NULL) { 71282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mCurSegment = (VACodedBufferSegment *)mCurSegment->next; 71382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mOffsetInSeg = 0; 71482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 71582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("End of stream\n"); 71682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->dataSize = sizeCopiedHere; 71782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->remainingSize = 0; 71882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->flag |= ENCODE_BUFFERFLAG_ENDOFFRAME; 71982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mCurSegment = NULL; 72082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 72182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 72282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 72382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 72482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 72582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON outBuffer->offset = NALUINFO_OFFSET; 72682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t *nalHead = (uint32_t *) outBuffer->data; 72782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON *nalHead = 0x4E414C4C; //'nall' 72882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON *(++nalHead) = nalNum; 72982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 73082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 73182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 73282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 73382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::sendEncodeCommand(EncodeTask *task) { 73482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON Encode_Status ret = ENCODE_SUCCESS; 73582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 73682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "Begin\n"); 73782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 73882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mFrameNum == 0 || mNewHeader) { 73982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mRenderHrd) { 74082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = renderHrd(); 74182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mRenderHrd = false; 74282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderHrd"); 74382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 74482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 74582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mFrameNum = 0; 74682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = renderSequenceParams(task); 74782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderSequenceParams"); 74882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mNewHeader) { 74982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mNewHeader = false; //Set to require new header filed to false 75082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mFrameNum = 0; //reset mFrameNum to 0 75182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON updateFrameInfo(task); //recalculate frame info if mNewHeader is set true after PrepareFrameInfo in encode() 75282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 75382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 75482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 75582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mRenderMaxSliceSize && mVideoParamsAVC.maxSliceSize != 0) { 75682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = renderMaxSliceSize(); 75782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderMaxSliceSize"); 75882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mRenderMaxSliceSize = false; 75982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 76082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 76182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mComParams.rcParams.enableIntraFrameQPControl && (task->type == FTYPE_IDR || task->type == FTYPE_I)) 76282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mRenderBitRate = true; 76382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 76482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mRenderBitRate) { 76582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = VideoEncoderBase::renderDynamicBitrate(task); 76682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderDynamicBitrate"); 76782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 76882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 76982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mRenderAIR && 77082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON (mComParams.refreshType == VIDEO_ENC_AIR || 77182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mComParams.refreshType == VIDEO_ENC_BOTH)) { 77282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 77382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = renderAIR(); 77482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderAIR"); 77582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 77682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mRenderAIR = false; 77782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 77882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 77982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mRenderCIR) { 78082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 78182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = renderCIR(); 78282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderCIR"); 78382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 78482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mRenderCIR = false; 78582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 78682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 78782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mRenderFrameRate) { 78882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 78982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = VideoEncoderBase::renderDynamicFrameRate(); 79082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderDynamicFrameRate"); 79182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 79282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mRenderFrameRate = false; 79382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 79482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 79582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = renderPictureParams(task); 79682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderPictureParams"); 79782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 79882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mFrameNum == 0 && (mEncPackedHeaders != VA_ATTRIB_NOT_SUPPORTED)) { 79982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = renderPackedSequenceParams(task); 80082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderPackedSequenceParams"); 80182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 80282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = renderPackedPictureParams(task); 80382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderPackedPictureParams"); 80482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 80582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 80682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = renderSliceParams(task); 80782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("renderSliceParams"); 80882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 80982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "End\n"); 81082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 81182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 81282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 81382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 81482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::renderMaxSliceSize() { 81582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 81682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus = VA_STATUS_SUCCESS; 81782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "Begin\n\n"); 81882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 81982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mComParams.rcMode != RATE_CONTROL_VCM) { 82082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_W ("Not in VCM mode, but call send_max_slice_size\n"); 82182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 82282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 82382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 82482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterBuffer *miscEncParamBuf; 82582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterMaxSliceSize *maxSliceSizeParam; 82682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VABufferID miscParamBufferID; 82782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 82882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer( 82982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVADisplay, mVAContext, 83082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterBufferType, 83182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterMaxSliceSize), 83282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 1, NULL, &miscParamBufferID); 83382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 83482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 83582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaMapBuffer(mVADisplay, miscParamBufferID, (void **)&miscEncParamBuf); 83682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaMapBuffer"); 83782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 83882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON miscEncParamBuf->type = VAEncMiscParameterTypeMaxSliceSize; 83982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON maxSliceSizeParam = (VAEncMiscParameterMaxSliceSize *)miscEncParamBuf->data; 84082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 84182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON maxSliceSizeParam->max_slice_size = mVideoParamsAVC.maxSliceSize; 84282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 84382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaUnmapBuffer(mVADisplay, miscParamBufferID); 84482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaUnmapBuffer"); 84582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 84682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_I( "max slice size = %d\n", maxSliceSizeParam->max_slice_size); 84782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 84882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &miscParamBufferID, 1); 84982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 85082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 85182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 85282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 85382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 85482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::renderCIR(){ 85582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus = VA_STATUS_SUCCESS; 85667efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "%s Begin\n", __FUNCTION__); 85782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 85882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VABufferID miscParamBufferCIRid; 85982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterBuffer *misc_param; 86082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterCIR *misc_cir_param; 86182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 86282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer(mVADisplay, mVAContext, 86382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterBufferType, 86482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterCIR), 86582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 1, 86682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON NULL, 86782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &miscParamBufferCIRid); 86882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 86982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 87082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaMapBuffer(mVADisplay, miscParamBufferCIRid, (void **)&misc_param); 87182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaMapBuffer"); 87282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 87382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON misc_param->type = VAEncMiscParameterTypeCIR; 87482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON misc_cir_param = (VAEncMiscParameterCIR *)misc_param->data; 87582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON misc_cir_param->cir_num_mbs = mComParams.cirParams.cir_num_mbs; 87682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_I( "cir_num_mbs %d \n", misc_cir_param->cir_num_mbs); 87782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 87882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaUnmapBuffer(mVADisplay, miscParamBufferCIRid); 87982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaUnmapBuffer"); 88082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 88182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &miscParamBufferCIRid, 1); 88282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 88382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 88482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 88582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 88682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 88782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::renderAIR() { 88882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus = VA_STATUS_SUCCESS; 88982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "Begin\n\n"); 89082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 89182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterBuffer *miscEncParamBuf; 89282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterAIR *airParams; 89382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VABufferID miscParamBufferID; 89482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 89582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer( 89682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVADisplay, mVAContext, 89782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterBufferType, 89882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeof(miscEncParamBuf) + sizeof(VAEncMiscParameterAIR), 89982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 1, NULL, &miscParamBufferID); 90082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 90182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 90282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaMapBuffer(mVADisplay, miscParamBufferID, (void **)&miscEncParamBuf); 90382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaMapBuffer"); 90482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 90582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON miscEncParamBuf->type = VAEncMiscParameterTypeAIR; 90682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON airParams = (VAEncMiscParameterAIR *)miscEncParamBuf->data; 90782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 90882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON airParams->air_num_mbs = mComParams.airParams.airMBs; 90982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON airParams->air_threshold= mComParams.airParams.airThreshold; 91082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON airParams->air_auto = mComParams.airParams.airAuto; 91182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 91282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaUnmapBuffer(mVADisplay, miscParamBufferID); 91382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaUnmapBuffer"); 91482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 91582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &miscParamBufferID, 1); 91682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 91782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 91882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_I( "airThreshold = %d\n", airParams->air_threshold); 91982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 92082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 92182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 92282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONint VideoEncoderAVC::calcLevel(int numMbs) { 92382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int level = 30; 92482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 92582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (numMbs < 1620) { 92682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON level = 30; 92782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else if (numMbs < 3600) { 92882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON level = 31; 92982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else if (numMbs < 5120) { 93082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON level = 32; 93182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else if (numMbs < 8192) { 93282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON level = 41; 93382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else if (numMbs < 8704) { 93482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON level = 42; 93582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else if (numMbs < 22080) { 93682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON level = 50; 93782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else if (numMbs < 36864) { 93882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON level = 51; 93982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 94082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_W("No such level can support that resolution"); 94182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON level = 51; 94282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 94382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return level; 94482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 94582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 94682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::renderSequenceParams(EncodeTask *) { 94782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 94882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus = VA_STATUS_SUCCESS; 94982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncSequenceParameterBufferH264 avcSeqParams = VAEncSequenceParameterBufferH264(); 95082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterBuffer *miscEncRCParamBuf; 95182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterBuffer *miscEncFrameRateParamBuf; 95282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterRateControl *rcMiscParam; 95382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterFrameRate *framerateParam; 95482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int level; 95582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t frameRateNum = mComParams.frameRate.frameRateNum; 95682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t frameRateDenom = mComParams.frameRate.frameRateDenom; 95782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 95882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "Begin\n\n"); 95982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer(mVADisplay, mVAContext, 96082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterBufferType, 96182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeof (VAEncMiscParameterBuffer) + sizeof (VAEncMiscParameterRateControl), 96282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 1, NULL, 96382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &mRcParamBuf); 96482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 96582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaMapBuffer(mVADisplay, mRcParamBuf, (void **)&miscEncRCParamBuf); 96682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaMapBuffer"); 96782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 96882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer(mVADisplay, mVAContext, 96982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncMiscParameterBufferType, 97082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeof (VAEncMiscParameterBuffer) + sizeof (VAEncMiscParameterFrameRate), 97182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 1, NULL, 97282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &mFrameRateParamBuf); 97382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 97482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaMapBuffer(mVADisplay, mFrameRateParamBuf, (void **)&miscEncFrameRateParamBuf); 97582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaMapBuffer"); 97682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 97782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON miscEncRCParamBuf->type = VAEncMiscParameterTypeRateControl; 97882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON rcMiscParam = (VAEncMiscParameterRateControl *)miscEncRCParamBuf->data; 97982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON miscEncFrameRateParamBuf->type = VAEncMiscParameterTypeFrameRate; 98082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON framerateParam = (VAEncMiscParameterFrameRate *)miscEncFrameRateParamBuf->data; 98182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // set up the sequence params for HW 98282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // avcSeqParams.level_idc = mLevel; 98382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.intra_period = mComParams.intraPeriod; 98482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.intra_idr_period = mVideoParamsAVC.idrInterval; 98582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.ip_period = mVideoParamsAVC.ipPeriod; 98682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.picture_width_in_mbs = (mComParams.resolution.width + 15) / 16; 98782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.picture_height_in_mbs = (mComParams.resolution.height + 15) / 16; 98882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 98982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON level = calcLevel (avcSeqParams.picture_width_in_mbs * avcSeqParams.picture_height_in_mbs); 99082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.level_idc = level; 99182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.bits_per_second = mComParams.rcParams.bitRate; 99282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON framerateParam->framerate = 99382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON (unsigned int) (frameRateNum + frameRateDenom /2 ) / frameRateDenom; 99482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON rcMiscParam->initial_qp = mComParams.rcParams.initQP; 99582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON rcMiscParam->min_qp = mComParams.rcParams.minQP; 99682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON rcMiscParam->max_qp = mComParams.rcParams.maxQP; 99782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mComParams.rcParams.enableIntraFrameQPControl) { 99882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON rcMiscParam->min_qp = mComParams.rcParams.I_minQP; 99982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON rcMiscParam->max_qp = mComParams.rcParams.I_maxQP; 100082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 100182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON rcMiscParam->window_size = mComParams.rcParams.windowSize; 100282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //target bitrate is sent to libva through Sequence Parameter Buffer 100382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON rcMiscParam->bits_per_second = 0; 100482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON rcMiscParam->basic_unit_size = mVideoParamsAVC.basicUnitSize; //for rate control usage 100582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.intra_period = mComParams.intraPeriod; 100682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //avcSeqParams.vui_flag = 248; 100782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.vui_parameters_present_flag = mVideoParamsAVC.VUIFlag; 100882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.num_units_in_tick = frameRateDenom; 100982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.time_scale = 2 * frameRateNum; 101082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.seq_parameter_set_id = 0; 101182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mVideoParamsAVC.crop.LeftOffset || 101282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.crop.RightOffset || 101382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.crop.TopOffset || 101482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVideoParamsAVC.crop.BottomOffset) { 101582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.frame_cropping_flag = true; 101682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.frame_crop_left_offset = mVideoParamsAVC.crop.LeftOffset; 101782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.frame_crop_right_offset = mVideoParamsAVC.crop.RightOffset; 101882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.frame_crop_top_offset = mVideoParamsAVC.crop.TopOffset; 101982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.frame_crop_bottom_offset = mVideoParamsAVC.crop.BottomOffset; 102082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 102182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.frame_cropping_flag = false; 102282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 102382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mComParams.resolution.width & 0xf) { 102482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.frame_cropping_flag = true; 102582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t AWidth = (mComParams.resolution.width + 0xf) & (~0xf); 102682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.frame_crop_right_offset = ( AWidth - mComParams.resolution.width ) / 2; 102782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 102882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 102982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mComParams.resolution.height & 0xf) { 103082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.frame_cropping_flag = true; 103182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t AHeight = (mComParams.resolution.height + 0xf) & (~0xf); 103282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.frame_crop_bottom_offset = ( AHeight - mComParams.resolution.height ) / 2; 103382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 103482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 103582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 103682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(avcSeqParams.vui_parameters_present_flag && (mVideoParamsAVC.SAR.SarWidth || mVideoParamsAVC.SAR.SarHeight)) { 103782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.vui_fields.bits.aspect_ratio_info_present_flag = true; 103882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.aspect_ratio_idc = 0xff /* Extended_SAR */; 103982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.sar_width = mVideoParamsAVC.SAR.SarWidth; 104082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.sar_height = mVideoParamsAVC.SAR.SarHeight; 104182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 104282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 104382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.max_num_ref_frames = 1; 104482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 104582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(avcSeqParams.ip_period > 1) 104667efa6523d593d3ebdb3e22eafb186e26d4bad74ywan avcSeqParams.max_num_ref_frames = 2; 104782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 104882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("===h264 sequence params===\n"); 104967efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "seq_parameter_set_id = %d\n", (uint32_t)avcSeqParams.seq_parameter_set_id); 105067efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "level_idc = %d\n", (uint32_t)avcSeqParams.level_idc); 105167efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "intra_period = %d\n", avcSeqParams.intra_period); 105267efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "idr_interval = %d\n", avcSeqParams.intra_idr_period); 105367efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "picture_width_in_mbs = %d\n", avcSeqParams.picture_width_in_mbs); 105467efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "picture_height_in_mbs = %d\n", avcSeqParams.picture_height_in_mbs); 105567efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "bitrate = %d\n", rcMiscParam->bits_per_second); 105667efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "frame_rate = %d\n", framerateParam->framerate); 105767efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "initial_qp = %d\n", rcMiscParam->initial_qp); 105867efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "min_qp = %d\n", rcMiscParam->min_qp); 105967efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "basic_unit_size = %d\n", rcMiscParam->basic_unit_size); 106067efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "bDirect8x8Inference = %d\n",mVideoParamsAVC.bDirect8x8Inference); 106182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 106282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Not sure whether these settings work for all drivers 106382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.seq_fields.bits.frame_mbs_only_flag = 1; 106482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.seq_fields.bits.pic_order_cnt_type = 0; 106582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.seq_fields.bits.direct_8x8_inference_flag = mVideoParamsAVC.bDirect8x8Inference; 106682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 106782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.seq_fields.bits.log2_max_frame_num_minus4 = 0; 106882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcSeqParams.seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4 = 2; 106982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON// avcSeqParams.time_scale = 900; 107082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON// avcSeqParams.num_units_in_tick = 15; /* Tc = num_units_in_tick / time_sacle */ 107182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Not sure whether these settings work for all drivers 107282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 107382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaUnmapBuffer(mVADisplay, mRcParamBuf); 107482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaUnmapBuffer"); 107582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaUnmapBuffer(mVADisplay, mFrameRateParamBuf); 107682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaUnmapBuffer"); 107782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer( 107882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVADisplay, mVAContext, 107982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncSequenceParameterBufferType, 108082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeof(avcSeqParams), 1, &avcSeqParams, 108182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &mSeqParamBuf); 108282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 108382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &mFrameRateParamBuf, 1); 108482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 108582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &mSeqParamBuf, 1); 108682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 108782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &mRcParamBuf, 1); 108882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 108982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 109082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 109182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 109282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 109382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::renderPackedSequenceParams(EncodeTask *) { 109482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 109582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus = VA_STATUS_SUCCESS; 109682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncSequenceParameterBufferH264 *avcSeqParams; 109782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncPackedHeaderParameterBuffer packed_header_param_buffer; 109882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON unsigned char *packed_seq_buffer = NULL; 1099661c5a76313015b6a3fea4b0e593b761a32f4372Andreas Gampe unsigned int length_in_bits; 110082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 110182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("Begin\n"); 110282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 110382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaMapBuffer(mVADisplay, mSeqParamBuf, (void **)&avcSeqParams); 110482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaMapBuffer"); 110582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 110682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON length_in_bits = build_packed_seq_buffer(&packed_seq_buffer, mComParams.profile, avcSeqParams); 110782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON packed_header_param_buffer.type = VAEncPackedHeaderSequence; 110882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON packed_header_param_buffer.bit_length = length_in_bits; 110982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON packed_header_param_buffer.has_emulation_bytes = 0; 111082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer(mVADisplay, mVAContext, 111182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncPackedHeaderParameterBufferType, 111282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeof(packed_header_param_buffer), 1, &packed_header_param_buffer, 111382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &packed_seq_header_param_buf_id); 111482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 111582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 111682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer(mVADisplay, mVAContext, 111782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncPackedHeaderDataBufferType, 111882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON (length_in_bits + 7) / 8, 1, packed_seq_buffer, 111982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &packed_seq_buf_id); 112082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 112182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 112282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &packed_seq_header_param_buf_id, 1); 112382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 112482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 112582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &packed_seq_buf_id, 1); 112682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 112782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 112882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaUnmapBuffer(mVADisplay, mSeqParamBuf); 112982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaUnmapBuffer"); 113082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 113182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON free(packed_seq_buffer); 113282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 113382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("End\n"); 113482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 113582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return vaStatus; 113682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 113782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 113882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::renderPictureParams(EncodeTask *task) { 113982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 114082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus = VA_STATUS_SUCCESS; 114182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncPictureParameterBufferH264 avcPicParams = VAEncPictureParameterBufferH264(); 114282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t RefFrmIdx; 114382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 114482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "Begin\n\n"); 114582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // set picture params for HW 114682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mAutoReference == false) { 114782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON for (RefFrmIdx = 0; RefFrmIdx < 16; RefFrmIdx++) { 114882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.ReferenceFrames[RefFrmIdx].picture_id = VA_INVALID_ID; 114982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.ReferenceFrames[RefFrmIdx].flags = VA_PICTURE_H264_INVALID; 115082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 115182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.ReferenceFrames[0].picture_id= task->ref_surface; 115282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.ReferenceFrames[0].flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE; 115382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.CurrPic.picture_id= task->rec_surface; 115482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Not sure whether these settings work for all drivers 115582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.CurrPic.TopFieldOrderCnt = mFrameNum * 2; 115682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 115782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.pic_fields.bits.transform_8x8_mode_flag = 0; 115882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.seq_parameter_set_id = 0; 115982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.pic_parameter_set_id = 0; 116082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 116182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.last_picture = 0; 116282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.frame_num = 0; 116382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 116482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.pic_init_qp = 26; 116582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.num_ref_idx_l0_active_minus1 = 0; 116682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.num_ref_idx_l1_active_minus1 = 0; 116782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 116882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.pic_fields.bits.idr_pic_flag = 0; 116982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.pic_fields.bits.reference_pic_flag = 0; 117082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.pic_fields.bits.entropy_coding_mode_flag = 0; 117182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.pic_fields.bits.weighted_pred_flag = 0; 117282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.pic_fields.bits.weighted_bipred_idc = 0; 117382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.pic_fields.bits.transform_8x8_mode_flag = 0; 117482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.pic_fields.bits.deblocking_filter_control_present_flag = 1; 117582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 117682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.frame_num = mFrameNum; 117782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.pic_fields.bits.reference_pic_flag = 1; 117882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Not sure whether these settings work for all drivers 117982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON }else { 118082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.CurrPic.picture_id= VA_INVALID_SURFACE; 118182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON for(uint32_t i =0; i< mAutoReferenceSurfaceNum; i++) 118282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.ReferenceFrames[i].picture_id = mAutoRefSurfaces[i]; 118382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 118482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 118582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.pic_fields.bits.idr_pic_flag = (mFrameNum == 0); 118682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.pic_fields.bits.entropy_coding_mode_flag = mVideoParamsAVC.bEntropyCodingCABAC; 118782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.coded_buf = task->coded_buffer; 118882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON avcPicParams.last_picture = 0; 118982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 119082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("======h264 picture params======\n"); 119167efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "reference_picture = 0x%08x\n", avcPicParams.ReferenceFrames[0].picture_id); 119267efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "reconstructed_picture = 0x%08x\n", avcPicParams.CurrPic.picture_id); 119367efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "coded_buf = 0x%08x\n", avcPicParams.coded_buf); 119482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //LOG_I( "picture_width = %d\n", avcPicParams.picture_width); 119582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //LOG_I( "picture_height = %d\n\n", avcPicParams.picture_height); 119682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 119782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer( 119882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVADisplay, mVAContext, 119982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncPictureParameterBufferType, 120082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeof(avcPicParams), 120182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 1,&avcPicParams, 120282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &mPicParamBuf); 120382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 120482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 120582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &mPicParamBuf, 1); 120682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 120782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 120882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "end\n"); 120982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 121082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 121182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 121282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::renderPackedPictureParams(EncodeTask *) { 121382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 121482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus = VA_STATUS_SUCCESS; 121582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncPictureParameterBufferH264 *avcPicParams; 121682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncPackedHeaderParameterBuffer packed_header_param_buffer; 121782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON unsigned char *packed_pic_buffer = NULL; 1218661c5a76313015b6a3fea4b0e593b761a32f4372Andreas Gampe unsigned int length_in_bits; 121982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 122082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("Begin\n"); 122182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 122282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaMapBuffer(mVADisplay, mPicParamBuf, (void **)&avcPicParams); 122382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaMapBuffer"); 122482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 122582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON length_in_bits = build_packed_pic_buffer(&packed_pic_buffer, avcPicParams); 122682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON packed_header_param_buffer.type = VAEncPackedHeaderPicture; 122782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON packed_header_param_buffer.bit_length = length_in_bits; 122882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON packed_header_param_buffer.has_emulation_bytes = 0; 122982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer(mVADisplay, mVAContext, 123082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncPackedHeaderParameterBufferType, 123182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeof(packed_header_param_buffer), 1, &packed_header_param_buffer, 123282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &packed_pic_header_param_buf_id); 123382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 123482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 123582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer(mVADisplay, mVAContext, 123682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncPackedHeaderDataBufferType, 123782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON (length_in_bits + 7) / 8, 1, packed_pic_buffer, 123882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &packed_pic_buf_id); 123982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 124082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 124182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &packed_pic_header_param_buf_id, 1); 124282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 124382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 124482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &packed_pic_buf_id, 1); 124582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 124682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 124782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaUnmapBuffer(mVADisplay, mSeqParamBuf); 124882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaUnmapBuffer"); 124982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 125082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON free(packed_pic_buffer); 125182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 125282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("End\n"); 125382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 125482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return vaStatus; 125582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 125682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 125782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VideoEncoderAVC::renderSliceParams(EncodeTask *task) { 125882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 125982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus = VA_STATUS_SUCCESS; 126082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 126182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t sliceNum = 0; 126282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t sliceIndex = 0; 126382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t sliceHeightInMB = 0; 126482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t maxSliceNum = 0; 126582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t minSliceNum = 0; 126682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t actualSliceHeightInMB = 0; 126782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t startRowInMB = 0; 126882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t modulus = 0; 126982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t RefFrmIdx; 127082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 127182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "Begin\n\n"); 127282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 127382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON maxSliceNum = (mComParams.resolution.height + 15) / 16; 127482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON minSliceNum = 1; 127582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 127682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (task->type == FTYPE_I || task->type == FTYPE_IDR) { 127782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceNum = mVideoParamsAVC.sliceNum.iSliceNum; 127882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 127982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceNum = mVideoParamsAVC.sliceNum.pSliceNum; 128082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 128182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 128282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (sliceNum < minSliceNum) { 128382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_W("Slice Number is too small"); 128482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceNum = minSliceNum; 128582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 128682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 128782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (sliceNum > maxSliceNum) { 128882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_W("Slice Number is too big"); 128982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceNum = maxSliceNum; 129082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 129182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 129282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mSliceNum= sliceNum; 129382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON modulus = maxSliceNum % sliceNum; 129482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceHeightInMB = (maxSliceNum - modulus) / sliceNum ; 129582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 129682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateBuffer( 129782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVADisplay, mVAContext, 129882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncSliceParameterBufferType, 129982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sizeof(VAEncSliceParameterBufferH264), 130082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON sliceNum, NULL, 130182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &mSliceParamBuf); 130282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaCreateBuffer"); 130382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 130482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAEncSliceParameterBufferH264 *sliceParams, *currentSlice; 130582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 130682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaMapBuffer(mVADisplay, mSliceParamBuf, (void **)&sliceParams); 130782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaMapBuffer"); 130882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(!sliceParams) 130982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_NULL_PTR; 131082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON memset(sliceParams, 0 , sizeof(VAEncSliceParameterBufferH264)); 131182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(!sliceParams) 131282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_NULL_PTR; 131382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 131482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice = sliceParams; 131582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON startRowInMB = 0; 131682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON for (sliceIndex = 0; sliceIndex < sliceNum; sliceIndex++) { 131782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice = sliceParams + sliceIndex; 131882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON actualSliceHeightInMB = sliceHeightInMB; 131982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (sliceIndex < modulus) { 132082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON actualSliceHeightInMB ++; 132182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 132282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 132382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // starting MB row number for this slice, suppose macroblock 16x16 132482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->macroblock_address = startRowInMB * ((mComParams.resolution.width + 0xf) & ~0xf) / 16; 132582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // slice height measured in MB 132682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->num_macroblocks = actualSliceHeightInMB * ((mComParams.resolution.width + 0xf) & ~0xf) / 16; 132782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(task->type == FTYPE_I||task->type == FTYPE_IDR) 132882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->slice_type = 2; 132982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else if(task->type == FTYPE_P) 133082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->slice_type = 0; 133182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else if(task->type == FTYPE_B) 133282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->slice_type = 1; 133382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->disable_deblocking_filter_idc = mComParams.disableDeblocking; 133482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 133582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // This is a temporary fix suggested by Binglin for bad encoding quality issue 133682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // TODO: We need a long term design for this field 133782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //currentSlice->slice_flags.bits.uses_long_term_ref = 0; 133882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //currentSlice->slice_flags.bits.is_long_term_ref = 0; 133982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 134082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("======AVC slice params======\n"); 134167efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "slice_index = %d\n", (int) sliceIndex); 134267efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "macroblock_address = %d\n", (int) currentSlice->macroblock_address); 134367efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "slice_height_in_mb = %d\n", (int) currentSlice->num_macroblocks); 134467efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V( "slice.type = %d\n", (int) currentSlice->slice_type); 134567efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("disable_deblocking_filter_idc = %d\n\n", (int) currentSlice->disable_deblocking_filter_idc); 134682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 134782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Not sure whether these settings work for all drivers 134882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->pic_parameter_set_id = 0; 134982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->pic_order_cnt_lsb = mFrameNum * 2; 135082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->direct_spatial_mv_pred_flag = 0; 135182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->num_ref_idx_l0_active_minus1 = 0; /* FIXME: ??? */ 135282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->num_ref_idx_l1_active_minus1 = 0; 135382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->cabac_init_idc = 0; 135482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->slice_qp_delta = 0; 135582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->disable_deblocking_filter_idc = 0; 135682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->slice_alpha_c0_offset_div2 = 2; 135782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->slice_beta_offset_div2 = 2; 135882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->idr_pic_id = 0; 135982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON for (RefFrmIdx = 0; RefFrmIdx < 32; RefFrmIdx++) { 136082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->RefPicList0[RefFrmIdx].picture_id = VA_INVALID_ID; 136182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->RefPicList0[RefFrmIdx].flags = VA_PICTURE_H264_INVALID; 136282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 136382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->RefPicList0[0].picture_id = task->ref_surface; 136482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON currentSlice->RefPicList0[0].flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE; 136582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON // Not sure whether these settings work for all drivers 136682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 136782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON startRowInMB += actualSliceHeightInMB; 136882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 136982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 137082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaUnmapBuffer(mVADisplay, mSliceParamBuf); 137182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaUnmapBuffer"); 137282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 137382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaRenderPicture(mVADisplay, mVAContext, &mSliceParamBuf, 1); 137482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaRenderPicture"); 137582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V( "end\n"); 137682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 137782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 1378