Re: [PATCH v2 5/7] media: uvcvideo: Increment intervals pointer at end of parsing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Laurent

On Mon, 15 May 2023 at 16:33, Laurent Pinchart
<laurent.pinchart@xxxxxxxxxxxxxxxx> wrote:
>
> Hi Ricardo,
>
> On Mon, May 15, 2023 at 03:22:13PM +0200, Ricardo Ribalda wrote:
> > On Sat, 6 May 2023 at 09:14, Laurent Pinchart wrote:
> > >
> > > The intervals pointer is incremented for each interval when parsing the
> > > format descriptor. This doesn't cause any issue as such, but gets in the
> > > way of constifying some pointers. Modify the parsing code to index the
> > > intervals pointer as an array and increment it in one go at end of
> > > parsing.
> > >
> > > Careful readers will notice that the maxIntervalIndex variable is set to
> > > 1 instead of n - 2 when bFrameIntervalType has a zero value. This is
> > > functionally equivalent, as n is equal to 3 in that case.
> > >
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>
> >
> > Reviewed-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx>
> >
> > > ---
> > >  drivers/media/usb/uvc/uvc_driver.c | 10 +++++++---
> > >  1 file changed, 7 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
> > > index 446bd8ff128c..11e4fa007f3f 100644
> > > --- a/drivers/media/usb/uvc/uvc_driver.c
> > > +++ b/drivers/media/usb/uvc/uvc_driver.c
> > > @@ -370,6 +370,8 @@ static int uvc_parse_format(struct uvc_device *dev,
> > >          */
> > >         while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE &&
> > >                buffer[2] == ftype) {
> > > +               unsigned int maxIntervalIndex;
> > > +
> > >                 frame = &format->frames[format->nframes];
> > >                 if (ftype != UVC_VS_FRAME_FRAME_BASED)
> > >                         n = buflen > 25 ? buffer[25] : 0;
> > > @@ -418,7 +420,7 @@ static int uvc_parse_format(struct uvc_device *dev,
> > >
> > >                 for (i = 0; i < n; ++i) {
> > >                         interval = get_unaligned_le32(&buffer[26+4*i]);
> > > -                       *(*intervals)++ = interval ? interval : 1;
> > > +                       (*intervals)[i] = interval ? interval : 1;
> > >                 }
> > >
> > >                 /*
> > > @@ -440,11 +442,11 @@ static int uvc_parse_format(struct uvc_device *dev,
> > >                                 * frame->wWidth * frame->wHeight / 8;
> > >
> > >                 /* Clamp the default frame interval to the boundaries. */
> > > -               n -= frame->bFrameIntervalType ? 1 : 2;
> > > +               maxIntervalIndex = frame->bFrameIntervalType ? n - 1 : 1;
> >
> > Maybe it is worth mentioning that bFrameIntervalType == 0 is a
> > continuous interval. idex 0 is min and 1 is max.
>
> I'll update the comment to
>
>                 /*
>                  * Clamp the default frame interval to the boundaries. A zero
>                  * bFrameIntervalType value indicates a continuous frame
>                  * interval range, with dwFrameInterval[0] storing the minimum
>                  * value and dwFrameInterval[1] storing the maximum value.
>                  */
>
Thanks! It looks much better :)


> > >                 frame->dwDefaultFrameInterval =
> > >                         clamp(frame->dwDefaultFrameInterval,
> > >                               frame->dwFrameInterval[0],
> > > -                             frame->dwFrameInterval[n]);
> > > +                             frame->dwFrameInterval[maxIntervalIndex]);
> > >
> > >                 /*
> > >                  * Some devices report frame intervals that are not functional.
> > > @@ -463,6 +465,8 @@ static int uvc_parse_format(struct uvc_device *dev,
> > >                         (100000000 / frame->dwDefaultFrameInterval) % 10);
> > >
> > >                 format->nframes++;
> > > +               *intervals += n;
> > > +
> > >                 buflen -= buffer[0];
> > >                 buffer += buffer[0];
> > >         }
>
> --
> Regards,
>
> Laurent Pinchart



-- 
Ricardo Ribalda



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux