This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

Other Parts Discussed in Thread: SYSBIOS

我现在遇到一个问题希望,能得到大家的帮助,关于在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   : ..\..\..\Test\TestVecs\Config\encoder.cfg
Input YUV     : ..\..\..\Test\TestVecs\Input\airshow_p352x288.yuv
Output Stream : ..\..\..\Test\TestVecs\Output\airshow_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跑sysbois,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核上,每个核上跑一路编码或解码,需要每个核上 的编码或解码程序里都有一个sysbios库支持,他们同时运行的时候,8个核之间sysbios有什么影响么,能这样用么。

 

 

 

  • 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文件.

  • HI ,

     Marvin Liang

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

    jingshuai

  • 我根据你说的修改了一下,在除了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   : ..\..\..\Test\TestVecs\Config\encoder.cfg
    Input YUV     : ..\..\..\Test\TestVecs\Input\airshow_p352x288.yuv
    Output Stream : ..\..\..\Test\TestVecs\Output\airshow_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怎样修改,函数代码怎么修改;

     

     

     

  • 就你的应用场景,不推荐在这个例子上做,因为你的场景里每个核实际是独立的,而本例较为复杂,有很多多核同步,一致性的操作。而且某些初始化,代码已经限制在核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一致性维护函数就可以了

  • HI,Marvin,liang

         现在自己做,时间来不及了,我先在core0跑起来吧,其他核跑起来的问题,麻烦您研究一下!

    谢谢!

    jingshuai。