* v4l2.c: add meaningful and informative printings for all v4l2 buf types in the 'print_v4l2_format_fmt' routine, implementation print_v4l2_clip routine to print the clips field in case of the overlay type buf * xlat/v4l2_vbi_flags.in: new flags for and V4L2_BUF_TYPE_VBI* * xlat/v4l2_sliced_flags.in: new flags for V4L2_BUF_TYPE_SLICED*
Signed-off-by: Edgar Kaziahmedov <e...@linux.com> --- v4l2.c | 107 ++++++++++++++++++++++++++++++++++++---------- xlat/v4l2_sliced_flags.in | 6 +++ xlat/v4l2_vbi_flags.in | 6 +++ 3 files changed, 97 insertions(+), 22 deletions(-) create mode 100644 xlat/v4l2_sliced_flags.in create mode 100644 xlat/v4l2_vbi_flags.in diff --git a/v4l2.c b/v4l2.c index 637e8788..879f1728 100644 --- a/v4l2.c +++ b/v4l2.c @@ -30,6 +30,7 @@ #include "defs.h" #include DEF_MPERS_TYPE(struct_v4l2_buffer) +#include DEF_MPERS_TYPE(struct_v4l2_clip) #include DEF_MPERS_TYPE(struct_v4l2_create_buffers) #include DEF_MPERS_TYPE(struct_v4l2_ext_control) #include DEF_MPERS_TYPE(struct_v4l2_ext_controls) @@ -44,6 +45,7 @@ #include <linux/videodev2.h> typedef struct v4l2_buffer struct_v4l2_buffer; +typedef struct v4l2_clip struct_v4l2_clip; typedef struct v4l2_create_buffers struct_v4l2_create_buffers; typedef struct v4l2_ext_control struct_v4l2_ext_control; typedef struct v4l2_ext_controls struct_v4l2_ext_controls; @@ -200,10 +202,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: @@ -244,42 +258,88 @@ 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 + /* OUTPUT_OVERLAY since Linux 2.6.22 */ case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: -#endif + case V4L2_BUF_TYPE_VIDEO_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, 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; - + } + /* both since Linux 2.5.46 */ 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("}"); break; - + /* both since Linux 2.5.46 */ case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: - case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: + case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: { + unsigned int i, j; + tprints(prefix); - tprints("fmt.sliced={???}"); + 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); + for (i = 0; i < ARRAY_SIZE(f->fmt.sliced.service_lines); i++) { + if (i > 0) + tprints(", "); + tprints("["); + for (j = 0; + j < ARRAY_SIZE(f->fmt.sliced.service_lines[0]); + j++) { + if (j > 0) + tprints(", "); + tprintf("%#x", + f->fmt.sliced.service_lines[i][j]); + } + tprints("]"); + } + tprintf("]}"); break; - + } + /* since Linux 4.4 */ +#if HAVE_DECL_V4L2_BUF_TYPE_SDR_OUTPUT + case V4L2_BUF_TYPE_SDR_OUTPUT: +#endif + /* since Linux 3.15 */ #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 @@ -296,11 +356,14 @@ 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); + if (!print_v4l2_format_fmt(tcp, ", ", &f)) { + tprints("}"); + return RVAL_DECODED | 1; + } } else { if (!syserror(tcp) && !umove(tcp, arg, &f)) { const char *delim = is_get ? ", " : " => "; - print_v4l2_format_fmt(delim, &f); + print_v4l2_format_fmt(tcp, delim, &f); } tprints("}"); } @@ -822,7 +885,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; diff --git a/xlat/v4l2_sliced_flags.in b/xlat/v4l2_sliced_flags.in new file mode 100644 index 00000000..baff2e26 --- /dev/null +++ b/xlat/v4l2_sliced_flags.in @@ -0,0 +1,6 @@ +V4L2_SLICED_TELETEXT_B +V4L2_SLICED_VPS +V4L2_SLICED_CAPTION_525 +V4L2_SLICED_WSS_625 +V4L2_SLICED_VBI_525 +V4L2_SLICED_VBI_625 diff --git a/xlat/v4l2_vbi_flags.in b/xlat/v4l2_vbi_flags.in new file mode 100644 index 00000000..b367e606 --- /dev/null +++ b/xlat/v4l2_vbi_flags.in @@ -0,0 +1,6 @@ +V4L2_VBI_UNSYNC +V4L2_VBI_INTERLACED +V4L2_VBI_ITU_525_F1_START +V4L2_VBI_ITU_525_F2_START +V4L2_VBI_ITU_625_F1_START +V4L2_VBI_ITU_625_F2_START -- 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