On Tue, Mar 28, 2017 at 06:21:29PM +0300, Edgar Kaziahmedov wrote:
> The commit adds meaningful and informative printings for all
> v4l2 buf types in the 'print_v4l2_format_fmt' routine.
> 
> Signed-off-by: Edgar Kaziahmedov <e...@linux.com>
> ---
>  v4l2.c | 110 
> +++++++++++++++++++++++++++++++++++++++++++++++++++--------------
>  1 file changed, 86 insertions(+), 24 deletions(-)
> 
> diff --git a/v4l2.c b/v4l2.c
> index 637e8788..c7127961 100644
> --- a/v4l2.c
> +++ b/v4l2.c
> @@ -51,6 +51,7 @@ typedef struct v4l2_format struct_v4l2_format;
>  typedef struct v4l2_framebuffer struct_v4l2_framebuffer;
>  typedef struct v4l2_input struct_v4l2_input;
>  typedef struct v4l2_standard struct_v4l2_standard;
> +typedef struct v4l2_clip struct_v4l2_clip;

As struct v4l2_clip contains pointers, it has to be mpers'ed indeed.
The typedef is one half of the thing, another half is DEF_MPERS_TYPE.

Also, please keep this list sorted.

>  #include MPERS_DEFS
>  
> @@ -200,10 +201,22 @@ print_v4l2_fmtdesc(struct tcb *const tcp, const 
> kernel_ulong_t arg)
>  
>  #include "xlat/v4l2_fields.h"
>  #include "xlat/v4l2_colorspaces.h"
> +#include "xlat/v4l2_vbi_flags.h"
> +#include "xlat/v4l2_sliced_flags.h"
>  
> -static void
> -print_v4l2_format_fmt(const char *prefix, const struct_v4l2_format *f)
> +static bool
> +print_v4l2_clip(struct tcb *tcp, void *elem_buf, size_t elem_size, void* 
> data)
> +{
> +     const struct_v4l2_clip *p = elem_buf;
> +     tprintf(FMT_RECT, ARGS_RECT(p->c));
> +     return true;
> +}
> +
> +static bool
> +print_v4l2_format_fmt(struct tcb *const tcp, const char *prefix,
> +                   const struct_v4l2_format *f)
>  {
> +     bool ret = true;
>       switch (f->type) {
>       case V4L2_BUF_TYPE_VIDEO_CAPTURE:
>       case V4L2_BUF_TYPE_VIDEO_OUTPUT:
> @@ -220,8 +233,8 @@ print_v4l2_format_fmt(const char *prefix, const 
> struct_v4l2_format *f)
>               tprints("}");
>               break;
>  #if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
> -     case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
> -     case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: {
> +     case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
> +     case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: {
>               unsigned int i, max;
>  
>               tprints(prefix);

Why do you need to reorder them?
Please avoid irrelevant changes.

> @@ -244,42 +257,89 @@ print_v4l2_format_fmt(const char *prefix, const 
> struct_v4l2_format *f)
>                               f->fmt.pix_mp.plane_fmt[i].sizeimage,
>                               f->fmt.pix_mp.plane_fmt[i].bytesperline);
>               }
> -             tprintf("], num_planes=%u}", (unsigned) 
> f->fmt.pix_mp.num_planes);
> +             tprintf("], num_planes=%u}",
> +                     (unsigned) f->fmt.pix_mp.num_planes);
>               break;
>       }
>  #endif
> -
> -     /* TODO: Complete this switch statement */
> -#if 0
> -     case V4L2_BUF_TYPE_VIDEO_OVERLAY:
>  #if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
> -     case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
> -#endif
> +     case V4L2_BUF_TYPE_VIDEO_OVERLAY:
> +     case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: {

V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY was added in the kernel after
V4L2_BUF_TYPE_VIDEO_OVERLAY; why do you penalising the latter?

> +             struct_v4l2_clip clip;
>               tprints(prefix);
> -             tprints("fmt.win={???}");
> +             tprintf("fmt.win={left=%d, top=%d, width=%u, height=%u, field=",
> +                     ARGS_RECT(f->fmt.win.w));
> +             printxval(v4l2_fields, f->fmt.win.field, "V4L2_FIELD_???");
> +             tprintf(", chromakey=%#x, clips=", f->fmt.win.chromakey);
> +             ret = print_array(tcp, ptr_to_kulong(f->fmt.win.clips),
> +                               f->fmt.win.clipcount, &clip, sizeof(clip),
> +                               umoven_or_printaddr_ignore_syserror,

Is this use of umoven_or_printaddr_ignore_syserror instead of regular
umoven_or_printaddr justified?  Do you really want to print v4l2_clip
on exiting of a failed ioctl syscall?

> +                               print_v4l2_clip, 0);
> +             tprintf(", clipcount=%u, bitmap=", f->fmt.win.clipcount);
> +             printaddr(ptr_to_kulong(f->fmt.win.bitmap));
> +             tprintf(", global_alpha=%#x}", f->fmt.win.global_alpha);
>               break;
> -
> +     }
> +#endif
> +#if HAVE_DECL_V4L2_BUF_TYPE_VBI_CAPTURE
>       case V4L2_BUF_TYPE_VBI_CAPTURE:
>       case V4L2_BUF_TYPE_VBI_OUTPUT:
>               tprints(prefix);
> -             tprints("fmt.vbi={???}");
> +             tprintf("fmt.vbi={sampling_rate=%u, offset=%u, "
> +                     "samples_per_line=%u, sample_format=",
> +                     f->fmt.vbi.sampling_rate, f->fmt.vbi.offset,
> +                     f->fmt.vbi.samples_per_line);
> +             print_pixelformat(f->fmt.vbi.sample_format);
> +             tprintf(", start=%u,%u, count=%u,%u, ",
> +                     f->fmt.vbi.start[0], f->fmt.vbi.start[1],
> +                     f->fmt.vbi.count[0], f->fmt.vbi.count[1]);

%u,%u describes no C type, please change to [%u, %u].

> +             tprints("flags=");
> +             printxval(v4l2_vbi_flags, f->fmt.vbi.flags, "V4L2_VBI_???");
> +             tprintf(", reserved=%#x,%#x}", f->fmt.vbi.reserved[0],
> +                     f->fmt.vbi.reserved[1]);

Do you think printing these reserved fields is useful?

>               break;
> -
> +#endif
> +#if HAVE_DECL_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
>       case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
> -     case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
> +     case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: {
> +             unsigned int i;
> +
>               tprints(prefix);
> -             tprints("fmt.sliced={???}");
> -             break;
> +             tprints("fmt.sliced={service_set=");
> +             printxval(v4l2_sliced_flags, f->fmt.sliced.service_set,
> +                     "V4L2_SLICED_???");
> +             tprintf(", io_size=%u, service_lines=[",
> +                     f->fmt.sliced.io_size);
> +             /* I'm sorry for this magic constant, but standard headers
> +              * doesn't contain the corresponding define for
> +              * v4l2_sliced_vbi_format
> +             */
> +             for (i = 0; i < 24; i++) {

Please use ARRAY_SIZE(f->fmt.sliced.service_lines[0]) instead.

> +                     if (i > 0)
> +                             tprints(", ");
> +                     tprintf("{line[%u]=%#x, %#x}", i,
> +                             f->fmt.sliced.service_lines[0][i],
> +                             f->fmt.sliced.service_lines[1][i]);

{line[%u]=%#x, %#x} is not a C type.

> +             }
> +             tprintf("], reserved=%#x,%#x}",
> +                     f->fmt.sliced.reserved[0],
> +                     f->fmt.sliced.reserved[1]);
>  
> +             break;
> +     }
> +#endif
>  #if HAVE_DECL_V4L2_BUF_TYPE_SDR_CAPTURE
>       case V4L2_BUF_TYPE_SDR_CAPTURE:
>       case V4L2_BUF_TYPE_SDR_OUTPUT:
>               tprints(prefix);
> -             tprints("fmt.sdr={???}");
> +             tprints("fmt.sdr={pixelformat=");
> +             print_pixelformat(f->fmt.sdr.pixelformat);
> +             tprintf(", buffersize=%u}",
> +                     f->fmt.sdr.buffersize);
>               break;
>  #endif
> -#endif
>       }
> +     return ret;
>  }
>  
>  static int
> @@ -287,7 +347,7 @@ print_v4l2_format(struct tcb *const tcp, const 
> kernel_ulong_t arg,
>                 const bool is_get)
>  {
>       struct_v4l2_format f;
> -

Please keep this empty line.

> +     bool fail = false;

I don't think you need it, see below.

>       if (entering(tcp)) {
>               tprints(", ");
>               if (umove_or_printaddr(tcp, arg, &f))
> @@ -296,14 +356,16 @@ print_v4l2_format(struct tcb *const tcp, const 
> kernel_ulong_t arg,
>               printxval(v4l2_buf_types, f.type, "V4L2_BUF_TYPE_???");
>               if (is_get)
>                       return 0;
> -             print_v4l2_format_fmt(", ", &f);
> +             fail = !print_v4l2_format_fmt(tcp, ", ", &f);

RVAL_DECODED | 1 can be returned at this point if print_v4l2_format_fmt
indicated a failure, but see below.

>       } else {
>               if (!syserror(tcp) && !umove(tcp, arg, &f)) {
>                       const char *delim = is_get ? ", " : " => ";
> -                     print_v4l2_format_fmt(delim, &f);
> +                     fail = !print_v4l2_format_fmt(tcp, delim, &f);

On exiting syscall this affects nothing.

>               }
>               tprints("}");
>       }
> +     if (fail)
> +             return RVAL_DECODED | 1;

If this happened on entering syscall, an invalid structure
without closing "}" will be printed.

>       return 1;
>  }
>  

-- 
ldv

Attachment: signature.asc
Description: PGP signature

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to