129a84457aed4c45bc900998b5e11c03023264208James Dong/* ------------------------------------------------------------------
229a84457aed4c45bc900998b5e11c03023264208James Dong * Copyright (C) 1998-2009 PacketVideo
329a84457aed4c45bc900998b5e11c03023264208James Dong *
429a84457aed4c45bc900998b5e11c03023264208James Dong * Licensed under the Apache License, Version 2.0 (the "License");
529a84457aed4c45bc900998b5e11c03023264208James Dong * you may not use this file except in compliance with the License.
629a84457aed4c45bc900998b5e11c03023264208James Dong * You may obtain a copy of the License at
729a84457aed4c45bc900998b5e11c03023264208James Dong *
829a84457aed4c45bc900998b5e11c03023264208James Dong *      http://www.apache.org/licenses/LICENSE-2.0
929a84457aed4c45bc900998b5e11c03023264208James Dong *
1029a84457aed4c45bc900998b5e11c03023264208James Dong * Unless required by applicable law or agreed to in writing, software
1129a84457aed4c45bc900998b5e11c03023264208James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1229a84457aed4c45bc900998b5e11c03023264208James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
1329a84457aed4c45bc900998b5e11c03023264208James Dong * express or implied.
1429a84457aed4c45bc900998b5e11c03023264208James Dong * See the License for the specific language governing permissions
1529a84457aed4c45bc900998b5e11c03023264208James Dong * and limitations under the License.
1629a84457aed4c45bc900998b5e11c03023264208James Dong * -------------------------------------------------------------------
1729a84457aed4c45bc900998b5e11c03023264208James Dong */
1829a84457aed4c45bc900998b5e11c03023264208James Dong#include "avcenc_lib.h"
1929a84457aed4c45bc900998b5e11c03023264208James Dong#include "avcenc_api.h"
2029a84457aed4c45bc900998b5e11c03023264208James Dong
2129a84457aed4c45bc900998b5e11c03023264208James Dong#define LOG2_MAX_FRAME_NUM_MINUS4   12   /* 12 default */
2229a84457aed4c45bc900998b5e11c03023264208James Dong#define SLICE_GROUP_CHANGE_CYCLE    1    /* default */
2329a84457aed4c45bc900998b5e11c03023264208James Dong
2429a84457aed4c45bc900998b5e11c03023264208James Dong/* initialized variables to be used in SPS*/
2529a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status  SetEncodeParam(AVCHandle* avcHandle, AVCEncParams* encParam,
2629a84457aed4c45bc900998b5e11c03023264208James Dong                              void* extSPS, void* extPPS)
2729a84457aed4c45bc900998b5e11c03023264208James Dong{
2829a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEncObject *encvid = (AVCEncObject*) avcHandle->AVCObject;
2929a84457aed4c45bc900998b5e11c03023264208James Dong    AVCCommonObj *video = encvid->common;
3029a84457aed4c45bc900998b5e11c03023264208James Dong    AVCSeqParamSet *seqParam = video->currSeqParams;
3129a84457aed4c45bc900998b5e11c03023264208James Dong    AVCPicParamSet *picParam = video->currPicParams;
3229a84457aed4c45bc900998b5e11c03023264208James Dong    AVCSliceHeader *sliceHdr = video->sliceHdr;
3329a84457aed4c45bc900998b5e11c03023264208James Dong    AVCRateControl *rateCtrl = encvid->rateCtrl;
3429a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status;
3529a84457aed4c45bc900998b5e11c03023264208James Dong    void *userData = avcHandle->userData;
3629a84457aed4c45bc900998b5e11c03023264208James Dong    int ii, maxFrameNum;
3729a84457aed4c45bc900998b5e11c03023264208James Dong
3829a84457aed4c45bc900998b5e11c03023264208James Dong    AVCSeqParamSet* extS = NULL;
3929a84457aed4c45bc900998b5e11c03023264208James Dong    AVCPicParamSet* extP = NULL;
4029a84457aed4c45bc900998b5e11c03023264208James Dong
4129a84457aed4c45bc900998b5e11c03023264208James Dong    if (extSPS) extS = (AVCSeqParamSet*) extSPS;
4229a84457aed4c45bc900998b5e11c03023264208James Dong    if (extPPS) extP = (AVCPicParamSet*) extPPS;
4329a84457aed4c45bc900998b5e11c03023264208James Dong
4429a84457aed4c45bc900998b5e11c03023264208James Dong    /* This part sets the default values of the encoding options this
4529a84457aed4c45bc900998b5e11c03023264208James Dong    library supports in seqParam, picParam and sliceHdr structures and
4629a84457aed4c45bc900998b5e11c03023264208James Dong    also copy the values from the encParam into the above 3 structures.
4729a84457aed4c45bc900998b5e11c03023264208James Dong
4829a84457aed4c45bc900998b5e11c03023264208James Dong    Some parameters will be assigned later when we encode SPS or PPS such as
4929a84457aed4c45bc900998b5e11c03023264208James Dong    the seq_parameter_id or pic_parameter_id. Also some of the slice parameters
5029a84457aed4c45bc900998b5e11c03023264208James Dong    have to be re-assigned per slice basis such as frame_num, slice_type,
5129a84457aed4c45bc900998b5e11c03023264208James Dong    first_mb_in_slice, pic_order_cnt_lsb, slice_qp_delta, slice_group_change_cycle */
5229a84457aed4c45bc900998b5e11c03023264208James Dong
5329a84457aed4c45bc900998b5e11c03023264208James Dong    /* profile_idc, constrained_setx_flag and level_idc is set by VerifyProfile(),
5429a84457aed4c45bc900998b5e11c03023264208James Dong    and VerifyLevel() functions later. */
5529a84457aed4c45bc900998b5e11c03023264208James Dong
5629a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->fullsearch_enable = encParam->fullsearch;
5729a84457aed4c45bc900998b5e11c03023264208James Dong
5829a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->outOfBandParamSet = ((encParam->out_of_band_param_set == AVC_ON) ? TRUE : FALSE);
5929a84457aed4c45bc900998b5e11c03023264208James Dong
6029a84457aed4c45bc900998b5e11c03023264208James Dong    /* parameters derived from the the encParam that are used in SPS */
6129a84457aed4c45bc900998b5e11c03023264208James Dong    if (extS)
6229a84457aed4c45bc900998b5e11c03023264208James Dong    {
6329a84457aed4c45bc900998b5e11c03023264208James Dong        video->MaxPicOrderCntLsb =  1 << (extS->log2_max_pic_order_cnt_lsb_minus4 + 4);
6429a84457aed4c45bc900998b5e11c03023264208James Dong        video->PicWidthInMbs = extS->pic_width_in_mbs_minus1 + 1;
6529a84457aed4c45bc900998b5e11c03023264208James Dong        video->PicHeightInMapUnits = extS->pic_height_in_map_units_minus1 + 1 ;
6629a84457aed4c45bc900998b5e11c03023264208James Dong        video->FrameHeightInMbs = (2 - extS->frame_mbs_only_flag) * video->PicHeightInMapUnits ;
6729a84457aed4c45bc900998b5e11c03023264208James Dong    }
6829a84457aed4c45bc900998b5e11c03023264208James Dong    else
6929a84457aed4c45bc900998b5e11c03023264208James Dong    {
7029a84457aed4c45bc900998b5e11c03023264208James Dong        video->MaxPicOrderCntLsb =  1 << (encParam->log2_max_poc_lsb_minus_4 + 4);
7129a84457aed4c45bc900998b5e11c03023264208James Dong        video->PicWidthInMbs = (encParam->width + 15) >> 4; /* round it to multiple of 16 */
7229a84457aed4c45bc900998b5e11c03023264208James Dong        video->FrameHeightInMbs = (encParam->height + 15) >> 4; /* round it to multiple of 16 */
7329a84457aed4c45bc900998b5e11c03023264208James Dong        video->PicHeightInMapUnits = video->FrameHeightInMbs;
7429a84457aed4c45bc900998b5e11c03023264208James Dong    }
7529a84457aed4c45bc900998b5e11c03023264208James Dong
7629a84457aed4c45bc900998b5e11c03023264208James Dong    video->PicWidthInSamplesL = video->PicWidthInMbs * 16 ;
7729a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->PicWidthInSamplesL + 32 > 0xFFFF)
7829a84457aed4c45bc900998b5e11c03023264208James Dong    {
7929a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_NOT_SUPPORTED; // we use 2-bytes for pitch
8029a84457aed4c45bc900998b5e11c03023264208James Dong    }
8129a84457aed4c45bc900998b5e11c03023264208James Dong
8229a84457aed4c45bc900998b5e11c03023264208James Dong    video->PicWidthInSamplesC = video->PicWidthInMbs * 8 ;
8329a84457aed4c45bc900998b5e11c03023264208James Dong    video->PicHeightInMbs = video->FrameHeightInMbs;
8429a84457aed4c45bc900998b5e11c03023264208James Dong    video->PicSizeInMapUnits = video->PicWidthInMbs * video->PicHeightInMapUnits ;
8529a84457aed4c45bc900998b5e11c03023264208James Dong    video->PicHeightInSamplesL = video->PicHeightInMbs * 16;
8629a84457aed4c45bc900998b5e11c03023264208James Dong    video->PicHeightInSamplesC = video->PicHeightInMbs * 8;
8729a84457aed4c45bc900998b5e11c03023264208James Dong    video->PicSizeInMbs = video->PicWidthInMbs * video->PicHeightInMbs;
8829a84457aed4c45bc900998b5e11c03023264208James Dong
8929a84457aed4c45bc900998b5e11c03023264208James Dong    if (!extS && !extP)
9029a84457aed4c45bc900998b5e11c03023264208James Dong    {
9129a84457aed4c45bc900998b5e11c03023264208James Dong        maxFrameNum = (encParam->idr_period == -1) ? (1 << 16) : encParam->idr_period;
9229a84457aed4c45bc900998b5e11c03023264208James Dong        ii = 0;
9329a84457aed4c45bc900998b5e11c03023264208James Dong        while (maxFrameNum > 0)
9429a84457aed4c45bc900998b5e11c03023264208James Dong        {
9529a84457aed4c45bc900998b5e11c03023264208James Dong            ii++;
9629a84457aed4c45bc900998b5e11c03023264208James Dong            maxFrameNum >>= 1;
9729a84457aed4c45bc900998b5e11c03023264208James Dong        }
9829a84457aed4c45bc900998b5e11c03023264208James Dong        if (ii < 4) ii = 4;
9929a84457aed4c45bc900998b5e11c03023264208James Dong        else if (ii > 16) ii = 16;
10029a84457aed4c45bc900998b5e11c03023264208James Dong
10129a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->log2_max_frame_num_minus4 = ii - 4;//LOG2_MAX_FRAME_NUM_MINUS4; /* default */
10229a84457aed4c45bc900998b5e11c03023264208James Dong
10329a84457aed4c45bc900998b5e11c03023264208James Dong        video->MaxFrameNum = 1 << ii; //(LOG2_MAX_FRAME_NUM_MINUS4 + 4); /* default */
10429a84457aed4c45bc900998b5e11c03023264208James Dong        video->MaxPicNum = video->MaxFrameNum;
10529a84457aed4c45bc900998b5e11c03023264208James Dong
10629a84457aed4c45bc900998b5e11c03023264208James Dong        /************* set the SPS *******************/
10729a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->seq_parameter_set_id = 0; /* start with zero */
10829a84457aed4c45bc900998b5e11c03023264208James Dong        /* POC */
10929a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->pic_order_cnt_type = encParam->poc_type; /* POC type */
11029a84457aed4c45bc900998b5e11c03023264208James Dong        if (encParam->poc_type == 0)
11129a84457aed4c45bc900998b5e11c03023264208James Dong        {
11229a84457aed4c45bc900998b5e11c03023264208James Dong            if (/*encParam->log2_max_poc_lsb_minus_4<0 || (no need, it's unsigned)*/
11329a84457aed4c45bc900998b5e11c03023264208James Dong                encParam->log2_max_poc_lsb_minus_4 > 12)
11429a84457aed4c45bc900998b5e11c03023264208James Dong            {
11529a84457aed4c45bc900998b5e11c03023264208James Dong                return AVCENC_INVALID_POC_LSB;
11629a84457aed4c45bc900998b5e11c03023264208James Dong            }
11729a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->log2_max_pic_order_cnt_lsb_minus4 = encParam->log2_max_poc_lsb_minus_4;
11829a84457aed4c45bc900998b5e11c03023264208James Dong        }
11929a84457aed4c45bc900998b5e11c03023264208James Dong        else if (encParam->poc_type == 1)
12029a84457aed4c45bc900998b5e11c03023264208James Dong        {
12129a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->delta_pic_order_always_zero_flag = encParam->delta_poc_zero_flag;
12229a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->offset_for_non_ref_pic = encParam->offset_poc_non_ref;
12329a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->offset_for_top_to_bottom_field = encParam->offset_top_bottom;
12429a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->num_ref_frames_in_pic_order_cnt_cycle = encParam->num_ref_in_cycle;
12529a84457aed4c45bc900998b5e11c03023264208James Dong            if (encParam->offset_poc_ref == NULL)
12629a84457aed4c45bc900998b5e11c03023264208James Dong            {
12729a84457aed4c45bc900998b5e11c03023264208James Dong                return AVCENC_ENCPARAM_MEM_FAIL;
12829a84457aed4c45bc900998b5e11c03023264208James Dong            }
12929a84457aed4c45bc900998b5e11c03023264208James Dong            for (ii = 0; ii < encParam->num_ref_frame; ii++)
13029a84457aed4c45bc900998b5e11c03023264208James Dong            {
13129a84457aed4c45bc900998b5e11c03023264208James Dong                seqParam->offset_for_ref_frame[ii] = encParam->offset_poc_ref[ii];
13229a84457aed4c45bc900998b5e11c03023264208James Dong            }
13329a84457aed4c45bc900998b5e11c03023264208James Dong        }
13429a84457aed4c45bc900998b5e11c03023264208James Dong        /* number of reference frame */
13529a84457aed4c45bc900998b5e11c03023264208James Dong        if (encParam->num_ref_frame > 16 || encParam->num_ref_frame < 0)
13629a84457aed4c45bc900998b5e11c03023264208James Dong        {
13729a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INVALID_NUM_REF;
13829a84457aed4c45bc900998b5e11c03023264208James Dong        }
13929a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->num_ref_frames = encParam->num_ref_frame; /* num reference frame range 0...16*/
14029a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->gaps_in_frame_num_value_allowed_flag = FALSE;
14129a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->pic_width_in_mbs_minus1 = video->PicWidthInMbs - 1;
14229a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->pic_height_in_map_units_minus1 = video->PicHeightInMapUnits - 1;
14329a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_mbs_only_flag = TRUE;
14429a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->mb_adaptive_frame_field_flag = FALSE;
14529a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->direct_8x8_inference_flag = FALSE; /* default */
14629a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_cropping_flag = FALSE;
14729a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_crop_bottom_offset = 0;
14829a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_crop_left_offset = 0;
14929a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_crop_right_offset = 0;
15029a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_crop_top_offset = 0;
15129a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->vui_parameters_present_flag = FALSE; /* default */
15229a84457aed4c45bc900998b5e11c03023264208James Dong    }
15329a84457aed4c45bc900998b5e11c03023264208James Dong    else if (extS) // use external SPS and PPS
15429a84457aed4c45bc900998b5e11c03023264208James Dong    {
15529a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->seq_parameter_set_id = extS->seq_parameter_set_id;
15629a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->log2_max_frame_num_minus4 = extS->log2_max_frame_num_minus4;
15729a84457aed4c45bc900998b5e11c03023264208James Dong        video->MaxFrameNum = 1 << (extS->log2_max_frame_num_minus4 + 4);
15829a84457aed4c45bc900998b5e11c03023264208James Dong        video->MaxPicNum = video->MaxFrameNum;
15929a84457aed4c45bc900998b5e11c03023264208James Dong        if (encParam->idr_period > (int)(video->MaxFrameNum) || (encParam->idr_period == -1))
16029a84457aed4c45bc900998b5e11c03023264208James Dong        {
16129a84457aed4c45bc900998b5e11c03023264208James Dong            encParam->idr_period = (int)video->MaxFrameNum;
16229a84457aed4c45bc900998b5e11c03023264208James Dong        }
16329a84457aed4c45bc900998b5e11c03023264208James Dong
16429a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->pic_order_cnt_type = extS->pic_order_cnt_type;
16529a84457aed4c45bc900998b5e11c03023264208James Dong        if (seqParam->pic_order_cnt_type == 0)
16629a84457aed4c45bc900998b5e11c03023264208James Dong        {
16729a84457aed4c45bc900998b5e11c03023264208James Dong            if (/*extS->log2_max_pic_order_cnt_lsb_minus4<0 || (no need it's unsigned)*/
16829a84457aed4c45bc900998b5e11c03023264208James Dong                extS->log2_max_pic_order_cnt_lsb_minus4 > 12)
16929a84457aed4c45bc900998b5e11c03023264208James Dong            {
17029a84457aed4c45bc900998b5e11c03023264208James Dong                return AVCENC_INVALID_POC_LSB;
17129a84457aed4c45bc900998b5e11c03023264208James Dong            }
17229a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->log2_max_pic_order_cnt_lsb_minus4 = extS->log2_max_pic_order_cnt_lsb_minus4;
17329a84457aed4c45bc900998b5e11c03023264208James Dong        }
17429a84457aed4c45bc900998b5e11c03023264208James Dong        else if (seqParam->pic_order_cnt_type == 1)
17529a84457aed4c45bc900998b5e11c03023264208James Dong        {
17629a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->delta_pic_order_always_zero_flag = extS->delta_pic_order_always_zero_flag;
17729a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->offset_for_non_ref_pic = extS->offset_for_non_ref_pic;
17829a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->offset_for_top_to_bottom_field = extS->offset_for_top_to_bottom_field;
17929a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->num_ref_frames_in_pic_order_cnt_cycle = extS->num_ref_frames_in_pic_order_cnt_cycle;
18029a84457aed4c45bc900998b5e11c03023264208James Dong            for (ii = 0; ii < (int) extS->num_ref_frames; ii++)
18129a84457aed4c45bc900998b5e11c03023264208James Dong            {
18229a84457aed4c45bc900998b5e11c03023264208James Dong                seqParam->offset_for_ref_frame[ii] = extS->offset_for_ref_frame[ii];
18329a84457aed4c45bc900998b5e11c03023264208James Dong            }
18429a84457aed4c45bc900998b5e11c03023264208James Dong        }
18529a84457aed4c45bc900998b5e11c03023264208James Dong        /* number of reference frame */
18629a84457aed4c45bc900998b5e11c03023264208James Dong        if (extS->num_ref_frames > 16 /*|| extS->num_ref_frames<0 (no need, it's unsigned)*/)
18729a84457aed4c45bc900998b5e11c03023264208James Dong        {
18829a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INVALID_NUM_REF;
18929a84457aed4c45bc900998b5e11c03023264208James Dong        }
19029a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->num_ref_frames = extS->num_ref_frames; /* num reference frame range 0...16*/
19129a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->gaps_in_frame_num_value_allowed_flag = extS->gaps_in_frame_num_value_allowed_flag;
19229a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->pic_width_in_mbs_minus1 = extS->pic_width_in_mbs_minus1;
19329a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->pic_height_in_map_units_minus1 = extS->pic_height_in_map_units_minus1;
19429a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_mbs_only_flag = extS->frame_mbs_only_flag;
19529a84457aed4c45bc900998b5e11c03023264208James Dong        if (extS->frame_mbs_only_flag != TRUE)
19629a84457aed4c45bc900998b5e11c03023264208James Dong        {
19729a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
19829a84457aed4c45bc900998b5e11c03023264208James Dong        }
19929a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->mb_adaptive_frame_field_flag = extS->mb_adaptive_frame_field_flag;
20029a84457aed4c45bc900998b5e11c03023264208James Dong        if (extS->mb_adaptive_frame_field_flag != FALSE)
20129a84457aed4c45bc900998b5e11c03023264208James Dong        {
20229a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
20329a84457aed4c45bc900998b5e11c03023264208James Dong        }
20429a84457aed4c45bc900998b5e11c03023264208James Dong
20529a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->direct_8x8_inference_flag = extS->direct_8x8_inference_flag;
20629a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_cropping_flag = extS->frame_cropping_flag ;
20729a84457aed4c45bc900998b5e11c03023264208James Dong        if (extS->frame_cropping_flag != FALSE)
20829a84457aed4c45bc900998b5e11c03023264208James Dong        {
20929a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
21029a84457aed4c45bc900998b5e11c03023264208James Dong        }
21129a84457aed4c45bc900998b5e11c03023264208James Dong
21229a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_crop_bottom_offset = 0;
21329a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_crop_left_offset = 0;
21429a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_crop_right_offset = 0;
21529a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_crop_top_offset = 0;
21629a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->vui_parameters_present_flag = extS->vui_parameters_present_flag;
21729a84457aed4c45bc900998b5e11c03023264208James Dong        if (extS->vui_parameters_present_flag)
21829a84457aed4c45bc900998b5e11c03023264208James Dong        {
21929a84457aed4c45bc900998b5e11c03023264208James Dong            memcpy(&(seqParam->vui_parameters), &(extS->vui_parameters), sizeof(AVCVUIParams));
22029a84457aed4c45bc900998b5e11c03023264208James Dong        }
22129a84457aed4c45bc900998b5e11c03023264208James Dong    }
22229a84457aed4c45bc900998b5e11c03023264208James Dong    else
22329a84457aed4c45bc900998b5e11c03023264208James Dong    {
22429a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_NOT_SUPPORTED;
22529a84457aed4c45bc900998b5e11c03023264208James Dong    }
22629a84457aed4c45bc900998b5e11c03023264208James Dong
22729a84457aed4c45bc900998b5e11c03023264208James Dong    /***************** now PPS ******************************/
22829a84457aed4c45bc900998b5e11c03023264208James Dong    if (!extP && !extS)
22929a84457aed4c45bc900998b5e11c03023264208James Dong    {
23029a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_parameter_set_id = (uint)(-1); /* start with zero */
23129a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->seq_parameter_set_id = (uint)(-1); /* start with zero */
23229a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->entropy_coding_mode_flag = 0; /* default to CAVLC */
23329a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_order_present_flag = 0; /* default for now, will need it for B-slice */
23429a84457aed4c45bc900998b5e11c03023264208James Dong        /* FMO */
23529a84457aed4c45bc900998b5e11c03023264208James Dong        if (encParam->num_slice_group < 1 || encParam->num_slice_group > MAX_NUM_SLICE_GROUP)
23629a84457aed4c45bc900998b5e11c03023264208James Dong        {
23729a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INVALID_NUM_SLICEGROUP;
23829a84457aed4c45bc900998b5e11c03023264208James Dong        }
23929a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->num_slice_groups_minus1 = encParam->num_slice_group - 1;
24029a84457aed4c45bc900998b5e11c03023264208James Dong
24129a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->num_slice_groups_minus1 > 0)
24229a84457aed4c45bc900998b5e11c03023264208James Dong        {
24329a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->slice_group_map_type = encParam->fmo_type;
24429a84457aed4c45bc900998b5e11c03023264208James Dong            switch (encParam->fmo_type)
24529a84457aed4c45bc900998b5e11c03023264208James Dong            {
24629a84457aed4c45bc900998b5e11c03023264208James Dong                case 0:
24729a84457aed4c45bc900998b5e11c03023264208James Dong                    for (ii = 0; ii <= (int)picParam->num_slice_groups_minus1; ii++)
24829a84457aed4c45bc900998b5e11c03023264208James Dong                    {
24929a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->run_length_minus1[ii] = encParam->run_length_minus1[ii];
25029a84457aed4c45bc900998b5e11c03023264208James Dong                    }
25129a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
25229a84457aed4c45bc900998b5e11c03023264208James Dong                case 2:
25329a84457aed4c45bc900998b5e11c03023264208James Dong                    for (ii = 0; ii < (int)picParam->num_slice_groups_minus1; ii++)
25429a84457aed4c45bc900998b5e11c03023264208James Dong                    {
25529a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->top_left[ii] = encParam->top_left[ii];
25629a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->bottom_right[ii] = encParam->bottom_right[ii];
25729a84457aed4c45bc900998b5e11c03023264208James Dong                    }
25829a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
25929a84457aed4c45bc900998b5e11c03023264208James Dong                case 3:
26029a84457aed4c45bc900998b5e11c03023264208James Dong                case 4:
26129a84457aed4c45bc900998b5e11c03023264208James Dong                case 5:
26229a84457aed4c45bc900998b5e11c03023264208James Dong                    if (encParam->change_dir_flag == AVC_ON)
26329a84457aed4c45bc900998b5e11c03023264208James Dong                    {
26429a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->slice_group_change_direction_flag = TRUE;
26529a84457aed4c45bc900998b5e11c03023264208James Dong                    }
26629a84457aed4c45bc900998b5e11c03023264208James Dong                    else
26729a84457aed4c45bc900998b5e11c03023264208James Dong                    {
26829a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->slice_group_change_direction_flag = FALSE;
26929a84457aed4c45bc900998b5e11c03023264208James Dong                    }
27029a84457aed4c45bc900998b5e11c03023264208James Dong                    if (/*encParam->change_rate_minus1 < 0 || (no need it's unsigned) */
27129a84457aed4c45bc900998b5e11c03023264208James Dong                        encParam->change_rate_minus1 > video->PicSizeInMapUnits - 1)
27229a84457aed4c45bc900998b5e11c03023264208James Dong                    {
27329a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_INVALID_CHANGE_RATE;
27429a84457aed4c45bc900998b5e11c03023264208James Dong                    }
27529a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->slice_group_change_rate_minus1 = encParam->change_rate_minus1;
27629a84457aed4c45bc900998b5e11c03023264208James Dong                    video->SliceGroupChangeRate = picParam->slice_group_change_rate_minus1 + 1;
27729a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
27829a84457aed4c45bc900998b5e11c03023264208James Dong                case 6:
27929a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->pic_size_in_map_units_minus1 = video->PicSizeInMapUnits - 1;
28029a84457aed4c45bc900998b5e11c03023264208James Dong
28129a84457aed4c45bc900998b5e11c03023264208James Dong                    /* allocate picParam->slice_group_id */
28229a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->slice_group_id = (uint*)avcHandle->CBAVC_Malloc(userData, sizeof(uint) * video->PicSizeInMapUnits, DEFAULT_ATTR);
28329a84457aed4c45bc900998b5e11c03023264208James Dong                    if (picParam->slice_group_id == NULL)
28429a84457aed4c45bc900998b5e11c03023264208James Dong                    {
28529a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_MEMORY_FAIL;
28629a84457aed4c45bc900998b5e11c03023264208James Dong                    }
28729a84457aed4c45bc900998b5e11c03023264208James Dong
28829a84457aed4c45bc900998b5e11c03023264208James Dong                    if (encParam->slice_group == NULL)
28929a84457aed4c45bc900998b5e11c03023264208James Dong                    {
29029a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_ENCPARAM_MEM_FAIL;
29129a84457aed4c45bc900998b5e11c03023264208James Dong                    }
29229a84457aed4c45bc900998b5e11c03023264208James Dong                    for (ii = 0; ii < (int)video->PicSizeInMapUnits; ii++)
29329a84457aed4c45bc900998b5e11c03023264208James Dong                    {
29429a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->slice_group_id[ii] = encParam->slice_group[ii];
29529a84457aed4c45bc900998b5e11c03023264208James Dong                    }
29629a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
29729a84457aed4c45bc900998b5e11c03023264208James Dong                default:
29829a84457aed4c45bc900998b5e11c03023264208James Dong                    return AVCENC_INVALID_FMO_TYPE;
29929a84457aed4c45bc900998b5e11c03023264208James Dong            }
30029a84457aed4c45bc900998b5e11c03023264208James Dong        }
30129a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->num_ref_idx_l0_active_minus1 = encParam->num_ref_frame - 1; /* assume frame only */
30229a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->num_ref_idx_l1_active_minus1 = 0; /* default value */
30329a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->weighted_pred_flag = 0; /* no weighted prediction supported */
30429a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->weighted_bipred_idc = 0; /* range 0,1,2 */
30529a84457aed4c45bc900998b5e11c03023264208James Dong        if (/*picParam->weighted_bipred_idc < 0 || (no need, it's unsigned) */
30629a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->weighted_bipred_idc > 2)
30729a84457aed4c45bc900998b5e11c03023264208James Dong        {
30829a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_WEIGHTED_BIPRED_FAIL;
30929a84457aed4c45bc900998b5e11c03023264208James Dong        }
31029a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_init_qp_minus26 = 0; /* default, will be changed at slice level anyway */
31129a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->pic_init_qp_minus26 < -26 || picParam->pic_init_qp_minus26 > 25)
31229a84457aed4c45bc900998b5e11c03023264208James Dong        {
31329a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INIT_QP_FAIL; /* out of range */
31429a84457aed4c45bc900998b5e11c03023264208James Dong        }
31529a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_init_qs_minus26 = 0;
31629a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->pic_init_qs_minus26 < -26 || picParam->pic_init_qs_minus26 > 25)
31729a84457aed4c45bc900998b5e11c03023264208James Dong        {
31829a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INIT_QS_FAIL; /* out of range */
31929a84457aed4c45bc900998b5e11c03023264208James Dong        }
32029a84457aed4c45bc900998b5e11c03023264208James Dong
32129a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->chroma_qp_index_offset = 0; /* default to zero for now */
32229a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->chroma_qp_index_offset < -12 || picParam->chroma_qp_index_offset > 12)
32329a84457aed4c45bc900998b5e11c03023264208James Dong        {
32429a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_CHROMA_QP_FAIL; /* out of range */
32529a84457aed4c45bc900998b5e11c03023264208James Dong        }
32629a84457aed4c45bc900998b5e11c03023264208James Dong        /* deblocking */
32729a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->deblocking_filter_control_present_flag = (encParam->db_filter == AVC_ON) ? TRUE : FALSE ;
32829a84457aed4c45bc900998b5e11c03023264208James Dong        /* constrained intra prediction */
32929a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->constrained_intra_pred_flag = (encParam->constrained_intra_pred == AVC_ON) ? TRUE : FALSE;
33029a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->redundant_pic_cnt_present_flag = 0; /* default */
33129a84457aed4c45bc900998b5e11c03023264208James Dong    }
33229a84457aed4c45bc900998b5e11c03023264208James Dong    else if (extP)// external PPS
33329a84457aed4c45bc900998b5e11c03023264208James Dong    {
33429a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_parameter_set_id = extP->pic_parameter_set_id - 1; /* to be increased by one */
33529a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->seq_parameter_set_id = extP->seq_parameter_set_id;
33629a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->entropy_coding_mode_flag = extP->entropy_coding_mode_flag;
33729a84457aed4c45bc900998b5e11c03023264208James Dong        if (extP->entropy_coding_mode_flag != 0) /* default to CAVLC */
33829a84457aed4c45bc900998b5e11c03023264208James Dong        {
33929a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
34029a84457aed4c45bc900998b5e11c03023264208James Dong        }
34129a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_order_present_flag = extP->pic_order_present_flag; /* default for now, will need it for B-slice */
34229a84457aed4c45bc900998b5e11c03023264208James Dong        if (extP->pic_order_present_flag != 0)
34329a84457aed4c45bc900998b5e11c03023264208James Dong        {
34429a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
34529a84457aed4c45bc900998b5e11c03023264208James Dong        }
34629a84457aed4c45bc900998b5e11c03023264208James Dong        /* FMO */
34729a84457aed4c45bc900998b5e11c03023264208James Dong        if (/*(extP->num_slice_groups_minus1<0) || (no need it's unsigned) */
34829a84457aed4c45bc900998b5e11c03023264208James Dong            (extP->num_slice_groups_minus1 > MAX_NUM_SLICE_GROUP - 1))
34929a84457aed4c45bc900998b5e11c03023264208James Dong        {
35029a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INVALID_NUM_SLICEGROUP;
35129a84457aed4c45bc900998b5e11c03023264208James Dong        }
35229a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->num_slice_groups_minus1 = extP->num_slice_groups_minus1;
35329a84457aed4c45bc900998b5e11c03023264208James Dong
35429a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->num_slice_groups_minus1 > 0)
35529a84457aed4c45bc900998b5e11c03023264208James Dong        {
35629a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->slice_group_map_type = extP->slice_group_map_type;
35729a84457aed4c45bc900998b5e11c03023264208James Dong            switch (extP->slice_group_map_type)
35829a84457aed4c45bc900998b5e11c03023264208James Dong            {
35929a84457aed4c45bc900998b5e11c03023264208James Dong                case 0:
36029a84457aed4c45bc900998b5e11c03023264208James Dong                    for (ii = 0; ii <= (int)extP->num_slice_groups_minus1; ii++)
36129a84457aed4c45bc900998b5e11c03023264208James Dong                    {
36229a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->run_length_minus1[ii] = extP->run_length_minus1[ii];
36329a84457aed4c45bc900998b5e11c03023264208James Dong                    }
36429a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
36529a84457aed4c45bc900998b5e11c03023264208James Dong                case 2:
36629a84457aed4c45bc900998b5e11c03023264208James Dong                    for (ii = 0; ii < (int)picParam->num_slice_groups_minus1; ii++)
36729a84457aed4c45bc900998b5e11c03023264208James Dong                    {
36829a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->top_left[ii] = extP->top_left[ii];
36929a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->bottom_right[ii] = extP->bottom_right[ii];
37029a84457aed4c45bc900998b5e11c03023264208James Dong                    }
37129a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
37229a84457aed4c45bc900998b5e11c03023264208James Dong                case 3:
37329a84457aed4c45bc900998b5e11c03023264208James Dong                case 4:
37429a84457aed4c45bc900998b5e11c03023264208James Dong                case 5:
37529a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->slice_group_change_direction_flag = extP->slice_group_change_direction_flag;
37629a84457aed4c45bc900998b5e11c03023264208James Dong                    if (/*extP->slice_group_change_rate_minus1 < 0 || (no need, it's unsigned) */
37729a84457aed4c45bc900998b5e11c03023264208James Dong                        extP->slice_group_change_rate_minus1 > video->PicSizeInMapUnits - 1)
37829a84457aed4c45bc900998b5e11c03023264208James Dong                    {
37929a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_INVALID_CHANGE_RATE;
38029a84457aed4c45bc900998b5e11c03023264208James Dong                    }
38129a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->slice_group_change_rate_minus1 = extP->slice_group_change_rate_minus1;
38229a84457aed4c45bc900998b5e11c03023264208James Dong                    video->SliceGroupChangeRate = picParam->slice_group_change_rate_minus1 + 1;
38329a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
38429a84457aed4c45bc900998b5e11c03023264208James Dong                case 6:
38529a84457aed4c45bc900998b5e11c03023264208James Dong                    if (extP->pic_size_in_map_units_minus1 != video->PicSizeInMapUnits - 1)
38629a84457aed4c45bc900998b5e11c03023264208James Dong                    {
38729a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_NOT_SUPPORTED;
38829a84457aed4c45bc900998b5e11c03023264208James Dong                    }
38929a84457aed4c45bc900998b5e11c03023264208James Dong
39029a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->pic_size_in_map_units_minus1 = extP->pic_size_in_map_units_minus1;
39129a84457aed4c45bc900998b5e11c03023264208James Dong
39229a84457aed4c45bc900998b5e11c03023264208James Dong                    /* allocate picParam->slice_group_id */
39329a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->slice_group_id = (uint*)avcHandle->CBAVC_Malloc(userData, sizeof(uint) * video->PicSizeInMapUnits, DEFAULT_ATTR);
39429a84457aed4c45bc900998b5e11c03023264208James Dong                    if (picParam->slice_group_id == NULL)
39529a84457aed4c45bc900998b5e11c03023264208James Dong                    {
39629a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_MEMORY_FAIL;
39729a84457aed4c45bc900998b5e11c03023264208James Dong                    }
39829a84457aed4c45bc900998b5e11c03023264208James Dong
39929a84457aed4c45bc900998b5e11c03023264208James Dong                    if (extP->slice_group_id == NULL)
40029a84457aed4c45bc900998b5e11c03023264208James Dong                    {
40129a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_ENCPARAM_MEM_FAIL;
40229a84457aed4c45bc900998b5e11c03023264208James Dong                    }
40329a84457aed4c45bc900998b5e11c03023264208James Dong                    for (ii = 0; ii < (int)video->PicSizeInMapUnits; ii++)
40429a84457aed4c45bc900998b5e11c03023264208James Dong                    {
40529a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->slice_group_id[ii] = extP->slice_group_id[ii];
40629a84457aed4c45bc900998b5e11c03023264208James Dong                    }
40729a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
40829a84457aed4c45bc900998b5e11c03023264208James Dong                default:
40929a84457aed4c45bc900998b5e11c03023264208James Dong                    return AVCENC_INVALID_FMO_TYPE;
41029a84457aed4c45bc900998b5e11c03023264208James Dong            }
41129a84457aed4c45bc900998b5e11c03023264208James Dong        }
41229a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->num_ref_idx_l0_active_minus1 = extP->num_ref_idx_l0_active_minus1;
41329a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->num_ref_idx_l1_active_minus1 = extP->num_ref_idx_l1_active_minus1; /* default value */
41429a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->num_ref_idx_l1_active_minus1 != 0)
41529a84457aed4c45bc900998b5e11c03023264208James Dong        {
41629a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
41729a84457aed4c45bc900998b5e11c03023264208James Dong        }
41829a84457aed4c45bc900998b5e11c03023264208James Dong
41929a84457aed4c45bc900998b5e11c03023264208James Dong        if (extP->weighted_pred_flag)
42029a84457aed4c45bc900998b5e11c03023264208James Dong        {
42129a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
42229a84457aed4c45bc900998b5e11c03023264208James Dong        }
42329a84457aed4c45bc900998b5e11c03023264208James Dong
42429a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->weighted_pred_flag = 0; /* no weighted prediction supported */
42529a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->weighted_bipred_idc = extP->weighted_bipred_idc; /* range 0,1,2 */
42629a84457aed4c45bc900998b5e11c03023264208James Dong        if (/*picParam->weighted_bipred_idc < 0 || (no need, it's unsigned) */
42729a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->weighted_bipred_idc > 2)
42829a84457aed4c45bc900998b5e11c03023264208James Dong        {
42929a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_WEIGHTED_BIPRED_FAIL;
43029a84457aed4c45bc900998b5e11c03023264208James Dong        }
43129a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_init_qp_minus26 = extP->pic_init_qp_minus26; /* default, will be changed at slice level anyway */
43229a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->pic_init_qp_minus26 < -26 || picParam->pic_init_qp_minus26 > 25)
43329a84457aed4c45bc900998b5e11c03023264208James Dong        {
43429a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INIT_QP_FAIL; /* out of range */
43529a84457aed4c45bc900998b5e11c03023264208James Dong        }
43629a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_init_qs_minus26 = extP->pic_init_qs_minus26;
43729a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->pic_init_qs_minus26 < -26 || picParam->pic_init_qs_minus26 > 25)
43829a84457aed4c45bc900998b5e11c03023264208James Dong        {
43929a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INIT_QS_FAIL; /* out of range */
44029a84457aed4c45bc900998b5e11c03023264208James Dong        }
44129a84457aed4c45bc900998b5e11c03023264208James Dong
44229a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->chroma_qp_index_offset = extP->chroma_qp_index_offset; /* default to zero for now */
44329a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->chroma_qp_index_offset < -12 || picParam->chroma_qp_index_offset > 12)
44429a84457aed4c45bc900998b5e11c03023264208James Dong        {
44529a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_CHROMA_QP_FAIL; /* out of range */
44629a84457aed4c45bc900998b5e11c03023264208James Dong        }
44729a84457aed4c45bc900998b5e11c03023264208James Dong        /* deblocking */
44829a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->deblocking_filter_control_present_flag = extP->deblocking_filter_control_present_flag;
44929a84457aed4c45bc900998b5e11c03023264208James Dong        /* constrained intra prediction */
45029a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->constrained_intra_pred_flag = extP->constrained_intra_pred_flag;
45129a84457aed4c45bc900998b5e11c03023264208James Dong        if (extP->redundant_pic_cnt_present_flag  != 0)
45229a84457aed4c45bc900998b5e11c03023264208James Dong        {
45329a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
45429a84457aed4c45bc900998b5e11c03023264208James Dong        }
45529a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->redundant_pic_cnt_present_flag = extP->redundant_pic_cnt_present_flag; /* default */
45629a84457aed4c45bc900998b5e11c03023264208James Dong    }
45729a84457aed4c45bc900998b5e11c03023264208James Dong    else
45829a84457aed4c45bc900998b5e11c03023264208James Dong    {
45929a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_NOT_SUPPORTED;
46029a84457aed4c45bc900998b5e11c03023264208James Dong    }
46129a84457aed4c45bc900998b5e11c03023264208James Dong
46229a84457aed4c45bc900998b5e11c03023264208James Dong    /****************** now set up some SliceHeader parameters ***********/
46329a84457aed4c45bc900998b5e11c03023264208James Dong    if (picParam->deblocking_filter_control_present_flag == TRUE)
46429a84457aed4c45bc900998b5e11c03023264208James Dong    {
46529a84457aed4c45bc900998b5e11c03023264208James Dong        /* these values only present when db_filter is ON */
46629a84457aed4c45bc900998b5e11c03023264208James Dong        if (encParam->disable_db_idc > 2)
46729a84457aed4c45bc900998b5e11c03023264208James Dong        {
46829a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INVALID_DEBLOCK_IDC; /* out of range */
46929a84457aed4c45bc900998b5e11c03023264208James Dong        }
47029a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->disable_deblocking_filter_idc = encParam->disable_db_idc;
47129a84457aed4c45bc900998b5e11c03023264208James Dong
47229a84457aed4c45bc900998b5e11c03023264208James Dong        if (encParam->alpha_offset < -6 || encParam->alpha_offset > 6)
47329a84457aed4c45bc900998b5e11c03023264208James Dong        {
47429a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INVALID_ALPHA_OFFSET;
47529a84457aed4c45bc900998b5e11c03023264208James Dong        }
47629a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->slice_alpha_c0_offset_div2 = encParam->alpha_offset;
47729a84457aed4c45bc900998b5e11c03023264208James Dong
47829a84457aed4c45bc900998b5e11c03023264208James Dong        if (encParam->beta_offset < -6 || encParam->beta_offset > 6)
47929a84457aed4c45bc900998b5e11c03023264208James Dong        {
48029a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INVALID_BETA_OFFSET;
48129a84457aed4c45bc900998b5e11c03023264208James Dong        }
48229a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->slice_beta_offset_div_2 =  encParam->beta_offset;
48329a84457aed4c45bc900998b5e11c03023264208James Dong    }
48429a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid->outOfBandParamSet == TRUE)
48529a84457aed4c45bc900998b5e11c03023264208James Dong    {
48629a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->idr_pic_id = 0;
48729a84457aed4c45bc900998b5e11c03023264208James Dong    }
48829a84457aed4c45bc900998b5e11c03023264208James Dong    else
48929a84457aed4c45bc900998b5e11c03023264208James Dong    {
49029a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->idr_pic_id = (uint)(-1); /* start with zero */
49129a84457aed4c45bc900998b5e11c03023264208James Dong    }
49229a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->field_pic_flag = FALSE;
49329a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->bottom_field_flag = FALSE;  /* won't be used anyway */
49429a84457aed4c45bc900998b5e11c03023264208James Dong    video->MbaffFrameFlag = (seqParam->mb_adaptive_frame_field_flag && !sliceHdr->field_pic_flag);
49529a84457aed4c45bc900998b5e11c03023264208James Dong
49629a84457aed4c45bc900998b5e11c03023264208James Dong    /* the rest will be set in InitSlice() */
49729a84457aed4c45bc900998b5e11c03023264208James Dong
49829a84457aed4c45bc900998b5e11c03023264208James Dong    /* now the rate control and performance related parameters */
49929a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->scdEnable = (encParam->auto_scd == AVC_ON) ? TRUE : FALSE;
50029a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->idrPeriod = encParam->idr_period + 1;
50129a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->intraMBRate = encParam->intramb_refresh;
50229a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->dpEnable = (encParam->data_par == AVC_ON) ? TRUE : FALSE;
50329a84457aed4c45bc900998b5e11c03023264208James Dong
50429a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->subPelEnable = (encParam->sub_pel == AVC_ON) ? TRUE : FALSE;
50529a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->mvRange = encParam->search_range;
50629a84457aed4c45bc900998b5e11c03023264208James Dong
50729a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->subMBEnable = (encParam->submb_pred == AVC_ON) ? TRUE : FALSE;
50829a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->rdOptEnable = (encParam->rdopt_mode == AVC_ON) ? TRUE : FALSE;
50929a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->bidirPred = (encParam->bidir_pred == AVC_ON) ? TRUE : FALSE;
51029a84457aed4c45bc900998b5e11c03023264208James Dong
51129a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->rcEnable = (encParam->rate_control == AVC_ON) ? TRUE : FALSE;
51229a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->initQP = encParam->initQP;
51329a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->initQP = AVC_CLIP3(0, 51, rateCtrl->initQP);
51429a84457aed4c45bc900998b5e11c03023264208James Dong
51529a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->bitRate = encParam->bitrate;
51629a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->cpbSize = encParam->CPB_size;
51729a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->initDelayOffset = (rateCtrl->bitRate * encParam->init_CBP_removal_delay / 1000);
51829a84457aed4c45bc900998b5e11c03023264208James Dong
51929a84457aed4c45bc900998b5e11c03023264208James Dong    if (encParam->frame_rate == 0)
52029a84457aed4c45bc900998b5e11c03023264208James Dong    {
52129a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_INVALID_FRAMERATE;
52229a84457aed4c45bc900998b5e11c03023264208James Dong    }
52329a84457aed4c45bc900998b5e11c03023264208James Dong
52429a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->frame_rate = (OsclFloat)(encParam->frame_rate * 1.0 / 1000);
52529a84457aed4c45bc900998b5e11c03023264208James Dong//  rateCtrl->srcInterval = encParam->src_interval;
52629a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->first_frame = 1; /* set this flag for the first time */
52729a84457aed4c45bc900998b5e11c03023264208James Dong
52829a84457aed4c45bc900998b5e11c03023264208James Dong    /* contrained_setx_flag will be set inside the VerifyProfile called below.*/
52929a84457aed4c45bc900998b5e11c03023264208James Dong    if (!extS && !extP)
53029a84457aed4c45bc900998b5e11c03023264208James Dong    {
53129a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->profile_idc = encParam->profile;
53229a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set0_flag = FALSE;
53329a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set1_flag = FALSE;
53429a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set2_flag = FALSE;
53529a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set3_flag = FALSE;
53629a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->level_idc = encParam->level;
53729a84457aed4c45bc900998b5e11c03023264208James Dong    }
53829a84457aed4c45bc900998b5e11c03023264208James Dong    else
53929a84457aed4c45bc900998b5e11c03023264208James Dong    {
54029a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->profile_idc = extS->profile_idc;
54129a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set0_flag = extS->constrained_set0_flag;
54229a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set1_flag = extS->constrained_set1_flag;
54329a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set2_flag = extS->constrained_set2_flag;
54429a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set3_flag = extS->constrained_set3_flag;
54529a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->level_idc = extS->level_idc;
54629a84457aed4c45bc900998b5e11c03023264208James Dong    }
54729a84457aed4c45bc900998b5e11c03023264208James Dong
54829a84457aed4c45bc900998b5e11c03023264208James Dong
54929a84457aed4c45bc900998b5e11c03023264208James Dong    status = VerifyProfile(encvid, seqParam, picParam);
55029a84457aed4c45bc900998b5e11c03023264208James Dong    if (status != AVCENC_SUCCESS)
55129a84457aed4c45bc900998b5e11c03023264208James Dong    {
55229a84457aed4c45bc900998b5e11c03023264208James Dong        return status;
55329a84457aed4c45bc900998b5e11c03023264208James Dong    }
55429a84457aed4c45bc900998b5e11c03023264208James Dong
55529a84457aed4c45bc900998b5e11c03023264208James Dong    status = VerifyLevel(encvid, seqParam, picParam);
55629a84457aed4c45bc900998b5e11c03023264208James Dong    if (status != AVCENC_SUCCESS)
55729a84457aed4c45bc900998b5e11c03023264208James Dong    {
55829a84457aed4c45bc900998b5e11c03023264208James Dong        return status;
55929a84457aed4c45bc900998b5e11c03023264208James Dong    }
56029a84457aed4c45bc900998b5e11c03023264208James Dong
56129a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_SUCCESS;
56229a84457aed4c45bc900998b5e11c03023264208James Dong}
56329a84457aed4c45bc900998b5e11c03023264208James Dong
56429a84457aed4c45bc900998b5e11c03023264208James Dong/* verify the profile setting */
56529a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status VerifyProfile(AVCEncObject *encvid, AVCSeqParamSet *seqParam, AVCPicParamSet *picParam)
56629a84457aed4c45bc900998b5e11c03023264208James Dong{
56729a84457aed4c45bc900998b5e11c03023264208James Dong    AVCRateControl *rateCtrl = encvid->rateCtrl;
56829a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status = AVCENC_SUCCESS;
56929a84457aed4c45bc900998b5e11c03023264208James Dong
57029a84457aed4c45bc900998b5e11c03023264208James Dong    if (seqParam->profile_idc == 0) /* find profile for this setting */
57129a84457aed4c45bc900998b5e11c03023264208James Dong    {
57229a84457aed4c45bc900998b5e11c03023264208James Dong        /* find the right profile for it */
57329a84457aed4c45bc900998b5e11c03023264208James Dong        if (seqParam->direct_8x8_inference_flag == TRUE &&
57429a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->entropy_coding_mode_flag == FALSE &&
57529a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->num_slice_groups_minus1 <= 7 /*&&
57629a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->num_slice_groups_minus1>=0 (no need, it's unsigned) */)
57729a84457aed4c45bc900998b5e11c03023264208James Dong        {
57829a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->profile_idc = AVC_EXTENDED;
57929a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->constrained_set2_flag = TRUE;
58029a84457aed4c45bc900998b5e11c03023264208James Dong        }
58129a84457aed4c45bc900998b5e11c03023264208James Dong
58229a84457aed4c45bc900998b5e11c03023264208James Dong        if (rateCtrl->dpEnable == FALSE &&
58329a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->num_slice_groups_minus1 == 0 &&
58429a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->redundant_pic_cnt_present_flag == FALSE)
58529a84457aed4c45bc900998b5e11c03023264208James Dong        {
58629a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->profile_idc = AVC_MAIN;
58729a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->constrained_set1_flag = TRUE;
58829a84457aed4c45bc900998b5e11c03023264208James Dong        }
58929a84457aed4c45bc900998b5e11c03023264208James Dong
59029a84457aed4c45bc900998b5e11c03023264208James Dong        if (rateCtrl->bidirPred == FALSE &&
59129a84457aed4c45bc900998b5e11c03023264208James Dong                rateCtrl->dpEnable == FALSE &&
59229a84457aed4c45bc900998b5e11c03023264208James Dong                seqParam->frame_mbs_only_flag == TRUE &&
59329a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->weighted_pred_flag == FALSE &&
59429a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->weighted_bipred_idc == 0 &&
59529a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->entropy_coding_mode_flag == FALSE &&
59629a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->num_slice_groups_minus1 <= 7 /*&&
59729a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->num_slice_groups_minus1>=0 (no need, it's unsigned)*/)
59829a84457aed4c45bc900998b5e11c03023264208James Dong        {
59929a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->profile_idc = AVC_BASELINE;
60029a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->constrained_set0_flag = TRUE;
60129a84457aed4c45bc900998b5e11c03023264208James Dong        }
60229a84457aed4c45bc900998b5e11c03023264208James Dong
60329a84457aed4c45bc900998b5e11c03023264208James Dong        if (seqParam->profile_idc == 0) /* still zero */
60429a84457aed4c45bc900998b5e11c03023264208James Dong        {
60529a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_PROFILE_NOT_SUPPORTED;
60629a84457aed4c45bc900998b5e11c03023264208James Dong        }
60729a84457aed4c45bc900998b5e11c03023264208James Dong    }
60829a84457aed4c45bc900998b5e11c03023264208James Dong
60929a84457aed4c45bc900998b5e11c03023264208James Dong    /* check the list of supported profile by this library */
61029a84457aed4c45bc900998b5e11c03023264208James Dong    switch (seqParam->profile_idc)
61129a84457aed4c45bc900998b5e11c03023264208James Dong    {
61229a84457aed4c45bc900998b5e11c03023264208James Dong        case AVC_BASELINE:
61329a84457aed4c45bc900998b5e11c03023264208James Dong            if (rateCtrl->bidirPred == TRUE ||
61429a84457aed4c45bc900998b5e11c03023264208James Dong                    rateCtrl->dpEnable == TRUE ||
61529a84457aed4c45bc900998b5e11c03023264208James Dong                    seqParam->frame_mbs_only_flag != TRUE ||
61629a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->weighted_pred_flag == TRUE ||
61729a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->weighted_bipred_idc != 0 ||
61829a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->entropy_coding_mode_flag == TRUE ||
61929a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->num_slice_groups_minus1 > 7 /*||
62029a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->num_slice_groups_minus1<0 (no need, it's unsigned) */)
62129a84457aed4c45bc900998b5e11c03023264208James Dong            {
62229a84457aed4c45bc900998b5e11c03023264208James Dong                status = AVCENC_TOOLS_NOT_SUPPORTED;
62329a84457aed4c45bc900998b5e11c03023264208James Dong            }
62429a84457aed4c45bc900998b5e11c03023264208James Dong            break;
62529a84457aed4c45bc900998b5e11c03023264208James Dong
62629a84457aed4c45bc900998b5e11c03023264208James Dong        case AVC_MAIN:
62729a84457aed4c45bc900998b5e11c03023264208James Dong        case AVC_EXTENDED:
62829a84457aed4c45bc900998b5e11c03023264208James Dong            status = AVCENC_PROFILE_NOT_SUPPORTED;
62929a84457aed4c45bc900998b5e11c03023264208James Dong    }
63029a84457aed4c45bc900998b5e11c03023264208James Dong
63129a84457aed4c45bc900998b5e11c03023264208James Dong    return status;
63229a84457aed4c45bc900998b5e11c03023264208James Dong}
63329a84457aed4c45bc900998b5e11c03023264208James Dong
63429a84457aed4c45bc900998b5e11c03023264208James Dong/* verify the level setting */
63529a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status VerifyLevel(AVCEncObject *encvid, AVCSeqParamSet *seqParam, AVCPicParamSet *picParam)
63629a84457aed4c45bc900998b5e11c03023264208James Dong{
63729a84457aed4c45bc900998b5e11c03023264208James Dong    (void)(picParam);
63829a84457aed4c45bc900998b5e11c03023264208James Dong
63929a84457aed4c45bc900998b5e11c03023264208James Dong    AVCRateControl *rateCtrl = encvid->rateCtrl;
64029a84457aed4c45bc900998b5e11c03023264208James Dong    AVCCommonObj *video = encvid->common;
64129a84457aed4c45bc900998b5e11c03023264208James Dong    int mb_per_sec, ii;
64229a84457aed4c45bc900998b5e11c03023264208James Dong    int lev_idx;
64329a84457aed4c45bc900998b5e11c03023264208James Dong    int dpb_size;
64429a84457aed4c45bc900998b5e11c03023264208James Dong
64529a84457aed4c45bc900998b5e11c03023264208James Dong    mb_per_sec = (int)(video->PicSizeInMbs * rateCtrl->frame_rate + 0.5);
64629a84457aed4c45bc900998b5e11c03023264208James Dong    dpb_size = (seqParam->num_ref_frames * video->PicSizeInMbs * 3) >> 6;
64729a84457aed4c45bc900998b5e11c03023264208James Dong
64829a84457aed4c45bc900998b5e11c03023264208James Dong    if (seqParam->level_idc == 0) /* find level for this setting */
64929a84457aed4c45bc900998b5e11c03023264208James Dong    {
65029a84457aed4c45bc900998b5e11c03023264208James Dong        for (ii = 0; ii < MAX_LEVEL_IDX; ii++)
65129a84457aed4c45bc900998b5e11c03023264208James Dong        {
65229a84457aed4c45bc900998b5e11c03023264208James Dong            if (mb_per_sec <= MaxMBPS[ii] &&
65329a84457aed4c45bc900998b5e11c03023264208James Dong                    video->PicSizeInMbs <= (uint)MaxFS[ii] &&
65429a84457aed4c45bc900998b5e11c03023264208James Dong                    rateCtrl->bitRate <= (int32)MaxBR[ii]*1000 &&
65529a84457aed4c45bc900998b5e11c03023264208James Dong                    rateCtrl->cpbSize <= (int32)MaxCPB[ii]*1000 &&
65629a84457aed4c45bc900998b5e11c03023264208James Dong                    rateCtrl->mvRange <= MaxVmvR[ii] &&
65729a84457aed4c45bc900998b5e11c03023264208James Dong                    dpb_size <= MaxDPBX2[ii]*512)
65829a84457aed4c45bc900998b5e11c03023264208James Dong            {
65929a84457aed4c45bc900998b5e11c03023264208James Dong                seqParam->level_idc = mapIdx2Lev[ii];
66029a84457aed4c45bc900998b5e11c03023264208James Dong                break;
66129a84457aed4c45bc900998b5e11c03023264208James Dong            }
66229a84457aed4c45bc900998b5e11c03023264208James Dong        }
66329a84457aed4c45bc900998b5e11c03023264208James Dong        if (seqParam->level_idc == 0)
66429a84457aed4c45bc900998b5e11c03023264208James Dong        {
66529a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_LEVEL_NOT_SUPPORTED;
66629a84457aed4c45bc900998b5e11c03023264208James Dong        }
66729a84457aed4c45bc900998b5e11c03023264208James Dong    }
66829a84457aed4c45bc900998b5e11c03023264208James Dong
66929a84457aed4c45bc900998b5e11c03023264208James Dong    /* check if this level is supported by this library */
67029a84457aed4c45bc900998b5e11c03023264208James Dong    lev_idx = mapLev2Idx[seqParam->level_idc];
67129a84457aed4c45bc900998b5e11c03023264208James Dong    if (seqParam->level_idc == AVC_LEVEL1_B)
67229a84457aed4c45bc900998b5e11c03023264208James Dong    {
67329a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set3_flag = 1;
67429a84457aed4c45bc900998b5e11c03023264208James Dong    }
67529a84457aed4c45bc900998b5e11c03023264208James Dong
67629a84457aed4c45bc900998b5e11c03023264208James Dong
67729a84457aed4c45bc900998b5e11c03023264208James Dong    if (lev_idx == 255) /* not defined */
67829a84457aed4c45bc900998b5e11c03023264208James Dong    {
67929a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_LEVEL_NOT_SUPPORTED;
68029a84457aed4c45bc900998b5e11c03023264208James Dong    }
68129a84457aed4c45bc900998b5e11c03023264208James Dong
68229a84457aed4c45bc900998b5e11c03023264208James Dong    /* check if the encoding setting complies with the level */
68329a84457aed4c45bc900998b5e11c03023264208James Dong    if (mb_per_sec > MaxMBPS[lev_idx] ||
68429a84457aed4c45bc900998b5e11c03023264208James Dong            video->PicSizeInMbs > (uint)MaxFS[lev_idx] ||
68529a84457aed4c45bc900998b5e11c03023264208James Dong            rateCtrl->bitRate > (int32)MaxBR[lev_idx]*1000 ||
68629a84457aed4c45bc900998b5e11c03023264208James Dong            rateCtrl->cpbSize > (int32)MaxCPB[lev_idx]*1000 ||
68729a84457aed4c45bc900998b5e11c03023264208James Dong            rateCtrl->mvRange > MaxVmvR[lev_idx])
68829a84457aed4c45bc900998b5e11c03023264208James Dong    {
68929a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_LEVEL_FAIL;
69029a84457aed4c45bc900998b5e11c03023264208James Dong    }
69129a84457aed4c45bc900998b5e11c03023264208James Dong
69229a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_SUCCESS;
69329a84457aed4c45bc900998b5e11c03023264208James Dong}
69429a84457aed4c45bc900998b5e11c03023264208James Dong
69529a84457aed4c45bc900998b5e11c03023264208James Dong/* initialize variables at the beginning of each frame */
69629a84457aed4c45bc900998b5e11c03023264208James Dong/* determine the picture type */
69729a84457aed4c45bc900998b5e11c03023264208James Dong/* encode POC */
69829a84457aed4c45bc900998b5e11c03023264208James Dong/* maybe we should do more stuff here. MotionEstimation+SCD and generate a new SPS and PPS */
69929a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status InitFrame(AVCEncObject *encvid)
70029a84457aed4c45bc900998b5e11c03023264208James Dong{
70129a84457aed4c45bc900998b5e11c03023264208James Dong    AVCStatus ret;
70229a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status;
70329a84457aed4c45bc900998b5e11c03023264208James Dong    AVCCommonObj *video = encvid->common;
70429a84457aed4c45bc900998b5e11c03023264208James Dong    AVCSliceHeader *sliceHdr = video->sliceHdr;
70529a84457aed4c45bc900998b5e11c03023264208James Dong
70629a84457aed4c45bc900998b5e11c03023264208James Dong    /* look for the next frame in coding_order and look for available picture
70729a84457aed4c45bc900998b5e11c03023264208James Dong       in the DPB. Note, video->currFS->PicOrderCnt, currFS->FrameNum and currPic->PicNum
70829a84457aed4c45bc900998b5e11c03023264208James Dong       are set to wrong number in this function (right for decoder). */
70929a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->nal_unit_type == AVC_NALTYPE_IDR)
71029a84457aed4c45bc900998b5e11c03023264208James Dong    {
71129a84457aed4c45bc900998b5e11c03023264208James Dong        // call init DPB in here.
71229a84457aed4c45bc900998b5e11c03023264208James Dong        ret = AVCConfigureSequence(encvid->avcHandle, video, TRUE);
71329a84457aed4c45bc900998b5e11c03023264208James Dong        if (ret != AVC_SUCCESS)
71429a84457aed4c45bc900998b5e11c03023264208James Dong        {
71529a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_FAIL;
71629a84457aed4c45bc900998b5e11c03023264208James Dong        }
71729a84457aed4c45bc900998b5e11c03023264208James Dong    }
71829a84457aed4c45bc900998b5e11c03023264208James Dong
71929a84457aed4c45bc900998b5e11c03023264208James Dong    /* flexible macroblock ordering (every frame)*/
72029a84457aed4c45bc900998b5e11c03023264208James Dong    /* populate video->mapUnitToSliceGroupMap and video->MbToSliceGroupMap */
72129a84457aed4c45bc900998b5e11c03023264208James Dong    /* It changes once per each PPS. */
72229a84457aed4c45bc900998b5e11c03023264208James Dong    FMOInit(video);
72329a84457aed4c45bc900998b5e11c03023264208James Dong
72429a84457aed4c45bc900998b5e11c03023264208James Dong    ret = DPBInitBuffer(encvid->avcHandle, video); // get new buffer
72529a84457aed4c45bc900998b5e11c03023264208James Dong
72629a84457aed4c45bc900998b5e11c03023264208James Dong    if (ret != AVC_SUCCESS)
72729a84457aed4c45bc900998b5e11c03023264208James Dong    {
72829a84457aed4c45bc900998b5e11c03023264208James Dong        return (AVCEnc_Status)ret; // AVCENC_PICTURE_READY, FAIL
72929a84457aed4c45bc900998b5e11c03023264208James Dong    }
73029a84457aed4c45bc900998b5e11c03023264208James Dong
73129a84457aed4c45bc900998b5e11c03023264208James Dong    DPBInitPic(video, 0); /* 0 is dummy */
73229a84457aed4c45bc900998b5e11c03023264208James Dong
73329a84457aed4c45bc900998b5e11c03023264208James Dong    /************* determine picture type IDR or non-IDR ***********/
73429a84457aed4c45bc900998b5e11c03023264208James Dong    video->currPicType = AVC_FRAME;
73529a84457aed4c45bc900998b5e11c03023264208James Dong    video->slice_data_partitioning = FALSE;
73629a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->currInput->is_reference = 1; /* default to all frames */
73729a84457aed4c45bc900998b5e11c03023264208James Dong    video->nal_ref_idc = 1;  /* need to set this for InitPOC */
73829a84457aed4c45bc900998b5e11c03023264208James Dong    video->currPic->isReference = TRUE;
73929a84457aed4c45bc900998b5e11c03023264208James Dong
74029a84457aed4c45bc900998b5e11c03023264208James Dong    /************* set frame_num ********************/
74129a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->nal_unit_type == AVC_NALTYPE_IDR)
74229a84457aed4c45bc900998b5e11c03023264208James Dong    {
74329a84457aed4c45bc900998b5e11c03023264208James Dong        video->prevFrameNum = video->MaxFrameNum;
74429a84457aed4c45bc900998b5e11c03023264208James Dong        video->PrevRefFrameNum = 0;
74529a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->frame_num = 0;
74629a84457aed4c45bc900998b5e11c03023264208James Dong    }
74729a84457aed4c45bc900998b5e11c03023264208James Dong    /* otherwise, it's set to previous reference frame access unit's frame_num in decoding order,
74829a84457aed4c45bc900998b5e11c03023264208James Dong       see the end of PVAVCDecodeSlice()*/
74929a84457aed4c45bc900998b5e11c03023264208James Dong    /* There's also restriction on the frame_num, see page 59 of JVT-I1010.doc. */
75029a84457aed4c45bc900998b5e11c03023264208James Dong    /* Basically, frame_num can't be repeated unless it's opposite fields or non reference fields */
75129a84457aed4c45bc900998b5e11c03023264208James Dong    else
75229a84457aed4c45bc900998b5e11c03023264208James Dong    {
75329a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->frame_num = (video->PrevRefFrameNum + 1) % video->MaxFrameNum;
75429a84457aed4c45bc900998b5e11c03023264208James Dong    }
75529a84457aed4c45bc900998b5e11c03023264208James Dong    video->CurrPicNum = sliceHdr->frame_num;  /* for field_pic_flag = 0 */
75629a84457aed4c45bc900998b5e11c03023264208James Dong    //video->CurrPicNum = 2*sliceHdr->frame_num + 1; /* for field_pic_flag = 1 */
75729a84457aed4c45bc900998b5e11c03023264208James Dong
75829a84457aed4c45bc900998b5e11c03023264208James Dong    /* assign pic_order_cnt, video->PicOrderCnt */
75929a84457aed4c45bc900998b5e11c03023264208James Dong    status = InitPOC(encvid);
76029a84457aed4c45bc900998b5e11c03023264208James Dong    if (status != AVCENC_SUCCESS)  /* incorrigable fail */
76129a84457aed4c45bc900998b5e11c03023264208James Dong    {
76229a84457aed4c45bc900998b5e11c03023264208James Dong        return status;
76329a84457aed4c45bc900998b5e11c03023264208James Dong    }
76429a84457aed4c45bc900998b5e11c03023264208James Dong
76529a84457aed4c45bc900998b5e11c03023264208James Dong    /* Initialize refListIdx for this picture */
76629a84457aed4c45bc900998b5e11c03023264208James Dong    RefListInit(video);
76729a84457aed4c45bc900998b5e11c03023264208James Dong
76829a84457aed4c45bc900998b5e11c03023264208James Dong    /************* motion estimation and scene analysis ************/
76929a84457aed4c45bc900998b5e11c03023264208James Dong    // , to move this to MB-based MV search for comparison
77029a84457aed4c45bc900998b5e11c03023264208James Dong    // use sub-optimal QP for mv search
77129a84457aed4c45bc900998b5e11c03023264208James Dong    AVCMotionEstimation(encvid);  /* AVCENC_SUCCESS or AVCENC_NEW_IDR */
77229a84457aed4c45bc900998b5e11c03023264208James Dong
77329a84457aed4c45bc900998b5e11c03023264208James Dong    /* after this point, the picture type will be fixed to either IDR or non-IDR */
77429a84457aed4c45bc900998b5e11c03023264208James Dong    video->currFS->PicOrderCnt = video->PicOrderCnt;
77529a84457aed4c45bc900998b5e11c03023264208James Dong    video->currFS->FrameNum = video->sliceHdr->frame_num;
77629a84457aed4c45bc900998b5e11c03023264208James Dong    video->currPic->PicNum = video->CurrPicNum;
77729a84457aed4c45bc900998b5e11c03023264208James Dong    video->mbNum = 0; /* start from zero MB */
77829a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->currSliceGroup = 0; /* start from slice group #0 */
77929a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->numIntraMB = 0; /* reset this counter */
78029a84457aed4c45bc900998b5e11c03023264208James Dong
78129a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->nal_unit_type == AVC_NALTYPE_IDR)
78229a84457aed4c45bc900998b5e11c03023264208James Dong    {
78329a84457aed4c45bc900998b5e11c03023264208James Dong        RCInitGOP(encvid);
78429a84457aed4c45bc900998b5e11c03023264208James Dong
78529a84457aed4c45bc900998b5e11c03023264208James Dong        /* calculate picture QP */
78629a84457aed4c45bc900998b5e11c03023264208James Dong        RCInitFrameQP(encvid);
78729a84457aed4c45bc900998b5e11c03023264208James Dong
78829a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_NEW_IDR;
78929a84457aed4c45bc900998b5e11c03023264208James Dong    }
79029a84457aed4c45bc900998b5e11c03023264208James Dong
79129a84457aed4c45bc900998b5e11c03023264208James Dong    /* calculate picture QP */
79229a84457aed4c45bc900998b5e11c03023264208James Dong    RCInitFrameQP(encvid); /* get QP after MV search */
79329a84457aed4c45bc900998b5e11c03023264208James Dong
79429a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_SUCCESS;
79529a84457aed4c45bc900998b5e11c03023264208James Dong}
79629a84457aed4c45bc900998b5e11c03023264208James Dong
79729a84457aed4c45bc900998b5e11c03023264208James Dong/* initialize variables for this slice */
79829a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status InitSlice(AVCEncObject *encvid)
79929a84457aed4c45bc900998b5e11c03023264208James Dong{
80029a84457aed4c45bc900998b5e11c03023264208James Dong    AVCCommonObj *video = encvid->common;
80129a84457aed4c45bc900998b5e11c03023264208James Dong    AVCSliceHeader *sliceHdr = video->sliceHdr;
80229a84457aed4c45bc900998b5e11c03023264208James Dong    AVCPicParamSet *currPPS = video->currPicParams;
80329a84457aed4c45bc900998b5e11c03023264208James Dong    AVCSeqParamSet *currSPS = video->currSeqParams;
80429a84457aed4c45bc900998b5e11c03023264208James Dong    int slice_type = video->slice_type;
80529a84457aed4c45bc900998b5e11c03023264208James Dong
80629a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->first_mb_in_slice = video->mbNum;
80729a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->mbNum) // not first slice of a frame
80829a84457aed4c45bc900998b5e11c03023264208James Dong    {
80929a84457aed4c45bc900998b5e11c03023264208James Dong        video->sliceHdr->slice_type = (AVCSliceType)slice_type;
81029a84457aed4c45bc900998b5e11c03023264208James Dong    }
81129a84457aed4c45bc900998b5e11c03023264208James Dong
81229a84457aed4c45bc900998b5e11c03023264208James Dong    /* sliceHdr->slice_type already set in InitFrame */
81329a84457aed4c45bc900998b5e11c03023264208James Dong
81429a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->pic_parameter_set_id = video->currPicParams->pic_parameter_set_id;
81529a84457aed4c45bc900998b5e11c03023264208James Dong
81629a84457aed4c45bc900998b5e11c03023264208James Dong    /* sliceHdr->frame_num already set in InitFrame */
81729a84457aed4c45bc900998b5e11c03023264208James Dong
81829a84457aed4c45bc900998b5e11c03023264208James Dong    if (!currSPS->frame_mbs_only_flag)  /* we shouldn't need this check */
81929a84457aed4c45bc900998b5e11c03023264208James Dong    {
82029a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->field_pic_flag = sliceHdr->bottom_field_flag = FALSE;
82129a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_TOOLS_NOT_SUPPORTED;
82229a84457aed4c45bc900998b5e11c03023264208James Dong    }
82329a84457aed4c45bc900998b5e11c03023264208James Dong
82429a84457aed4c45bc900998b5e11c03023264208James Dong    /* sliceHdr->idr_pic_id already set in PVAVCEncodeNAL
82529a84457aed4c45bc900998b5e11c03023264208James Dong
82629a84457aed4c45bc900998b5e11c03023264208James Dong     sliceHdr->pic_order_cnt_lsb already set in InitFrame..InitPOC
82729a84457aed4c45bc900998b5e11c03023264208James Dong     sliceHdr->delta_pic_order_cnt_bottom  already set in InitPOC
82829a84457aed4c45bc900998b5e11c03023264208James Dong
82929a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->delta_pic_order_cnt[0] already set in InitPOC
83029a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->delta_pic_order_cnt[1] already set in InitPOC
83129a84457aed4c45bc900998b5e11c03023264208James Dong    */
83229a84457aed4c45bc900998b5e11c03023264208James Dong
83329a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->redundant_pic_cnt = 0; /* default if(currPPS->redundant_pic_cnt_present_flag), range 0..127 */
83429a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->direct_spatial_mv_pred_flag = 0; // default if(slice_type == AVC_B_SLICE)
83529a84457aed4c45bc900998b5e11c03023264208James Dong
83629a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->num_ref_idx_active_override_flag = FALSE; /* default, if(slice_type== P,SP or B)*/
83729a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->num_ref_idx_l0_active_minus1 = 0; /* default, if (num_ref_idx_active_override_flag) */
83829a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->num_ref_idx_l1_active_minus1 = 0; /* default, if above and B_slice */
83929a84457aed4c45bc900998b5e11c03023264208James Dong    /* the above 2 values range from 0..15 for frame picture and 0..31 for field picture */
84029a84457aed4c45bc900998b5e11c03023264208James Dong
84129a84457aed4c45bc900998b5e11c03023264208James Dong    /* ref_pic_list_reordering(), currently we don't do anything */
84229a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->ref_pic_list_reordering_flag_l0 = FALSE; /* default */
84329a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->ref_pic_list_reordering_flag_l1 = FALSE; /* default */
84429a84457aed4c45bc900998b5e11c03023264208James Dong    /* if the above are TRUE, some other params must be set */
84529a84457aed4c45bc900998b5e11c03023264208James Dong
84629a84457aed4c45bc900998b5e11c03023264208James Dong    if ((currPPS->weighted_pred_flag && (slice_type == AVC_P_SLICE || slice_type == AVC_SP_SLICE)) ||
84729a84457aed4c45bc900998b5e11c03023264208James Dong            (currPPS->weighted_bipred_idc == 1 && slice_type == AVC_B_SLICE))
84829a84457aed4c45bc900998b5e11c03023264208James Dong    {
84929a84457aed4c45bc900998b5e11c03023264208James Dong        //      pred_weight_table(); // not supported !!
85029a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_TOOLS_NOT_SUPPORTED;
85129a84457aed4c45bc900998b5e11c03023264208James Dong    }
85229a84457aed4c45bc900998b5e11c03023264208James Dong
85329a84457aed4c45bc900998b5e11c03023264208James Dong    /* dec_ref_pic_marking(), this will be done later*/
85429a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->no_output_of_prior_pics_flag = FALSE; /* default */
85529a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->long_term_reference_flag = FALSE; /* for IDR frame, do not make it long term */
85629a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->adaptive_ref_pic_marking_mode_flag = FALSE; /* default */
85729a84457aed4c45bc900998b5e11c03023264208James Dong    /* other params are not set here because they are not used */
85829a84457aed4c45bc900998b5e11c03023264208James Dong
85929a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->cabac_init_idc = 0; /* default, if entropy_coding_mode_flag && slice_type==I or SI, range 0..2  */
86029a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->slice_qp_delta = 0; /* default for now */
86129a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->sp_for_switch_flag = FALSE; /* default, if slice_type == SP */
86229a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->slice_qs_delta = 0; /* default, if slice_type == SP or SI */
86329a84457aed4c45bc900998b5e11c03023264208James Dong
86429a84457aed4c45bc900998b5e11c03023264208James Dong    /* derived variables from encParam */
86529a84457aed4c45bc900998b5e11c03023264208James Dong    /* deblocking filter */
86629a84457aed4c45bc900998b5e11c03023264208James Dong    video->FilterOffsetA = video->FilterOffsetB = 0;
86729a84457aed4c45bc900998b5e11c03023264208James Dong    if (currPPS->deblocking_filter_control_present_flag == TRUE)
86829a84457aed4c45bc900998b5e11c03023264208James Dong    {
86929a84457aed4c45bc900998b5e11c03023264208James Dong        video->FilterOffsetA = sliceHdr->slice_alpha_c0_offset_div2 << 1;
87029a84457aed4c45bc900998b5e11c03023264208James Dong        video->FilterOffsetB = sliceHdr->slice_beta_offset_div_2 << 1;
87129a84457aed4c45bc900998b5e11c03023264208James Dong    }
87229a84457aed4c45bc900998b5e11c03023264208James Dong
87329a84457aed4c45bc900998b5e11c03023264208James Dong    /* flexible macroblock ordering */
87429a84457aed4c45bc900998b5e11c03023264208James Dong    /* populate video->mapUnitToSliceGroupMap and video->MbToSliceGroupMap */
87529a84457aed4c45bc900998b5e11c03023264208James Dong    /* We already call it at the end of PVAVCEncInitialize(). It changes once per each PPS. */
87629a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->currPicParams->num_slice_groups_minus1 > 0 && video->currPicParams->slice_group_map_type >= 3
87729a84457aed4c45bc900998b5e11c03023264208James Dong            && video->currPicParams->slice_group_map_type <= 5)
87829a84457aed4c45bc900998b5e11c03023264208James Dong    {
87929a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->slice_group_change_cycle = SLICE_GROUP_CHANGE_CYCLE;  /* default, don't understand how to set it!!!*/
88029a84457aed4c45bc900998b5e11c03023264208James Dong
88129a84457aed4c45bc900998b5e11c03023264208James Dong        video->MapUnitsInSliceGroup0 =
88229a84457aed4c45bc900998b5e11c03023264208James Dong            AVC_MIN(sliceHdr->slice_group_change_cycle * video->SliceGroupChangeRate, video->PicSizeInMapUnits);
88329a84457aed4c45bc900998b5e11c03023264208James Dong
88429a84457aed4c45bc900998b5e11c03023264208James Dong        FMOInit(video);
88529a84457aed4c45bc900998b5e11c03023264208James Dong    }
88629a84457aed4c45bc900998b5e11c03023264208James Dong
88729a84457aed4c45bc900998b5e11c03023264208James Dong    /* calculate SliceQPy first  */
88829a84457aed4c45bc900998b5e11c03023264208James Dong    /* calculate QSy first */
88929a84457aed4c45bc900998b5e11c03023264208James Dong
89029a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->slice_qp_delta = video->QPy - 26 - currPPS->pic_init_qp_minus26;
89129a84457aed4c45bc900998b5e11c03023264208James Dong    //sliceHdr->slice_qs_delta = video->QSy - 26 - currPPS->pic_init_qs_minus26;
89229a84457aed4c45bc900998b5e11c03023264208James Dong
89329a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_SUCCESS;
89429a84457aed4c45bc900998b5e11c03023264208James Dong}
89529a84457aed4c45bc900998b5e11c03023264208James Dong
896