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            if (extS->offset_for_ref_frame == NULL)
18129a84457aed4c45bc900998b5e11c03023264208James Dong            {
18229a84457aed4c45bc900998b5e11c03023264208James Dong                return AVCENC_ENCPARAM_MEM_FAIL;
18329a84457aed4c45bc900998b5e11c03023264208James Dong            }
18429a84457aed4c45bc900998b5e11c03023264208James Dong            for (ii = 0; ii < (int) extS->num_ref_frames; ii++)
18529a84457aed4c45bc900998b5e11c03023264208James Dong            {
18629a84457aed4c45bc900998b5e11c03023264208James Dong                seqParam->offset_for_ref_frame[ii] = extS->offset_for_ref_frame[ii];
18729a84457aed4c45bc900998b5e11c03023264208James Dong            }
18829a84457aed4c45bc900998b5e11c03023264208James Dong        }
18929a84457aed4c45bc900998b5e11c03023264208James Dong        /* number of reference frame */
19029a84457aed4c45bc900998b5e11c03023264208James Dong        if (extS->num_ref_frames > 16 /*|| extS->num_ref_frames<0 (no need, it's unsigned)*/)
19129a84457aed4c45bc900998b5e11c03023264208James Dong        {
19229a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INVALID_NUM_REF;
19329a84457aed4c45bc900998b5e11c03023264208James Dong        }
19429a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->num_ref_frames = extS->num_ref_frames; /* num reference frame range 0...16*/
19529a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->gaps_in_frame_num_value_allowed_flag = extS->gaps_in_frame_num_value_allowed_flag;
19629a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->pic_width_in_mbs_minus1 = extS->pic_width_in_mbs_minus1;
19729a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->pic_height_in_map_units_minus1 = extS->pic_height_in_map_units_minus1;
19829a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_mbs_only_flag = extS->frame_mbs_only_flag;
19929a84457aed4c45bc900998b5e11c03023264208James Dong        if (extS->frame_mbs_only_flag != TRUE)
20029a84457aed4c45bc900998b5e11c03023264208James Dong        {
20129a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
20229a84457aed4c45bc900998b5e11c03023264208James Dong        }
20329a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->mb_adaptive_frame_field_flag = extS->mb_adaptive_frame_field_flag;
20429a84457aed4c45bc900998b5e11c03023264208James Dong        if (extS->mb_adaptive_frame_field_flag != FALSE)
20529a84457aed4c45bc900998b5e11c03023264208James Dong        {
20629a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
20729a84457aed4c45bc900998b5e11c03023264208James Dong        }
20829a84457aed4c45bc900998b5e11c03023264208James Dong
20929a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->direct_8x8_inference_flag = extS->direct_8x8_inference_flag;
21029a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_cropping_flag = extS->frame_cropping_flag ;
21129a84457aed4c45bc900998b5e11c03023264208James Dong        if (extS->frame_cropping_flag != FALSE)
21229a84457aed4c45bc900998b5e11c03023264208James Dong        {
21329a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
21429a84457aed4c45bc900998b5e11c03023264208James Dong        }
21529a84457aed4c45bc900998b5e11c03023264208James Dong
21629a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_crop_bottom_offset = 0;
21729a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_crop_left_offset = 0;
21829a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_crop_right_offset = 0;
21929a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->frame_crop_top_offset = 0;
22029a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->vui_parameters_present_flag = extS->vui_parameters_present_flag;
22129a84457aed4c45bc900998b5e11c03023264208James Dong        if (extS->vui_parameters_present_flag)
22229a84457aed4c45bc900998b5e11c03023264208James Dong        {
22329a84457aed4c45bc900998b5e11c03023264208James Dong            memcpy(&(seqParam->vui_parameters), &(extS->vui_parameters), sizeof(AVCVUIParams));
22429a84457aed4c45bc900998b5e11c03023264208James Dong        }
22529a84457aed4c45bc900998b5e11c03023264208James Dong    }
22629a84457aed4c45bc900998b5e11c03023264208James Dong    else
22729a84457aed4c45bc900998b5e11c03023264208James Dong    {
22829a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_NOT_SUPPORTED;
22929a84457aed4c45bc900998b5e11c03023264208James Dong    }
23029a84457aed4c45bc900998b5e11c03023264208James Dong
23129a84457aed4c45bc900998b5e11c03023264208James Dong    /***************** now PPS ******************************/
23229a84457aed4c45bc900998b5e11c03023264208James Dong    if (!extP && !extS)
23329a84457aed4c45bc900998b5e11c03023264208James Dong    {
23429a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_parameter_set_id = (uint)(-1); /* start with zero */
23529a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->seq_parameter_set_id = (uint)(-1); /* start with zero */
23629a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->entropy_coding_mode_flag = 0; /* default to CAVLC */
23729a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_order_present_flag = 0; /* default for now, will need it for B-slice */
23829a84457aed4c45bc900998b5e11c03023264208James Dong        /* FMO */
23929a84457aed4c45bc900998b5e11c03023264208James Dong        if (encParam->num_slice_group < 1 || encParam->num_slice_group > MAX_NUM_SLICE_GROUP)
24029a84457aed4c45bc900998b5e11c03023264208James Dong        {
24129a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INVALID_NUM_SLICEGROUP;
24229a84457aed4c45bc900998b5e11c03023264208James Dong        }
24329a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->num_slice_groups_minus1 = encParam->num_slice_group - 1;
24429a84457aed4c45bc900998b5e11c03023264208James Dong
24529a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->num_slice_groups_minus1 > 0)
24629a84457aed4c45bc900998b5e11c03023264208James Dong        {
24729a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->slice_group_map_type = encParam->fmo_type;
24829a84457aed4c45bc900998b5e11c03023264208James Dong            switch (encParam->fmo_type)
24929a84457aed4c45bc900998b5e11c03023264208James Dong            {
25029a84457aed4c45bc900998b5e11c03023264208James Dong                case 0:
25129a84457aed4c45bc900998b5e11c03023264208James Dong                    for (ii = 0; ii <= (int)picParam->num_slice_groups_minus1; ii++)
25229a84457aed4c45bc900998b5e11c03023264208James Dong                    {
25329a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->run_length_minus1[ii] = encParam->run_length_minus1[ii];
25429a84457aed4c45bc900998b5e11c03023264208James Dong                    }
25529a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
25629a84457aed4c45bc900998b5e11c03023264208James Dong                case 2:
25729a84457aed4c45bc900998b5e11c03023264208James Dong                    for (ii = 0; ii < (int)picParam->num_slice_groups_minus1; ii++)
25829a84457aed4c45bc900998b5e11c03023264208James Dong                    {
25929a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->top_left[ii] = encParam->top_left[ii];
26029a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->bottom_right[ii] = encParam->bottom_right[ii];
26129a84457aed4c45bc900998b5e11c03023264208James Dong                    }
26229a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
26329a84457aed4c45bc900998b5e11c03023264208James Dong                case 3:
26429a84457aed4c45bc900998b5e11c03023264208James Dong                case 4:
26529a84457aed4c45bc900998b5e11c03023264208James Dong                case 5:
26629a84457aed4c45bc900998b5e11c03023264208James Dong                    if (encParam->change_dir_flag == AVC_ON)
26729a84457aed4c45bc900998b5e11c03023264208James Dong                    {
26829a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->slice_group_change_direction_flag = TRUE;
26929a84457aed4c45bc900998b5e11c03023264208James Dong                    }
27029a84457aed4c45bc900998b5e11c03023264208James Dong                    else
27129a84457aed4c45bc900998b5e11c03023264208James Dong                    {
27229a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->slice_group_change_direction_flag = FALSE;
27329a84457aed4c45bc900998b5e11c03023264208James Dong                    }
27429a84457aed4c45bc900998b5e11c03023264208James Dong                    if (/*encParam->change_rate_minus1 < 0 || (no need it's unsigned) */
27529a84457aed4c45bc900998b5e11c03023264208James Dong                        encParam->change_rate_minus1 > video->PicSizeInMapUnits - 1)
27629a84457aed4c45bc900998b5e11c03023264208James Dong                    {
27729a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_INVALID_CHANGE_RATE;
27829a84457aed4c45bc900998b5e11c03023264208James Dong                    }
27929a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->slice_group_change_rate_minus1 = encParam->change_rate_minus1;
28029a84457aed4c45bc900998b5e11c03023264208James Dong                    video->SliceGroupChangeRate = picParam->slice_group_change_rate_minus1 + 1;
28129a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
28229a84457aed4c45bc900998b5e11c03023264208James Dong                case 6:
28329a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->pic_size_in_map_units_minus1 = video->PicSizeInMapUnits - 1;
28429a84457aed4c45bc900998b5e11c03023264208James Dong
28529a84457aed4c45bc900998b5e11c03023264208James Dong                    /* allocate picParam->slice_group_id */
28629a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->slice_group_id = (uint*)avcHandle->CBAVC_Malloc(userData, sizeof(uint) * video->PicSizeInMapUnits, DEFAULT_ATTR);
28729a84457aed4c45bc900998b5e11c03023264208James Dong                    if (picParam->slice_group_id == NULL)
28829a84457aed4c45bc900998b5e11c03023264208James Dong                    {
28929a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_MEMORY_FAIL;
29029a84457aed4c45bc900998b5e11c03023264208James Dong                    }
29129a84457aed4c45bc900998b5e11c03023264208James Dong
29229a84457aed4c45bc900998b5e11c03023264208James Dong                    if (encParam->slice_group == NULL)
29329a84457aed4c45bc900998b5e11c03023264208James Dong                    {
29429a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_ENCPARAM_MEM_FAIL;
29529a84457aed4c45bc900998b5e11c03023264208James Dong                    }
29629a84457aed4c45bc900998b5e11c03023264208James Dong                    for (ii = 0; ii < (int)video->PicSizeInMapUnits; ii++)
29729a84457aed4c45bc900998b5e11c03023264208James Dong                    {
29829a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->slice_group_id[ii] = encParam->slice_group[ii];
29929a84457aed4c45bc900998b5e11c03023264208James Dong                    }
30029a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
30129a84457aed4c45bc900998b5e11c03023264208James Dong                default:
30229a84457aed4c45bc900998b5e11c03023264208James Dong                    return AVCENC_INVALID_FMO_TYPE;
30329a84457aed4c45bc900998b5e11c03023264208James Dong            }
30429a84457aed4c45bc900998b5e11c03023264208James Dong        }
30529a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->num_ref_idx_l0_active_minus1 = encParam->num_ref_frame - 1; /* assume frame only */
30629a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->num_ref_idx_l1_active_minus1 = 0; /* default value */
30729a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->weighted_pred_flag = 0; /* no weighted prediction supported */
30829a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->weighted_bipred_idc = 0; /* range 0,1,2 */
30929a84457aed4c45bc900998b5e11c03023264208James Dong        if (/*picParam->weighted_bipred_idc < 0 || (no need, it's unsigned) */
31029a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->weighted_bipred_idc > 2)
31129a84457aed4c45bc900998b5e11c03023264208James Dong        {
31229a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_WEIGHTED_BIPRED_FAIL;
31329a84457aed4c45bc900998b5e11c03023264208James Dong        }
31429a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_init_qp_minus26 = 0; /* default, will be changed at slice level anyway */
31529a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->pic_init_qp_minus26 < -26 || picParam->pic_init_qp_minus26 > 25)
31629a84457aed4c45bc900998b5e11c03023264208James Dong        {
31729a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INIT_QP_FAIL; /* out of range */
31829a84457aed4c45bc900998b5e11c03023264208James Dong        }
31929a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_init_qs_minus26 = 0;
32029a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->pic_init_qs_minus26 < -26 || picParam->pic_init_qs_minus26 > 25)
32129a84457aed4c45bc900998b5e11c03023264208James Dong        {
32229a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INIT_QS_FAIL; /* out of range */
32329a84457aed4c45bc900998b5e11c03023264208James Dong        }
32429a84457aed4c45bc900998b5e11c03023264208James Dong
32529a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->chroma_qp_index_offset = 0; /* default to zero for now */
32629a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->chroma_qp_index_offset < -12 || picParam->chroma_qp_index_offset > 12)
32729a84457aed4c45bc900998b5e11c03023264208James Dong        {
32829a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_CHROMA_QP_FAIL; /* out of range */
32929a84457aed4c45bc900998b5e11c03023264208James Dong        }
33029a84457aed4c45bc900998b5e11c03023264208James Dong        /* deblocking */
33129a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->deblocking_filter_control_present_flag = (encParam->db_filter == AVC_ON) ? TRUE : FALSE ;
33229a84457aed4c45bc900998b5e11c03023264208James Dong        /* constrained intra prediction */
33329a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->constrained_intra_pred_flag = (encParam->constrained_intra_pred == AVC_ON) ? TRUE : FALSE;
33429a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->redundant_pic_cnt_present_flag = 0; /* default */
33529a84457aed4c45bc900998b5e11c03023264208James Dong    }
33629a84457aed4c45bc900998b5e11c03023264208James Dong    else if (extP)// external PPS
33729a84457aed4c45bc900998b5e11c03023264208James Dong    {
33829a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_parameter_set_id = extP->pic_parameter_set_id - 1; /* to be increased by one */
33929a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->seq_parameter_set_id = extP->seq_parameter_set_id;
34029a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->entropy_coding_mode_flag = extP->entropy_coding_mode_flag;
34129a84457aed4c45bc900998b5e11c03023264208James Dong        if (extP->entropy_coding_mode_flag != 0) /* default to CAVLC */
34229a84457aed4c45bc900998b5e11c03023264208James Dong        {
34329a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
34429a84457aed4c45bc900998b5e11c03023264208James Dong        }
34529a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_order_present_flag = extP->pic_order_present_flag; /* default for now, will need it for B-slice */
34629a84457aed4c45bc900998b5e11c03023264208James Dong        if (extP->pic_order_present_flag != 0)
34729a84457aed4c45bc900998b5e11c03023264208James Dong        {
34829a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
34929a84457aed4c45bc900998b5e11c03023264208James Dong        }
35029a84457aed4c45bc900998b5e11c03023264208James Dong        /* FMO */
35129a84457aed4c45bc900998b5e11c03023264208James Dong        if (/*(extP->num_slice_groups_minus1<0) || (no need it's unsigned) */
35229a84457aed4c45bc900998b5e11c03023264208James Dong            (extP->num_slice_groups_minus1 > MAX_NUM_SLICE_GROUP - 1))
35329a84457aed4c45bc900998b5e11c03023264208James Dong        {
35429a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INVALID_NUM_SLICEGROUP;
35529a84457aed4c45bc900998b5e11c03023264208James Dong        }
35629a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->num_slice_groups_minus1 = extP->num_slice_groups_minus1;
35729a84457aed4c45bc900998b5e11c03023264208James Dong
35829a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->num_slice_groups_minus1 > 0)
35929a84457aed4c45bc900998b5e11c03023264208James Dong        {
36029a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->slice_group_map_type = extP->slice_group_map_type;
36129a84457aed4c45bc900998b5e11c03023264208James Dong            switch (extP->slice_group_map_type)
36229a84457aed4c45bc900998b5e11c03023264208James Dong            {
36329a84457aed4c45bc900998b5e11c03023264208James Dong                case 0:
36429a84457aed4c45bc900998b5e11c03023264208James Dong                    for (ii = 0; ii <= (int)extP->num_slice_groups_minus1; ii++)
36529a84457aed4c45bc900998b5e11c03023264208James Dong                    {
36629a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->run_length_minus1[ii] = extP->run_length_minus1[ii];
36729a84457aed4c45bc900998b5e11c03023264208James Dong                    }
36829a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
36929a84457aed4c45bc900998b5e11c03023264208James Dong                case 2:
37029a84457aed4c45bc900998b5e11c03023264208James Dong                    for (ii = 0; ii < (int)picParam->num_slice_groups_minus1; ii++)
37129a84457aed4c45bc900998b5e11c03023264208James Dong                    {
37229a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->top_left[ii] = extP->top_left[ii];
37329a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->bottom_right[ii] = extP->bottom_right[ii];
37429a84457aed4c45bc900998b5e11c03023264208James Dong                    }
37529a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
37629a84457aed4c45bc900998b5e11c03023264208James Dong                case 3:
37729a84457aed4c45bc900998b5e11c03023264208James Dong                case 4:
37829a84457aed4c45bc900998b5e11c03023264208James Dong                case 5:
37929a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->slice_group_change_direction_flag = extP->slice_group_change_direction_flag;
38029a84457aed4c45bc900998b5e11c03023264208James Dong                    if (/*extP->slice_group_change_rate_minus1 < 0 || (no need, it's unsigned) */
38129a84457aed4c45bc900998b5e11c03023264208James Dong                        extP->slice_group_change_rate_minus1 > video->PicSizeInMapUnits - 1)
38229a84457aed4c45bc900998b5e11c03023264208James Dong                    {
38329a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_INVALID_CHANGE_RATE;
38429a84457aed4c45bc900998b5e11c03023264208James Dong                    }
38529a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->slice_group_change_rate_minus1 = extP->slice_group_change_rate_minus1;
38629a84457aed4c45bc900998b5e11c03023264208James Dong                    video->SliceGroupChangeRate = picParam->slice_group_change_rate_minus1 + 1;
38729a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
38829a84457aed4c45bc900998b5e11c03023264208James Dong                case 6:
38929a84457aed4c45bc900998b5e11c03023264208James Dong                    if (extP->pic_size_in_map_units_minus1 != video->PicSizeInMapUnits - 1)
39029a84457aed4c45bc900998b5e11c03023264208James Dong                    {
39129a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_NOT_SUPPORTED;
39229a84457aed4c45bc900998b5e11c03023264208James Dong                    }
39329a84457aed4c45bc900998b5e11c03023264208James Dong
39429a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->pic_size_in_map_units_minus1 = extP->pic_size_in_map_units_minus1;
39529a84457aed4c45bc900998b5e11c03023264208James Dong
39629a84457aed4c45bc900998b5e11c03023264208James Dong                    /* allocate picParam->slice_group_id */
39729a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->slice_group_id = (uint*)avcHandle->CBAVC_Malloc(userData, sizeof(uint) * video->PicSizeInMapUnits, DEFAULT_ATTR);
39829a84457aed4c45bc900998b5e11c03023264208James Dong                    if (picParam->slice_group_id == NULL)
39929a84457aed4c45bc900998b5e11c03023264208James Dong                    {
40029a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_MEMORY_FAIL;
40129a84457aed4c45bc900998b5e11c03023264208James Dong                    }
40229a84457aed4c45bc900998b5e11c03023264208James Dong
40329a84457aed4c45bc900998b5e11c03023264208James Dong                    if (extP->slice_group_id == NULL)
40429a84457aed4c45bc900998b5e11c03023264208James Dong                    {
40529a84457aed4c45bc900998b5e11c03023264208James Dong                        return AVCENC_ENCPARAM_MEM_FAIL;
40629a84457aed4c45bc900998b5e11c03023264208James Dong                    }
40729a84457aed4c45bc900998b5e11c03023264208James Dong                    for (ii = 0; ii < (int)video->PicSizeInMapUnits; ii++)
40829a84457aed4c45bc900998b5e11c03023264208James Dong                    {
40929a84457aed4c45bc900998b5e11c03023264208James Dong                        picParam->slice_group_id[ii] = extP->slice_group_id[ii];
41029a84457aed4c45bc900998b5e11c03023264208James Dong                    }
41129a84457aed4c45bc900998b5e11c03023264208James Dong                    break;
41229a84457aed4c45bc900998b5e11c03023264208James Dong                default:
41329a84457aed4c45bc900998b5e11c03023264208James Dong                    return AVCENC_INVALID_FMO_TYPE;
41429a84457aed4c45bc900998b5e11c03023264208James Dong            }
41529a84457aed4c45bc900998b5e11c03023264208James Dong        }
41629a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->num_ref_idx_l0_active_minus1 = extP->num_ref_idx_l0_active_minus1;
41729a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->num_ref_idx_l1_active_minus1 = extP->num_ref_idx_l1_active_minus1; /* default value */
41829a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->num_ref_idx_l1_active_minus1 != 0)
41929a84457aed4c45bc900998b5e11c03023264208James Dong        {
42029a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
42129a84457aed4c45bc900998b5e11c03023264208James Dong        }
42229a84457aed4c45bc900998b5e11c03023264208James Dong
42329a84457aed4c45bc900998b5e11c03023264208James Dong        if (extP->weighted_pred_flag)
42429a84457aed4c45bc900998b5e11c03023264208James Dong        {
42529a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
42629a84457aed4c45bc900998b5e11c03023264208James Dong        }
42729a84457aed4c45bc900998b5e11c03023264208James Dong
42829a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->weighted_pred_flag = 0; /* no weighted prediction supported */
42929a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->weighted_bipred_idc = extP->weighted_bipred_idc; /* range 0,1,2 */
43029a84457aed4c45bc900998b5e11c03023264208James Dong        if (/*picParam->weighted_bipred_idc < 0 || (no need, it's unsigned) */
43129a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->weighted_bipred_idc > 2)
43229a84457aed4c45bc900998b5e11c03023264208James Dong        {
43329a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_WEIGHTED_BIPRED_FAIL;
43429a84457aed4c45bc900998b5e11c03023264208James Dong        }
43529a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_init_qp_minus26 = extP->pic_init_qp_minus26; /* default, will be changed at slice level anyway */
43629a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->pic_init_qp_minus26 < -26 || picParam->pic_init_qp_minus26 > 25)
43729a84457aed4c45bc900998b5e11c03023264208James Dong        {
43829a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INIT_QP_FAIL; /* out of range */
43929a84457aed4c45bc900998b5e11c03023264208James Dong        }
44029a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->pic_init_qs_minus26 = extP->pic_init_qs_minus26;
44129a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->pic_init_qs_minus26 < -26 || picParam->pic_init_qs_minus26 > 25)
44229a84457aed4c45bc900998b5e11c03023264208James Dong        {
44329a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INIT_QS_FAIL; /* out of range */
44429a84457aed4c45bc900998b5e11c03023264208James Dong        }
44529a84457aed4c45bc900998b5e11c03023264208James Dong
44629a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->chroma_qp_index_offset = extP->chroma_qp_index_offset; /* default to zero for now */
44729a84457aed4c45bc900998b5e11c03023264208James Dong        if (picParam->chroma_qp_index_offset < -12 || picParam->chroma_qp_index_offset > 12)
44829a84457aed4c45bc900998b5e11c03023264208James Dong        {
44929a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_CHROMA_QP_FAIL; /* out of range */
45029a84457aed4c45bc900998b5e11c03023264208James Dong        }
45129a84457aed4c45bc900998b5e11c03023264208James Dong        /* deblocking */
45229a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->deblocking_filter_control_present_flag = extP->deblocking_filter_control_present_flag;
45329a84457aed4c45bc900998b5e11c03023264208James Dong        /* constrained intra prediction */
45429a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->constrained_intra_pred_flag = extP->constrained_intra_pred_flag;
45529a84457aed4c45bc900998b5e11c03023264208James Dong        if (extP->redundant_pic_cnt_present_flag  != 0)
45629a84457aed4c45bc900998b5e11c03023264208James Dong        {
45729a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_NOT_SUPPORTED;
45829a84457aed4c45bc900998b5e11c03023264208James Dong        }
45929a84457aed4c45bc900998b5e11c03023264208James Dong        picParam->redundant_pic_cnt_present_flag = extP->redundant_pic_cnt_present_flag; /* default */
46029a84457aed4c45bc900998b5e11c03023264208James Dong    }
46129a84457aed4c45bc900998b5e11c03023264208James Dong    else
46229a84457aed4c45bc900998b5e11c03023264208James Dong    {
46329a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_NOT_SUPPORTED;
46429a84457aed4c45bc900998b5e11c03023264208James Dong    }
46529a84457aed4c45bc900998b5e11c03023264208James Dong
46629a84457aed4c45bc900998b5e11c03023264208James Dong    /****************** now set up some SliceHeader parameters ***********/
46729a84457aed4c45bc900998b5e11c03023264208James Dong    if (picParam->deblocking_filter_control_present_flag == TRUE)
46829a84457aed4c45bc900998b5e11c03023264208James Dong    {
46929a84457aed4c45bc900998b5e11c03023264208James Dong        /* these values only present when db_filter is ON */
47029a84457aed4c45bc900998b5e11c03023264208James Dong        if (encParam->disable_db_idc > 2)
47129a84457aed4c45bc900998b5e11c03023264208James Dong        {
47229a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INVALID_DEBLOCK_IDC; /* out of range */
47329a84457aed4c45bc900998b5e11c03023264208James Dong        }
47429a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->disable_deblocking_filter_idc = encParam->disable_db_idc;
47529a84457aed4c45bc900998b5e11c03023264208James Dong
47629a84457aed4c45bc900998b5e11c03023264208James Dong        if (encParam->alpha_offset < -6 || encParam->alpha_offset > 6)
47729a84457aed4c45bc900998b5e11c03023264208James Dong        {
47829a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INVALID_ALPHA_OFFSET;
47929a84457aed4c45bc900998b5e11c03023264208James Dong        }
48029a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->slice_alpha_c0_offset_div2 = encParam->alpha_offset;
48129a84457aed4c45bc900998b5e11c03023264208James Dong
48229a84457aed4c45bc900998b5e11c03023264208James Dong        if (encParam->beta_offset < -6 || encParam->beta_offset > 6)
48329a84457aed4c45bc900998b5e11c03023264208James Dong        {
48429a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_INVALID_BETA_OFFSET;
48529a84457aed4c45bc900998b5e11c03023264208James Dong        }
48629a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->slice_beta_offset_div_2 =  encParam->beta_offset;
48729a84457aed4c45bc900998b5e11c03023264208James Dong    }
48829a84457aed4c45bc900998b5e11c03023264208James Dong    if (encvid->outOfBandParamSet == TRUE)
48929a84457aed4c45bc900998b5e11c03023264208James Dong    {
49029a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->idr_pic_id = 0;
49129a84457aed4c45bc900998b5e11c03023264208James Dong    }
49229a84457aed4c45bc900998b5e11c03023264208James Dong    else
49329a84457aed4c45bc900998b5e11c03023264208James Dong    {
49429a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->idr_pic_id = (uint)(-1); /* start with zero */
49529a84457aed4c45bc900998b5e11c03023264208James Dong    }
49629a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->field_pic_flag = FALSE;
49729a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->bottom_field_flag = FALSE;  /* won't be used anyway */
49829a84457aed4c45bc900998b5e11c03023264208James Dong    video->MbaffFrameFlag = (seqParam->mb_adaptive_frame_field_flag && !sliceHdr->field_pic_flag);
49929a84457aed4c45bc900998b5e11c03023264208James Dong
50029a84457aed4c45bc900998b5e11c03023264208James Dong    /* the rest will be set in InitSlice() */
50129a84457aed4c45bc900998b5e11c03023264208James Dong
50229a84457aed4c45bc900998b5e11c03023264208James Dong    /* now the rate control and performance related parameters */
50329a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->scdEnable = (encParam->auto_scd == AVC_ON) ? TRUE : FALSE;
50429a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->idrPeriod = encParam->idr_period + 1;
50529a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->intraMBRate = encParam->intramb_refresh;
50629a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->dpEnable = (encParam->data_par == AVC_ON) ? TRUE : FALSE;
50729a84457aed4c45bc900998b5e11c03023264208James Dong
50829a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->subPelEnable = (encParam->sub_pel == AVC_ON) ? TRUE : FALSE;
50929a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->mvRange = encParam->search_range;
51029a84457aed4c45bc900998b5e11c03023264208James Dong
51129a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->subMBEnable = (encParam->submb_pred == AVC_ON) ? TRUE : FALSE;
51229a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->rdOptEnable = (encParam->rdopt_mode == AVC_ON) ? TRUE : FALSE;
51329a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->bidirPred = (encParam->bidir_pred == AVC_ON) ? TRUE : FALSE;
51429a84457aed4c45bc900998b5e11c03023264208James Dong
51529a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->rcEnable = (encParam->rate_control == AVC_ON) ? TRUE : FALSE;
51629a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->initQP = encParam->initQP;
51729a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->initQP = AVC_CLIP3(0, 51, rateCtrl->initQP);
51829a84457aed4c45bc900998b5e11c03023264208James Dong
51929a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->bitRate = encParam->bitrate;
52029a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->cpbSize = encParam->CPB_size;
52129a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->initDelayOffset = (rateCtrl->bitRate * encParam->init_CBP_removal_delay / 1000);
52229a84457aed4c45bc900998b5e11c03023264208James Dong
52329a84457aed4c45bc900998b5e11c03023264208James Dong    if (encParam->frame_rate == 0)
52429a84457aed4c45bc900998b5e11c03023264208James Dong    {
52529a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_INVALID_FRAMERATE;
52629a84457aed4c45bc900998b5e11c03023264208James Dong    }
52729a84457aed4c45bc900998b5e11c03023264208James Dong
52829a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->frame_rate = (OsclFloat)(encParam->frame_rate * 1.0 / 1000);
52929a84457aed4c45bc900998b5e11c03023264208James Dong//  rateCtrl->srcInterval = encParam->src_interval;
53029a84457aed4c45bc900998b5e11c03023264208James Dong    rateCtrl->first_frame = 1; /* set this flag for the first time */
53129a84457aed4c45bc900998b5e11c03023264208James Dong
53229a84457aed4c45bc900998b5e11c03023264208James Dong    /* contrained_setx_flag will be set inside the VerifyProfile called below.*/
53329a84457aed4c45bc900998b5e11c03023264208James Dong    if (!extS && !extP)
53429a84457aed4c45bc900998b5e11c03023264208James Dong    {
53529a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->profile_idc = encParam->profile;
53629a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set0_flag = FALSE;
53729a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set1_flag = FALSE;
53829a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set2_flag = FALSE;
53929a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set3_flag = FALSE;
54029a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->level_idc = encParam->level;
54129a84457aed4c45bc900998b5e11c03023264208James Dong    }
54229a84457aed4c45bc900998b5e11c03023264208James Dong    else
54329a84457aed4c45bc900998b5e11c03023264208James Dong    {
54429a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->profile_idc = extS->profile_idc;
54529a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set0_flag = extS->constrained_set0_flag;
54629a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set1_flag = extS->constrained_set1_flag;
54729a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set2_flag = extS->constrained_set2_flag;
54829a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set3_flag = extS->constrained_set3_flag;
54929a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->level_idc = extS->level_idc;
55029a84457aed4c45bc900998b5e11c03023264208James Dong    }
55129a84457aed4c45bc900998b5e11c03023264208James Dong
55229a84457aed4c45bc900998b5e11c03023264208James Dong
55329a84457aed4c45bc900998b5e11c03023264208James Dong    status = VerifyProfile(encvid, seqParam, picParam);
55429a84457aed4c45bc900998b5e11c03023264208James Dong    if (status != AVCENC_SUCCESS)
55529a84457aed4c45bc900998b5e11c03023264208James Dong    {
55629a84457aed4c45bc900998b5e11c03023264208James Dong        return status;
55729a84457aed4c45bc900998b5e11c03023264208James Dong    }
55829a84457aed4c45bc900998b5e11c03023264208James Dong
55929a84457aed4c45bc900998b5e11c03023264208James Dong    status = VerifyLevel(encvid, seqParam, picParam);
56029a84457aed4c45bc900998b5e11c03023264208James Dong    if (status != AVCENC_SUCCESS)
56129a84457aed4c45bc900998b5e11c03023264208James Dong    {
56229a84457aed4c45bc900998b5e11c03023264208James Dong        return status;
56329a84457aed4c45bc900998b5e11c03023264208James Dong    }
56429a84457aed4c45bc900998b5e11c03023264208James Dong
56529a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_SUCCESS;
56629a84457aed4c45bc900998b5e11c03023264208James Dong}
56729a84457aed4c45bc900998b5e11c03023264208James Dong
56829a84457aed4c45bc900998b5e11c03023264208James Dong/* verify the profile setting */
56929a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status VerifyProfile(AVCEncObject *encvid, AVCSeqParamSet *seqParam, AVCPicParamSet *picParam)
57029a84457aed4c45bc900998b5e11c03023264208James Dong{
57129a84457aed4c45bc900998b5e11c03023264208James Dong    AVCRateControl *rateCtrl = encvid->rateCtrl;
57229a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status = AVCENC_SUCCESS;
57329a84457aed4c45bc900998b5e11c03023264208James Dong
57429a84457aed4c45bc900998b5e11c03023264208James Dong    if (seqParam->profile_idc == 0) /* find profile for this setting */
57529a84457aed4c45bc900998b5e11c03023264208James Dong    {
57629a84457aed4c45bc900998b5e11c03023264208James Dong        /* find the right profile for it */
57729a84457aed4c45bc900998b5e11c03023264208James Dong        if (seqParam->direct_8x8_inference_flag == TRUE &&
57829a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->entropy_coding_mode_flag == FALSE &&
57929a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->num_slice_groups_minus1 <= 7 /*&&
58029a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->num_slice_groups_minus1>=0 (no need, it's unsigned) */)
58129a84457aed4c45bc900998b5e11c03023264208James Dong        {
58229a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->profile_idc = AVC_EXTENDED;
58329a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->constrained_set2_flag = TRUE;
58429a84457aed4c45bc900998b5e11c03023264208James Dong        }
58529a84457aed4c45bc900998b5e11c03023264208James Dong
58629a84457aed4c45bc900998b5e11c03023264208James Dong        if (rateCtrl->dpEnable == FALSE &&
58729a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->num_slice_groups_minus1 == 0 &&
58829a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->redundant_pic_cnt_present_flag == FALSE)
58929a84457aed4c45bc900998b5e11c03023264208James Dong        {
59029a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->profile_idc = AVC_MAIN;
59129a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->constrained_set1_flag = TRUE;
59229a84457aed4c45bc900998b5e11c03023264208James Dong        }
59329a84457aed4c45bc900998b5e11c03023264208James Dong
59429a84457aed4c45bc900998b5e11c03023264208James Dong        if (rateCtrl->bidirPred == FALSE &&
59529a84457aed4c45bc900998b5e11c03023264208James Dong                rateCtrl->dpEnable == FALSE &&
59629a84457aed4c45bc900998b5e11c03023264208James Dong                seqParam->frame_mbs_only_flag == TRUE &&
59729a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->weighted_pred_flag == FALSE &&
59829a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->weighted_bipred_idc == 0 &&
59929a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->entropy_coding_mode_flag == FALSE &&
60029a84457aed4c45bc900998b5e11c03023264208James Dong                picParam->num_slice_groups_minus1 <= 7 /*&&
60129a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->num_slice_groups_minus1>=0 (no need, it's unsigned)*/)
60229a84457aed4c45bc900998b5e11c03023264208James Dong        {
60329a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->profile_idc = AVC_BASELINE;
60429a84457aed4c45bc900998b5e11c03023264208James Dong            seqParam->constrained_set0_flag = TRUE;
60529a84457aed4c45bc900998b5e11c03023264208James Dong        }
60629a84457aed4c45bc900998b5e11c03023264208James Dong
60729a84457aed4c45bc900998b5e11c03023264208James Dong        if (seqParam->profile_idc == 0) /* still zero */
60829a84457aed4c45bc900998b5e11c03023264208James Dong        {
60929a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_PROFILE_NOT_SUPPORTED;
61029a84457aed4c45bc900998b5e11c03023264208James Dong        }
61129a84457aed4c45bc900998b5e11c03023264208James Dong    }
61229a84457aed4c45bc900998b5e11c03023264208James Dong
61329a84457aed4c45bc900998b5e11c03023264208James Dong    /* check the list of supported profile by this library */
61429a84457aed4c45bc900998b5e11c03023264208James Dong    switch (seqParam->profile_idc)
61529a84457aed4c45bc900998b5e11c03023264208James Dong    {
61629a84457aed4c45bc900998b5e11c03023264208James Dong        case AVC_BASELINE:
61729a84457aed4c45bc900998b5e11c03023264208James Dong            if (rateCtrl->bidirPred == TRUE ||
61829a84457aed4c45bc900998b5e11c03023264208James Dong                    rateCtrl->dpEnable == TRUE ||
61929a84457aed4c45bc900998b5e11c03023264208James Dong                    seqParam->frame_mbs_only_flag != TRUE ||
62029a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->weighted_pred_flag == TRUE ||
62129a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->weighted_bipred_idc != 0 ||
62229a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->entropy_coding_mode_flag == TRUE ||
62329a84457aed4c45bc900998b5e11c03023264208James Dong                    picParam->num_slice_groups_minus1 > 7 /*||
62429a84457aed4c45bc900998b5e11c03023264208James Dong            picParam->num_slice_groups_minus1<0 (no need, it's unsigned) */)
62529a84457aed4c45bc900998b5e11c03023264208James Dong            {
62629a84457aed4c45bc900998b5e11c03023264208James Dong                status = AVCENC_TOOLS_NOT_SUPPORTED;
62729a84457aed4c45bc900998b5e11c03023264208James Dong            }
62829a84457aed4c45bc900998b5e11c03023264208James Dong            break;
62929a84457aed4c45bc900998b5e11c03023264208James Dong
63029a84457aed4c45bc900998b5e11c03023264208James Dong        case AVC_MAIN:
63129a84457aed4c45bc900998b5e11c03023264208James Dong        case AVC_EXTENDED:
63229a84457aed4c45bc900998b5e11c03023264208James Dong            status = AVCENC_PROFILE_NOT_SUPPORTED;
63329a84457aed4c45bc900998b5e11c03023264208James Dong    }
63429a84457aed4c45bc900998b5e11c03023264208James Dong
63529a84457aed4c45bc900998b5e11c03023264208James Dong    return status;
63629a84457aed4c45bc900998b5e11c03023264208James Dong}
63729a84457aed4c45bc900998b5e11c03023264208James Dong
63829a84457aed4c45bc900998b5e11c03023264208James Dong/* verify the level setting */
63929a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status VerifyLevel(AVCEncObject *encvid, AVCSeqParamSet *seqParam, AVCPicParamSet *picParam)
64029a84457aed4c45bc900998b5e11c03023264208James Dong{
64129a84457aed4c45bc900998b5e11c03023264208James Dong    (void)(picParam);
64229a84457aed4c45bc900998b5e11c03023264208James Dong
64329a84457aed4c45bc900998b5e11c03023264208James Dong    AVCRateControl *rateCtrl = encvid->rateCtrl;
64429a84457aed4c45bc900998b5e11c03023264208James Dong    AVCCommonObj *video = encvid->common;
64529a84457aed4c45bc900998b5e11c03023264208James Dong    int mb_per_sec, ii;
64629a84457aed4c45bc900998b5e11c03023264208James Dong    int lev_idx;
64729a84457aed4c45bc900998b5e11c03023264208James Dong    int dpb_size;
64829a84457aed4c45bc900998b5e11c03023264208James Dong
64929a84457aed4c45bc900998b5e11c03023264208James Dong    mb_per_sec = (int)(video->PicSizeInMbs * rateCtrl->frame_rate + 0.5);
65029a84457aed4c45bc900998b5e11c03023264208James Dong    dpb_size = (seqParam->num_ref_frames * video->PicSizeInMbs * 3) >> 6;
65129a84457aed4c45bc900998b5e11c03023264208James Dong
65229a84457aed4c45bc900998b5e11c03023264208James Dong    if (seqParam->level_idc == 0) /* find level for this setting */
65329a84457aed4c45bc900998b5e11c03023264208James Dong    {
65429a84457aed4c45bc900998b5e11c03023264208James Dong        for (ii = 0; ii < MAX_LEVEL_IDX; ii++)
65529a84457aed4c45bc900998b5e11c03023264208James Dong        {
65629a84457aed4c45bc900998b5e11c03023264208James Dong            if (mb_per_sec <= MaxMBPS[ii] &&
65729a84457aed4c45bc900998b5e11c03023264208James Dong                    video->PicSizeInMbs <= (uint)MaxFS[ii] &&
65829a84457aed4c45bc900998b5e11c03023264208James Dong                    rateCtrl->bitRate <= (int32)MaxBR[ii]*1000 &&
65929a84457aed4c45bc900998b5e11c03023264208James Dong                    rateCtrl->cpbSize <= (int32)MaxCPB[ii]*1000 &&
66029a84457aed4c45bc900998b5e11c03023264208James Dong                    rateCtrl->mvRange <= MaxVmvR[ii] &&
66129a84457aed4c45bc900998b5e11c03023264208James Dong                    dpb_size <= MaxDPBX2[ii]*512)
66229a84457aed4c45bc900998b5e11c03023264208James Dong            {
66329a84457aed4c45bc900998b5e11c03023264208James Dong                seqParam->level_idc = mapIdx2Lev[ii];
66429a84457aed4c45bc900998b5e11c03023264208James Dong                break;
66529a84457aed4c45bc900998b5e11c03023264208James Dong            }
66629a84457aed4c45bc900998b5e11c03023264208James Dong        }
66729a84457aed4c45bc900998b5e11c03023264208James Dong        if (seqParam->level_idc == 0)
66829a84457aed4c45bc900998b5e11c03023264208James Dong        {
66929a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_LEVEL_NOT_SUPPORTED;
67029a84457aed4c45bc900998b5e11c03023264208James Dong        }
67129a84457aed4c45bc900998b5e11c03023264208James Dong    }
67229a84457aed4c45bc900998b5e11c03023264208James Dong
67329a84457aed4c45bc900998b5e11c03023264208James Dong    /* check if this level is supported by this library */
67429a84457aed4c45bc900998b5e11c03023264208James Dong    lev_idx = mapLev2Idx[seqParam->level_idc];
67529a84457aed4c45bc900998b5e11c03023264208James Dong    if (seqParam->level_idc == AVC_LEVEL1_B)
67629a84457aed4c45bc900998b5e11c03023264208James Dong    {
67729a84457aed4c45bc900998b5e11c03023264208James Dong        seqParam->constrained_set3_flag = 1;
67829a84457aed4c45bc900998b5e11c03023264208James Dong    }
67929a84457aed4c45bc900998b5e11c03023264208James Dong
68029a84457aed4c45bc900998b5e11c03023264208James Dong
68129a84457aed4c45bc900998b5e11c03023264208James Dong    if (lev_idx == 255) /* not defined */
68229a84457aed4c45bc900998b5e11c03023264208James Dong    {
68329a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_LEVEL_NOT_SUPPORTED;
68429a84457aed4c45bc900998b5e11c03023264208James Dong    }
68529a84457aed4c45bc900998b5e11c03023264208James Dong
68629a84457aed4c45bc900998b5e11c03023264208James Dong    /* check if the encoding setting complies with the level */
68729a84457aed4c45bc900998b5e11c03023264208James Dong    if (mb_per_sec > MaxMBPS[lev_idx] ||
68829a84457aed4c45bc900998b5e11c03023264208James Dong            video->PicSizeInMbs > (uint)MaxFS[lev_idx] ||
68929a84457aed4c45bc900998b5e11c03023264208James Dong            rateCtrl->bitRate > (int32)MaxBR[lev_idx]*1000 ||
69029a84457aed4c45bc900998b5e11c03023264208James Dong            rateCtrl->cpbSize > (int32)MaxCPB[lev_idx]*1000 ||
69129a84457aed4c45bc900998b5e11c03023264208James Dong            rateCtrl->mvRange > MaxVmvR[lev_idx])
69229a84457aed4c45bc900998b5e11c03023264208James Dong    {
69329a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_LEVEL_FAIL;
69429a84457aed4c45bc900998b5e11c03023264208James Dong    }
69529a84457aed4c45bc900998b5e11c03023264208James Dong
69629a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_SUCCESS;
69729a84457aed4c45bc900998b5e11c03023264208James Dong}
69829a84457aed4c45bc900998b5e11c03023264208James Dong
69929a84457aed4c45bc900998b5e11c03023264208James Dong/* initialize variables at the beginning of each frame */
70029a84457aed4c45bc900998b5e11c03023264208James Dong/* determine the picture type */
70129a84457aed4c45bc900998b5e11c03023264208James Dong/* encode POC */
70229a84457aed4c45bc900998b5e11c03023264208James Dong/* maybe we should do more stuff here. MotionEstimation+SCD and generate a new SPS and PPS */
70329a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status InitFrame(AVCEncObject *encvid)
70429a84457aed4c45bc900998b5e11c03023264208James Dong{
70529a84457aed4c45bc900998b5e11c03023264208James Dong    AVCStatus ret;
70629a84457aed4c45bc900998b5e11c03023264208James Dong    AVCEnc_Status status;
70729a84457aed4c45bc900998b5e11c03023264208James Dong    AVCCommonObj *video = encvid->common;
70829a84457aed4c45bc900998b5e11c03023264208James Dong    AVCSliceHeader *sliceHdr = video->sliceHdr;
70929a84457aed4c45bc900998b5e11c03023264208James Dong
71029a84457aed4c45bc900998b5e11c03023264208James Dong    /* look for the next frame in coding_order and look for available picture
71129a84457aed4c45bc900998b5e11c03023264208James Dong       in the DPB. Note, video->currFS->PicOrderCnt, currFS->FrameNum and currPic->PicNum
71229a84457aed4c45bc900998b5e11c03023264208James Dong       are set to wrong number in this function (right for decoder). */
71329a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->nal_unit_type == AVC_NALTYPE_IDR)
71429a84457aed4c45bc900998b5e11c03023264208James Dong    {
71529a84457aed4c45bc900998b5e11c03023264208James Dong        // call init DPB in here.
71629a84457aed4c45bc900998b5e11c03023264208James Dong        ret = AVCConfigureSequence(encvid->avcHandle, video, TRUE);
71729a84457aed4c45bc900998b5e11c03023264208James Dong        if (ret != AVC_SUCCESS)
71829a84457aed4c45bc900998b5e11c03023264208James Dong        {
71929a84457aed4c45bc900998b5e11c03023264208James Dong            return AVCENC_FAIL;
72029a84457aed4c45bc900998b5e11c03023264208James Dong        }
72129a84457aed4c45bc900998b5e11c03023264208James Dong    }
72229a84457aed4c45bc900998b5e11c03023264208James Dong
72329a84457aed4c45bc900998b5e11c03023264208James Dong    /* flexible macroblock ordering (every frame)*/
72429a84457aed4c45bc900998b5e11c03023264208James Dong    /* populate video->mapUnitToSliceGroupMap and video->MbToSliceGroupMap */
72529a84457aed4c45bc900998b5e11c03023264208James Dong    /* It changes once per each PPS. */
72629a84457aed4c45bc900998b5e11c03023264208James Dong    FMOInit(video);
72729a84457aed4c45bc900998b5e11c03023264208James Dong
72829a84457aed4c45bc900998b5e11c03023264208James Dong    ret = DPBInitBuffer(encvid->avcHandle, video); // get new buffer
72929a84457aed4c45bc900998b5e11c03023264208James Dong
73029a84457aed4c45bc900998b5e11c03023264208James Dong    if (ret != AVC_SUCCESS)
73129a84457aed4c45bc900998b5e11c03023264208James Dong    {
73229a84457aed4c45bc900998b5e11c03023264208James Dong        return (AVCEnc_Status)ret; // AVCENC_PICTURE_READY, FAIL
73329a84457aed4c45bc900998b5e11c03023264208James Dong    }
73429a84457aed4c45bc900998b5e11c03023264208James Dong
73529a84457aed4c45bc900998b5e11c03023264208James Dong    DPBInitPic(video, 0); /* 0 is dummy */
73629a84457aed4c45bc900998b5e11c03023264208James Dong
73729a84457aed4c45bc900998b5e11c03023264208James Dong    /************* determine picture type IDR or non-IDR ***********/
73829a84457aed4c45bc900998b5e11c03023264208James Dong    video->currPicType = AVC_FRAME;
73929a84457aed4c45bc900998b5e11c03023264208James Dong    video->slice_data_partitioning = FALSE;
74029a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->currInput->is_reference = 1; /* default to all frames */
74129a84457aed4c45bc900998b5e11c03023264208James Dong    video->nal_ref_idc = 1;  /* need to set this for InitPOC */
74229a84457aed4c45bc900998b5e11c03023264208James Dong    video->currPic->isReference = TRUE;
74329a84457aed4c45bc900998b5e11c03023264208James Dong
74429a84457aed4c45bc900998b5e11c03023264208James Dong    /************* set frame_num ********************/
74529a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->nal_unit_type == AVC_NALTYPE_IDR)
74629a84457aed4c45bc900998b5e11c03023264208James Dong    {
74729a84457aed4c45bc900998b5e11c03023264208James Dong        video->prevFrameNum = video->MaxFrameNum;
74829a84457aed4c45bc900998b5e11c03023264208James Dong        video->PrevRefFrameNum = 0;
74929a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->frame_num = 0;
75029a84457aed4c45bc900998b5e11c03023264208James Dong    }
75129a84457aed4c45bc900998b5e11c03023264208James Dong    /* otherwise, it's set to previous reference frame access unit's frame_num in decoding order,
75229a84457aed4c45bc900998b5e11c03023264208James Dong       see the end of PVAVCDecodeSlice()*/
75329a84457aed4c45bc900998b5e11c03023264208James Dong    /* There's also restriction on the frame_num, see page 59 of JVT-I1010.doc. */
75429a84457aed4c45bc900998b5e11c03023264208James Dong    /* Basically, frame_num can't be repeated unless it's opposite fields or non reference fields */
75529a84457aed4c45bc900998b5e11c03023264208James Dong    else
75629a84457aed4c45bc900998b5e11c03023264208James Dong    {
75729a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->frame_num = (video->PrevRefFrameNum + 1) % video->MaxFrameNum;
75829a84457aed4c45bc900998b5e11c03023264208James Dong    }
75929a84457aed4c45bc900998b5e11c03023264208James Dong    video->CurrPicNum = sliceHdr->frame_num;  /* for field_pic_flag = 0 */
76029a84457aed4c45bc900998b5e11c03023264208James Dong    //video->CurrPicNum = 2*sliceHdr->frame_num + 1; /* for field_pic_flag = 1 */
76129a84457aed4c45bc900998b5e11c03023264208James Dong
76229a84457aed4c45bc900998b5e11c03023264208James Dong    /* assign pic_order_cnt, video->PicOrderCnt */
76329a84457aed4c45bc900998b5e11c03023264208James Dong    status = InitPOC(encvid);
76429a84457aed4c45bc900998b5e11c03023264208James Dong    if (status != AVCENC_SUCCESS)  /* incorrigable fail */
76529a84457aed4c45bc900998b5e11c03023264208James Dong    {
76629a84457aed4c45bc900998b5e11c03023264208James Dong        return status;
76729a84457aed4c45bc900998b5e11c03023264208James Dong    }
76829a84457aed4c45bc900998b5e11c03023264208James Dong
76929a84457aed4c45bc900998b5e11c03023264208James Dong    /* Initialize refListIdx for this picture */
77029a84457aed4c45bc900998b5e11c03023264208James Dong    RefListInit(video);
77129a84457aed4c45bc900998b5e11c03023264208James Dong
77229a84457aed4c45bc900998b5e11c03023264208James Dong    /************* motion estimation and scene analysis ************/
77329a84457aed4c45bc900998b5e11c03023264208James Dong    // , to move this to MB-based MV search for comparison
77429a84457aed4c45bc900998b5e11c03023264208James Dong    // use sub-optimal QP for mv search
77529a84457aed4c45bc900998b5e11c03023264208James Dong    AVCMotionEstimation(encvid);  /* AVCENC_SUCCESS or AVCENC_NEW_IDR */
77629a84457aed4c45bc900998b5e11c03023264208James Dong
77729a84457aed4c45bc900998b5e11c03023264208James Dong    /* after this point, the picture type will be fixed to either IDR or non-IDR */
77829a84457aed4c45bc900998b5e11c03023264208James Dong    video->currFS->PicOrderCnt = video->PicOrderCnt;
77929a84457aed4c45bc900998b5e11c03023264208James Dong    video->currFS->FrameNum = video->sliceHdr->frame_num;
78029a84457aed4c45bc900998b5e11c03023264208James Dong    video->currPic->PicNum = video->CurrPicNum;
78129a84457aed4c45bc900998b5e11c03023264208James Dong    video->mbNum = 0; /* start from zero MB */
78229a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->currSliceGroup = 0; /* start from slice group #0 */
78329a84457aed4c45bc900998b5e11c03023264208James Dong    encvid->numIntraMB = 0; /* reset this counter */
78429a84457aed4c45bc900998b5e11c03023264208James Dong
78529a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->nal_unit_type == AVC_NALTYPE_IDR)
78629a84457aed4c45bc900998b5e11c03023264208James Dong    {
78729a84457aed4c45bc900998b5e11c03023264208James Dong        RCInitGOP(encvid);
78829a84457aed4c45bc900998b5e11c03023264208James Dong
78929a84457aed4c45bc900998b5e11c03023264208James Dong        /* calculate picture QP */
79029a84457aed4c45bc900998b5e11c03023264208James Dong        RCInitFrameQP(encvid);
79129a84457aed4c45bc900998b5e11c03023264208James Dong
79229a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_NEW_IDR;
79329a84457aed4c45bc900998b5e11c03023264208James Dong    }
79429a84457aed4c45bc900998b5e11c03023264208James Dong
79529a84457aed4c45bc900998b5e11c03023264208James Dong    /* calculate picture QP */
79629a84457aed4c45bc900998b5e11c03023264208James Dong    RCInitFrameQP(encvid); /* get QP after MV search */
79729a84457aed4c45bc900998b5e11c03023264208James Dong
79829a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_SUCCESS;
79929a84457aed4c45bc900998b5e11c03023264208James Dong}
80029a84457aed4c45bc900998b5e11c03023264208James Dong
80129a84457aed4c45bc900998b5e11c03023264208James Dong/* initialize variables for this slice */
80229a84457aed4c45bc900998b5e11c03023264208James DongAVCEnc_Status InitSlice(AVCEncObject *encvid)
80329a84457aed4c45bc900998b5e11c03023264208James Dong{
80429a84457aed4c45bc900998b5e11c03023264208James Dong    AVCCommonObj *video = encvid->common;
80529a84457aed4c45bc900998b5e11c03023264208James Dong    AVCSliceHeader *sliceHdr = video->sliceHdr;
80629a84457aed4c45bc900998b5e11c03023264208James Dong    AVCPicParamSet *currPPS = video->currPicParams;
80729a84457aed4c45bc900998b5e11c03023264208James Dong    AVCSeqParamSet *currSPS = video->currSeqParams;
80829a84457aed4c45bc900998b5e11c03023264208James Dong    int slice_type = video->slice_type;
80929a84457aed4c45bc900998b5e11c03023264208James Dong
81029a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->first_mb_in_slice = video->mbNum;
81129a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->mbNum) // not first slice of a frame
81229a84457aed4c45bc900998b5e11c03023264208James Dong    {
81329a84457aed4c45bc900998b5e11c03023264208James Dong        video->sliceHdr->slice_type = (AVCSliceType)slice_type;
81429a84457aed4c45bc900998b5e11c03023264208James Dong    }
81529a84457aed4c45bc900998b5e11c03023264208James Dong
81629a84457aed4c45bc900998b5e11c03023264208James Dong    /* sliceHdr->slice_type already set in InitFrame */
81729a84457aed4c45bc900998b5e11c03023264208James Dong
81829a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->pic_parameter_set_id = video->currPicParams->pic_parameter_set_id;
81929a84457aed4c45bc900998b5e11c03023264208James Dong
82029a84457aed4c45bc900998b5e11c03023264208James Dong    /* sliceHdr->frame_num already set in InitFrame */
82129a84457aed4c45bc900998b5e11c03023264208James Dong
82229a84457aed4c45bc900998b5e11c03023264208James Dong    if (!currSPS->frame_mbs_only_flag)  /* we shouldn't need this check */
82329a84457aed4c45bc900998b5e11c03023264208James Dong    {
82429a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->field_pic_flag = sliceHdr->bottom_field_flag = FALSE;
82529a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_TOOLS_NOT_SUPPORTED;
82629a84457aed4c45bc900998b5e11c03023264208James Dong    }
82729a84457aed4c45bc900998b5e11c03023264208James Dong
82829a84457aed4c45bc900998b5e11c03023264208James Dong    /* sliceHdr->idr_pic_id already set in PVAVCEncodeNAL
82929a84457aed4c45bc900998b5e11c03023264208James Dong
83029a84457aed4c45bc900998b5e11c03023264208James Dong     sliceHdr->pic_order_cnt_lsb already set in InitFrame..InitPOC
83129a84457aed4c45bc900998b5e11c03023264208James Dong     sliceHdr->delta_pic_order_cnt_bottom  already set in InitPOC
83229a84457aed4c45bc900998b5e11c03023264208James Dong
83329a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->delta_pic_order_cnt[0] already set in InitPOC
83429a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->delta_pic_order_cnt[1] already set in InitPOC
83529a84457aed4c45bc900998b5e11c03023264208James Dong    */
83629a84457aed4c45bc900998b5e11c03023264208James Dong
83729a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->redundant_pic_cnt = 0; /* default if(currPPS->redundant_pic_cnt_present_flag), range 0..127 */
83829a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->direct_spatial_mv_pred_flag = 0; // default if(slice_type == AVC_B_SLICE)
83929a84457aed4c45bc900998b5e11c03023264208James Dong
84029a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->num_ref_idx_active_override_flag = FALSE; /* default, if(slice_type== P,SP or B)*/
84129a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->num_ref_idx_l0_active_minus1 = 0; /* default, if (num_ref_idx_active_override_flag) */
84229a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->num_ref_idx_l1_active_minus1 = 0; /* default, if above and B_slice */
84329a84457aed4c45bc900998b5e11c03023264208James Dong    /* the above 2 values range from 0..15 for frame picture and 0..31 for field picture */
84429a84457aed4c45bc900998b5e11c03023264208James Dong
84529a84457aed4c45bc900998b5e11c03023264208James Dong    /* ref_pic_list_reordering(), currently we don't do anything */
84629a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->ref_pic_list_reordering_flag_l0 = FALSE; /* default */
84729a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->ref_pic_list_reordering_flag_l1 = FALSE; /* default */
84829a84457aed4c45bc900998b5e11c03023264208James Dong    /* if the above are TRUE, some other params must be set */
84929a84457aed4c45bc900998b5e11c03023264208James Dong
85029a84457aed4c45bc900998b5e11c03023264208James Dong    if ((currPPS->weighted_pred_flag && (slice_type == AVC_P_SLICE || slice_type == AVC_SP_SLICE)) ||
85129a84457aed4c45bc900998b5e11c03023264208James Dong            (currPPS->weighted_bipred_idc == 1 && slice_type == AVC_B_SLICE))
85229a84457aed4c45bc900998b5e11c03023264208James Dong    {
85329a84457aed4c45bc900998b5e11c03023264208James Dong        //      pred_weight_table(); // not supported !!
85429a84457aed4c45bc900998b5e11c03023264208James Dong        return AVCENC_TOOLS_NOT_SUPPORTED;
85529a84457aed4c45bc900998b5e11c03023264208James Dong    }
85629a84457aed4c45bc900998b5e11c03023264208James Dong
85729a84457aed4c45bc900998b5e11c03023264208James Dong    /* dec_ref_pic_marking(), this will be done later*/
85829a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->no_output_of_prior_pics_flag = FALSE; /* default */
85929a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->long_term_reference_flag = FALSE; /* for IDR frame, do not make it long term */
86029a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->adaptive_ref_pic_marking_mode_flag = FALSE; /* default */
86129a84457aed4c45bc900998b5e11c03023264208James Dong    /* other params are not set here because they are not used */
86229a84457aed4c45bc900998b5e11c03023264208James Dong
86329a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->cabac_init_idc = 0; /* default, if entropy_coding_mode_flag && slice_type==I or SI, range 0..2  */
86429a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->slice_qp_delta = 0; /* default for now */
86529a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->sp_for_switch_flag = FALSE; /* default, if slice_type == SP */
86629a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->slice_qs_delta = 0; /* default, if slice_type == SP or SI */
86729a84457aed4c45bc900998b5e11c03023264208James Dong
86829a84457aed4c45bc900998b5e11c03023264208James Dong    /* derived variables from encParam */
86929a84457aed4c45bc900998b5e11c03023264208James Dong    /* deblocking filter */
87029a84457aed4c45bc900998b5e11c03023264208James Dong    video->FilterOffsetA = video->FilterOffsetB = 0;
87129a84457aed4c45bc900998b5e11c03023264208James Dong    if (currPPS->deblocking_filter_control_present_flag == TRUE)
87229a84457aed4c45bc900998b5e11c03023264208James Dong    {
87329a84457aed4c45bc900998b5e11c03023264208James Dong        video->FilterOffsetA = sliceHdr->slice_alpha_c0_offset_div2 << 1;
87429a84457aed4c45bc900998b5e11c03023264208James Dong        video->FilterOffsetB = sliceHdr->slice_beta_offset_div_2 << 1;
87529a84457aed4c45bc900998b5e11c03023264208James Dong    }
87629a84457aed4c45bc900998b5e11c03023264208James Dong
87729a84457aed4c45bc900998b5e11c03023264208James Dong    /* flexible macroblock ordering */
87829a84457aed4c45bc900998b5e11c03023264208James Dong    /* populate video->mapUnitToSliceGroupMap and video->MbToSliceGroupMap */
87929a84457aed4c45bc900998b5e11c03023264208James Dong    /* We already call it at the end of PVAVCEncInitialize(). It changes once per each PPS. */
88029a84457aed4c45bc900998b5e11c03023264208James Dong    if (video->currPicParams->num_slice_groups_minus1 > 0 && video->currPicParams->slice_group_map_type >= 3
88129a84457aed4c45bc900998b5e11c03023264208James Dong            && video->currPicParams->slice_group_map_type <= 5)
88229a84457aed4c45bc900998b5e11c03023264208James Dong    {
88329a84457aed4c45bc900998b5e11c03023264208James Dong        sliceHdr->slice_group_change_cycle = SLICE_GROUP_CHANGE_CYCLE;  /* default, don't understand how to set it!!!*/
88429a84457aed4c45bc900998b5e11c03023264208James Dong
88529a84457aed4c45bc900998b5e11c03023264208James Dong        video->MapUnitsInSliceGroup0 =
88629a84457aed4c45bc900998b5e11c03023264208James Dong            AVC_MIN(sliceHdr->slice_group_change_cycle * video->SliceGroupChangeRate, video->PicSizeInMapUnits);
88729a84457aed4c45bc900998b5e11c03023264208James Dong
88829a84457aed4c45bc900998b5e11c03023264208James Dong        FMOInit(video);
88929a84457aed4c45bc900998b5e11c03023264208James Dong    }
89029a84457aed4c45bc900998b5e11c03023264208James Dong
89129a84457aed4c45bc900998b5e11c03023264208James Dong    /* calculate SliceQPy first  */
89229a84457aed4c45bc900998b5e11c03023264208James Dong    /* calculate QSy first */
89329a84457aed4c45bc900998b5e11c03023264208James Dong
89429a84457aed4c45bc900998b5e11c03023264208James Dong    sliceHdr->slice_qp_delta = video->QPy - 26 - currPPS->pic_init_qp_minus26;
89529a84457aed4c45bc900998b5e11c03023264208James Dong    //sliceHdr->slice_qs_delta = video->QSy - 26 - currPPS->pic_init_qs_minus26;
89629a84457aed4c45bc900998b5e11c03023264208James Dong
89729a84457aed4c45bc900998b5e11c03023264208James Dong    return AVCENC_SUCCESS;
89829a84457aed4c45bc900998b5e11c03023264208James Dong}
89929a84457aed4c45bc900998b5e11c03023264208James Dong
900