#include #include #include #include #include #include "mfxcommon.h" #include "mfxmvc.h" #include "mfxvideo.h" #include "mfxvideo++.h" #include "mfxplugin.h" #include "mfxplugin++.h" #include "sample_defs.h" #include "sample_types.h" #include "sample_utils.h" #define INTEL_ENC_LOW_LATENCY_ASYNC_DEPTH (1) #define INTEL_ENC_LOW_LATENCY_GOP_REF_DIST (1) #define INTEL_ENC_LOW_LATENCY_NUM_REF_FRAME (1) #define INTEL_ENC_DEFAULT_KEY_FRAME_INTERVAL (65535) #define INTEL_ENC_DEFAULT_KEY_FRAME_INTERVAL_H265 (65535) #define INTEL_ENC_MAX_BITRATE_RATIO (1.0) #define MSDK_CHECK_STATUS(X, MSG) \ { \ if ((X) < MFX_ERR_NONE) { \ return X; \ } \ } #define MSDK_ALIGN16(value) (((value + 15) >> 4) << 4) // round up to a multiple of 16 #define MSDK_ALIGN32(value) (((value + 31) >> 5) << 5) // round up to a multiple of 32 #define MSDK_1080P_SIZE (1920 * 1088) #define MSDK_2K_SIZE (2560 * 1440) #define MSDK_4K_SIZE (3840 * 2160) #define MSDK_EXT_BRC_MAX_QP_1080P (42) #define MSDK_EXT_BRC_MIN_QP_1080P (17) #define MSDK_EXT_BRC_MAX_QP_2K (MSDK_EXT_BRC_MAX_QP_1080P + 2) #define MSDK_EXT_BRC_MIN_QP_2K (MSDK_EXT_BRC_MIN_QP_1080P + 2) #define MSDK_EXT_BRC_MAX_QP_4K (MSDK_EXT_BRC_MAX_QP_1080P + 4) #define MSDK_EXT_BRC_MIN_QP_4K (MSDK_EXT_BRC_MIN_QP_1080P + 4) MFXVideoSession m_mfxSession; MFXVideoENCODE* m_mfxEncoder; int main() { mfxInitParamlWrap initPar; initPar.Version.Major = 1; initPar.Version.Minor = 0; initPar.GPUCopy = MFX_GPUCOPY_ON; initPar.Implementation = MFX_IMPL_HARDWARE_ANY; mfxStatus sts = m_mfxSession.InitEx(initPar); MSDK_CHECK_STATUS(sts, "m_mfxSession.InitEx failed"); mfxVersion version; sts = MFXQueryVersion(m_mfxSession, &version); MSDK_CHECK_STATUS(sts, "MFXQueryVersion failed"); m_mfxEncoder = new MFXVideoENCODE(m_mfxSession); if (m_mfxEncoder == NULL) { // HME_TRACE(HME_V_LOG_ALL, kTraceError, -1, "new mfxVideoENCODE fail!"); return -1; } //mfxVideoParam _mfxEncParams; MfxVideoParamsWrapper _mfxEncParams; _mfxEncParams.mfx.CodecId = MFX_CODEC_HEVC; _mfxEncParams.mfx.TargetUsage = MFX_TARGETUSAGE_BALANCED; _mfxEncParams.mfx.RateControlMethod = MFX_RATECONTROL_CQP; _mfxEncParams.mfx.GopRefDist = INTEL_ENC_LOW_LATENCY_GOP_REF_DIST; _mfxEncParams.mfx.GopPicSize = INTEL_ENC_DEFAULT_KEY_FRAME_INTERVAL; _mfxEncParams.mfx.NumRefFrame = INTEL_ENC_LOW_LATENCY_NUM_REF_FRAME; _mfxEncParams.mfx.IdrInterval = 0; _mfxEncParams.mfx.CodecProfile = 1; //_codecProfile; _mfxEncParams.mfx.CodecLevel = 41; //_codecLevel; _mfxEncParams.mfx.MaxKbps = 10240; // _bitrate; _mfxEncParams.mfx.InitialDelayInKB = 0; _mfxEncParams.mfx.GopOptFlag = 0; _mfxEncParams.mfx.BufferSizeInKB = 10240; // _bitrate; // MSDK那边为6000 _mfxEncParams.mfx.TargetKbps == 10240; // _bitrate; // MSDK那边为6000 _mfxEncParams.mfx.NumSlice = 0; _mfxEncParams.mfx.LowPower = MFX_CODINGOPTION_OFF; //低功耗z30005613 _mfxEncParams.mfx.EncodedOrder = 0; ConvertFrameRate(60, &_mfxEncParams.mfx.FrameInfo.FrameRateExtN, //* &_mfxEncParams.mfx.FrameInfo.FrameRateExtD); _mfxEncParams.IOPattern = MFX_IOPATTERN_IN_SYSTEM_MEMORY; _mfxEncParams.mfx.FrameInfo.FourCC = MFX_FOURCC_NV12; _mfxEncParams.mfx.FrameInfo.ChromaFormat = FourCCToChroma(_mfxEncParams.mfx.FrameInfo.FourCC); _mfxEncParams.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; _mfxEncParams.mfx.FrameInfo.Shift = false; _mfxEncParams.mfx.FrameInfo.Width = MSDK_ALIGN16(1920); _mfxEncParams.mfx.FrameInfo.Height = (MFX_PICSTRUCT_PROGRESSIVE == _mfxEncParams.mfx.FrameInfo.PicStruct) ? MSDK_ALIGN16(1080) : MSDK_ALIGN32(1080); _mfxEncParams.mfx.FrameInfo.CropX = 0; /*x起点*/ _mfxEncParams.mfx.FrameInfo.CropY = 0; /*y起点*/ _mfxEncParams.mfx.FrameInfo.CropW = 1920; /*区域宽*/ _mfxEncParams.mfx.FrameInfo.CropH = 1080; /*区域高*/ auto codingOption = _mfxEncParams.AddExtBuffer(); codingOption->PicTimingSEI = MFX_CODINGOPTION_OFF; // 禁止每帧都编一个SEI codingOption->AUDelimiter = MFX_CODINGOPTION_OFF; // 禁止每帧都编一个AUD codingOption->NalHrdConformance = MFX_CODINGOPTION_OFF; // 禁止每帧都编一个SEI //HME_TRACE(HME_V_LOG_ALL, kTraceDebug, -1, "RateDistortionOpt:%d", codingOption->RateDistortionOpt); auto codingOption2 = _mfxEncParams.AddExtBuffer(); codingOption2->LookAheadDepth = 0; codingOption2->MaxSliceSize = 0; codingOption2->MaxFrameSize = 1000000; codingOption2->BRefType = MFX_B_REF_PYRAMID; codingOption2->ExtBRC = 0; codingOption2->IntRefType = 0; codingOption2->IntRefCycleSize = 0; codingOption2->IntRefQPDelta = 0; codingOption2->AdaptiveI = 0; codingOption2->AdaptiveB = 0; codingOption2->RepeatPPS = MFX_CODINGOPTION_OFF; // 禁止每帧都编一个PPS codingOption2->MinQPI = MSDK_EXT_BRC_MIN_QP_4K; // 4 codingOption2->MaxQPI = MSDK_EXT_BRC_MAX_QP_4K; codingOption2->MinQPP = MSDK_EXT_BRC_MIN_QP_4K; codingOption2->MaxQPP = MSDK_EXT_BRC_MAX_QP_4K; codingOption2->MinQPB = MSDK_EXT_BRC_MIN_QP_4K; codingOption2->MaxQPB = MSDK_EXT_BRC_MAX_QP_4K; codingOption2->EnableMAD = MFX_CODINGOPTION_ON; // HME_TRACE(HME_V_LOG_ALL, kTraceDebug, -1, "MBBRC:%d", codingOption2->MBBRC); auto codingOption3 = _mfxEncParams.AddExtBuffer(); codingOption3->WeightedPred = 0; codingOption3->WeightedBiPred = 0; codingOption3->LowDelayBRC = 0; codingOption3->PRefType = 0; codingOption3->IntRefCycleDist = 0; codingOption3->QVBRQuality = 0; codingOption3->ExtBrcAdaptiveLTR = 0; codingOption3->WinBRCSize = 0; codingOption3->WinBRCMaxAvgKbps = 0; codingOption3->AdaptiveMaxFrameSize = 0; codingOption3->MaxFrameSizeI = 0; // 只针对VBR codingOption3->MaxFrameSizeP = 0; // 只针对VBR codingOption3->GPB = MFX_CODINGOPTION_OFF; //保证输出P帧z30005613 codingOption3->EnableMBQP = MFX_CODINGOPTION_ON; _mfxEncParams.AsyncDepth = INTEL_ENC_LOW_LATENCY_ASYNC_DEPTH; printf("m_mfxEncoder->Query\r\n"); sts = m_mfxEncoder->Query(&_mfxEncParams, &_mfxEncParams); printf("m_mfxEncoder->Query ok\r\n"); printf("m_mfxEncoder->Init\r\n"); sts = m_mfxEncoder->Init(&_mfxEncParams); printf("m_mfxEncoder->Init ok\r\n"); while (true) {} return 0; }