由于项目需要,想要将视频编码程序烧写到rom中,为此需要修改源程序将视频编码参数提前写入,不再通过串口访问PC上的参数文件。
在C:\ti\mcsdk_video_2_2_0_46\examples\transcode 下有个demo,这个demo可以进行视频编解码,但是由于“年久失修”,有很多问题,最后也没有调通,具体问题可以参考:https://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/t/521705
于是准备修改上一篇博文介绍的demo,不过要首先能成功 rebuild 它,参考资料:http://processors.wiki.ti.com/index.php/MCSDK_VIDEO_2.x_Getting_Started_TFTP_Demo_Guide。
第一步:安装 Active Perl 到默认位置 C:\Perl 、安装 MinGW ,并保证已安装的相应组件的版本号是符合此项目需求的,太新太旧都不行。
第二步:在C:\ti\mcsdk_video_2_2_0_46\dsp\mkrel 下打开命令行界面,输入 setupenvMsys.bat bypass ,等待环境配置成功后输入 make sv04 ,即可开始编译项目。
编译成功后会在C:\ti\mcsdk_video_2_2_0_46\dsp\mkrel\sv04下生成 sv04.out 文件。
编译测试成功后,开始修改源文件,将参数写入代码中,需要修改的源文件如下:
1、C:\ti\mcsdk_video_2_2_0_46\dsp\siu\vct 下 siuVctParse.h 文件,添加如下代码
2、C:\ti\mcsdk_video_2_2_0_46\dsp\siu\vct 下 siuVctParse.c 文件,在文件最后添加如下函数
/************************bbs***************/ siuVctParams_t *bbs1(const char *fileName){ // strncpy ((char *) siuVctParseMap[25].Place, "320", SIU_VCT_PARAM_TYPE_INT_DEC); // tlong tlongContent; // sscanf ("320", "%d", &tlongContent); // * (tlong *) (siuVctParseMap[25].Place) = tlongContent; strncpy ((char *) siuVctParseMap[0].Place, "192.168.1.101", SIUVCT_PARSE_ADDRESS_SIZE); strncpy ((char *) siuVctParseMap[1].Place, "F8-BC-12-A0-D3-18", SIUVCT_PARSE_ADDRESS_SIZE); strncpy ((char *) siuVctParseMap[2].Place, "192.168.1.100", SIUVCT_PARSE_ADDRESS_SIZE); strncpy ((char *) siuVctParseMap[3].Place, "08-24-BA-75-5E-9E", SIUVCT_PARSE_ADDRESS_SIZE); strncpy ((char *) siuVctParseMap[4].Place, "H264HPENC", SIUVCT_PARSE_ADDRESS_SIZE); * (tlong *) (siuVctParseMap[9].Place)=1;//核心数 siuVctParams.coreTeamMapping[0] = 0;//0核 siuVctParams.coreTeamMapping[1] = -1;//表示结束 * (tlong *) (siuVctParseMap[25].Place)=320; * (tlong *) (siuVctParseMap[26].Place)=3; * (tlong *) (siuVctParseMap[27].Place)=5; * (tlong *) (siuVctParseMap[28].Place)=1088; * (tlong *) (siuVctParseMap[29].Place)=1920; * (tlong *) (siuVctParseMap[30].Place)=1; * (tlong *) (siuVctParseMap[31].Place)=3; * (tlong *) (siuVctParseMap[32].Place)=12000000; * (tlong *) (siuVctParseMap[33].Place)=0; * (tlong *) (siuVctParseMap[34].Place)=1; * (tlong *) (siuVctParseMap[35].Place)=0; * (tlong *) (siuVctParseMap[36].Place)=1; * (tlong *) (siuVctParseMap[37].Place)=100; * (tlong *) (siuVctParseMap[38].Place)=40; * (tlong *) (siuVctParseMap[39].Place)=3; * (tlong *) (siuVctParseMap[40].Place)=3; * (tlong *) (siuVctParseMap[41].Place)=0; * (tlong *) (siuVctParseMap[42].Place)=0; * (tlong *) (siuVctParseMap[43].Place)=-1; * (tlong *) (siuVctParseMap[44].Place)=-1; * (tlong *) (siuVctParseMap[45].Place)=-1; * (tlong *) (siuVctParseMap[46].Place)=1; * (tlong *) (siuVctParseMap[47].Place)=0; * (tlong *) (siuVctParseMap[48].Place)=-1; * (tlong *) (siuVctParseMap[49].Place)=51; * (tlong *) (siuVctParseMap[50].Place)=1; * (tlong *) (siuVctParseMap[51].Place)=-1; * (tlong *) (siuVctParseMap[52].Place)=51; * (tlong *) (siuVctParseMap[53].Place)=1; * (tlong *) (siuVctParseMap[54].Place)=4; * (tlong *) (siuVctParseMap[55].Place)=51; * (tlong *) (siuVctParseMap[56].Place)=1; * (tlong *) (siuVctParseMap[57].Place)=0; * (tlong *) (siuVctParseMap[58].Place)=0; * (tlong *) (siuVctParseMap[59].Place)=16000000; * (tlong *) (siuVctParseMap[60].Place)=16000000; * (tlong *) (siuVctParseMap[61].Place)=1; * (tlong *) (siuVctParseMap[62].Place)=1; * (tlong *) (siuVctParseMap[63].Place)=0; * (tlong *) (siuVctParseMap[64].Place)=1; * (tlong *) (siuVctParseMap[65].Place)=1; * (tlong *) (siuVctParseMap[66].Place)=144; * (tlong *) (siuVctParseMap[67].Place)=32; * (tlong *) (siuVctParseMap[68].Place)=144; * (tlong *) (siuVctParseMap[69].Place)=32; * (tlong *) (siuVctParseMap[70].Place)=4; * (tlong *) (siuVctParseMap[71].Place)=1; * (tlong *) (siuVctParseMap[72].Place)=2; * (tlong *) (siuVctParseMap[73].Place)=0; * (tlong *) (siuVctParseMap[74].Place)=0; * (tlong *) (siuVctParseMap[75].Place)=0; * (tlong *) (siuVctParseMap[76].Place)=0; * (tlong *) (siuVctParseMap[77].Place)=0; * (tlong *) (siuVctParseMap[78].Place)=1800; * (tlong *) (siuVctParseMap[79].Place)=0; * (tlong *) (siuVctParseMap[80].Place)=1; * (tlong *) (siuVctParseMap[81].Place)=2; * (tlong *) (siuVctParseMap[82].Place)=0; * (tlong *) (siuVctParseMap[83].Place)=0; * (tlong *) (siuVctParseMap[84].Place)=1; * (tlong *) (siuVctParseMap[85].Place)=1; * (tlong *) (siuVctParseMap[86].Place)=1; * (tlong *) (siuVctParseMap[87].Place)=0; * (tlong *) (siuVctParseMap[88].Place)=2; * (tlong *) (siuVctParseMap[89].Place)=0; * (tlong *) (siuVctParseMap[90].Place)=1; * (tlong *) (siuVctParseMap[91].Place)=5; * (tlong *) (siuVctParseMap[92].Place)=5; * (tlong *) (siuVctParseMap[93].Place)=5; * (tlong *) (siuVctParseMap[94].Place)=1; * (tlong *) (siuVctParseMap[95].Place)=1; * (tlong *) (siuVctParseMap[96].Place)=4; * (tlong *) (siuVctParseMap[97].Place)=1; * (tlong *) (siuVctParseMap[98].Place)=0; * (tlong *) (siuVctParseMap[99].Place)=0; * (tlong *) (siuVctParseMap[100].Place)=0; * (tlong *) (siuVctParseMap[101].Place)=0; * (tlong *) (siuVctParseMap[102].Place)=0; * (tlong *) (siuVctParseMap[103].Place)=5; * (tlong *) (siuVctParseMap[104].Place)=0; * (tlong *) (siuVctParseMap[821].Place)=228; * (tlong *) (siuVctParseMap[822].Place)=1088; * (tlong *) (siuVctParseMap[823].Place)=1920; * (tlong *) (siuVctParseMap[824].Place)=30000; * (tlong *) (siuVctParseMap[825].Place)=30000; * (tlong *) (siuVctParseMap[826].Place)=8000000; * (tlong *) (siuVctParseMap[827].Place)=30; * (tlong *) (siuVctParseMap[828].Place)=0; * (tlong *) (siuVctParseMap[829].Place)=1920; * (tlong *) (siuVctParseMap[830].Place)=-1; * (tlong *) (siuVctParseMap[831].Place)=3; * (tlong *) (siuVctParseMap[832].Place)=2; * (tlong *) (siuVctParseMap[833].Place)=1; * (tlong *) (siuVctParseMap[834].Place)=1; * (tlong *) (siuVctParseMap[835].Place)=1; * (tlong *) (siuVctParseMap[836].Place)=0; * (tlong *) (siuVctParseMap[837].Place)=0; * (tlong *) (siuVctParseMap[838].Place)=0; * (tlong *) (siuVctParseMap[839].Place)=0; * (tlong *) (siuVctParseMap[840].Place)=0; * (tlong *) (siuVctParseMap[841].Place)=0; * (tlong *) (siuVctParseMap[842].Place)=0; * (tlong *) (siuVctParseMap[843].Place)=1; * (tlong *) (siuVctParseMap[844].Place)=0; * (tlong *) (siuVctParseMap[845].Place)=-1; * (tlong *) (siuVctParseMap[846].Place)=51; * (tlong *) (siuVctParseMap[847].Place)=1; * (tlong *) (siuVctParseMap[848].Place)=-1; * (tlong *) (siuVctParseMap[849].Place)=51; * (tlong *) (siuVctParseMap[850].Place)=1; * (tlong *) (siuVctParseMap[851].Place)=4; * (tlong *) (siuVctParseMap[852].Place)=51; * (tlong *) (siuVctParseMap[853].Place)=1; * (tlong *) (siuVctParseMap[854].Place)=0; * (tlong *) (siuVctParseMap[855].Place)=0; * (tlong *) (siuVctParseMap[856].Place)=16000000; * (tlong *) (siuVctParseMap[857].Place)=16000000; * (tlong *) (siuVctParseMap[858].Place)=1; * (tlong *) (siuVctParseMap[859].Place)=1; * (tlong *) (siuVctParseMap[860].Place)=0; * (tlong *) (siuVctParseMap[861].Place)=1; * (tlong *) (siuVctParseMap[862].Place)=1; * (tlong *) (siuVctParseMap[863].Place)=144; * (tlong *) (siuVctParseMap[864].Place)=32; * (tlong *) (siuVctParseMap[865].Place)=144; * (tlong *) (siuVctParseMap[866].Place)=32; * (tlong *) (siuVctParseMap[867].Place)=4; * (tlong *) (siuVctParseMap[868].Place)=1; * (tlong *) (siuVctParseMap[869].Place)=2; * (tlong *) (siuVctParseMap[870].Place)=0; * (tlong *) (siuVctParseMap[871].Place)=0; * (tlong *) (siuVctParseMap[872].Place)=0; * (tlong *) (siuVctParseMap[873].Place)=0; * (tlong *) (siuVctParseMap[874].Place)=0; * (tlong *) (siuVctParseMap[875].Place)=1800; * (tlong *) (siuVctParseMap[876].Place)=0; * (tlong *) (siuVctParseMap[877].Place)=0; strncpy ((char *) siuVctParseMap[1141].Place, "Shark1920x1088.yuv", SIUVCT_PARSE_FILE_NAME_SIZE); strncpy ((char *) siuVctParseMap[1142].Place, "Shark1920x1088_hp.264", SIUVCT_PARSE_FILE_NAME_SIZE); * (tlong *) (siuVctParseMap[1143].Place)=100; return &siuVctParams; }3、C:\ti\mcsdk_video_2_2_0_46\dsp\siu\vct 中 siuVctRun.c 文件,将 void siuVctRunTask(void) 函数修改如下 void siuVctRunTask(void) { if (SIU_VCT_DATA_PCIE_IN()) { first_time_flush_dec = 1; siuVctMailboxInit(); siuVidMc3GlobalInit(SIU_VCT_GLOBAL_CORE_ID); siuVct_Pcie_Read_Init(); siuVctProcessClip(); } else { char *testVecsFile = "..\\..\\..\\siu\\vct\\testVecs\\testVecs.cfg"; char *tftpCfgFile = "..\\..\\..\\siu\\vct\\testVecs\\tftp.cfg"; char configFile[256]; char testFile[256]; char line[256]; FILE *fTestVecs; FILE *fTftpCfg; FILE *ftest; void *taskCxt = NULL; siuVidMc3GlobalInit(SIU_VCT_GLOBAL_CORE_ID); /* Read TFTP configuration file */ ///fTftpCfg = fopen(tftpCfgFile, "r"); ///if (!fTftpCfg) ///{ ///printf("TFTP config file cannot be opened \n"); } ///printf("Read tftp config file \n"); ///siuVctReadParamFile(tftpCfgFile); /* Read test vector file */ ///fTestVecs = fopen(testVecsFile, "r"); ///if (!fTestVecs) ///{ ///printf("testVecs file cannot be opened \n"); ///} ///printf("Read testVecs file \n"); first_time_flush_dec = 1; ///while(!feof(fTestVecs)) ///{ ///if (fgets((void *)line, 254, fTestVecs) == NULL) break; ///sscanf((void *)line, "%s", configFile); ///printf("Read codec config file name %s \n", configFile); ///if (fgets((void *)line, 254, fTestVecs) == NULL) break; ///sscanf((void *)line, "%s", testFile); ///printf("Read test file name %s \n", testFile); ///ftest = fopen(testFile,"r"); ///if (ftest == NULL) { ///printf("File cannot be opened \n"); ///} ///while(!feof(ftest)) ///{ /* Parse codec config file and fill structure siuVctRunParams */ ///siuVctRunParams = siuVctReadParamFile(configFile); siuVctRunParams = bbs1(); /* Read test clip file for input/output/#frames */ ///fscanf(ftest,"%s",&siuVctRunParams->tftpGetFilename[0]); ///fscanf(ftest,"%s",&siuVctRunParams->tftpPuFilename[0]); ///fscanf(ftest,"%d",&siuVctRunParams->framesToEncode); ///if ((strlen((const char *)&siuVctRunParams->tftpGetFilename[0]) == 0) || ///(strlen((const char *)&siuVctRunParams->tftpPuFilename[0]) == 0) || ///(siuVctRunParams->framesToEncode <= 0)) { ///break; ///} /* Configure codec with parameters from the config file */ taskCxt = siuVctRunGetTaskContext(NULL); if(siuVctRunMediaConfigReq((mediaTaskContext_t *)taskCxt, NULL, NULL) == -1) { ///break; } /* Process frames for the clip */ siuVctProcessClip(); siuVctDeleteInst((mediaTaskContext_t *)taskCxt); ///} ///} } }修改完成后重新编译,得到sv04.out,加载到0核,Free Run,编码成功。但是编码速度只有1.5M/s,虽有提升,但是却不大。推测是TFTP传输速度限制