主函数
主函数的执行过程:
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; // 编码器创建,我们目前只关注这个
}
}