前言
开学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);
}