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