lkml.org 
[lkml]   [2024]   [Apr]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH 25/35] media: venus: Use the correct div_ function
On Mon, Apr 15, 2024 at 07:34:42PM +0000, Ricardo Ribalda wrote:
> us_per_frame does not fit in u32
>

drivers/media/platform/qcom/venus/venc.c
391 static int venc_s_parm(struct file *file, void *fh, struct v4l2_streamparm *a)
392 {
393 struct venus_inst *inst = to_inst(file);
394 struct v4l2_outputparm *out = &a->parm.output;
395 struct v4l2_fract *timeperframe = &out->timeperframe;
396 u64 us_per_frame, fps;
397
398 if (a->type != V4L2_BUF_TYPE_VIDEO_OUTPUT &&
399 a->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
400 return -EINVAL;
401
402 memset(out->reserved, 0, sizeof(out->reserved));
403
404 if (!timeperframe->denominator)
405 timeperframe->denominator = inst->timeperframe.denominator;
406 if (!timeperframe->numerator)
407 timeperframe->numerator = inst->timeperframe.numerator;
408
409 out->capability = V4L2_CAP_TIMEPERFRAME;
410
411 us_per_frame = timeperframe->numerator * (u64)USEC_PER_SEC;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
It looks like in some drivers this multiply can go over U32_MAX.

412 do_div(us_per_frame, timeperframe->denominator);
^^^^^^^^^^^^
But after this divide, then we're under 1,000,000 again. Otherwise the
FPS is zero. So maybe the right thing to do is:

inst->fps = USEC_PER_SEC / (u32)us_per_frame;

413
414 if (!us_per_frame)
415 return -EINVAL;
416
417 fps = (u64)USEC_PER_SEC;
418 do_div(fps, us_per_frame);
419
420 inst->timeperframe = *timeperframe;
421 inst->fps = fps;
422
423 return 0;
424 }

regards,
dan carpenter


\
 
 \ /
  Last update: 2024-04-17 10:36    [W:0.031 / U:0.228 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site