From 57b3fe537e70924af39417e1f394cdb5e414dabc Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Sun, 10 Oct 2021 12:07:09 +0200 Subject: [PATCH] v4l2: handle discrete and stepwize frame size enumeration --- spa/plugins/v4l2/v4l2-utils.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/spa/plugins/v4l2/v4l2-utils.c b/spa/plugins/v4l2/v4l2-utils.c index 2197268f9..af26d77d3 100644 --- a/spa/plugins/v4l2/v4l2-utils.c +++ b/spa/plugins/v4l2/v4l2-utils.c @@ -726,7 +726,35 @@ spa_v4l2_enum_format(struct impl *this, int seq, spa_pod_builder_id(&b, info->format); } spa_pod_builder_prop(&b, SPA_FORMAT_VIDEO_size, 0); - spa_pod_builder_rectangle(&b, port->frmsize.discrete.width, port->frmsize.discrete.height); + if (port->frmsize.type == V4L2_FRMSIZE_TYPE_DISCRETE) { + spa_pod_builder_rectangle(&b, + port->frmsize.discrete.width, + port->frmsize.discrete.height); + } else if (port->frmsize.type == V4L2_FRMSIZE_TYPE_CONTINUOUS || + port->frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) { + spa_pod_builder_push_choice(&b, &f[1], SPA_CHOICE_None, 0); + choice = (struct spa_pod_choice*)spa_pod_builder_frame(&b, &f[1]); + + spa_pod_builder_rectangle(&b, + port->frmsize.stepwise.min_width, + port->frmsize.stepwise.min_height); + spa_pod_builder_rectangle(&b, + port->frmsize.stepwise.min_width, + port->frmsize.stepwise.min_height); + spa_pod_builder_rectangle(&b, + port->frmsize.stepwise.max_width, + port->frmsize.stepwise.max_height); + + if (port->frmsize.type == V4L2_FRMSIZE_TYPE_CONTINUOUS) { + choice->body.type = SPA_CHOICE_Range; + } else { + choice->body.type = SPA_CHOICE_Step; + spa_pod_builder_rectangle(&b, + port->frmsize.stepwise.max_width, + port->frmsize.stepwise.max_height); + } + spa_pod_builder_pop(&b, &f[1]); + } spa_pod_builder_prop(&b, SPA_FORMAT_VIDEO_framerate, 0);