瑞芯微Rockchip开发者社区
直播中

凤求凰

11年用户 425经验值
私信 关注
[问答]

Android RK3399 UVC摄像头格式异常怎么解决?

Android RK3399 UVC摄像头格式异常怎么解决?

回帖(2)

史岩超

2022-3-7 14:09:44
前言


厂商提供了一个摄像头,接入后dev/video节点已生成,打开也成功了,但是黑屏,无法预览。最终查了HAL层代码才确认是厂商的摄像头属性(支持格式)导致的。

以下代码只限于Rockchip平台的,其他的平台不一样的可以绕道。

分析


1.根据打开摄像头的日志,可以发现是mjpeg解码失败导致的

CameraHal: reprocessFrame(1066): mjpeg data error!!

2.确认是格式问题后,在打开摄像头的LOG中我又发现了以下日志,从日志中可以看出驱动获取到摄像头支持的格式有(YUVYV MJPEG H264)

CameraHal: cameraCreate(354): cameraCreate(354): dlsym dec_oneframe_RkJpegDecoder sucess!
2021-01-06 10:34:47.283 238-2387/? D/CameraHal: cameraCreate(376): Camera driver: uvcvideo  Card Name:UVC Camera (1d6b:0102)  Driver version: 4.4.83  CameraHal version: 1.80.2
CameraHal: cameraCreate(383): mCamDriverSupportFmt: fmt = 1448695129(YUYV 4:2:2),index = 0
CameraHal: cameraCreate(383): mCamDriverSupportFmt: fmt = 1196444237(Motion-JPEG),index = 1
CameraHal: cameraCreate(383): mCamDriverSupportFmt: fmt = 875967048(H.264),index = 2
CameraHal: cameraCreate(421): cameraCreate(421): mCamDriverPreviewFmt(MJPG) is cameraHal and camera driver is also supported!!
CameraHal: cameraCreate(423): mCamDriverPreviewFmt  = 1196444237
CameraHal: cameraCreate(429): cameraCreate(429): Current driver is uvcvideo, v4l2 memory is V4L2_MEMORY_MMAP

3.想查Hal层源码中是如何选择格式的,由于没有源码,无从下手,后来想到github,果然被我找到了RK3399 7.1.2的cameraHal的源码,这里是传送门

4.有源码了就好办多了,很快找到了报错的位置:CameraU***Adapter.cpp,显然MJPEG的解码器解码失败了,摄像头过来的根本不是MJPEG标准格式

  if( frame->frame_fmt == V4L2_PIX_FMT_MJPEG){
               char *srcbuf = (char*)frame->vir_addr;
               if((srcbuf[0] == 0xff) && (srcbuf[1] == 0xd8) && (srcbuf[2] == 0xff)){
        //decoder to NV12
                  ............
            }else{
                            LOGE("mjpeg data error!!");
                            return -1;
        }

5.以下为格式选择的关键代码:CameraAdapter.cpp,拿驱动拿到的摄像头信息与Hal层支持的格式进行比对,发现相同的就用,但有一个规则,如果两边都支持MJPEG,那么MJPEG格式优先。

i = 0;   
    while (CameraHal_SupportFmt) {
        LOG1("CameraHal_SupportFmt:fmt = %d,index = %d",CameraHal_SupportFmt,i);
        j = 0;
        while (mCamDriverSupportFmt[j]) {
            if (mCamDriverSupportFmt[j] == CameraHal_SupportFmt) {
                if ((mCamDriverSupportFmt[j] == V4L2_PIX_FMT_MJPEG) && (mMjpegDecoder.state == -1))
                    continue;
                break;
            }
            j++;
        }
        if (mCamDriverSupportFmt[j] == CameraHal_SupportFmt) {
            break;
        }
        i++;
    }


处理方式


我是被摄像头厂商给坑了,原来摄像头虽然属性是支持MJPEG格式,但其实不支持。

1.如果是可以改源码的,将CameraU***Adapter.h中的CONFIG_CAMERA_UVC_MJPEG_SUPPORT改为0就不会再支持MJPEG了,

2.如果不可以动源码,这种问题直接让厂商处理。

结论


有些厂商真的是坑死个人,既然摄像头不支持,属性上还挂着支持,真的恶心呐,恶心,我都关着门。
举报

Nevermore555

2023-3-4 20:08:28
我遇到了一样的问题,我的摄像头默认支持YUV422(index0)和MJPEG(index1),同样是程序显示选择MJPEG,但是却没有图像,我把CONFIG_CAMERA_UVC_MJPEG_SUPPORT关闭之后依然没有图像,我怀疑还是rockchip的库有些问题,摄像头在pc上验证两种格式都行,把摄像头MJPEG改为index0 后,摄像头就可以正常工作了。
CameraHal: cameraCreate(383): mCamDriverSupportFmt: fmt = 1448695129(YUYV 4:2:2),index = 0
CameraHal: cameraCreate(383): mCamDriverSupportFmt: fmt = 1196444237(Motion-JPEG),index = 1
举报

更多回帖

发帖
×
20
完善资料,
赚取积分