硬體編解碼(四)Intel提供的QuickSync使用樣例(1)主函式
阿新 • • 發佈:2019-01-22
主函式
主函式的執行過程:
1、獲取使用者的輸入引數
2、解析使用者的輸入引數
3、建立編碼器
4、編碼器初始化
5、執行編碼器,開始編碼
6、編碼結束,關閉編碼器
主函式程式碼
#if defined(_WIN32) || defined(_WIN64) int _tmain(int argc, msdk_char *argv[]) #else int main(int argc, char *argv[]) #endif { // 使用者輸入的引數 sInputParams Params = {}; // input parameters from command line // 編碼器 std::auto_ptr<CEncodingPipeline> pPipeline; // 編碼器狀態,一般都是Media sdk函式的返回值 mfxStatus sts = MFX_ERR_NONE; // return value check // 解析使用者輸入的引數 sts = ParseInputString(argv, (mfxU8)argc, &Params); MSDK_CHECK_PARSE_RESULT(sts, MFX_ERR_NONE, 1); // Choosing which pipeline to use // 建立編碼器,儲存在智慧指標中 pPipeline.reset(CreatePipeline(Params)); MSDK_CHECK_POINTER(pPipeline.get(), MFX_ERR_MEMORY_ALLOC); // 是否為多視點(3D等)編碼 if (MVC_ENABLED & Params.MVC_flags) { pPipeline->SetNumView(Params.numViews); } // 編碼器初始化 sts = pPipeline->Init(&Params); MSDK_CHECK_STATUS(sts, "pPipeline->Init failed"); pPipeline->PrintInfo(); msdk_printf(MSDK_STRING("Processing started\n")); // video for linux 2 這個函式用於設定Linux媒體裝置,如果是windows系統,這個函式沒啥用 if (pPipeline->CaptureStartV4L2Pipeline() != MFX_ERR_NONE) { msdk_printf(MSDK_STRING("V4l2 failure terminating the program\n")); return 0; } // 執行編碼器 for (;;) { // 編碼 sts = pPipeline->Run(); if (MFX_ERR_DEVICE_LOST == sts || MFX_ERR_DEVICE_FAILED == sts) { msdk_printf(MSDK_STRING("\nERROR: Hardware device was lost or returned an unexpected error. Recovering...\n")); sts = pPipeline->ResetDevice(); MSDK_CHECK_STATUS(sts, "pPipeline->ResetDevice failed"); sts = pPipeline->ResetMFXComponents(&Params); MSDK_CHECK_STATUS(sts, "pPipeline->ResetMFXComponents failed"); continue; } else { MSDK_CHECK_STATUS(sts, "pPipeline->Run failed"); break; } } pPipeline->CaptureStopV4L2Pipeline(); // 關閉編碼器 pPipeline->Close(); msdk_printf(MSDK_STRING("\nProcessing finished\n")); return 0; }
建立編碼器的程式碼
// 建立編碼器 CEncodingPipeline* CreatePipeline(const sInputParams& params) { MOD_ENC_CREATE_PIPELINE; if(params.UseRegionEncode) { return new CRegionEncodingPipeline; } else if(params.nRotationAngle) { return new CUserPipeline; } else { return new CEncodingPipeline; // 編碼器建立,我們目前只關注這個 } }