2016-10-30 1 views
1

V4L2 API를 사용하여 UVC 장치에서 프레임을 잡아냅니다. 프레임의 타임 스탬프와 현재 시계 시간 사이의 오프셋을 계산하여 노출 시간을 측정하고 싶습니다.V4L2 프레임의 체계적인 오프셋

read_frame: frame exposure started 28.892 seconds ago 
read_frame: frame exposure started 28.944 seconds ago 
read_frame: frame exposure started 28.895 seconds ago 
read_frame: frame exposure started 29.037 seconds ago 

내가 이상한 30 초 사이에 오프셋 받고 있어요 :이 VIDIOC_S_CTRL 1 개 번째 세트의 노출 시간에 대한 반환 무엇

/* Control code snipped */ 
struct v4l2_buffer buf = {0} 
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 
buf.memory = V4L2_MEMORY_MMAP; 
ioctl(fd, VIDIOC_DQBUF, &buf); 

switch(buf.flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) 
{ 
    case V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC: 
    { 
     struct timespec uptime = {0}; 
     clock_gettime(CLOCK_MONOTONIC,&uptime); 

     float const secs = 
      (buf.timestamp.tv_sec - uptime.tv_sec) + 
      (buf.timestamp.tv_usec - uptime.tv_nsec/1000.0f)/1000.0f; 

     if(V4L2_BUF_FLAG_TSTAMP_SRC_SOE == (buf.flags & V4L2_BUF_FLAG_TSTAMP_SRC_MASK)) 
      printf("%s: frame exposure started %.03f seconds ago\n",__FUNCTION__,-secs); 
     else if(V4L2_BUF_FLAG_TSTAMP_SRC_EOF == (buf.flags & V4L2_BUF_FLAG_TSTAMP_SRC_MASK)) 
      printf("%s: frame finished capturing %.03f seconds ago\n",__FUNCTION__,-secs); 
     else printf("%s: unsupported timestamp in frame\n",__FUNCTION__); 

     break; 
    } 

    case V4L2_BUF_FLAG_TIMESTAMP_UNKNOWN: 
    case V4L2_BUF_FLAG_TIMESTAMP_COPY: 
    default: 
     printf("%s: no usable timestamp found in frame\n",__FUNCTION__); 
} 

예 : 이것은 내가 사용하고 코드입니다 SRC_SOE 시간 소인 및 단조로운 시계, 1 초 노출 용접. V4L2/UVC 시간 소인은 ktime_get_ts()의 결과로 계산됩니다. 내가 뭘 잘못하고 있는거야?

이것은 Linux 4.4 Gentoo 시스템에서 실행됩니다. 웹캠은 표준 UVC 장치로 인식되는 DMK21AU04.AS입니다.

답변

2

건은 ...

1 초에 =의 1000MS,
1 밀리 초 = 1000us,
1 우리 = 1000ns.

그래서 ...

가 같아야합니다 ...

float const secs = 
     (buf.timestamp.tv_sec - uptime.tv_sec) + 
     (buf.timestamp.tv_usec - uptime.tv_nsec/1000.0f)/1000000.0f; 
+0

과 실제로 코드가 –

+0

이 ... 나에게 매우 도움이 될 내가 할 수 밝혀, 당신에게 @TallFurryMan 감사합니다 내가 그것을 보지 않고 오랫동안 대답을 꼼짝 않고 바라 보았다고 생각하지 않는다. :) – TallFurryMan

관련 문제