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