关于rkmpp使用,正常退出异常

  • subs666 wrote: 2024-04-21 15:24 请问你们是否试过正常退出rockit?我这边正常退出会崩溃,这是我的日志。希望你们可以复现下比如你们用你们之前发的rkmpp那一套,模拟while执行10秒break循环,正常退出。
    您好,由于不知道您运行的上下文环境,无法推测您遇到段错误的原因,我测试了 https://github.com/luckfox-eng29/luckfo ... tsp_opencv 把while函数注释掉延时10s后退出,相关日志如下:
    Rockit_quit.jpg
    如果您在程序编译阶段添加了-g标志,可以在luckfox-pico 根文件系统的/mnt/sdcard中找到程序运行奔溃后生成的core-xxx 文件,可以使用gdb定位出现段错误的具体原因。
  • 看您的日志似乎也是有rockit的报错日志,不知道是否是正常的。您测试是否可以正常退出呢,根据您的日志最后一段没截全我无法判断。您可以测试一下这个代码吗?在luckfox-pico/media/samples/simple_test/simple_vi_venc.c。看这个是否可以正常退出
  • subs666 wrote: 2024-04-22 8:12 看您的日志似乎也是有rockit的报错日志,不知道是否是正常的。您测试是否可以正常退出呢,根据您的日志最后一段没截全我无法判断。您可以测试一下这个代码吗?在luckfox-pico/media/samples/simple_test/simple_vi_venc.c。看这个是否可以正常退出
    上面的日志就是在while循环结束后输出的所有内容,相比您的日志少了段错误的打印。
    您指的报错如果时指mpp_chan和RKSockServer的话,mpp库是用来作编码的库,它被集成在VENC中,当作为编码使用的VENC资源被释放时mpp调用的context也被释放了就会提示找不到,这个问题目前没有发现会造成什么资源损失,瑞芯微官方并没有开源VENC和MPP的相关源码所以并不知具体细节。
    RKSockServer 提示的accept failed 也是类似的原因。Socket虽然常用于网络中通信但是在内核和应用中也用于信息的传递,资源释放后客户端被销毁。作为服务器端的组件找不到connect的客户端所以提示accept failed。同样是缺少相关的源码资料,目前也不清楚具体细节。
    这两处在其他瑞芯微平台使用media库时也会出现,目前还没有发现因此引起的不良影响,可以视作正常的打印内容。
    simple_vi_venc.c我们会在测试后第一时间告知您结果。
  • Crocodile wrote: 2024-04-22 9:32
    subs666 wrote: 2024-04-22 8:12 看您的日志似乎也是有rockit的报错日志,不知道是否是正常的。您测试是否可以正常退出呢,根据您的日志最后一段没截全我无法判断。您可以测试一下这个代码吗?在luckfox-pico/media/samples/simple_test/simple_vi_venc.c。看这个是否可以正常退出
    上面的日志就是在while循环结束后输出的所有内容,相比您的日志少了段错误的打印。
    您指的报错如果时指mpp_chan和RKSockServer的话,mpp库是用来作编码的库,它被集成在VENC中,当作为编码使用的VENC资源被释放时mpp调用的context也被释放了就会提示找不到,这个问题目前没有发现会造成什么资源损失,瑞芯微官方并没有开源VENC和MPP的相关源码所以并不知具体细节。
    RKSockServer 提示的accept failed 也是类似的原因。Socket虽然常用于网络中通信但是在内核和应用中也用于信息的传递,资源释放后客户端被销毁。作为服务器端的组件找不到connect的客户端所以提示accept failed。同样是缺少相关的源码资料,目前也不清楚具体细节。
    这两处在其他瑞芯微平台使用media库时也会出现,目前还没有发现因此引起的不良影响,可以视作正常的打印内容。
    simple_vi_venc.c我们会在测试后第一时间告知您结果。
    目前我测试了luckfox-pico/media/samples/simple_test/simple_vi_venc.c,在while循环中等待10后break,输出的日志为
    simple_vi_vencquit.jpg
    我注意到这个程序在获取VENC编码输出图像是在 GetMediaBuffer0 线程中进行的,如果是验证资源释放是否正确这部分是不需要运行的,所以我注释掉这部分的相关代码

    Code: Select all

    	//pthread_t main_thread;
    	//pthread_create(&main_thread, NULL, GetMediaBuffer0, NULL);
    	
    	//pthread_join(&main_thread, NULL);
    
    我觉得段错误可能是这个线程中的某些资源没有释放导致的,希望这对您有所帮助。
  • 感谢指导,通过gdb定位,确实是我代码问题。