On Do, 2022-04-21 at 16:54 +0200, Philipp Zabel wrote: > On Do, 2022-04-21 at 12:02 +0200, Hans Verkuil wrote: > [...] > > > - if (fmt->pixelformat == V4L2_PIX_FMT_JPEG) > > > - colorspace = V4L2_COLORSPACE_JPEG; > > > > It's perfectly fine to keep this, the problem occurs with the raw image side > > (capture for the decoder, output for the encoder). > > > > There the colorspace must be SRGB, the xfer_func may be 0 or SRGB, > > v4l2-compliance doesn't allow xfer_func 0: > > fail: v4l2-test-formats.cpp(835): fmt_jpeg.g_xfer_func() != V4L2_XFER_FUNC_SRGB > test VIDIOC_S_FMT: FAIL > > Is this too strict? > > > and the > > ycbcr_enc is 0 (if not a YUV pixelformat) or ENC_601 (if it is a YUV format). > > Why does it have to be ENC_601 for YUV formats? Both > V4L2_MAP_YCBCR_ENC_DEFAULT(V4L2_COLORSPACE_JPEG) and > V4L2_MAP_YCBCR_ENC_DEFAULT(V4L2_COLORSPACE_SRGB) map to > V4L2_YCBCR_ENC_601 regardless of the pixel format, so there should be > no difference if 0 was allowed as well. > > On the other hand, quantization should be set to > V4L2_QUANTIZATION_FULL_RANGE for YUV formats on the raw image side, as > that defaults to LIM_RANGE for raw YUV images with SRGB colorspace. > > Basically, I wonder whether or not it would be a good idea to apply the > following change to v4l2-compliance: > > diff --git a/utils/v4l2-compliance/v4l2-test-formats.cpp b/utils/v4l2-compliance/v4l2-test-formats.cpp > index 269a3832fcdf..902c66367ff7 100644 > --- a/utils/v4l2-compliance/v4l2-test-formats.cpp > +++ b/utils/v4l2-compliance/v4l2-test-formats.cpp > @@ -832,8 +832,10 @@ static int testJPEGColorspace(const cv4l_fmt &fmt_raw, const cv4l_fmt &fmt_jpeg, > } > /* V4L2_COLORSPACE_JPEG is shorthand for these values: */ > fail_on_test(fmt_jpeg.g_colorspace() != V4L2_COLORSPACE_SRGB); > - fail_on_test(fmt_jpeg.g_xfer_func() != V4L2_XFER_FUNC_SRGB); > - fail_on_test(fmt_jpeg.g_ycbcr_enc() != V4L2_YCBCR_ENC_601); > + fail_on_test(fmt_jpeg.g_xfer_func() != V4L2_XFER_FUNC_DEFAULT && > + fmt_jpeg.g_xfer_func() != V4L2_XFER_FUNC_SRGB); > + fail_on_test(fmt_jpeg.g_ycbcr_enc() != V4L2_YCBCR_ENC_DEFAULT && > + fmt_jpeg.g_ycbcr_enc() != V4L2_YCBCR_ENC_601); > fail_on_test(fmt_jpeg.g_quantization() != V4L2_QUANTIZATION_FULL_RANGE); > return 0; > } Please disregard, I overlooked that this part is checking the encoded image side. The raw image side is allowed 0 ycbcr_enc and xfer_func already, and raw image quantization is not checked at all. regards Philipp