Linux下VCU控制软件C++转C[一]

27 篇文章 7 订阅
7 篇文章 2 订阅

前言

开学t瞄的一个一个月了,这肺炎真的恶心啊,感觉要毕不了业了,下面说一下vcu c++转c的简单过程

开始

转c其实就是把C++的机制在c下实现,如类的构造、析构灯简单举个例子
原来c++简单定义一个数据

EncoderSink enc;

用c来实现

	//编码器实例
	EncoderSink enc;
	{	//构造
		encSinkStructFunc_init((void *)&enc, &cfg, pScheduler, pAllocator);
	}

其中encSinkStructFunc_init是用来初始化类内数据结构、功能函数

void encSinkStructFunc_init(EncoderSink* this, ConfigFile const* cfg, TScheduler* pScheduler, AL_TAllocator* pAllocator)
{
	EncoderSink* encSink = (EncoderSink*)this;

	{
		QPBuffersStructFunc_Init(&encSink->qpBuffers);
		encSink->qpBuffers.QPBuffers(&encSink->qpBuffers, &cfg->Settings, cfg->RunInfo.eGenerateQpMode);
	}
	//this = encSink;
	encSink->init = encSinkStructFunc_init;
	encSink->get = encSink_get;
/*for get inst*/
	{
		void inst_PreprocessFrame(void){
			return encSink_PreprocessFrame(this);
		}
		encSink->sinkInst.PreprocessFrame = inst_PreprocessFrame;
		void inst_ProcessFrame(AL_TBuffer *frame){
			return encSink_ProcessFrame(this, frame);
		}
		encSink->sinkInst.ProcessFrame = inst_ProcessFrame;
	}
	//指令传输器
	{
		CommandsSenderStructFunc_Init(&this->commandsSender);

	}
	{
		CEncCmdMngrStructFunc_Init(&this->EncCmd);
		this->EncCmd.CEncCmdMngr(&this->EncCmd, (void *)0, cfg->RunInfo.iScnChgLookAhead, cfg->Settings.tChParam[0].tGopParam.uFreqLT);
	}

	//encSink->m_InputChanged = encSink_m_InputChanged;
	encSink->PreprocessFrame = encSink_PreprocessFrame;
	encSink->ProcessFrame = encSink_ProcessFrame;
	encSink->PreprocessOutput = encSink_PreprocessOutput;
	encSink->processOutput = encSink_processOutput;
	encSink->InitHDR = encSink_InitHDR;
	encSink->EndEncoding = encSink_EndEncoding;
	//encSink->isSourceReleased = isSourceReleased;
	//encSink->isStreamReleased = isStreamReleased;

	encSink->m_picCount = 0;
	encSink->m_pictureType = -1;
	encSink->m_StartTime = 0;
	encSink->m_EndTime = 0;

	AL_CB_EndEncoding onEndEncoding = { EndEncoding, this };

	AL_ERR errorCode = AL_Encoder_Create(&encSink->hEnc, pScheduler, pAllocator, &cfg->Settings, onEndEncoding);

	if(AL_IS_ERROR_CODE(errorCode))
		xil_printf("err code :%d", errorCode);//throw codec_error(EncoderErrorToString(errorCode), errorCode);

	if(AL_IS_WARNING_CODE(errorCode))
		xil_printf("warn code :%d", errorCode); //LogWarning("%s\n", EncoderErrorToString(errorCode));


	this->commandsSender.CommandsSender(&this->commandsSender, this->hEnc);
	/*    commandsSender.reset(new CommandsSender(hEnc));
	    BitstreamOutput.reset(new NullFrameSink);
	    BitrateOutput.reset(new NullFrameSink);

	    for(int i = 0; i < cfg.Settings.NumLayer; ++i)
	      LayerRecOutput[i].reset(new NullFrameSink);
*/
	encSink->m_pictureType = cfg->RunInfo.printPictureType ? AL_SLICE_MAX_ENUM : -1;
	//实际没执行
	encSink->InitHDR(encSink, cfg->sHDRFileName);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值