@@ -24,9 +24,15 @@ const std::list<unsigned long> ioctls = {
VIDIOC_DQBUF,
VIDIOC_G_PARM,
VIDIOC_S_PARM,
+ VIDIOC_ENUMINPUT,
VIDIOC_G_CTRL,
VIDIOC_S_CTRL,
VIDIOC_QUERYCTRL,
+ VIDIOC_G_INPUT,
+ VIDIOC_S_INPUT,
+ VIDIOC_G_OUTPUT,
+ VIDIOC_S_OUTPUT,
+ VIDIOC_ENUMOUTPUT,
VIDIOC_G_CROP,
VIDIOC_S_CROP,
VIDIOC_TRY_FMT,
@@ -614,6 +614,17 @@ void retrace_vidioc_queryctrl(int fd_retrace, json_object *ioctl_args)
free(ptr);
}
+void retrace_vidioc_enuminput(int fd_retrace, json_object *ioctl_args)
+{
+ struct v4l2_input *ptr = retrace_v4l2_input_gen(ioctl_args);
+ ioctl(fd_retrace, VIDIOC_ENUMINPUT, ptr);
+
+ if (is_verbose() || (errno != 0))
+ perror("VIDIOC_ENUMINPUT");
+
+ free(ptr);
+}
+
void retrace_vidioc_g_control(int fd_retrace, json_object *ioctl_args)
{
struct v4l2_control *ptr = retrace_v4l2_control_gen(ioctl_args);
@@ -636,6 +647,61 @@ void retrace_vidioc_s_control(int fd_retrace, json_object *ioctl_args)
free(ptr);
}
+void retrace_vidioc_g_input(int fd_retrace, json_object *ioctl_args)
+{
+ int input = 0;
+ ioctl(fd_retrace, VIDIOC_G_INPUT, &input);
+
+ if (is_verbose() || (errno != 0))
+ perror("VIDIOC_G_INPUT");
+}
+
+void retrace_vidioc_s_input(int fd_retrace, json_object *ioctl_args)
+{
+ int input = 0;
+ json_object *input_obj;
+ if (json_object_object_get_ex(ioctl_args, "input", &input_obj))
+ input = json_object_get_int(input_obj);
+
+ ioctl(fd_retrace, VIDIOC_S_INPUT, &input);
+
+ if (is_verbose() || (errno != 0))
+ perror("VIDIOC_S_INPUT");
+}
+
+void retrace_vidioc_g_output(int fd_retrace, json_object *ioctl_args)
+{
+ int output = 0;
+ ioctl(fd_retrace, VIDIOC_G_OUTPUT, &output);
+
+ if (is_verbose() || (errno != 0))
+ perror("VIDIOC_G_OUTPUT");
+}
+
+void retrace_vidioc_s_output(int fd_retrace, json_object *ioctl_args)
+{
+ int output = 0;
+ json_object *output_obj;
+ if (json_object_object_get_ex(ioctl_args, "output", &output_obj))
+ output = json_object_get_int(output_obj);
+
+ ioctl(fd_retrace, VIDIOC_S_OUTPUT, &output);
+
+ if (is_verbose() || (errno != 0))
+ perror("VIDIOC_S_OUTPUT");
+}
+
+void retrace_vidioc_enumoutput(int fd_retrace, json_object *ioctl_args)
+{
+ struct v4l2_output *ptr = retrace_v4l2_output_gen(ioctl_args);
+ ioctl(fd_retrace, VIDIOC_ENUMOUTPUT, ptr);
+
+ if (is_verbose() || (errno != 0))
+ perror("VIDIOC_ENUMOUTPUT");
+
+ free(ptr);
+}
+
void retrace_vidioc_g_crop(int fd_retrace, json_object *ioctl_args)
{
struct v4l2_crop *ptr = retrace_v4l2_crop_gen(ioctl_args);
@@ -1165,6 +1231,9 @@ void retrace_ioctl(json_object *syscall_obj)
case VIDIOC_S_PARM:
retrace_vidioc_s_parm(fd_retrace, ioctl_args_user);
break;
+ case VIDIOC_ENUMINPUT:
+ retrace_vidioc_enuminput(fd_retrace, ioctl_args_user);
+ break;
case VIDIOC_G_CTRL:
retrace_vidioc_g_control(fd_retrace, ioctl_args_user);
break;
@@ -1174,6 +1243,21 @@ void retrace_ioctl(json_object *syscall_obj)
case VIDIOC_QUERYCTRL:
retrace_vidioc_queryctrl(fd_retrace, ioctl_args_user);
break;
+ case VIDIOC_G_INPUT:
+ retrace_vidioc_g_input(fd_retrace, ioctl_args_user);
+ break;
+ case VIDIOC_S_INPUT:
+ retrace_vidioc_s_input(fd_retrace, ioctl_args_user);
+ break;
+ case VIDIOC_G_OUTPUT:
+ retrace_vidioc_g_output(fd_retrace, ioctl_args_user);
+ break;
+ case VIDIOC_S_OUTPUT:
+ retrace_vidioc_s_output(fd_retrace, ioctl_args_user);
+ break;
+ case VIDIOC_ENUMOUTPUT:
+ retrace_vidioc_enumoutput(fd_retrace, ioctl_args_user);
+ break;
case VIDIOC_G_CROP:
retrace_vidioc_g_crop(fd_retrace, ioctl_args_user);
break;
@@ -556,6 +556,9 @@ json_object *trace_ioctl_args(unsigned long cmd, void *arg)
case VIDIOC_S_PARM:
trace_v4l2_streamparm(arg, ioctl_args);
break;
+ case VIDIOC_ENUMINPUT:
+ trace_v4l2_input_gen(arg, ioctl_args);
+ break;
case VIDIOC_G_CTRL:
case VIDIOC_S_CTRL:
trace_v4l2_control_gen(arg, ioctl_args);
@@ -563,6 +566,21 @@ json_object *trace_ioctl_args(unsigned long cmd, void *arg)
case VIDIOC_QUERYCTRL:
trace_v4l2_queryctrl_gen(arg, ioctl_args);
break;
+ case VIDIOC_G_INPUT:
+ case VIDIOC_S_INPUT: {
+ int *input = static_cast<int*>(arg);
+ json_object_object_add(ioctl_args, "input", json_object_new_int(*input));
+ break;
+ }
+ case VIDIOC_G_OUTPUT:
+ case VIDIOC_S_OUTPUT: {
+ int *output = static_cast<int*>(arg);
+ json_object_object_add(ioctl_args, "output", json_object_new_int(*output));
+ break;
+ }
+ case VIDIOC_ENUMOUTPUT:
+ trace_v4l2_output_gen(arg, ioctl_args);
+ break;
case VIDIOC_G_CROP:
case VIDIOC_S_CROP:
trace_v4l2_crop_gen(arg, ioctl_args);
@@ -156,6 +156,12 @@ sub get_val_def_name {
if ($struct_name eq "v4l2_frmivalenum") {
return "v4l2_frmivaltypes_val_def";
}
+ if ($struct_name eq "v4l2_input") {
+ return $val_def_name = "input_type_val_def";
+ }
+ if ($struct_name eq "v4l2_output") {
+ return $val_def_name = "output_type_val_def";
+ }
return "nullptr"; # will print as hex string
}
# special treatment for struct v4l2_input which has members named both "tuner" and "type"
@@ -209,6 +215,9 @@ sub get_val_def_name {
if ($member =~ /xfer_func/) {
return "v4l2_xfer_func_val_def";
}
+ if (($member eq "status") && ($struct_name eq "v4l2_input")) {
+ $val_def_name = "input_field_val_def";
+ }
return "";
}
@@ -824,11 +833,41 @@ while (<>) {
flag_def_gen("V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS");
next;
}
+ if (grep {/^#define V4L2_STD_PAL_B\s+/} $_) {
+ printf $fh_common_info_h "constexpr flag_def std_flag_def[] = {\n";
+ flag_def_gen("V4L2_STD_ALL");
+ next
+ }
if (grep {/^#define V4L2_MODE_HIGHQUALITY\s+/} $_) {
printf $fh_common_info_h "constexpr val_def streamparm_val_def[] = {\n";
val_def_gen("V4L2_CAP_TIMEPERFRAME");
next;
}
+ if (grep {/^#define V4L2_INPUT_TYPE_TUNER\s+/} $_) {
+ printf $fh_common_info_h "constexpr val_def input_type_val_def[] = {\n";
+ val_def_gen("V4L2_INPUT_TYPE_TOUCH");
+ next
+ }
+ if (grep {/^#define V4L2_IN_ST_NO_POWER\s+/} $_) {
+ printf $fh_common_info_h "constexpr val_def input_field_val_def[] = {\n";
+ val_def_gen("V4L2_IN_ST_VTR");
+ next
+ }
+ if (grep {/^#define V4L2_IN_CAP_DV_TIMINGS\s+/} $_) {
+ printf $fh_common_info_h "constexpr flag_def input_cap_flag_def[] = {\n";
+ flag_def_gen("V4L2_IN_CAP_NATIVE_SIZE");
+ next
+ }
+ if (grep {/^#define V4L2_OUTPUT_TYPE_MODULATOR\s+/} $_) {
+ printf $fh_common_info_h "constexpr val_def output_type_val_def[] = {\n";
+ val_def_gen("V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY");
+ next
+ }
+ if (grep {/^#define V4L2_OUT_CAP_DV_TIMINGS\s+/} $_) {
+ printf $fh_common_info_h "constexpr flag_def output_cap_flag_def[] = {\n";
+ flag_def_gen("V4L2_OUT_CAP_NATIVE_SIZE");
+ next
+ }
if (grep {/^#define V4L2_ENC_CMD_START\s+/} $_) {
printf $fh_common_info_h "constexpr val_def encoder_cmd_val_def[] = {\n";
val_def_gen("V4L2_ENC_CMD_RESUME");
Add tracing and retracing for: VIDIOC_ENUMINPUT, VIDIOC_ENUMOUTPUT, VIDIOC_G_INPUT, VIDIOC_S_INPUT, VIDIOC_G_OUTPUT, VIDIOC_S_OUTPUT. Signed-off-by: Deborah Brouwer <deborah.brouwer@collabora.com> --- utils/v4l2-tracer/libv4l2tracer.cpp | 6 ++ utils/v4l2-tracer/retrace.cpp | 84 ++++++++++++++++++++++++++++ utils/v4l2-tracer/trace.cpp | 18 ++++++ utils/v4l2-tracer/v4l2-tracer-gen.pl | 39 +++++++++++++ 4 files changed, 147 insertions(+)