Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: vivid: Add support to the CSC API

The CSC API (Colorspace conversion) allows userspace to try
to configure the colorspace, transfer function, Y'CbCr/HSV encoding
and the quantization for capture devices. This patch adds support
to the CSC API in vivid.
Using the CSC API, userspace is allowed to do the following:

- Set the colorspace.
- Set the xfer_func.
- Set the ycbcr_enc function for YUV formats.
- Set the hsv_enc function for HSV formats
- Set the quantization for YUV and RGB formats.

Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>

authored by

Dafna Hirschfeld and committed by
Mauro Carvalho Chehab
2f491463 b38c73ca

+86 -6
+32 -6
drivers/media/test-drivers/vivid/vivid-vid-cap.c
··· 560 560 unsigned factor = 1; 561 561 unsigned w, h; 562 562 unsigned p; 563 + bool user_set_csc = !!(mp->flags & V4L2_PIX_FMT_FLAG_SET_CSC); 563 564 564 565 fmt = vivid_get_format(dev, mp->pixelformat); 565 566 if (!fmt) { ··· 634 633 (fmt->bit_depth[p] / fmt->vdownsampling[p])) / 635 634 (fmt->bit_depth[0] / fmt->vdownsampling[0]); 636 635 637 - mp->colorspace = vivid_colorspace_cap(dev); 638 - if (fmt->color_enc == TGP_COLOR_ENC_HSV) 639 - mp->hsv_enc = vivid_hsv_enc_cap(dev); 640 - else 636 + if (!user_set_csc || !v4l2_is_colorspace_valid(mp->colorspace)) 637 + mp->colorspace = vivid_colorspace_cap(dev); 638 + 639 + if (!user_set_csc || !v4l2_is_xfer_func_valid(mp->xfer_func)) 640 + mp->xfer_func = vivid_xfer_func_cap(dev); 641 + 642 + if (fmt->color_enc == TGP_COLOR_ENC_HSV) { 643 + if (!user_set_csc || !v4l2_is_hsv_enc_valid(mp->hsv_enc)) 644 + mp->hsv_enc = vivid_hsv_enc_cap(dev); 645 + } else if (fmt->color_enc == TGP_COLOR_ENC_YCBCR) { 646 + if (!user_set_csc || !v4l2_is_ycbcr_enc_valid(mp->ycbcr_enc)) 647 + mp->ycbcr_enc = vivid_ycbcr_enc_cap(dev); 648 + } else { 641 649 mp->ycbcr_enc = vivid_ycbcr_enc_cap(dev); 642 - mp->xfer_func = vivid_xfer_func_cap(dev); 643 - mp->quantization = vivid_quantization_cap(dev); 650 + } 651 + 652 + if (fmt->color_enc == TGP_COLOR_ENC_YCBCR || 653 + fmt->color_enc == TGP_COLOR_ENC_RGB) { 654 + if (!user_set_csc || !v4l2_is_quant_valid(mp->quantization)) 655 + mp->quantization = vivid_quantization_cap(dev); 656 + } else { 657 + mp->quantization = vivid_quantization_cap(dev); 658 + } 659 + 644 660 memset(mp->reserved, 0, sizeof(mp->reserved)); 645 661 return 0; 646 662 } ··· 787 769 if (vivid_is_sdtv_cap(dev)) 788 770 dev->tv_field_cap = mp->field; 789 771 tpg_update_mv_step(&dev->tpg); 772 + dev->tpg.colorspace = mp->colorspace; 773 + dev->tpg.xfer_func = mp->xfer_func; 774 + if (dev->fmt_cap->color_enc == TGP_COLOR_ENC_YCBCR) 775 + dev->tpg.ycbcr_enc = mp->ycbcr_enc; 776 + else 777 + dev->tpg.hsv_enc = mp->hsv_enc; 778 + dev->tpg.quantization = mp->quantization; 779 + 790 780 return 0; 791 781 } 792 782
+25
drivers/media/test-drivers/vivid/vivid-vid-common.c
··· 920 920 fmt = &vivid_formats[f->index]; 921 921 922 922 f->pixelformat = fmt->fourcc; 923 + 924 + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE && 925 + f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) 926 + return 0; 927 + /* 928 + * For capture devices, we support the CSC API. 929 + * We allow userspace to: 930 + * 1. set the colorspace 931 + * 2. set the xfer_func 932 + * 3. set the ycbcr_enc on YUV formats 933 + * 4. set the hsv_enc on HSV formats 934 + * 5. set the quantization on YUV and RGB formats 935 + */ 936 + f->flags |= V4L2_FMT_FLAG_CSC_COLORSPACE; 937 + f->flags |= V4L2_FMT_FLAG_CSC_XFER_FUNC; 938 + 939 + if (fmt->color_enc == TGP_COLOR_ENC_YCBCR) { 940 + f->flags |= V4L2_FMT_FLAG_CSC_YCBCR_ENC; 941 + f->flags |= V4L2_FMT_FLAG_CSC_QUANTIZATION; 942 + } else if (fmt->color_enc == TGP_COLOR_ENC_HSV) { 943 + f->flags |= V4L2_FMT_FLAG_CSC_HSV_ENC; 944 + } else if (fmt->color_enc == TGP_COLOR_ENC_RGB) { 945 + f->flags |= V4L2_FMT_FLAG_CSC_QUANTIZATION; 946 + } 947 + 923 948 return 0; 924 949 } 925 950
+29
include/media/v4l2-common.h
··· 539 539 buf->timestamp.tv_usec = ts.tv_nsec / NSEC_PER_USEC; 540 540 } 541 541 542 + static inline bool v4l2_is_colorspace_valid(__u32 colorspace) 543 + { 544 + return colorspace > V4L2_COLORSPACE_DEFAULT && 545 + colorspace <= V4L2_COLORSPACE_DCI_P3; 546 + } 547 + 548 + static inline bool v4l2_is_xfer_func_valid(__u32 xfer_func) 549 + { 550 + return xfer_func > V4L2_XFER_FUNC_DEFAULT && 551 + xfer_func <= V4L2_XFER_FUNC_SMPTE2084; 552 + } 553 + 554 + static inline bool v4l2_is_ycbcr_enc_valid(__u8 ycbcr_enc) 555 + { 556 + return ycbcr_enc > V4L2_YCBCR_ENC_DEFAULT && 557 + ycbcr_enc <= V4L2_YCBCR_ENC_SMPTE240M; 558 + } 559 + 560 + static inline bool v4l2_is_hsv_enc_valid(__u8 hsv_enc) 561 + { 562 + return hsv_enc == V4L2_HSV_ENC_180 || hsv_enc == V4L2_HSV_ENC_256; 563 + } 564 + 565 + static inline bool v4l2_is_quant_valid(__u8 quantization) 566 + { 567 + return quantization == V4L2_QUANTIZATION_FULL_RANGE || 568 + quantization == V4L2_QUANTIZATION_LIM_RANGE; 569 + } 570 + 542 571 #endif /* V4L2_COMMON_H_ */