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; }