Firefly开源社区

V4L2如何设置帧率?

20

积分

0

威望

0

贡献

技术小白

积分
20
发表于 2019-12-6 16:44:23     
本帖最后由 luffy 于 2019-12-6 16:54 编辑

RK3399平台
Sensor 支持120FPS, 我设置的60FPS, 但是我v4l2读取速率一直都是30FPS, 测MIPI信号也是差不多60FPS Screenshot from 2019-12-06 16-42-53.png
读取代码如下:

  1. int Camera::readFrame()
  2. {
  3.   struct v4l2_buffer buf;
  4.   int i, bytesused;

  5.   CLEAR(buf);

  6.   buf.type = m_bufType;
  7.   buf.memory = V4L2_MEMORY_MMAP;

  8.   if (V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE == m_bufType) {
  9.     struct v4l2_plane planes[FMT_NUM_PLANES];
  10.     buf.m.planes = planes;
  11.     buf.length = FMT_NUM_PLANES;
  12.   }

  13.   if (-1 == xioctl(m_camfd, VIDIOC_DQBUF, &buf)) {
  14.     ERR("VIDIOC_DQBUF");
  15.     return -1;
  16.   }

  17.   i = buf.index;

  18.   if (V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE == m_bufType)
  19.     bytesused = buf.m.planes[0].bytesused;
  20.   else
  21.     bytesused = buf.bytesused;

  22.   uint8_t *pdata = (uint8_t *)(m_imgBuffers[i].start);
  23.   for (size_t i = 0; i < m_width*m_height*2; i+=2) {
  24.     m_rawBuffer[i] = pdata[i+1];
  25.     m_rawBuffer[i+1] = pdata[i];
  26.   }

  27.   if (-1 == xioctl(m_camfd, VIDIOC_QBUF, &buf)) {
  28.     ERR("VIDIOC_QBUF");
  29.     return -1;
  30.   }

  31.   return 0;
  32. }

  33. bool Camera::trigger()
  34. {
  35.   struct reg_map regs[] = {
  36.     {0x1100, 0x01},
  37.     {REG_NULL, 0x00},
  38.   };
  39.   return ioctl(m_camconf_fd, SET_REGS_ONLINE_CMD, regs) == 0 ? true : false;
  40. }

  41. int Camera::nextFrame(std::vector<CameraFrame> &frames)
  42. {
  43.   if (m_triggerMode) {
  44.     if (!trigger()) {
  45.       LOG(ERROR) << "trigger error";
  46.       return -1;
  47.     }
  48.   }

  49.   std::lock_guard<std::mutex> l(m_runLock);
  50.   if (!m_isRunning) {
  51.     LOG(ERROR) << "not running, can not read frame";
  52.     return -1;
  53.   }

  54.   TimeMeasure tm;
  55.   tm.addRecord("all");
  56.   tm.addRecord("read");
  57.   if (readFrame() == -1) {
  58.     return -1;
  59.   }
  60.   LOG(INFO) << "read frame cost: " << tm.stopRecord("read") << "ms";

  61.   CameraFrame frame;
  62.   frame.pdata = m_rawBuffer;
  63.   frame.step = m_width * 2;
  64.   frame.type = kTypeGray;
  65.   frame.width = m_width;
  66.   frame.height = m_height;
  67.   frame.fmt = kFmt16Gray;
  68.   frames.push_back(frame);

  69.   return 0;
  70. }
复制代码



驱动配置如下:
  1.         {
  2.                 .width = 640,
  3.                 .height = 480,
  4.                 .max_fps = {
  5.                         .numerator = 1,
  6.                         .denominator = 120,
  7.                 },
  8.                 .hts_def = 640,
  9.                 .vts_def = 480,
  10.                 .regs_size = ARRAY_SIZE(cam_640x480_regs),
  11.                 .reg_list = cam_640x480_regs,
  12.         },
复制代码
  1. static int cam_g_frame_interval(struct v4l2_subdev *sd,
  2.                                     struct v4l2_subdev_frame_interval *fi)
  3. {
  4.         struct mycam *mycam = to_mycam(sd);
  5.         const struct mycam_mode *mode = mycam->cur_mode;

  6.         mutex_lock(&mycam->mutex);
  7.         fi->interval = mode->max_fps;
  8.         mutex_unlock(&mycam->mutex);

  9.         return 0;
  10. }
复制代码







回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表