用户您好,请详细描述您所遇到的问题:
-
系统软件版本:x3_ubuntu_v1.1.5
-
问题涉及的技术领域:图像编解码器
-
问题描述:在使用X3的硬件解码器时出现此问题,使用hobot_vdec进行JPEG格式图像解码时出现隔帧绿屏现象,具体视频传到下方附件
-
复现概率:必现
-
已进行的排查措施、分析及结果:
-
使用H264输入/NV12格式输出的情况下进行解码无任何问题,NV12格式图像输出正常,输入源为H264的IP网络相机
-
使用JPEG输入/NV12格式输出的情况下进行解码,存在隔帧绿屏现象,输入源为1080P的USB UVC协议相机
-
提供必要的问题日志:
-
软件上是否有做自定义修改:有,使用了hobot_codec这个git上的demo进行修改,去除了ROS部分,仅保留了图像编解码部分,对代码没有其他修改
补充: 现在使用相同的代码测试已经不会出现正常图像,而是一直报如下错误,输出结果始终为附件图绿屏样式
[2023-08-28 17:43:49][ERR][Input][line:103]:[Invalid argument]:[Input fail, ret: -1]
[2023-08-28 17:43:49][ERR][Input][line:274]:[Invalid argument]:[input nLen: 4147200 exceeds alloc codec_buf_size_: 2073600]
问题视频.mp4-
异常图片.png-
正常图片.png
zhuk
4
对比一下,然后再对比一下实现的逻辑。如果不用tros的话可以直接参考RDK X3手册里的编解码示例5.1 参考示例 | RDK X3用户手册 (horizon.cc)
这些示例的代码可以在哪里下载到 可以给一个链接吗?
zhuk
6
就在RDK X3上,可以到开发板的对应路径下看看。
目前经过测试还是认为是USB相机输入的JPEG图像有问题,这款相机JPEG的压缩原始格式是YUV422Planar,我想了解一下地平线USB解码和编码目前支持的是什么格式?根据我查到的资料编码是NV12格式,解码是MJPEG压缩的YUV420P/I420格式,是这样吗?
zhuk
8
USB摄像头支持mjpeg压缩编码以及原图格式输出,原图格式一般是yuyv或者yuv422,可以通过接口选择输出的格式。-
你这边应该是选择的原图输出,原图到nv12是转码,jpeg压缩图到nv12才是解码。
不是的,我这边相机设置的输出MJPEG格式,是YUV422P压缩而成的MJPEG,然后放到地平线demo的jpeg解码器中解码会有问题,所以我想问的是地平线的JPEG解码支持哪种YUV格式压缩成的MJPEG?是YUV420P还是YUV420SP还是NV12/NV21
zhuk
10
不存在“JPEG解码支持哪种YUV格式压缩成的MJPEG”这种问题。
从相机拿到的jpeg图发出来一下,这张图使用哪个demo解码会有问题?
http://9426224.xyz:7010/sharing/cZgZuD2gP 图像我放我自己的盘了 您可以下载下来看下 用的demo是hobot_codec 这个图像格式是YUV422P
zhuk
12
这个usb摄像头输出的jpeg压缩图不太正常,1080p图片有4M大小,比相同分辨率的NV12图(3M)还要大。
有没有看下是不是拿到的所有jpeg图都是这么大,另外获取图像的时候能否选择压缩率。
我这边用HEX查看了图像 实际上图像大小应该只有10万字节左右,后面都是补0,我现在测试将这些jpeg压缩图像放到解码器中就会如下图所示
zhuk
14
这不是用tros输出的log吧,hobot_codec 里面默认为1920*1080分辨率的jpeg图片申请的解码缓存大小是2M(1920*1080),大于主流usb摄像头输出的jpeg图片大小。
如果你这边的usb摄像头无法修改编码参数,需要修改一下hobot_codec 的解码缓存大小,从默认的w*h改为w*h*2。
具体位置:hobot_codec/src/decoder/x3/hobot_vdec.cpp at develop · HorizonRDK/hobot_codec (github.com)
zhuk
15
另外使用opencv加载这张图片,加载的图片大小是190多K,可能自动把后面的0过滤掉了。
我知道你的意思。我这边加载图片进入缓存的大小是10万字节,我把后面的0都截除掉了,同样的缓存我这边使用CPU解码 Libjpeg-turbo库是可以正常解码的,但是使用地平线解码器是不行的,这应该是硬件上就不支持YUV422P格式导致的
zhuk
17
不是解码器的问题,是软件申请的缓存大小不够,可以改下缓存大小或者使用RDK的解码示例测下看看。
yuv422p是原图格式,大小是w*h*1.5,和nv12格式计算方法一样,例如使用ffmpeg将jpeg转yuv422p的命令是:ffmpeg -i in.jpg -pix_fmt yuv420p out.yuv。
现在的问题不是缓存问题 而是这个jpeg的buf放进解码器之后解码器没有输出,我查阅了地平线的文档写的是支持YUV420格式,所以我在问是不是由于JPEG压缩的YUV422P,这个422P解码器是没办法解码的