动态修改VPSS通道属性的镜像和翻转属性不生效

  • luyixdu wrote: 2024-02-29 5:23 求助,万分感谢!!!

    开发板: LuckFox Pico Pro/Max
    数据流:VI----VPSS----VENC----RTSP

    动态修改参数验证方案:读取终端指令 ---> 调用RK_MPI_VPSS_SetChnAttr()进行修改。

    出现问题:图像并没有按照预期进行镜像、翻转,但是从dumpsys vpss中看到的mirror和flip参数确实变化了。

    详细描述:
    如图1,为初始化后,MIRROR和FLIP参数都为false时候的图像
    049204cd57767ba4a09a9b33bfcbb4c9.png
    设置MIRROR参数为TRUE,如下图2
    3d0deb4499e671ac319574a0c516e1f3.png
    图像并没有变化,通过dumpsys vpss查看通道属性,mirror参数确实配置成功了,如下图3
    e5e5eede746e73c9d523031664665fa6.png

    动态配置的代码段如下。

    Code: Select all

    
    bool SetParam::stMirrorRotation(
        const param::MirrorRotationParam& par) noexcept {
        VPSS_CHN_ATTR_S stChnAttr;
        memset(&stChnAttr, 0x0, sizeof(VPSS_CHN_ATTR_S));
        auto ret = RK_MPI_VPSS_GetChnAttr(0, 0, &stChnAttr);
        if (RK_SUCCESS != ret) {
            SPDLOG_ERROR("RK_MPI_VPSS_GetChnAttr failed with {:#x}.", ret);
            return false;
        }
    
        SPDLOG_DEBUG("set vpss chn par: {}-{}", par.mirror, par.flip);
        stChnAttr.bFlip = par.flip ? RK_BOOL::RK_TRUE : RK_BOOL::RK_FALSE;
        stChnAttr.bMirror = par.mirror ? RK_BOOL::RK_TRUE : RK_BOOL::RK_FALSE;
    
        ret = RK_MPI_VPSS_SetChnAttr(0, 0, &stChnAttr);
        if (RK_SUCCESS != ret) {
            SPDLOG_ERROR("RK_MPI_VPSS_SetChnAttr failed with {:#x}.", ret);
            return false;
        }
    
        ret = RK_MPI_VPSS_GetChnAttr(0, 0, &stChnAttr);
        if (RK_SUCCESS == ret) {
            SPDLOG_DEBUG("read vpss chn par: mirror-flip: {}-{}", stChnAttr.bMirror,
                         stChnAttr.bFlip);
        }
    
        return true;
    }
    
    你好,如果要实现 VPSS 动态修改参数请先与 VI 通道解绑,停止 VPSS 组(Group)对输入的获取,关闭 VPSS 通道。把参数设置后再按顺序启动通道,组和绑定 VI 通道,调用软件接口顺序如下:
    VPSS动态修改.jpg
    由于 RKMPI 库并没有公开源码,只能从文档和调试情况分析发生这种情况的原因 可能为
    • VPSS 组件使用组(Group) 管理输入,使用通道(Channel)管理输出。
    • 对 VPSS 的输出镜像翻转属性做设置时调用 RK_MPI_VPSS_SetChnAttr 只是更新通道的属性信息,正在运行的通道的属性在使用 RK_MPI_VPSS_EnableChn 时确认了,需要关闭重新启动才能更新属性。
    • 关闭 VPSS 的通道时组还在进行工作,从绑定的输入通道获取数据,但是数据没有被及时处理会发生错误,所以在关闭通道前要停止组的接收。
    • 由于 VPSS 与 VI 绑定,VI 通道的数据要传输到 VPSS 的组上,如果 VPSS 的组停止接收也会发生错误,所以需要先进行解绑。
  • Crocodile wrote: 2024-03-02 7:16
    luyixdu wrote: 2024-02-29 5:23 求助,万分感谢!!!

    开发板: LuckFox Pico Pro/Max
    数据流:VI----VPSS----VENC----RTSP

    动态修改参数验证方案:读取终端指令 ---> 调用RK_MPI_VPSS_SetChnAttr()进行修改。

    出现问题:图像并没有按照预期进行镜像、翻转,但是从dumpsys vpss中看到的mirror和flip参数确实变化了。

    详细描述:
    如图1,为初始化后,MIRROR和FLIP参数都为false时候的图像
    049204cd57767ba4a09a9b33bfcbb4c9.png
    设置MIRROR参数为TRUE,如下图2
    3d0deb4499e671ac319574a0c516e1f3.png
    图像并没有变化,通过dumpsys vpss查看通道属性,mirror参数确实配置成功了,如下图3
    e5e5eede746e73c9d523031664665fa6.png

    动态配置的代码段如下。

    Code: Select all

    
    bool SetParam::stMirrorRotation(
        const param::MirrorRotationParam& par) noexcept {
        VPSS_CHN_ATTR_S stChnAttr;
        memset(&stChnAttr, 0x0, sizeof(VPSS_CHN_ATTR_S));
        auto ret = RK_MPI_VPSS_GetChnAttr(0, 0, &stChnAttr);
        if (RK_SUCCESS != ret) {
            SPDLOG_ERROR("RK_MPI_VPSS_GetChnAttr failed with {:#x}.", ret);
            return false;
        }
    
        SPDLOG_DEBUG("set vpss chn par: {}-{}", par.mirror, par.flip);
        stChnAttr.bFlip = par.flip ? RK_BOOL::RK_TRUE : RK_BOOL::RK_FALSE;
        stChnAttr.bMirror = par.mirror ? RK_BOOL::RK_TRUE : RK_BOOL::RK_FALSE;
    
        ret = RK_MPI_VPSS_SetChnAttr(0, 0, &stChnAttr);
        if (RK_SUCCESS != ret) {
            SPDLOG_ERROR("RK_MPI_VPSS_SetChnAttr failed with {:#x}.", ret);
            return false;
        }
    
        ret = RK_MPI_VPSS_GetChnAttr(0, 0, &stChnAttr);
        if (RK_SUCCESS == ret) {
            SPDLOG_DEBUG("read vpss chn par: mirror-flip: {}-{}", stChnAttr.bMirror,
                         stChnAttr.bFlip);
        }
    
        return true;
    }
    
    你好,如果要实现 VPSS 动态修改参数请先与 VI 通道解绑,停止 VPSS 组(Group)对输入的获取,关闭 VPSS 通道。把参数设置后再按顺序启动通道,组和绑定 VI 通道,调用软件接口顺序如下:
    VPSS动态修改.jpg

    由于 RKMPI 库并没有公开源码,只能从文档和调试情况分析发生这种情况的原因 可能为
    • VPSS 组件使用组(Group) 管理输入,使用通道(Channel)管理输出。
    • 对 VPSS 的输出镜像翻转属性做设置时调用 RK_MPI_VPSS_SetChnAttr 只是更新通道的属性信息,正在运行的通道的属性在使用 RK_MPI_VPSS_EnableChn 时确认了,需要关闭重新启动才能更新属性。
    • 关闭 VPSS 的通道时组还在进行工作,从绑定的输入通道获取数据,但是数据没有被及时处理会发生错误,所以在关闭通道前要停止组的接收。
    • 由于 VPSS 与 VI 绑定,VI 通道的数据要传输到 VPSS 的组上,如果 VPSS 的组停止接收也会发生错误,所以需要先进行解绑。
    好的,谢谢您,我之前是通过解除和VPSS所有的系统绑定,然后重启VPSS模块,最后重新进行系统绑定解决的。
    这样看来我不用解绑后端模块了。