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; #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); @@ -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: { + 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, + 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]); + 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]); 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++) { + if (i > 0) + tprints(", "); + tprintf("{line[%u]=%#x, %#x}", i, + f->fmt.sliced.service_lines[0][i], + f->fmt.sliced.service_lines[1][i]); + } + 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; - + bool fail = false; 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); } 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); } tprints("}"); } + if (fail) + return RVAL_DECODED | 1; return 1; } @@ -822,7 +884,7 @@ print_v4l2_create_buffers(struct tcb *const tcp, const kernel_ulong_t arg) tprints(", format={type="); printxval(v4l2_buf_types, b.format.type, "V4L2_BUF_TYPE_???"); - print_v4l2_format_fmt(", ", + print_v4l2_format_fmt(tcp, ", ", (struct_v4l2_format *) &b.format); tprints("}}"); return 0; -- 2.11.0 ------------------------------------------------------------------------------ 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