void VaapiEncoderH264::resetParams () { m_levelIdc = level(); DEBUG("resetParams, ensureCodedBufferSize"); ensureCodedBufferSize(); if (ipPeriod() == 0) m_videoParamCommon.intraPeriod = 1; else m_numBFrames = ipPeriod() - 1; assert(intraPeriod() > ipPeriod()); m_keyPeriod = intraPeriod() * (m_videoParamAVC.idrInterval + 1); if (m_keyPeriod > MAX_IDR_PERIOD) m_keyPeriod = MAX_IDR_PERIOD; if (minQP() > initQP() || (rateControlMode()== RATE_CONTROL_CQP && minQP() < initQP())) minQP() = initQP(); if (m_numBFrames > (intraPeriod() + 1) / 2) m_numBFrames = (intraPeriod() + 1) / 2; /* init m_maxFrameNum, max_poc */ m_log2MaxFrameNum = h264_get_log2_max_frame_num (m_keyPeriod); assert (m_log2MaxFrameNum >= 4); m_maxFrameNum = (1 << m_log2MaxFrameNum); m_log2MaxPicOrderCnt = m_log2MaxFrameNum + 1; m_maxPicOrderCnt = (1 << m_log2MaxPicOrderCnt); m_maxRefList1Count = m_numBFrames > 0;//m_maxRefList1Count <=1, because of currenent order mechanism m_maxRefList0Count = numRefFrames(); if (m_maxRefList0Count >= m_maxOutputBuffer -1) m_maxRefList0Count = m_maxOutputBuffer -1; m_maxRefFrames = m_maxRefList0Count + m_maxRefList1Count; assert(m_maxRefFrames <= m_maxOutputBuffer); INFO("m_maxRefFrames: %d", m_maxRefFrames); resetGopStart(); }
void VaapiEncoderH264::resetParams () { m_levelIdc = level(); DEBUG("resetParams, ensureCodedBufferSize"); ensureCodedBufferSize(); if (ipPeriod() == 0) m_videoParamCommon.intraPeriod = 1; else m_numBFrames = ipPeriod() - 1; assert(intraPeriod() > ipPeriod()); if (keyFramePeriod() < intraPeriod()) keyFramePeriod() = intraPeriod(); if (keyFramePeriod() > MAX_IDR_PERIOD) keyFramePeriod() = MAX_IDR_PERIOD; if (minQP() > initQP() || (rateControlMode()== RATE_CONTROL_CQP && minQP() < initQP())) minQP() = initQP(); if (m_numBFrames > (intraPeriod() + 1) / 2) m_numBFrames = (intraPeriod() + 1) / 2; /* init m_maxFrameNum, max_poc */ m_log2MaxFrameNum = h264_get_log2_max_frame_num (keyFramePeriod()); assert (m_log2MaxFrameNum >= 4); m_maxFrameNum = (1 << m_log2MaxFrameNum); m_log2MaxPicOrderCnt = m_log2MaxFrameNum + 1; m_maxPicOrderCnt = (1 << m_log2MaxPicOrderCnt); m_maxRefList0Count = 1; m_maxRefList1Count = m_numBFrames > 0; m_maxRefFrames = m_maxRefList0Count + m_maxRefList1Count; INFO("m_maxRefFrames: %d", m_maxRefFrames); resetGopStart(); }
/* Adds slice headers to picture */ bool VaapiEncoderH264::addSliceHeaders (const PicturePtr& picture) const { VAEncSliceParameterBufferH264 *sliceParam; uint32_t sliceOfMbs, sliceModMbs, curSliceMbs; uint32_t mbSize; uint32_t lastMbIndex; assert (picture); if (picture->m_type != VAAPI_PICTURE_TYPE_I) { /* have one reference frame at least */ assert(m_refList0.size() > 0); } mbSize = m_mbWidth * m_mbHeight; assert (m_numSlices && m_numSlices < mbSize); sliceOfMbs = mbSize / m_numSlices; sliceModMbs = mbSize % m_numSlices; lastMbIndex = 0; for (uint32_t i = 0; i < m_numSlices; ++i) { curSliceMbs = sliceOfMbs; if (sliceModMbs) { ++curSliceMbs; --sliceModMbs; } if (!picture->newSlice(sliceParam)) return false; sliceParam->macroblock_address = lastMbIndex; sliceParam->num_macroblocks = curSliceMbs; sliceParam->macroblock_info = VA_INVALID_ID; sliceParam->slice_type = h264_get_slice_type (picture->m_type); assert (sliceParam->slice_type != -1); sliceParam->idr_pic_id = m_idrNum; sliceParam->pic_order_cnt_lsb = picture->m_poc; sliceParam->num_ref_idx_active_override_flag = 1; if (picture->m_type != VAAPI_PICTURE_TYPE_I && m_refList0.size() > 0) sliceParam->num_ref_idx_l0_active_minus1 = m_refList0.size() - 1; if (picture->m_type == VAAPI_PICTURE_TYPE_B && m_refList1.size() > 0) sliceParam->num_ref_idx_l1_active_minus1 = m_refList1.size() - 1; fillReferenceList(sliceParam); sliceParam->slice_qp_delta = initQP() - minQP(); if (sliceParam->slice_qp_delta > 4) sliceParam->slice_qp_delta = 4; sliceParam->slice_alpha_c0_offset_div2 = 2; sliceParam->slice_beta_offset_div2 = 2; /* set calculation for next slice */ lastMbIndex += curSliceMbs; } assert (lastMbIndex == mbSize); return true; }
/* Fills in VA picture parameter buffer */ bool VaapiEncoderH264::fill(VAEncPictureParameterBufferH264* picParam, const PicturePtr& picture, const SurfacePtr& surface) const { uint32_t i = 0; /* reference list, */ picParam->CurrPic.picture_id = surface->getID(); picParam->CurrPic.TopFieldOrderCnt = picture->m_poc; if (picture->m_type != VAAPI_PICTURE_TYPE_I) { for (i = 0; i < m_refList.size(); i++) { picParam->ReferenceFrames[i].picture_id = m_refList[i]->m_pic->getID(); picParam->ReferenceFrames[i].TopFieldOrderCnt = m_refList[i]->m_poc; picParam->ReferenceFrames[i].flags |= VA_PICTURE_H264_SHORT_TERM_REFERENCE; } } for (; i < 16; ++i) { picParam->ReferenceFrames[i].picture_id = VA_INVALID_ID; } picParam->coded_buf = picture->m_codedBuffer->getID(); picParam->pic_parameter_set_id = 0; picParam->seq_parameter_set_id = 0; picParam->last_picture = 0; /* means last encoding picture */ picParam->frame_num = picture->m_frameNum; picParam->pic_init_qp = initQP(); picParam->num_ref_idx_l0_active_minus1 = (m_maxRefList0Count ? (m_maxRefList0Count - 1) : 0); picParam->num_ref_idx_l1_active_minus1 = (m_maxRefList1Count ? (m_maxRefList1Count - 1) : 0); picParam->chroma_qp_index_offset = 0; picParam->second_chroma_qp_index_offset = 0; /* set picture fields */ picParam->pic_fields.bits.idr_pic_flag = picture->isIdr(); picParam->pic_fields.bits.reference_pic_flag = (picture->m_type != VAAPI_PICTURE_TYPE_B); picParam->pic_fields.bits.entropy_coding_mode_flag = m_useCabac; picParam->pic_fields.bits.transform_8x8_mode_flag = m_useDct8x8; /* enable debloking */ picParam->pic_fields.bits.deblocking_filter_control_present_flag = TRUE; return TRUE; }