TI论坛
直播中

李娜

7年用户 171经验值
私信 关注
[问答]

关于C6678上H264编码在单核上跑的问题

我现在遇到一个问题希望,能得到大家的帮助,关于在C6678上单核跑H264编码的问题:
我直接使用ti网上提供的codec例子:C66x_h264hpvenc_01_00_01_04_ELF;
我想在做这样一个项目,在一个核上跑C66x_h264hpvdec_01_01_01_04_ELF,一个核上跑C66x_h264hpvenc_01_00_01_04_ELF,我想问一下,这个编码例子是否可以直接用在非EVM板卡上。
目前我已经将解码例子C66x_h264hpvdec_01_01_01_04_ELF在TMS320C6678 EVM 版 单核上跑起来了,但是编码在TMS320C6678 EVM 版 存在问题。编码情况如下:

1   我直接在单核core0上运行,可以正常编码。
     或者以0核为主核,1到7核为次核,多核编一路码流,也能正常编码。
2  现在是我想在除了0核以外的其他核上,单独将   C66x_h264hpvdec_01_01_01_04_ELF跑起来,做了如下修改:
   a) 例如,在core1上单独跑起来,在文件encoder.cfg和h264hpvenc.cfg中
       ncores                  = 1
      CoreTeamMap      = 1;
   
SharedRegion.setEntryMeta(0,     [ base: Program.global.shmSL2Base,       len: Program.global.shmSL2Size,       ownerProcId: 0,       isValid: true,       cacheEnable: true,           cacheLineSize: 64,       name: "ipc_internal_shared_mem",     ]);
to
   SharedRegion.setEntryMeta(0,     [ base: Program.global.shmSL2Base,       len: Program.global.shmSL2Size,       ownerProcId: 1,       isValid: true,       cacheEnable: true,           cacheLineSize: 64,       name: "ipc_internal_shared_mem",     ]);
经过上述修改后,运行起来后,发现如下问题:
1)函数H264HPVENC_encodeFrame()  返回0,loutArgs->bytesgenerated= 0,我查看输出buffer的内容,通过eseye码流分析工具,发现当前编码输出的码流输出了正确的sps,pps帧头,slice头,从第一个宏块开始的码流数据就全是0了,(参数配置文件中generateHeader         = 0)。
2)在单核core1上运行的错误log如下:
[C66xx_1]
---------------------------------------------------------
Test Case Number : 1
---------------------------------------------------------
Config File   : ......TestTestVecsConfigencoder.cfg
Input YUV     : ......TestTestVecsInputairshow_p352x288.yuv
Output Stream : ......TestTestVecsOutputairshow_p352x288.264
ShmemTab initialized on Core 1
Algorithm Instance  Creation for the Module DEV.H264HP.E.C6678.01.00.01.04 Done...
Started Reading Frame : 0.......
Frame_Cycles :  0.102369
#0    : IVIDEO_IDR_FRAME      : Bits  : 0        
Started Reading Frame : 1.......
Frame_Cycles :  0.119687
#1    : IVIDEO_P_FRAME        : Bits  : 0        
Started Reading Frame : 2.......
Frame_Cycles :  0.118790
#2    : IVIDEO_P_FRAME        : Bits  : 0        
Started Reading Frame : 3.......
Frame_Cycles :  0.118818
#3    : IVIDEO_P_FRAME        : Bits  : 0
3)我想问的问题:
我目前做的项目是在C6678上:core0跑sy***ois,core1跑一路解码,core2跑一路编码,将core1解出的YUV成新的码流;
                                                同样,core3跑一路解码,core4跑一路编码,将core3解出的YUV编成新的码流;                                                        
                                                           core5跑一路解码,core6跑一路编码,将core5解出的YUV编成新的码流;
1)我能不能直接使用TI提供的codecs示例编解码程序C66x_h264hpvenc_01_00_01_04_ELF、C66x_h264hpvdec_01_01_01_04_ELF,直接在非EVM板卡(研华8901板卡)上跑起来,如果能,需要做哪些工作;
2)如果能用,我上面的修改是否正确,上面修改后编码出现的问题,请问怎么解决;
3)在例子程序中,在非0核上,每个核上跑一路编码或解码,需要每个核上 的编码或解码程序里都有一个sy***ios库支持,他们同时运行的时候,8个核之间sy***ios有什么影响么,能这样用么。


回帖(5)

蒲泛粟

2018-8-6 07:27:38
Hi,
    1)可以的,codec库本身不限制任何芯片,所有的TI C66x DSP都可以跑,非EVM板上主要是要修改板子相关的memory配置,DDR etc.
2) encoder.cfg,只是用作编码库的参数设置,其多核配置,仅根据核的数目来确定slides划分,所以只要你单核跑的话,无论核1,核2,设置都应该为     ncores                  = 1
      CoreTeamMap      = 0;
你的用例中,其实所有的核都是单独运行的。那么理论上MultiProc,SharedRegion等核间共享模块都不需要了,请根据自己的需求和BIOS, IPC文档来修改h264hpvenc.cfg文件。如果你也想用到IPC模块,一般IPC的初始化都是在核0完成的(就如我们的testapp),所以不管核0是否跑codec,都需要先运行初始化IPC
3) 非IPC情况下,可以按你说的这样来设计,从BIOS的角度就像8个完全独立的DSP,请注意修改你的BIOS cfg文件.
举报

