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.

dm8168编码3840*2160_30的视频丢帧



大家好:

       我找到一个关于dm8168视频编码丢帧的问题麻烦名位帮忙看一下是什么原因,现象如下:

        1. 视频处理流程: 我的视频输入是通过视频采集端口输入4路1080P30的视频,通过自己编写的一个视频拼接LINK将其拼接成了3840 * 2160_30的视频,然后将视频输入给编码LINK,编码完成后通过网络输出。

         2.出现的问题: 现在我测得编码LINK输出的帧率只有每秒20帧, 而我在拼接LINK中打印信息能确定向编码LINK输入的视频是30帧的。

         3.我的疑问:

                           a. dm8168的EncLink得否完成3840 * 2160_30的编码工作,如果能需要怎么设置? 如果不能有什么其它好的办法.

         4.我的编码程序如下:

/* encode */
/* IVA_HD 高清视频图像加速器 在DM8148中有3个IVA,对于每个IVA用户都可指定其要编解码的通道 */
static SystemVideo_Ivahd2ChMap_Tbl systemVid_encDecIvaChMapTbl =
{
.isPopulated = 1,
/* IVA0 */
.ivaMap[0] =
{
.EncNumCh = 1, /* IVA0 需要处理的视频编码通道数 */
.EncChList = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0 , 0, 0}, /* 分别是那些通道 */
.DecNumCh = 0, /* IVA0 需要处理的视频解码通道数 */
.DecChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 分别是那些通道 */
},
/* IVA1 */
.ivaMap[1] =
{
.EncNumCh = 1,
.EncChList = {0, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31},
.DecNumCh = 0,
.DecChList = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0 , 0, 0},
},
/* IVA2 */
.ivaMap[2] =
{
.EncNumCh = 1,
.EncChList = {0, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
.DecNumCh = 0,
.DecChList = {12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
},

};

System_linkControl(
SYSTEM_LINK_ID_M3VIDEO,
SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL,
&systemVid_encDecIvaChMapTbl,
sizeof(SystemVideo_Ivahd2ChMap_Tbl),
TRUE
);

EncLink_CreateParams encPrm;

EncLink_CreateParams_Init (&encPrm);
encPrm.chCreateParams[0].format = IVIDEO_H264HP;
encPrm.chCreateParams[0].profile = IH264_HIGH_PROFILE; /* 使用高配置文件 */
encPrm.chCreateParams[0].dataLayout = IVIDEO_FIELD_SEPARATED; /* ? */
encPrm.chCreateParams[0].fieldMergeEncodeEnable = FALSE; /* 区域合并编码关闭 */
encPrm.chCreateParams[0].maxBitRate = -1; /* 没限制 */
encPrm.chCreateParams[0].enableHighSpeed = TRUE;
encPrm.chCreateParams[0].rateControlPreset = IVIDEO_LOW_DELAY; /* 速度管理预测 */
encPrm.chCreateParams[0].encodingPreset = XDM_USER_DEFINED; /* 编码预测 高质量,高速, */
encPrm.chCreateParams[0].enableAnalyticinfo = FALSE; /* 向视频流添加MV数据 */
encPrm.chCreateParams[0].enableWaterMarking = FALSE; /* 给视频增加水印 */

encPrm.chCreateParams[0].defaultDynamicParams.intraFrameInterval = FRAME_OUT_RATE;
encPrm.chCreateParams[0].defaultDynamicParams.inputFrameRate = FRAME_OUT_RATE;
encPrm.chCreateParams[0].defaultDynamicParams.targetBitRate = ENCODE_BITE_RATE;
encPrm.chCreateParams[0].defaultDynamicParams.interFrameInterval = 1;
encPrm.chCreateParams[0].defaultDynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
encPrm.chCreateParams[0].defaultDynamicParams.rcAlg = 0 ;
encPrm.chCreateParams[0].defaultDynamicParams.qpMin = 10;
encPrm.chCreateParams[0].defaultDynamicParams.qpMax = 40;
encPrm.chCreateParams[0].defaultDynamicParams.qpInit = -1;
encPrm.chCreateParams[0].defaultDynamicParams.vbrDuration = 8;
encPrm.chCreateParams[0].defaultDynamicParams.vbrSensitivity = 0;
encPrm.inQueParams.prevLinkId = IpcFrameVideoInID;
encPrm.inQueParams.prevLinkQueId= 0;
encPrm.outQueParams.nextLink = IPCBitOutVideoID;
encPrm.numBufPerCh[0] = 24;
encPrm.numBufPerCh[1] = 0;
encPrm.numBufPerCh[2] = 0;
encPrm.numBufPerCh[3] = 0;

请大家帮忙看一下怎么解决,谢谢!

  • 你好,

    目前TI的h264enc是基于单个IVAHD的。即使是CYG4的DM8168也不能完成一个IVAHD实现你需要的分辨率的30编码。

    能否只拼接两个1080p图像,利用两个IVAHD分别编码一个拼接图像,在解码侧在把2个拼接的图像再进行拼接?

  • 你好!

            谢谢你的解答,问题解决了。

            我在拼接完后把一个通道的3840 * 2160_30的视频数据又分为两个通道(每个通道就是3840 * 2160_15)给传给编码LINK,这样每个通道就可以一个IVAHD

    代码修改如下:

      

    /* encode */
    /* IVA_HD 高清视频图像加速器 在DM8148中有3个IVA,对于每个IVA用户都可指定其要编解码的通道 */
    static SystemVideo_Ivahd2ChMap_Tbl systemVid_encDecIvaChMapTbl =
    {
    .isPopulated = 1,
    /* IVA0 */
    .ivaMap[0] =
    {
    .EncNumCh = 1, /* IVA0 需要处理的视频编码通道数 */
    .EncChList = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0 , 0, 0}, /* 分别是那些通道 */
    .DecNumCh = 0, /* IVA0 需要处理的视频解码通道数 */
    .DecChList = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 分别是那些通道 */
    },
    /* IVA1 */
    .ivaMap[1] =
    {
    .EncNumCh = 1,
    .EncChList = {1, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31},
    .DecNumCh = 0,
    .DecChList = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0 , 0, 0},
    },
    /* IVA2 */
    .ivaMap[2] =
    {
    .EncNumCh = 2,
    .EncChList = {0, 1, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    .DecNumCh = 0,
    .DecChList = {12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    },

    };

    System_linkControl(
    SYSTEM_LINK_ID_M3VIDEO,
    SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL,
    &systemVid_encDecIvaChMapTbl,
    sizeof(SystemVideo_Ivahd2ChMap_Tbl),
    TRUE
    );

    EncLink_CreateParams encPrm;
    EncLink_ChCreateParams *chCreatePrm;
    EncLink_CreateParams_Init (&encPrm);
    for(chId = 0; chId < MOSAIC_OUTPUT_CH_NUM; chId++)
    {
    chCreatePrm = &(encPrm.chCreateParams[chId]);
    chCreatePrm->format = IVIDEO_H264HP;
    chCreatePrm->profile = IH264_HIGH_PROFILE; /* 使用高配置文件 */
    chCreatePrm->dataLayout = IVIDEO_FIELD_SEPARATED; /* ? */
    chCreatePrm->fieldMergeEncodeEnable = FALSE; /* 区域合并编码关闭 */
    chCreatePrm->maxBitRate = -1; /* 没限制 */
    chCreatePrm->enableHighSpeed = TRUE;
    chCreatePrm->rateControlPreset = IVIDEO_LOW_DELAY; /* 速度管理预测 */
    chCreatePrm->encodingPreset = XDM_USER_DEFINED; /* 编码预测 高质量,高速, */
    chCreatePrm->enableAnalyticinfo = FALSE; /* 向视频流添加MV数据 */
    chCreatePrm->enableWaterMarking = FALSE; /* 给视频增加水印 */

    chCreatePrm->defaultDynamicParams.intraFrameInterval = FRAME_OUT_RATE;
    chCreatePrm->defaultDynamicParams.inputFrameRate = FRAME_OUT_RATE;
    chCreatePrm->defaultDynamicParams.targetBitRate = ENCODE_BITE_RATE;
    chCreatePrm->defaultDynamicParams.interFrameInterval = 1;
    chCreatePrm->defaultDynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
    chCreatePrm->defaultDynamicParams.rcAlg = 0 ;
    chCreatePrm->defaultDynamicParams.qpMin = 10;
    chCreatePrm->defaultDynamicParams.qpMax = 40;
    chCreatePrm->defaultDynamicParams.qpInit = -1;
    chCreatePrm->defaultDynamicParams.vbrDuration = 8;
    chCreatePrm->defaultDynamicParams.vbrSensitivity = 0;
    }

    encPrm.inQueParams.prevLinkId = IpcFrameVideoInID;
    encPrm.inQueParams.prevLinkQueId= 0;
    encPrm.outQueParams.nextLink = IPCBitOutVideoID;
    encPrm.numBufPerCh[0] = 6;
    encPrm.numBufPerCh[1] = 6;
    encPrm.numBufPerCh[2] = 6;
    encPrm.numBufPerCh[3] = 6;

  • 你好!

            这个视频拼接还有点问题, 我用一个IVAHD编码3840*2160_30可以达到20帧,会什么用两个IVADH分别编码3840*2160_15一共只能达到24帧。

    这3个IVAHD 不是独立工作的么? 

  • 你好,

    可能是DDR资源的影响。

    请问你编码是否有使用high speed模式,如果没有,配置请参考 http://www.deyisupport.com/question_answer/dsp_arm/davinci_digital_media_processors/f/39/t/58037.aspx。

  • 我的DDR3时钟是675MHz,改为796MHz时应用程序跑起来就挂掉了, 我已经使能了high seed模式,使用这两个配置来实现的

    chCreatePrm->enableHighSpeed = TRUE;

    chCreatePrm->encodingPreset = XDM_USER_DEFINED;

    现在主要是产生了新的问题VPSS总是重启,报错如下:

    [m3vpss ] 138390: CAPTURE: Overflow detected on VIP1, Total Resets = 118

    [m3vpss ] 138406: CAPTURE: Overflow detected on VIP0, Total Resets = 119

    而且使用的硬件编码器个数越多,重启得就越频繁。

  • 你好,

    现在问题是DDR吞吐瓶颈的可能性很大,还需要你解决如何让DDR运行在800Mhz的问题。是否有尝试过800Mhz下的宽松时序(http://www.deyisupport.com/question_answer/dsp_arm/davinci_digital_media_processors/f/39/p/101240/269155.aspx#269155)?

    VIP overflow可能是编码器抢占了太多DDR资源,导致VIP不能及时把数据写到DDR导致溢出。

  • 谢谢你的问题,我也想到了,但我现在这用的板子的DDR芯片就只能跑到1333M, 但我用别一个可以跑到1600再试试。