Hi Daniel, Sorry for the delay, it's been very busy lately... On 26/06/2021 18:42, Daniel Almeida wrote: > I am sending this again because apparently I sent it originally from my > personal email by mistake. > > --------------- > > > Hi Hans! > > I have been working on testing this lately as you know. > > From the example you've added to vivid, i.e.: > > +static const struct v4l2_ctrl_config vivid_ctrl_u32_dyn_array = { > + .ops = &vivid_user_gen_ctrl_ops, > + .id = VIVID_CID_U32_DYN_ARRAY, > + .name = "U32 Dynamic Array", > + .type = V4L2_CTRL_TYPE_U32, > + .flags = V4L2_CTRL_FLAG_DYNAMIC_ARRAY, > + .def = 50, > + .min = 10, > + .max = 90, > + .step = 1, > + .dims = { 100 }, > +}; > + > > + v4l2_ctrl_new_custom(hdl_user_gen, &vivid_ctrl_u32_dyn_array, NULL); > > > I was under the impression that it'd be enough to pass the id and > V4L2_CTRL_FLAG_DYNAMIC_ARRAY in the config before calling > v4l2_ctrl_new_custom. Apparently that's not the case though, because > v4l2_ctrl_fill will then set its own flags if I understood correctly, i.e.: > > > if (name == NULL) > v4l2_ctrl_fill(cfg->id, &name, &type, &min, &max, &step, > &def,&flags) v4l2_ctrl_fill doesn't know about custom controls. It only handles standard controls. For custom controls you always need to fill in everything. > > <snip> > > *name = v4l2_ctrl_get_name(id); > *flags = 0 > > > <snip> > > > To be honest, I didn't quite understand whether you wanted individual > drivers to signal they want to treat a given control as a dynamic array > or whether I should add that flag in the switch statement in > v4l2_ctrl_fill, thereby enabling this feature by default for all drivers > that use that control if I understood correctly. If a standard control (i.e. not a private driver control) is a dynamic array, then that flag must be set in v4l2_ctrl_fill(). > > If the former, I was expecting to communicate it to userspace via a menu > control, e.g. for h264 and cedrus: > > enum v4l2_stateless_h264_decode_mode { > V4L2_STATELESS_H264_DECODE_MODE_SLICE_BASED, /* i.e. a single > slice per request */ > V4L2_STATELESS_H264_DECODE_MODE_FRAME_BASED, > + V4L2_STATELESS_H264_DECODE_MODE_SLICE_ARRAY_BASED, /* i.e. an array > of slices per request */ > }; > > @@ -56,6 +56,7 @@ static const struct cedrus_control cedrus_controls[] = { > { > .cfg = { > .id = V4L2_CID_STATELESS_H264_SLICE_PARAMS, > + .flags = V4L2_CTRL_FLAG_DYNAMIC_ARRAY, > }, > .codec = CEDRUS_CODEC_H264, > }, > @@ -86,7 +87,7 @@ static const struct cedrus_control cedrus_controls[] = { > { > .cfg = { > .id = V4L2_CID_STATELESS_H264_DECODE_MODE, > - .max = V4L2_STATELESS_H264_DECODE_MODE_SLICE_BASED, > + .max = V4L2_STATELESS_H264_DECODE_MODE_SLICE_ARRAY_BASED, > .def = V4L2_STATELESS_H264_DECODE_MODE_SLICE_BASED, > }, > .codec = CEDRUS_CODEC_H264, > > -- Daniel > If a driver supports arrays of slice params, then it will need to create a new V4L2_CID_STATELESS_H264_SLICE_PARAMS_ARRAY control. You can't just change V4L2_CID_STATELESS_H264_SLICE_PARAMS from a regular compound control to a dynamic array control, they have to be different controls. A driver can support either V4L2_CID_STATELESS_H264_SLICE_PARAMS, V4L2_CID_STATELESS_H264_SLICE_PARAMS_ARRAY or both, with the corresponding modes enumerated in V4L2_CID_STATELESS_H264_DECODE_MODE. I hope this helps. Regards, Hans