Encode_Status VaapiEncoderH264::getMaxOutSize(uint32_t *maxSize) { FUNC_ENTER(); if (ensureCodedBufferSize()) *maxSize = m_maxCodedbufSize; else *maxSize = 0; return ENCODE_SUCCESS; }
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(); }
// calls immediately after reorder, // it makes sure I frame are encoded immediately, so P frames can be pushed to the front of the m_reorderFrameList. // it also makes sure input thread and output thread runs in parallel Encode_Status VaapiEncoderH264::doEncode(const SurfacePtr& surface, uint64_t timeStamp, bool forceKeyFrame) { FUNC_ENTER(); Encode_Status ret; ret = reorder(surface, timeStamp, forceKeyFrame); if (ret != ENCODE_SUCCESS) return ret; while (m_reorderState == VAAPI_ENC_REORD_DUMP_FRAMES) { if (!m_maxCodedbufSize) ensureCodedBufferSize(); CodedBufferPtr codedBuffer = VaapiCodedBuffer::create(m_context, m_maxCodedbufSize); if (!codedBuffer) return ENCODE_NO_MEMORY; PicturePtr picture = m_reorderFrameList.front(); m_reorderFrameList.pop_front(); picture->m_codedBuffer = codedBuffer; if (m_reorderFrameList.empty()) m_reorderState = VAAPI_ENC_REORD_WAIT_FRAMES; ret = encodePicture(picture); if (ret != ENCODE_SUCCESS) { return ret; } codedBuffer->setFlag(ENCODE_BUFFERFLAG_ENDOFFRAME); INFO("picture->m_type: 0x%x\n", picture->m_type); if (picture->isIdr()) { codedBuffer->setFlag(ENCODE_BUFFERFLAG_SYNCFRAME); } if (!output(picture)) return ENCODE_INVALID_PARAMS; } INFO(); return ENCODE_SUCCESS; }