X3上使用MJEPG格式采集USB摄像头图像,调用HB_VDEC_SendStream时失败

我需要采集USB摄像头上的视频,视频分辨率1920x1080,手头上这个摄像头当采用YUYV格式时采集帧率在5fps左右,不满足要求,然后我试着用MJPEG格式采集视频,帧率能到30帧,我使用从网上找到的V4L2例子代码打开摄像头,读摄像头视频,图像保存为文件显示正常。当我试着用开发包里面的API解码时出错,程序打印如下信息:-

root@x3sdbx3-samsung2G-3200:/userdata/cam_test# ./camera_capture

1920 1080

ion allocator open success m_ionClient :7 !

HorizonVideoDecoder Decode, BufferSize=4147200

[ERROR][video/src/hb_vdec.c:671] [68.803874]HB_VDEC_SendStream[671]: bitstream buffer too large

HorizonVideoDecoder Decode, BufferSize=4147200

[ERROR][video/src/hb_vdec.c:671] [68.838882]HB_VDEC_SendStream[671]: bitstream buffer too large

HorizonVideoDecoder Decode, BufferSize=4147200

[ERROR][video/src/hb_vdec.c:671] [68.870596]HB_VDEC_SendStream[671]: bitstream buffer too large

HorizonVideoDecoder Decode, BufferSize=4147200

[ERROR][video/src/hb_vdec.c:671] [68.903056]HB_VDEC_SendStream[671]: bitstream buffer too large

HorizonVideoDecoder Decode, BufferSize=4147200

[ERROR][MM][src/vdi/linux/vdi_osal.c:174] [ERROR][69.17948][1692:1695][JPUAPIFUNC] hit end of stream

[ERROR][MM][src/vdi/linux/vdi_osal.c:174] [ERROR][69.17960][1692:1695][JPGDecoder] JPU_DecGetInitialInfo failed. ret(0x1)

[ERROR][MM][src/vdi/linux/vdi_osal.c:174] [ERROR][69.17962][1692:1695][COMPONENT] Component jpg_decoder will be terminated.

[ERROR][video/src/hb_vdec.c:666] [69.180674]HB_VDEC_SendStream[666]: [HB_VDEC] HB_VDEC_SendStream:666 Failed VeChn = 0 s32Ret = -269024256

HorizonVideoDecoder Decode, BufferSize=4147200

[ERROR][MM][src/vdi/linux/vdi_osal.c:174] [ERROR][69.18309][1692:1692][TASK] It’s not allowd to do this operation. Please check the task state 6.

[ERROR][video/src/hb_vdec.c:666] [69.183137]HB_VDEC_SendStream[666]: [HB_VDEC] HB_VDEC_SendStream:666 Failed VeChn = 0 s32Ret = -269024256

HorizonVideoDecoder Decode, BufferSize=4147200

[ERROR][MM][src/vdi/linux/vdi_osal.c:174] [ERROR][69.18527][1692:1692][TASK] It’s not allowd to do this operation. Please check the task state 6.

[ERROR][video/src/hb_vdec.c:666] [69.185330]HB_VDEC_SendStream[666]: [HB_VDEC] HB_VDEC_SendStream:666 Failed VeChn = 0 s32Ret = -269024256

已经解决了,参数传递错误导致,-
int StreamBufSize = VideoWidth * VideoHeight * 3 / 2;换成-
int StreamBufSize = VideoWidth * VideoHeight * 2;就对了。

板子固件:xj3_1.1.20g

程序调用顺序如下:

#define DECODE_MEMORY_BLOCK_NUMBER 4-

HB_SYS_Init();

VP_CONFIG_S struVpConf;

memset(&struVpConf, 0x00, sizeof(VP_CONFIG_S));

struVpConf.u32MaxPoolCnt = DECODE_MEMORY_BLOCK_NUMBER;

HB_VP_SetConfig(&struVpConf);

HB_VP_Init();

HB_VDEC_Module_Init();

int ret = 0;

int VideoWidth = 1920;

int VideoHeight = 1080;

int StreamBufSize = VideoWidth * VideoHeight * 3 / 2;

for (int32_t i = 0; i < DECODE_MEMORY_BLOCK_NUMBER; ++i)

{

if (0 != (ret = HB_SYS_Alloc(&PhyAddr[i], reinterpret_cast<void **>(&VirAddr[i]), StreamBufSize)))

{

return -1;

}

}

VDEC_CHN_ATTR_S VDecChnAttr;

memset(&VDecChnAttr, 0, sizeof(VDEC_CHN_ATTR_S));

VDecChnAttr.enType = PT_MJPEG;

VDecChnAttr.enMode = VIDEO_MODE_FRAME;

VDecChnAttr.enPixelFormat = HB_PIXEL_FORMAT_YUV420P;

VDecChnAttr.u32FrameBufCnt = m_FrameBufferNumber;

VDecChnAttr.u32StreamBufCnt = m_FrameBufferNumber;

VDecChnAttr.u32StreamBufSize = StreamBufSize;

VDecChnAttr.bExternalBitStreamBuf = HB_TRUE;

VDecChnAttr.stAttrMjpeg.enRotation = CODEC_ROTATION_0;

VDecChnAttr.stAttrMjpeg.enMirrorFlip = DIRECTION_NONE;

VDecChnAttr.stAttrMjpeg.stCropCfg.bEnable = HB_FALSE;

HB_VDEC_CreateChn(0, &VDecChnAttr);

HB_VDEC_SetChnAttr(0, &VDecChnAttr);

HB_VDEC_StartRecvStream(0);

int FrameNumber = 0;

VIDEO_STREAM_S PstStream;

memset(&PstStream, 0, sizeof(VIDEO_STREAM_S));

uint64_t MemoryIndex = FrameNumber % DECODE_MEMORY_BLOCK_NUMBER;

memcpy(m_VirAddr[MemoryIndex], BufferIn, BufferSize);

PstStream.pstPack.phy_ptr = PhyAddr[MemoryIndex];

PstStream.pstPack.vir_ptr = VirAddr[MemoryIndex];

PstStream.pstPack.pts = FrameNumber;

PstStream.pstPack.src_idx = MemoryIndex;

PstStream.pstPack.size = BufferSize;

PstStream.pstPack.stream_end = HB_FALSE;

if (0 != HB_VDEC_SendStream(0, &PstStream, -1))

{

printf(“decode, HB_VDEC_SendStream fail, errno=%d\n”, errno);

return -1;

}

++FrameNumber;