专栏算法工具链X3 上H.264视频硬编码模块设置属性时失败

X3 上H.264视频硬编码模块设置属性时失败

已解决
coofly192020-11-05
259
5

为了说明问题我先做个约定简称,如下:

版本1:Linux x3dvbx3-hynix1G-2666 4.14.74 #56 SMP PREEMPT Fri Sep 11 15:51:48 +08 2020 aarch64 GNU/Linux

版本2:Linux x3sdbx3-hynix1G-2666 4.14.74 #20 SMP PREEMPT Thu Oct 22 11:23:27 +08 2020 aarch64 GNU/Linux

我在版本1上跑通了程序处理,包括硬件视频编解码、网络模型推理,但试着完善时发现进程间不能通过socket通信,调查发现网络设备没有lo,即系统虚拟的回环接口。我下载了版本2固件并且刷新X3开发板,在版本2固件上能看到回环设备,进程间通过socket可以通讯,但是同样的编码初始化代码在版本2上失败,错误信息如下:

有谁知道这是啥问题吗?

算法工具链
评论5
0/1000
  • coofly19
    Lv.1

    VENC_CHN_ATTR_S VEncChnAttr;

    memset(&VEncChnAttr, 0, sizeof(VENC_CHN_ATTR_S));

    VEncChnAttr.stVencAttr.enType = PT_H264;

    VEncChnAttr.stVencAttr.u32PicWidth = 640;

    VEncChnAttr.stVencAttr.u32PicHeight = 480;

    VEncChnAttr.stVencAttr.enPixelFormat = HB_PIXEL_FORMAT_YUV420P;

    VEncChnAttr.stVencAttr.u32FrameBufferCount = 8;

    VEncChnAttr.stVencAttr.u32BitStreamBufferCount = 8;

    VEncChnAttr.stVencAttr.bExternalFreamBuffer = HB_TRUE;

    VEncChnAttr.stVencAttr.enRotation = CODEC_ROTATION_0;

    VEncChnAttr.stVencAttr.enMirrorFlip = DIRECTION_NONE;

    VEncChnAttr.stVencAttr.stCropCfg.bEnable = HB_FALSE;

    VEncChnAttr.stVencAttr.stAttrH264.h264_profile = HB_H264_PROFILE_BP;

    VEncChnAttr.stVencAttr.stAttrH264.h264_level = HB_H264_LEVEL_UNSPECIFIED;

    VEncChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264VBR;

    VEncChnAttr.stRcAttr.stH264Vbr.bQpMapEnable = HB_TRUE;

    VEncChnAttr.stRcAttr.stH264Vbr.u32IntraPeriod = 20;

    VEncChnAttr.stRcAttr.stH264Vbr.u32IntraQp = 20;

    VEncChnAttr.stRcAttr.stH264Vbr.u32FrameRate = 20;

    VEncChnAttr.stGopAttr.u32GopPresetIdx = 6;

    VEncChnAttr.stGopAttr.s32DecodingRefreshType = 2;

    int ret = HB_VENC_CreateChn(0, &m_VEncChnAttr);

    if (0 != ret)

    {

    printf("HB_VENC_CreateChn failed, ret=%x\n", ret);

    return -1;

    }

    VENC_RC_ATTR_S *PstRcParam = &(m_VEncChnAttr.stRcAttr);

    VEncChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;

    ret = HB_VENC_GetRcParam(0, PstRcParam);

    if (0 != ret)

    {

    HB_VENC_DestroyChn(0);

    printf("HB_VENC_GetRcParam failed, ret=%d\n", ret);

    return -1;

    }

    PstRcParam->stH264Cbr.u32IntraPeriod = 20;

    PstRcParam->stH264Cbr.u32BitRate = 2 * 1024 * 1024;

    PstRcParam->stH264Cbr.u32FrameRate = FrameRate;

    PstRcParam->stH264Cbr.u32VbvBufferSize = 3000;

    ret = HB_VENC_SetChnAttr(0, &m_VEncChnAttr);

    if (0 != ret)

    {

    HB_VENC_DestroyChn(0);

    printf("HB_VENC_SetChnAttr failed, ret=%d\n", ret);

    return -1;

    }

    2020-11-05
    0
    0
  • coofly19
    Lv.1

    调用HB_VENC_SetChnAttr失败,打印一些错误信息,图片看得不清楚,我贴上日志信息:

    [ 40.786284] [VPUDRV]vpu_ioctl:1328: [+]VDI_IOCTL_SET_CTX_INFO

    [ 40.788008] [VPUDRV]vpu_ioctl:1345: [-]VDI_IOCTL_SET_CTX_INFO

    [ERROR][][video/src/hb_params_adaptive.c:511] [40.784329]hb_rc_params_adaptive_context[511] E: hb_rc_params_adaptive_context:511 Not Support encoding agreement[ 40.789752] [VPUDRV]vpu_ioctl:1262: [+]VDI_IOCTL_FREE_INSTANCE_ID

    [ERROR][][video/src/hb_params_adaptive.c:818] [40.784420]hb_venc_chn_attr_adaptive_context[818] E: video/src/hb_params_adaptive.c:818 hb_rc_params_adaptive_context s32Ret = -268958728

    [ERROR][][video/src/hb_venc.c:98] [40.784464]MCErrC_2_HBVencErrC[98] E: [HB_VENC] MCErrC_2_HBVencErrC:98 Not Support Venc Error Code(-268958728)!

    [ERROR][][video/src/hb_venc.c:856] [40.784487]HB_VENC_SetChnAttr[856] E: [HB_VENC] HB_VENC_SetChnAttr:856 hb_venc_chn_attr_adaptive_context VeChn = 0 s32Ret = -268958728

    [ 40.791884] [VPUDRV]vpu_ioctl:1283: [-]VDI_IOCTL_FREE_INSTANCE_ID clear id = 1

    HorizonVideoEncoder,1970-01-01 08:00:40 796ms,Init, HB_VENC_SetChnAttr failed, ret=-268958728

    2020-11-05
    0
    0
  • bin.fei
    Lv.1

    确认编译代码的依赖头文件和lib是否和开发板对应,比如AI Express最新2.6.0里面和编译可执行文件是否一样

    2020-11-06
    0
    0
  • coofly19
    Lv.1

    问题找到了,我在升级到0922的固件镜像后,头文件和库文件没有更新导致设置编码属性出错,单独的测试程序设置编码属性问题解决了。

    2020-11-10
    0
    0
  • coofly19
    Lv.1

    设置编码属性成功后,编码视频流时出现问题,以前在0911固件上获取视频,第一个包是SPS然后马上要再调用HB_VENC_GetStream去获取IDR帧,然而在0922固件中只需要调用一次HB_VENC_GetStream就可以把SPS和IDR数据包都获取出来,其他人在0922固件上遇到这个问题需要注意下。另外在解码时第一帧需要送带SPS 和IDR帧的视频包

    2020-11-10
    0
    0