mirror of
https://github.com/torvalds/linux.git
synced 2024-11-01 01:31:44 +00:00
[media] [FOR,v3.3] uvcvideo: Avoid division by 0 in timestamp calculation
Use system timestamps if the timestamp can't be computed from the data sent by the device. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
fda27874de
commit
8e57dec045
@ -611,9 +611,11 @@ void uvc_video_clock_update(struct uvc_streaming *stream,
|
||||
delta_stc = buf->pts - (1UL << 31);
|
||||
x1 = first->dev_stc - delta_stc;
|
||||
x2 = last->dev_stc - delta_stc;
|
||||
if (x1 == x2)
|
||||
goto done;
|
||||
|
||||
y1 = (first->dev_sof + 2048) << 16;
|
||||
y2 = (last->dev_sof + 2048) << 16;
|
||||
|
||||
if (y2 < y1)
|
||||
y2 += 2048 << 16;
|
||||
|
||||
@ -631,14 +633,16 @@ void uvc_video_clock_update(struct uvc_streaming *stream,
|
||||
x1, x2, y1, y2, clock->sof_offset);
|
||||
|
||||
/* Second step, SOF to host clock conversion. */
|
||||
ts = timespec_sub(last->host_ts, first->host_ts);
|
||||
x1 = (uvc_video_clock_host_sof(first) + 2048) << 16;
|
||||
x2 = (uvc_video_clock_host_sof(last) + 2048) << 16;
|
||||
y1 = NSEC_PER_SEC;
|
||||
y2 = (ts.tv_sec + 1) * NSEC_PER_SEC + ts.tv_nsec;
|
||||
|
||||
if (x2 < x1)
|
||||
x2 += 2048 << 16;
|
||||
if (x1 == x2)
|
||||
goto done;
|
||||
|
||||
ts = timespec_sub(last->host_ts, first->host_ts);
|
||||
y1 = NSEC_PER_SEC;
|
||||
y2 = (ts.tv_sec + 1) * NSEC_PER_SEC + ts.tv_nsec;
|
||||
|
||||
/* Interpolated and host SOF timestamps can wrap around at slightly
|
||||
* different times. Handle this by adding or removing 2048 to or from
|
||||
|
Loading…
Reference in New Issue
Block a user