vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Fri Mar 8 20:42:18 2013 +0200| [03fafd80fbf02169b6d0d9377c05748137d70ced] | committer: Rémi Denis-Courmont
v4l2: use buffer PTS where available (fix #5474) > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=03fafd80fbf02169b6d0d9377c05748137d70ced --- modules/access/v4l2/demux.c | 3 +-- modules/access/v4l2/v4l2.h | 1 + modules/access/v4l2/video.c | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/modules/access/v4l2/demux.c b/modules/access/v4l2/demux.c index 598c082..9d9b2ff 100644 --- a/modules/access/v4l2/demux.c +++ b/modules/access/v4l2/demux.c @@ -566,7 +566,7 @@ static void *UserPtrThread (void *data) assert (block->p_buffer == (void *)buf.m.userptr); block->i_buffer = buf.length; - block->i_pts = block->i_dts = mdate (); + block->i_pts = block->i_dts = GetBufferPTS (&buf); block->i_flags |= sys->block_flags; es_out_Control (demux->out, ES_OUT_SET_PCR, block->i_pts); es_out_Send (demux->out, sys->es, block); @@ -611,7 +611,6 @@ static void *MmapThread (void *data) block_t *block = GrabVideo (VLC_OBJECT(demux), fd, sys->bufv); if (block != NULL) { - block->i_pts = block->i_dts = mdate (); block->i_flags |= sys->block_flags; es_out_Control (demux->out, ES_OUT_SET_PCR, block->i_pts); es_out_Send (demux->out, sys->es, block); diff --git a/modules/access/v4l2/v4l2.h b/modules/access/v4l2/v4l2.h index dd219c9..9888785 100644 --- a/modules/access/v4l2/v4l2.h +++ b/modules/access/v4l2/v4l2.h @@ -55,6 +55,7 @@ int StartUserPtr (vlc_object_t *, int); struct buffer_t *StartMmap (vlc_object_t *, int, uint32_t *); void StopMmap (int, struct buffer_t *, uint32_t); +mtime_t GetBufferPTS (const struct v4l2_buffer *); block_t* GrabVideo (vlc_object_t *, int, const struct buffer_t *); #ifdef ZVBI_COMPILED diff --git a/modules/access/v4l2/video.c b/modules/access/v4l2/video.c index 3772662..bcc3afa 100644 --- a/modules/access/v4l2/video.c +++ b/modules/access/v4l2/video.c @@ -28,6 +28,7 @@ # include "config.h" #endif +#include <assert.h> #include <errno.h> #include <sys/ioctl.h> #include <sys/mman.h> @@ -513,6 +514,24 @@ int SetupFormat (vlc_object_t *obj, int fd, uint32_t fourcc, return 0; } +mtime_t GetBufferPTS (const struct v4l2_buffer *buf) +{ + mtime_t pts; + + switch (buf->flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) + { + case V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC: + pts = (buf->timestamp.tv_sec * CLOCK_FREQ) + + buf->timestamp.tv_usec; + static_assert (CLOCK_FREQ == 1000000, "Clock unit mismatch"); + break; + case V4L2_BUF_FLAG_TIMESTAMP_UNKNOWN: + default: + pts = mdate (); + break; + } + return pts; +} /***************************************************************************** * GrabVideo: Grab a video frame @@ -545,6 +564,7 @@ block_t *GrabVideo (vlc_object_t *demux, int fd, block_t *block = block_Alloc (buf.bytesused); if (unlikely(block == NULL)) return NULL; + block->i_pts = block->i_dts = GetBufferPTS (&buf); memcpy (block->p_buffer, bufv[buf.index].start, buf.bytesused); /* Unlock */ _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
