/* * Copyright (c) 2021 by Allwinnertech Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "common.h" #include #include #include #include #include #include #include "v4l2_log.h" typedef struct camera3_jpeg_blob { void * vaddr; int share_fd; } camera_save_buffer_t; bool saveBuffers(char *str, void *p, unsigned int length, bool is_oneframe) { int fd; HAL_LOGD("Debug to save a frame!"); if ((access(str, 0) != -1) && (is_oneframe)) { HAL_LOGD("File %s is exists!!!\n", str); } if (is_oneframe) { fd = open(str, O_CREAT|O_RDWR|O_TRUNC, 0777); // save one frame data } else { fd = open(str, O_CREAT|O_RDWR|O_APPEND, 0777); // save more frames } if (!fd) { HAL_LOGE("Open file error %s", strerror(errno)); return false; } if (write(fd, p, length)) { HAL_LOGE("Write file fail %s", strerror(errno)); close(fd); return true; } else { HAL_LOGE("Write file fail"); close(fd); return false; } } bool saveSizes(int width, int height) { int fd; char buf[128]; fd = open("/data/camera/size.txt", O_CREAT|O_RDWR|O_APPEND, 0777); if (!fd) { HAL_LOGE("Open file error %s", strerror(errno)); return false; } sprintf(buf, "width:%d height:%d", width, height); if (write(fd, reinterpret_cast(buf), sizeof(buf))) { close(fd); return true; } else { HAL_LOGE("Write file fail %s", strerror(errno)); close(fd); return false; } } int getSingleCameraId() { char singleCameraId[PROPERTY_VALUE_MAX]; if (!(property_get("persist.vendor.SingleCameraId", singleCameraId, NULL) > 0)) { return -1; } else { int id = atoi(singleCameraId); return id; } } int getSupportCameraId(int cameraId) { int res = getSingleCameraId(); if (res < 0) { return cameraId; } else { return res; } } std::string getV4l2IoctlString(int v4l2_ioctl_request) { return v4l2_ioctl_map[v4l2_ioctl_request]; } std::string getHalPixelFormatString(int hal_pixel_format) { return hal_pixel_format_map[hal_pixel_format]; } std::string getV4l2PixelFormatString(int v4l2_pixel_format) { return v4l2_pixel_format_map[v4l2_pixel_format]; } std::string getGrallocUsageString(int usage) { return gralloc_usage_map[usage]; } std::map v4l2_ioctl_map = { {VIDIOC_QUERYCAP, "VIDIOC_QUERYCAP"}, {VIDIOC_RESERVED, "VIDIOC_RESERVED"}, {VIDIOC_ENUM_FMT, "VIDIOC_ENUM_FMT"}, {VIDIOC_G_FMT, "VIDIOC_G_FMT"}, {VIDIOC_S_FMT, "VIDIOC_S_FMT"}, {VIDIOC_REQBUFS, "VIDIOC_REQBUFS"}, {VIDIOC_QUERYBUF, "VIDIOC_QUERYBUF"}, {VIDIOC_G_FBUF, "VIDIOC_G_FBUF"}, {VIDIOC_S_FBUF, "VIDIOC_S_FBUF"}, {VIDIOC_OVERLAY, "VIDIOC_OVERLAY"}, {VIDIOC_QBUF, "VIDIOC_QBUF"}, {VIDIOC_EXPBUF, "VIDIOC_EXPBUF"}, {VIDIOC_DQBUF, "VIDIOC_DQBUF"}, {VIDIOC_STREAMON, "VIDIOC_STREAMON"}, {VIDIOC_STREAMOFF, "VIDIOC_STREAMOFF"}, {VIDIOC_G_PARM, "VIDIOC_G_PARM"}, {VIDIOC_S_PARM, "VIDIOC_S_PARM"}, {VIDIOC_G_STD, "VIDIOC_G_STD"}, {VIDIOC_S_STD, "VIDIOC_S_STD"}, {VIDIOC_ENUMSTD, "VIDIOC_ENUMSTD"}, {VIDIOC_ENUMINPUT, "VIDIOC_ENUMINPUT"}, {VIDIOC_G_CTRL, "VIDIOC_G_CTRL"}, {VIDIOC_S_CTRL, "VIDIOC_S_CTRL"}, {VIDIOC_G_TUNER, "VIDIOC_G_TUNER"}, {VIDIOC_S_TUNER, "VIDIOC_S_TUNER"}, {VIDIOC_G_AUDIO, "VIDIOC_G_AUDIO"}, {VIDIOC_S_AUDIO, "VIDIOC_S_AUDIO"}, {VIDIOC_QUERYCTRL, "VIDIOC_QUERYCTRL"}, {VIDIOC_QUERYMENU, "VIDIOC_QUERYMENU"}, {VIDIOC_G_INPUT, "VIDIOC_G_INPUT"}, {VIDIOC_S_INPUT, "VIDIOC_S_INPUT"}, {VIDIOC_G_EDID, "VIDIOC_G_EDID"}, {VIDIOC_S_EDID, "VIDIOC_S_EDID"}, {VIDIOC_G_OUTPUT, "VIDIOC_G_OUTPUT"}, {VIDIOC_S_OUTPUT, "VIDIOC_S_OUTPUT"}, {VIDIOC_ENUMOUTPUT, "VIDIOC_ENUMOUTPUT"}, {VIDIOC_G_AUDOUT, "VIDIOC_G_AUDOUT"}, {VIDIOC_S_AUDOUT, "VIDIOC_S_AUDOUT"}, {VIDIOC_G_MODULATOR, "VIDIOC_G_MODULATOR"}, {VIDIOC_S_MODULATOR, "VIDIOC_S_MODULATOR"}, {VIDIOC_G_FREQUENCY, "VIDIOC_G_FREQUENCY"}, {VIDIOC_S_FREQUENCY, "VIDIOC_S_FREQUENCY"}, {VIDIOC_CROPCAP, "VIDIOC_CROPCAP"}, {VIDIOC_G_CROP, "VIDIOC_G_CROP"}, {VIDIOC_S_CROP, "VIDIOC_S_CROP"}, {VIDIOC_G_JPEGCOMP, "VIDIOC_G_JPEGCOMP"}, {VIDIOC_S_JPEGCOMP, "VIDIOC_S_JPEGCOMP"}, {VIDIOC_QUERYSTD, "VIDIOC_QUERYSTD"}, {VIDIOC_TRY_FMT, "VIDIOC_TRY_FMT"}, {VIDIOC_ENUMAUDIO, "VIDIOC_ENUMAUDIO"}, {VIDIOC_ENUMAUDOUT, "VIDIOC_ENUMAUDOUT"}, {VIDIOC_G_PRIORITY, "VIDIOC_G_PRIORITY"}, {VIDIOC_S_PRIORITY, "VIDIOC_S_PRIORITY"}, {VIDIOC_G_SLICED_VBI_CAP, "VIDIOC_G_SLICED_VBI_CAP"}, {VIDIOC_LOG_STATUS, "VIDIOC_LOG_STATUS"}, {VIDIOC_G_EXT_CTRLS, "VIDIOC_G_EXT_CTRLS"}, {VIDIOC_S_EXT_CTRLS, "VIDIOC_S_EXT_CTRLS"}, {VIDIOC_TRY_EXT_CTRLS, "VIDIOC_TRY_EXT_CTRLS"}, {VIDIOC_ENUM_FRAMESIZES, "VIDIOC_ENUM_FRAMESIZES"}, {VIDIOC_ENUM_FRAMEINTERVALS, "VIDIOC_ENUM_FRAMEINTERVALS"}, {VIDIOC_G_ENC_INDEX, "VIDIOC_G_ENC_INDEX"}, {VIDIOC_ENCODER_CMD, "VIDIOC_ENCODER_CMD"}, {VIDIOC_TRY_ENCODER_CMD, "VIDIOC_TRY_ENCODER_CMD"}, {VIDIOC_DBG_S_REGISTER, "VIDIOC_DBG_S_REGISTER"}, {VIDIOC_DBG_G_REGISTER, "VIDIOC_DBG_G_REGISTER"}, {VIDIOC_S_HW_FREQ_SEEK, "VIDIOC_S_HW_FREQ_SEEK"}, {VIDIOC_S_DV_TIMINGS, "VIDIOC_S_DV_TIMINGS"}, {VIDIOC_G_DV_TIMINGS, "VIDIOC_G_DV_TIMINGS"}, {VIDIOC_DQEVENT, "VIDIOC_DQEVENT"}, {VIDIOC_SUBSCRIBE_EVENT, "VIDIOC_SUBSCRIBE_EVENT"}, {VIDIOC_UNSUBSCRIBE_EVENT, "VIDIOC_UNSUBSCRIBE_EVENT"}, {VIDIOC_CREATE_BUFS, "VIDIOC_CREATE_BUFS"}, {VIDIOC_PREPARE_BUF, "VIDIOC_PREPARE_BUF"}, {VIDIOC_G_SELECTION, "VIDIOC_G_SELECTION"}, {VIDIOC_S_SELECTION, "VIDIOC_S_SELECTION"}, {VIDIOC_DECODER_CMD, "VIDIOC_DECODER_CMD"}, {VIDIOC_TRY_DECODER_CMD, "VIDIOC_TRY_DECODER_CMD"}, {VIDIOC_ENUM_DV_TIMINGS, "VIDIOC_ENUM_DV_TIMINGS"}, {VIDIOC_QUERY_DV_TIMINGS, "VIDIOC_QUERY_DV_TIMINGS"}, {VIDIOC_DV_TIMINGS_CAP, "VIDIOC_DV_TIMINGS_CAP"}, {VIDIOC_ENUM_FREQ_BANDS, "VIDIOC_ENUM_FREQ_BANDS"} }; std::map hal_pixel_format_map = { {HAL_PIXEL_FORMAT_RGBA_8888, "FORMAT_RGBA_8888"}, {HAL_PIXEL_FORMAT_RGBX_8888, "FORMAT_RGBX_8888"}, {HAL_PIXEL_FORMAT_RGB_888, "FORMAT_RGB_888"}, {HAL_PIXEL_FORMAT_RGB_565, "FORMAT_RGB_565"}, {HAL_PIXEL_FORMAT_BGRA_8888, "FORMAT_BGRA_8888"}, {HAL_PIXEL_FORMAT_YCBCR_422_SP, "FORMAT_YCBCR_422_SP"}, {HAL_PIXEL_FORMAT_YCRCB_420_SP, "FORMAT_YCRCB_420_SP"}, {HAL_PIXEL_FORMAT_YCBCR_422_I, "FORMAT_YCBCR_422_I"}, {HAL_PIXEL_FORMAT_RGBA_FP16, "FORMAT_RGBA_FP16"}, {HAL_PIXEL_FORMAT_RAW16, "FORMAT_RAW16"}, {HAL_PIXEL_FORMAT_BLOB, "FORMAT_BLOB"}, {HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, "FORMAT_IMPLEMENTATION_DEFINED"}, {HAL_PIXEL_FORMAT_YCBCR_420_888, "FORMAT_YCBCR_420_888"}, {HAL_PIXEL_FORMAT_RAW_OPAQUE, "FORMAT_RAW_OPAQUE"}, {HAL_PIXEL_FORMAT_RAW10, "FORMAT_RAW10"}, {HAL_PIXEL_FORMAT_RAW12, "FORMAT_RAW12"}, {HAL_PIXEL_FORMAT_RGBA_1010102, "FORMAT_RGBA_1010102"}, {HAL_PIXEL_FORMAT_Y8, "FORMAT_Y8"}, {HAL_PIXEL_FORMAT_Y16, "FORMAT_Y16"}, {HAL_PIXEL_FORMAT_YV12, "FORMAT_YV12"} }; std::map v4l2_pixel_format_map = { {V4L2_PIX_FMT_RGB332, "FMT_RGB332"}, {V4L2_PIX_FMT_RGB444, "FMT_RGB444"}, {V4L2_PIX_FMT_RGB555, "FMT_RGB555"}, {V4L2_PIX_FMT_RGB565, "FMT_RGB565"}, {V4L2_PIX_FMT_RGB555X, "FMT_RGB555X"}, {V4L2_PIX_FMT_RGB565X, "FMT_RGB565X"}, {V4L2_PIX_FMT_BGR666, "FMT_BGR666"}, {V4L2_PIX_FMT_BGR24, "FMT_BGR24"}, {V4L2_PIX_FMT_RGB24, "FMT_RGB24"}, {V4L2_PIX_FMT_BGR32, "FMT_BGR32"}, {V4L2_PIX_FMT_RGB32, "FMT_RGB32"}, {V4L2_PIX_FMT_GREY, "FMT_GREY"}, {V4L2_PIX_FMT_Y4, "FMT_Y4"}, {V4L2_PIX_FMT_Y6, "FMT_Y6"}, {V4L2_PIX_FMT_Y10, "FMT_Y10"}, {V4L2_PIX_FMT_Y12, "FMT_Y12"}, {V4L2_PIX_FMT_Y16, "FMT_Y16"}, {V4L2_PIX_FMT_Y10BPACK, "FMT_Y10BPACK"}, {V4L2_PIX_FMT_PAL8, "FMT_PAL8"}, {V4L2_PIX_FMT_UV8, "FMT_UV8"}, {V4L2_PIX_FMT_YVU410, "FMT_YVU410"}, {V4L2_PIX_FMT_YVU420, "FMT_YVU420"}, {V4L2_PIX_FMT_YUYV, "FMT_YUYV"}, {V4L2_PIX_FMT_YYUV, "FMT_YYUV"}, {V4L2_PIX_FMT_YVYU, "FMT_YVYU"}, {V4L2_PIX_FMT_UYVY, "FMT_UYVY"}, {V4L2_PIX_FMT_VYUY, "FMT_VYUY"}, {V4L2_PIX_FMT_YUV422P, "FMT_YUV422P"}, {V4L2_PIX_FMT_YUV411P, "FMT_YUV411P"}, {V4L2_PIX_FMT_Y41P, "FMT_Y41P"}, {V4L2_PIX_FMT_YUV444, "FMT_YUV444"}, {V4L2_PIX_FMT_YUV555, "FMT_YUV555"}, {V4L2_PIX_FMT_YUV565, "FMT_YUV565"}, {V4L2_PIX_FMT_YUV32, "FMT_YUV32"}, {V4L2_PIX_FMT_YUV410, "FMT_YUV410"}, {V4L2_PIX_FMT_YUV420, "FMT_YUV420"}, {V4L2_PIX_FMT_HI240, "FMT_HI240"}, {V4L2_PIX_FMT_HM12, "FMT_HM12"}, {V4L2_PIX_FMT_M420, "FMT_M420"}, {V4L2_PIX_FMT_NV12, "FMT_NV12"}, {V4L2_PIX_FMT_NV21, "FMT_NV21"}, {V4L2_PIX_FMT_NV16, "FMT_NV16"}, {V4L2_PIX_FMT_NV61, "FMT_NV61"}, {V4L2_PIX_FMT_NV24, "FMT_NV24"}, {V4L2_PIX_FMT_NV42, "FMT_NV42"}, {V4L2_PIX_FMT_NV12M, "FMT_NV12M"}, {V4L2_PIX_FMT_NV21M, "FMT_NV21M"}, {V4L2_PIX_FMT_NV16M, "FMT_NV16M"}, {V4L2_PIX_FMT_NV61M, "FMT_NV61M"}, {V4L2_PIX_FMT_NV12MT, "FMT_NV12MT"}, {V4L2_PIX_FMT_NV12MT_16X16, "FMT_NV12MT_16X16"}, {V4L2_PIX_FMT_YUV420M, "FMT_YUV420M"}, {V4L2_PIX_FMT_YVU420M, "FMT_YVU420M"}, {V4L2_PIX_FMT_SBGGR8, "FMT_SBGGR8"}, {V4L2_PIX_FMT_SGBRG8, "FMT_SGBRG8"}, {V4L2_PIX_FMT_SGRBG8, "FMT_SGRBG8"}, {V4L2_PIX_FMT_SRGGB8, "FMT_SRGGB8"}, {V4L2_PIX_FMT_SBGGR10, "FMT_SBGGR10"}, {V4L2_PIX_FMT_SGBRG10, "FMT_SGBRG10"}, {V4L2_PIX_FMT_SGRBG10, "FMT_SGRBG10"}, {V4L2_PIX_FMT_SRGGB10, "FMT_SRGGB10"}, {V4L2_PIX_FMT_SBGGR12, "FMT_SBGGR12"}, {V4L2_PIX_FMT_SGBRG12, "FMT_SGBRG12"}, {V4L2_PIX_FMT_SGRBG12, "FMT_SGRBG12"}, {V4L2_PIX_FMT_SRGGB12, "FMT_SRGGB12"}, {V4L2_PIX_FMT_SBGGR10ALAW8, "FMT_SBGGR10ALAW8"}, {V4L2_PIX_FMT_SGBRG10ALAW8, "FMT_SGBRG10ALAW8"}, {V4L2_PIX_FMT_SGRBG10ALAW8, "FMT_SGRBG10ALAW8"}, {V4L2_PIX_FMT_SRGGB10ALAW8, "FMT_SRGGB10ALAW8"}, {V4L2_PIX_FMT_SBGGR10DPCM8, "FMT_SBGGR10DPCM8"}, {V4L2_PIX_FMT_SGBRG10DPCM8, "FMT_SGBRG10DPCM8"}, {V4L2_PIX_FMT_SGRBG10DPCM8, "FMT_SGRBG10DPCM8"}, {V4L2_PIX_FMT_SRGGB10DPCM8, "FMT_SRGGB10DPCM8"}, {V4L2_PIX_FMT_SBGGR16, "FMT_SBGGR16"}, {V4L2_PIX_FMT_MJPEG, "FMT_MJPEG"}, {V4L2_PIX_FMT_JPEG, "FMT_JPEG"}, {V4L2_PIX_FMT_DV, "FMT_DV"}, {V4L2_PIX_FMT_MPEG, "FMT_MPEG"}, {V4L2_PIX_FMT_H264, "FMT_H264"}, {V4L2_PIX_FMT_H264_NO_SC, "FMT_H264_NO_SC"}, {V4L2_PIX_FMT_H264_MVC, "FMT_H264_MVC"}, {V4L2_PIX_FMT_H263, "FMT_H263"}, {V4L2_PIX_FMT_MPEG1, "FMT_MPEG1"}, {V4L2_PIX_FMT_MPEG2, "FMT_MPEG2"}, {V4L2_PIX_FMT_MPEG4, "FMT_MPEG4"}, {V4L2_PIX_FMT_XVID, "FMT_XVID"}, {V4L2_PIX_FMT_VC1_ANNEX_G, "FMT_VC1_ANNEX_G"}, {V4L2_PIX_FMT_VC1_ANNEX_L, "FMT_VC1_ANNEX_L"}, {V4L2_PIX_FMT_VP8, "FMT_VP8"}, {V4L2_PIX_FMT_CPIA1, "FMT_CPIA1"}, {V4L2_PIX_FMT_WNVA, "FMT_WNVA"}, {V4L2_PIX_FMT_SN9C10X, "FMT_SN9C10X"}, {V4L2_PIX_FMT_SN9C20X_I420, "FMT_SN9C20X_I420"}, {V4L2_PIX_FMT_PWC1, "FMT_PWC1"}, {V4L2_PIX_FMT_PWC2, "FMT_PWC2"}, {V4L2_PIX_FMT_ET61X251, "FMT_ET61X251"}, {V4L2_PIX_FMT_SPCA501, "FMT_SPCA501"}, {V4L2_PIX_FMT_SPCA505, "FMT_SPCA505"}, {V4L2_PIX_FMT_SPCA508, "FMT_SPCA508"}, {V4L2_PIX_FMT_SPCA561, "FMT_SPCA561"}, {V4L2_PIX_FMT_PAC207, "FMT_PAC207"}, {V4L2_PIX_FMT_MR97310A, "FMT_MR97310A"}, {V4L2_PIX_FMT_JL2005BCD, "FMT_JL2005BCD"}, {V4L2_PIX_FMT_SN9C2028, "FMT_SN9C2028"}, {V4L2_PIX_FMT_SQ905C, "FMT_SQ905C"}, {V4L2_PIX_FMT_PJPG, "FMT_PJPG"}, {V4L2_PIX_FMT_OV511, "FMT_OV511"}, {V4L2_PIX_FMT_OV518, "FMT_OV518"}, {V4L2_PIX_FMT_STV0680, "FMT_STV0680"}, {V4L2_PIX_FMT_TM6000, "FMT_TM6000"}, {V4L2_PIX_FMT_CIT_YYVYUY, "FMT_CIT_YYVYUY"}, {V4L2_PIX_FMT_KONICA420, "FMT_KONICA420"}, {V4L2_PIX_FMT_JPGL, "FMT_JPGL"}, {V4L2_PIX_FMT_SE401, "FMT_SE401"}, {V4L2_PIX_FMT_S5C_UYVY_JPG, "FMT_S5C_UYVY_JPG"} }; std::map gralloc_usage_map = { {GRALLOC_USAGE_SW_READ_NEVER, "USAGE_SW_READ_NEVER"}, {GRALLOC_USAGE_SW_READ_RARELY, "USAGE_SW_READ_RARELY"}, {GRALLOC_USAGE_SW_READ_OFTEN, "USAGE_SW_READ_OFTEN"}, {GRALLOC_USAGE_SW_READ_MASK, "USAGE_SW_READ_MASK"}, {GRALLOC_USAGE_SW_WRITE_NEVER, "USAGE_SW_WRITE_NEVER"}, {GRALLOC_USAGE_SW_WRITE_RARELY, "USAGE_SW_WRITE_RARELY"}, {GRALLOC_USAGE_SW_WRITE_OFTEN, "USAGE_SW_WRITE_OFTEN"}, {GRALLOC_USAGE_SW_WRITE_MASK, "USAGE_SW_WRITE_MASK"}, {GRALLOC_USAGE_HW_TEXTURE, "USAGE_HW_TEXTURE"}, {GRALLOC_USAGE_HW_RENDER, "USAGE_HW_RENDER"}, {GRALLOC_USAGE_HW_2D, "USAGE_HW_2D"}, {GRALLOC_USAGE_HW_COMPOSER, "USAGE_HW_COMPOSER"}, {GRALLOC_USAGE_HW_FB, "USAGE_HW_FB"}, {GRALLOC_USAGE_EXTERNAL_DISP, "USAGE_EXTERNAL_DISP"}, {GRALLOC_USAGE_PROTECTED, "USAGE_PROTECTED"}, {GRALLOC_USAGE_CURSOR, "USAGE_CURSOR"}, {GRALLOC_USAGE_HW_VIDEO_ENCODER, "USAGE_HW_VIDEO_ENCODER"}, {GRALLOC_USAGE_HW_CAMERA_WRITE, "USAGE_HW_CAMERA_WRITE"}, {GRALLOC_USAGE_HW_CAMERA_READ, "USAGE_HW_CAMERA_READ"}, {GRALLOC_USAGE_HW_CAMERA_ZSL, "USAGE_HW_CAMERA_ZSL"}, {GRALLOC_USAGE_HW_CAMERA_MASK, "USAGE_HW_CAMERA_MASK"}, {GRALLOC_USAGE_HW_MASK, "USAGE_HW_MASK"}, {GRALLOC_USAGE_RENDERSCRIPT, "USAGE_RENDERSCRIPT"}, {GRALLOC_USAGE_FOREIGN_BUFFERS, "USAGE_FOREIGN_BUFFERS"}, {GRALLOC_USAGE_HW_IMAGE_ENCODER, "USAGE_HW_IMAGE_ENCODER"}, {GRALLOC_USAGE_ALLOC_MASK, "USAGE_ALLOC_MASK"}, {GRALLOC_USAGE_PRIVATE_0, "USAGE_PRIVATE_0"}, {GRALLOC_USAGE_PRIVATE_1, "USAGE_PRIVATE_1"}, {GRALLOC_USAGE_PRIVATE_2, "USAGE_PRIVATE_2"}, {GRALLOC_USAGE_PRIVATE_3, "USAGE_PRIVATE_3"}, {GRALLOC_USAGE_PRIVATE_MASK, "USAGE_PRIVATE_MASK"} };