Re: [PATCH 4/4] uvcvideo: Add UVC timestamps support

2011-11-23 Thread Laurent Pinchart
Hi Javier,

On Thursday 17 November 2011 13:14:26 javier Martin wrote:
 On 8 November 2011 13:06, Laurent Pinchart wrote:
   void uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type
  type, diff --git a/drivers/media/video/uvc/uvc_video.c
  b/drivers/media/video/uvc/uvc_video.c index 513ba30..d0600a5 100644
  --- a/drivers/media/video/uvc/uvc_video.c
  +++ b/drivers/media/video/uvc/uvc_video.c
 
 [snip]
 
  +   ts.tv_sec = first-host_ts.tv_sec - 1 + y / NSEC_PER_SEC;
  +   ts.tv_nsec = first-host_ts.tv_nsec + y % NSEC_PER_SEC;
 
 I'm trying to build the uvcvideo-next branch which includes this patch
 and the previous two lines give the following error:
 
 drivers/built-in.o: In function `uvc_video_clock_update':
 /home/javier/GIT/linux-uvc/drivers/media/video/uvc/uvc_video.c:656:
 undefined reference to `__aeabi_uldivmod'
 /home/javier/GIT/linux-uvc/drivers/media/video/uvc/uvc_video.c:657:
 undefined reference to `__aeabi_uldivmod'
 
 I am using gcc version 4.2.3 (Sourcery G++ Lite 2008q1-126) for ARM.

Thanks for the report. I've fixed this and updated the uvcvideo-next branch.

-- 
Regards,

Laurent Pinchart
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 4/4] uvcvideo: Add UVC timestamps support

2011-11-17 Thread javier Martin
Hi Laurent,

On 8 November 2011 13:06, Laurent Pinchart
laurent.pinch...@ideasonboard.com wrote:
  void uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
 diff --git a/drivers/media/video/uvc/uvc_video.c 
 b/drivers/media/video/uvc/uvc_video.c
 index 513ba30..d0600a5 100644
 --- a/drivers/media/video/uvc/uvc_video.c
 +++ b/drivers/media/video/uvc/uvc_video.c
[snip]
 +       ts.tv_sec = first-host_ts.tv_sec - 1 + y / NSEC_PER_SEC;
 +       ts.tv_nsec = first-host_ts.tv_nsec + y % NSEC_PER_SEC;

I'm trying to build the uvcvideo-next branch which includes this patch
and the previous two lines give the following error:

drivers/built-in.o: In function `uvc_video_clock_update':
/home/javier/GIT/linux-uvc/drivers/media/video/uvc/uvc_video.c:656:
undefined reference to `__aeabi_uldivmod'
/home/javier/GIT/linux-uvc/drivers/media/video/uvc/uvc_video.c:657:
undefined reference to `__aeabi_uldivmod'

I am using gcc version 4.2.3 (Sourcery G++ Lite 2008q1-126) for ARM.

 +       if (ts.tv_nsec = NSEC_PER_SEC) {
 +               ts.tv_sec++;
 +               ts.tv_nsec -= NSEC_PER_SEC;
 +       }
 +
 +       uvc_trace(UVC_TRACE_CLOCK, %s: SOF %u.%06llu y %llu ts %lu.%06lu 
 +                 buf ts %lu.%06lu (x1 %u/%u/%u x2 %u/%u/%u y1 %u y2 %u)\n,
 +                 stream-dev-name,
 +                 sof  16, div64_u64(((u64)sof  0x) * 100LLU, 
 65536),
 +                 y, ts.tv_sec, ts.tv_nsec / NSEC_PER_USEC,
 +                 v4l2_buf-timestamp.tv_sec, v4l2_buf-timestamp.tv_usec,
 +                 x1, first-host_sof, first-dev_sof,
 +                 x2, last-host_sof, last-dev_sof, y1, y2);
 +
 +       /* Update the V4L2 buffer. */
 +       v4l2_buf-timestamp.tv_sec = ts.tv_sec;
 +       v4l2_buf-timestamp.tv_usec = ts.tv_nsec / NSEC_PER_USEC;
 +
 +done:
 +       spin_unlock_irqrestore(stream-clock.lock, flags);
 +}
 +
  /* 
  * Stream statistics
  */
 @@ -637,6 +957,7 @@ static int uvc_video_decode_start(struct uvc_streaming 
 *stream,
                        uvc_video_stats_update(stream);
        }

 +       uvc_video_clock_decode(stream, buf, data, len);
        uvc_video_stats_decode(stream, data, len);

        /* Store the payload FID bit and return immediately when the buffer is
 @@ -1096,6 +1417,8 @@ static void uvc_uninit_video(struct uvc_streaming 
 *stream, int free_buffers)

        if (free_buffers)
                uvc_free_urb_buffers(stream);
 +
 +       uvc_video_clock_cleanup(stream);
  }

  /*
 @@ -1225,6 +1548,10 @@ static int uvc_init_video(struct uvc_streaming 
 *stream, gfp_t gfp_flags)

        uvc_video_stats_start(stream);

 +       ret = uvc_video_clock_init(stream);
 +       if (ret  0)
 +               return ret;
 +
        if (intf-num_altsetting  1) {
                struct usb_host_endpoint *best_ep = NULL;
                unsigned int best_psize = 3 * 1024;
 diff --git a/drivers/media/video/uvc/uvcvideo.h 
 b/drivers/media/video/uvc/uvcvideo.h
 index e4d4b6d..e9c19f5 100644
 --- a/drivers/media/video/uvc/uvcvideo.h
 +++ b/drivers/media/video/uvc/uvcvideo.h
 @@ -329,6 +329,8 @@ struct uvc_buffer {
        void *mem;
        unsigned int length;
        unsigned int bytesused;
 +
 +       u32 pts;
  };

  #define UVC_QUEUE_DISCONNECTED         (1  0)
 @@ -455,6 +457,25 @@ struct uvc_streaming {
                struct uvc_stats_frame frame;
                struct uvc_stats_stream stream;
        } stats;
 +
 +       /* Timestamps support. */
 +       struct uvc_clock {
 +               struct uvc_clock_sample {
 +                       u32 dev_stc;
 +                       u16 dev_sof;
 +                       struct timespec host_ts;
 +                       u16 host_sof;
 +               } *samples;
 +
 +               unsigned int head;
 +               unsigned int count;
 +               unsigned int size;
 +
 +               u16 last_sof;
 +               u16 sof_offset;
 +
 +               spinlock_t lock;
 +       } clock;
  };

  enum uvc_device_state {
 @@ -527,6 +548,7 @@ struct uvc_driver {
  #define UVC_TRACE_STATUS       (1  9)
  #define UVC_TRACE_VIDEO                (1  10)
  #define UVC_TRACE_STATS                (1  11)
 +#define UVC_TRACE_CLOCK                (1  12)

  #define UVC_WARN_MINMAX                0
  #define UVC_WARN_PROBE_DEF     1
 @@ -607,6 +629,9 @@ extern int uvc_probe_video(struct uvc_streaming *stream,
                struct uvc_streaming_control *probe);
  extern int uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit,
                __u8 intfnum, __u8 cs, void *data, __u16 size);
 +void uvc_video_clock_update(struct uvc_streaming *stream,
 +                           struct v4l2_buffer *v4l2_buf,
 +                           struct uvc_buffer *buf);

  /* Status */
  extern int uvc_status_init(struct uvc_device *dev);
 --
 1.7.3.4

 --
 To unsubscribe from this list: send the line unsubscribe linux-media in
 the body of a message