Page 1 of 1

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

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

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

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

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

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

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;
}

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

Posted: 2024-03-02 7:16
by Crocodile
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 的组停止接收也会发生错误,所以需要先进行解绑。

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

Posted: 2024-03-04 9:58
by luyixdu
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模块,最后重新进行系统绑定解决的。
这样看来我不用解绑后端模块了。