Encode_Status VaapiEncoderH264::reorder(const SurfacePtr& surface, uint64_t timeStamp, bool forceKeyFrame) { if (!surface) return ENCODE_INVALID_PARAMS; PicturePtr picture(new VaapiEncPictureH264(m_context, surface, timeStamp)); bool isIdr = (m_frameIndex == 0 ||m_frameIndex >= keyFramePeriod() || forceKeyFrame); if (isIdr) { setIdrFrame (picture); m_reorderFrameList.push_back(picture); m_curFrameNum++; m_reorderState = VAAPI_ENC_REORD_DUMP_FRAMES; } else if (m_frameIndex % intraPeriod() == 0) { setIFrame (picture); m_reorderFrameList.push_front(picture); m_curFrameNum++; m_reorderState = VAAPI_ENC_REORD_DUMP_FRAMES; }else if (m_frameIndex % (m_numBFrames + 1) != 0) { setBFrame (picture); m_reorderFrameList.push_back(picture); } else { setPFrame (picture); m_reorderFrameList.push_front(picture); m_curFrameNum++; m_reorderState = VAAPI_ENC_REORD_DUMP_FRAMES; } picture->m_poc = ((m_frameIndex * 2) % m_maxPicOrderCnt); m_frameIndex++; return ENCODE_SUCCESS; }
Encode_Status VaapiEncoderH264::reorder(const SurfacePtr& surface, uint64_t timeStamp, bool forceKeyFrame) { if (!surface) return ENCODE_INVALID_PARAMS; PicturePtr picture(new VaapiEncPictureH264(m_context, surface, timeStamp)); bool isIdr = (m_frameIndex == 0 ||m_frameIndex >= m_keyPeriod || forceKeyFrame); if (isIdr) { // If the last frame before IDR is B frame, set it to P frame. if (m_reorderFrameList.size()) { PicturePtr lastPic = m_reorderFrameList.back(); if (lastPic->m_type == VAAPI_PICTURE_TYPE_B) { lastPic->m_type = VAAPI_PICTURE_TYPE_P; m_reorderFrameList.pop_back(); m_reorderFrameList.push_front(lastPic); } } setIdrFrame (picture); m_reorderFrameList.push_back(picture); m_curFrameNum++; m_reorderState = VAAPI_ENC_REORD_DUMP_FRAMES; } else if (m_frameIndex % intraPeriod() == 0) { setIFrame (picture); m_reorderFrameList.push_front(picture); m_curFrameNum++; m_reorderState = VAAPI_ENC_REORD_DUMP_FRAMES; }else if (m_frameIndex % (m_numBFrames + 1) != 0) { setBFrame (picture); m_reorderFrameList.push_back(picture); } else { setPFrame (picture); m_reorderFrameList.push_front(picture); m_curFrameNum++; m_reorderState = VAAPI_ENC_REORD_DUMP_FRAMES; } picture->m_poc = ((m_frameIndex * 2) % m_maxPicOrderCnt); m_frameIndex++; return ENCODE_SUCCESS; }