media: stm32: dcmipp: avoid duplicated format on enum in bytecap

Avoid duplication of enumerated pixelformat on the bytecap
video capture device.  Indeed, since the bytecap format list
contains both CSI & parallel 16bits formats, ensure that same
pixelformat are not reported twice when performing enumeration
of supported formats.

Signed-off-by: Alain Volmat <alain.volmat@foss.st.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
This commit is contained in:
Alain Volmat 2024-12-12 10:17:34 +01:00 committed by Hans Verkuil
parent e265023155
commit 58d0201ef8

View File

@ -268,34 +268,34 @@ static int dcmipp_bytecap_enum_fmt_vid_cap(struct file *file, void *priv,
{
const struct dcmipp_bytecap_pix_map *vpix;
unsigned int index = f->index;
unsigned int i;
unsigned int i, prev_pixelformat = 0;
if (f->mbus_code) {
/*
* If a media bus code is specified, only enumerate formats
* compatible with it.
*/
for (i = 0; i < ARRAY_SIZE(dcmipp_bytecap_pix_map_list); i++) {
vpix = &dcmipp_bytecap_pix_map_list[i];
if (vpix->code != f->mbus_code)
continue;
/*
* List up all formats (or only ones matching f->mbus_code), taking
* care of removing duplicated entries (due to support of both
* parallel & csi 16 bits formats
*/
for (i = 0; i < ARRAY_SIZE(dcmipp_bytecap_pix_map_list); i++) {
vpix = &dcmipp_bytecap_pix_map_list[i];
/* Skip formats not matching requested mbus code */
if (f->mbus_code && vpix->code != f->mbus_code)
continue;
if (index == 0)
break;
/* Skip duplicated pixelformat */
if (vpix->pixelformat == prev_pixelformat)
continue;
index--;
}
prev_pixelformat = vpix->pixelformat;
if (i == ARRAY_SIZE(dcmipp_bytecap_pix_map_list))
return -EINVAL;
} else {
/* Otherwise, enumerate all formats. */
if (f->index >= ARRAY_SIZE(dcmipp_bytecap_pix_map_list))
return -EINVAL;
if (index == 0)
break;
vpix = &dcmipp_bytecap_pix_map_list[f->index];
index--;
}
if (i == ARRAY_SIZE(dcmipp_bytecap_pix_map_list))
return -EINVAL;
f->pixelformat = vpix->pixelformat;
return 0;