李娜

2018-8-6 07:47:37
引用: flowerddd 发表于 2018-8-6 07:27
Hi,
    1)可以的,codec库本身不限制任何芯片,所有的TI C66x DSP都可以跑,非EVM板上主要是要修改板子相关的memory配置,DDR etc.
2) encoder.cfg,只是用作编码库的参数设置,其多核配置,仅根据核的数目来确定slides划分,所以只要你单核跑的话,无论核1,核2,设置都应该为     ncores            ...

HI ,
 Marvin Liang
非常感谢你的回答,我明天上班按照你说的试试,如果有什么问题,随时在这里向你请教!谢谢,辛苦了!
jingshuai
举报

李娜

2018-8-6 08:03:43
引用: flowerddd 发表于 2018-8-6 07:27
Hi,
    1)可以的,codec库本身不限制任何芯片,所有的TI C66x DSP都可以跑,非EVM板上主要是要修改板子相关的memory配置,DDR etc.
2) encoder.cfg,只是用作编码库的参数设置,其多核配置,仅根据核的数目来确定slides划分,所以只要你单核跑的话,无论核1,核2,设置都应该为     ncores            ...

我根据你说的修改了一下,在除了core0的核上,单核跑,还是有问题;
1    我做了如下尝试:
    IPC的初始化函数 IPC_start();以及ipcBarCreate(); ipcCreateShare();在core0上跑起来,将encode.cfg中设置
       ncores                  = 1
      CoreTeamMap      = 0;
    发现在core1上共享内存的分配上就崩溃了,因为分配共享内存的结构体codecShm是在core0上分配的,core1和core0之间单独跑,他们之间就没什么联系了;
    要想在core1上跑起来,core1也需要对IPC模块做同样的工作,让同步和分享内存模块共享起来,而这又回到我第一次提问的问题;
 a) 例如,在core1上单独跑起来,在文件encoder.cfg和h264hpvenc.cfg中
       ncores                  = 1
      CoreTeamMap      = 1;
   
SharedRegion.setEntryMeta(0,     [ base: Program.global.shmSL2Base,       len: Program.global.shmSL2Size,       ownerProcId: 0,       isValid: true,       cacheEnable: true,           cacheLineSize: 64,       name: "ipc_internal_shared_mem",     ]);
to
   SharedRegion.setEntryMeta(0,     [ base: Program.global.shmSL2Base,       len: Program.global.shmSL2Size,       ownerProcId: 1,       isValid: true,       cacheEnable: true,           cacheLineSize: 64,       name: "ipc_internal_shared_mem",     ]);
经过上述修改后,运行起来后,发现如下问题:
 1)函数H264HPVENC_encodeFrame()  返回0,loutArgs->bytesgenerated= 0,我查看输出buffer的内容,通过eseye码流分析工具,发现当前编码输出的码流输出了正确的sps,pps帧头,slice头,从第一个宏块开始的码流数据就全是0了,(参数配置文件中generateHeader         = 0)。
2)在单核core1上运行的错误log如下:
[C66xx_1]
---------------------------------------------------------
Test Case Number : 1
---------------------------------------------------------
Config File   : ......TestTestVecsConfigencoder.cfg
Input YUV     : ......TestTestVecsInputairshow_p352x288.yuv
Output Stream : ......TestTestVecsOutputairshow_p352x288.264
ShmemTab initialized on Core 1
Algorithm Instance  Creation for the Module DEV.H264HP.E.C6678.01.00.01.04 Done...
Started Reading Frame : 0.......
Frame_Cycles :  0.102369
#0    : IVIDEO_IDR_FRAME      : Bits  : 0        
Started Reading Frame : 1.......
Frame_Cycles :  0.119687
#1    : IVIDEO_P_FRAME        : Bits  : 0        
Started Reading Frame : 2.......
Frame_Cycles :  0.118790
#2    : IVIDEO_P_FRAME        : Bits  : 0        
Started Reading Frame : 3.......
Frame_Cycles :  0.118818
#3    : IVIDEO_P_FRAME        : Bits  : 0
2)我将与同步(barrier)和share region模块相关的函数和在bios中,IPC模块设置屏蔽掉,直接就崩溃了,
 
我想知道,我如果要直接将这个例子使用起来,h264hpvenc.cfg怎样修改,函数代码怎么修改;
 
 
 
举报

蒲泛粟

2018-8-6 08:11:30
引用: lihan19840814 发表于 2018-8-6 08:03
我根据你说的修改了一下,在除了core0的核上,单核跑,还是有问题;
1    我做了如下尝试:
    IPC的初始化函数 IPC_start();以及ipcBarCreate(); ipcCreateShare();在core0上跑起来,将encode.cfg中设置

就你的应用场景,不推荐在这个例子上做,因为你的场景里每个核实际是独立的,而本例较为复杂,有很多多核同步,一致性的操作。而且某些初始化,代码已经限制在核0做了。
你可以重新建立简单的例子,按照user guide推荐的次序调用API来配置codec库:
1.参考EncodeTask函数,调用H264HPVENC_create/H264HPVENC_control/H264HPVENC_activate/H264HPVENC_encodeFrame/H264HPVENC_deactivate等核心的函数建立一个单核的程序。
2.上述中需要的codec buffer,先分配non-cacheable buffer,codec 测试通过后,改为cacheable并加上对应的cache一致性维护函数就可以了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分