X3M 接USB camera ,才用V4L2 capture 到jpeg后,用硬件解码报错

遇到的问题:-
一. 系统软件版本: (通过 cat /etc/version 获得)-
==》x3_ubuntu_v1.1.0-
二. 问题涉及的技术领域: (硬件、操作系统、驱动、其他)-
==》 编码器-
问题描述:(尽可能详细的描述在进行什么功能的开发或者测试,发现了什么问题,问题现象,并且提供预期的结果)-
V4L2 capture 到JPEG(resolution:2560*720,pixelformat:YUY2),送解码-
器工作,希望能获取YUV420的数据-
三. 问题日志:-
“[INFO] [1669780022.803927966] [HobotCodec]: [chnAttr_init]->type=jpeg, 26.-
[INFO] [1669780022.870738258] [HobotCodec]: mmzAlloc paddr = 0x17646000, vaddr = 0x9c10b000 i = 0-
[INFO] [1669780022.874148615] [HobotCodec]: mmzAlloc paddr = 0x179ca000, vaddr = 0x9747b000 i = 1-
[INFO] [1669780022.877248277] [HobotCodec]: mmzAlloc paddr = 0x17ff2000, vaddr = 0x96e53000 i = 2-
[INFO] [1669780022.879936165] [HobotCodec]: mmzAlloc paddr = 0x1861a000, vaddr = 0x9682b000 i = 3-
[INFO] [1669780022.882134198] [HobotCodec]: mmzAlloc paddr = 0x1899e000, vaddr = 0x964a7000 i = 4-
[INFO] [1669780022.882204654] [HobotCodec]: HB_VDEC_Module_Init: 0 end.-
[ERROR][“vdec”][video/src/hb_vdec.c:672] [1195.269596]HB_VDEC_SendStream[672]: bitstream buffer too large-
[INFO] [1669780023.344231464] [HobotCodec]: [PutData] pts:0, vir_ptr:9c10b000, size:3686400, ret=-8.-
[ERROR][“multimedia”][src/vdi/linux/vdi_osal.c:174] [ERROR][1195.57562][50925:50927][JPUAPIFUNC] hit end of stream-
[ERROR][“multimedia”][src/vdi/linux/vdi_osal.c:174] [ERROR][1195.57570][50925:50927][JPGDecoder] JPU_DecGetInitialInfo failed. ret(0x1)-
[ERROR][“multimedia”][src/vdi/linux/vdi_osal.c:174] [ERROR][1195.57572][50925:50927][COMPONENT] Component jpg_decoder will be terminated.-
[ERROR][“vdec”][video/src/hb_vdec.c:743] [1196.270304]HB_VDEC_GetFrame[743]: [HB_VDEC] HB_VDEC_GetFrame:743 Failed VdChn = 1 s32Ret = -269024256-
[ERROR] [1669780024.344677412] [HobotCodec]: HB_VDEC_GetFrame failed:-269024256-
[INFO] [1669780024.345229889] [HobotCodec]: [ReleaseFrame] 0x40000000- 0x40100000, 0x1074791425-
[ERROR][“multimedia”][src/vdi/linux/vdi_osal.c:174] [ERROR][1196.27130][50925:50925][TASK] It’s not allowd to do this operation. Please check the task state 6.-
[ERROR][“vdec”][video/src/hb_vdec.c:914] [1196.271441]HB_VDEC_ReleaseFrame[914]: [HB_VDEC] HB_VDEC_ReleaseFrame:914 Failed VdChn = 1 s32Ret = -269024256-
[ERROR][“vdec”][video/src/hb_vdec.c:438] [1196.271932]HB_VDEC_QueryStatus[438]: [HB_VDEC] HB_VDEC_QueryStatus:438 Failed to hb_mm_mc_release VeChn = 1 s32Ret = -269024256-
[ERROR][“multimedia”][src/vdi/linux/vdi_osal.c:174] [ERROR][1196.27647][50925:50925][TASK] It’s not allowd to do this operation. Please check the task state 6.-
[ERROR][“vdec”][video/src/hb_vdec.c:666] [1196.276650]HB_VDEC_SendStream: [HB_VDEC] HB_VDEC_SendStream:666 Failed VeChn = 1 s32Ret = -269024256-
[INFO] [1669780024.350955564] [HobotCodec]: [PutData] pts:1, vir_ptr:9747b000, size:3686400, ret=-269024256.-
[ERROR][“multimedia”][src/vdi/linux/vdi_osal.c:174] [ERROR][1196.27698][50925:50925][TASK] It’s not allowd to do this operation. Please check the task state 6.-
[ERROR][“vdec”][video/src/hb_vdec.c:743] [1196.277073]HB_VDEC_GetFrame[743]: [HB_VDEC] HB_VDEC_GetFrame:743 Failed VdChn = 1 s32Ret = -269024256-
[ERROR] [1669780024.351321049] [HobotCodec]: HB_VDEC_GetFrame failed:-269024256”

软件上是否有做自定义修改:-
才用开源的V4L2 + hobot_codec 中解码器的实现

  1. 从摄像头获取的图像是YUY2还是JPEG格式?hobot codec不支持YUY2格式图片。
  2. hobot codec的启动命令是什么?

USB camera 获取的的jpeg(送解码器的图像dump 下来确认过是2560*720,3.5M 左右的一张jpeg)

mediainfo查看的信息如下:

Image

Format : JPEG

Width : 2 560 pixels

Height : 720 pixels

Color space : YUV

Chroma subsampling : 4:2:2

Bit depth : 8 bits

Compression mode : Lossy

Stream size : 3.52 MiB (100%)

希望送这个jpeg 到硬件解码成YUV420或者YUY2。

hobot_codec没有使用命令,我把hobot_codec中的解码器的实现集成到到自己的工程里面,希望借此完成解码行为

“hobot codec不支持YUY2格式图片”-
是X3M 的硬件就不支持YUY2的jpeg 解码吗,还是软件上有限制

这个jpeg图看起来不太正常,能用软件打开吗?这个分辨率的图片大小应该只有几百K,从你发的数据看,3.52 MiB=2560*720/1024/1024*2。

搜一下u32StreamBufSize参数,把解码器的buffer设置大一些,需要比JPEG图片大,也就是要大于3686400。

我用软件可以打开画面,(这个大小也是觉得很怪,但是V4L2 的VIDIOC_DQBUF出来的数据,就是这么大,而且jpeg在PC 上可以打开)

你说的u32StreamBufSize 是下面这个吗

m_oVdecChnAttr.u32StreamBufSize = (m_nPicWidth * m_nPicHeight * 3 / 2 + 1024) & ~0x3ff;

如果是我换成下面这个大小,这个值你们觉得是否合适

m_oVdecChnAttr.u32StreamBufSize = (m_nPicWidth * m_nPicHeight * 2 + 1024) & ~0x3ff;

可以的,只要大于jpeg图size就行。

现在可以解码了,想问下解码器可以直接输出NV12或者其他YUV420吗,我看解码器中的配置中是有参数可以选择的,原始的JPEG 格式是YUY2的,X3M 的编码器我好像记得只支持NV12

解码器可以直接输出NV12。

解码是MJPEG/H264/H265—>BGR8/RGB8/NV12,编码是BGR8/RGB8/NV12—>MJPEG/H264/H265。

详细说明参考手册3.3. 图像编解码 — 地平线机器人平台用户手册 1.0 文档 (horizon.ai)