public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Yong Zhi <yong.zhi@intel.com>
Cc: linux-media@vger.kernel.org, sakari.ailus@linux.intel.com,
	tfiga@chromium.org, rajmohan.mani@intel.com,
	tuukka.toivonen@intel.com, jerry.w.hu@intel.com,
	tian.shu.qiu@intel.com, hans.verkuil@cisco.com,
	mchehab@kernel.org, bingbu.cao@intel.com,
	jian.xu.zheng@intel.com
Subject: Re: [PATCH v8 15/17] media: v4l: Add Intel IPU3 meta buffer formats
Date: Tue, 11 Dec 2018 14:58:50 +0200	[thread overview]
Message-ID: <2743727.5LazzqFdDF@avalon> (raw)
In-Reply-To: <1544144622-29791-16-git-send-email-yong.zhi@intel.com>

Hello Yong,

Thank you for the patch.

On Friday, 7 December 2018 03:03:40 EET Yong Zhi wrote:
> Add IPU3-specific meta formats for processing parameters and
> 3A statistics.
> 
>   V4L2_META_FMT_IPU3_PARAMS
>   V4L2_META_FMT_IPU3_STAT_3A
> 
> Signed-off-by: Yong Zhi <yong.zhi@intel.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

My Reviewed-by tag was related to the format part only (v4l2-ioctl.c and 
videodev2.h) :-) Please see below for more comments about the documentation.

> ---
>  Documentation/media/uapi/v4l/meta-formats.rst      |   1 +
>  .../media/uapi/v4l/pixfmt-meta-intel-ipu3.rst      | 178 ++++++++++++++++++
>  drivers/media/v4l2-core/v4l2-ioctl.c               |   2 +
>  include/uapi/linux/videodev2.h                     |   4 +
>  4 files changed, 185 insertions(+)
>  create mode 100644 Documentation/media/uapi/v4l/pixfmt-meta-intel-ipu3.rst
> 
> diff --git a/Documentation/media/uapi/v4l/meta-formats.rst
> b/Documentation/media/uapi/v4l/meta-formats.rst index
> 438bd244bd2f..5f956fa784b7 100644
> --- a/Documentation/media/uapi/v4l/meta-formats.rst
> +++ b/Documentation/media/uapi/v4l/meta-formats.rst
> @@ -19,6 +19,7 @@ These formats are used for the :ref:`metadata` interface
> only.
>  .. toctree::
>      :maxdepth: 1
> 
> +    pixfmt-meta-intel-ipu3
>      pixfmt-meta-d4xx
>      pixfmt-meta-uvc
>      pixfmt-meta-vsp1-hgo

Please keep this list alphabetically sorted.

> diff --git a/Documentation/media/uapi/v4l/pixfmt-meta-intel-ipu3.rst
> b/Documentation/media/uapi/v4l/pixfmt-meta-intel-ipu3.rst new file mode
> 100644
> index 000000000000..8cd30ffbf8b8
> --- /dev/null
> +++ b/Documentation/media/uapi/v4l/pixfmt-meta-intel-ipu3.rst
> @@ -0,0 +1,178 @@
> +.. -*- coding: utf-8; mode: rst -*-
> +
> +.. _v4l2-meta-fmt-params:
> +.. _v4l2-meta-fmt-stat-3a:
> +
> +******************************************************************
> +V4L2_META_FMT_IPU3_PARAMS ('ip3p'), V4L2_META_FMT_IPU3_3A ('ip3s')
> +******************************************************************
> +
> +.. c:type:: ipu3_uapi_stats_3a

No need for c:type:: here, the structure is already properly defined in 
drivers/staging/media/ipu3/include/intel-ipu3.h

> +3A statistics
> +=============
> +
> +For IPU3 ImgU, the 3A statistics accelerators collect different statistics

I'd write "The IPU3 ImgU 3A statistics accelerators collect" or "The IPU3 ImgU 
includes 3A statistics accelerators that collect"

> over +an input bayer frame. Those statistics, defined in data struct

bayer should be spelled Bayer (here and below).

> :c:type:`ipu3_uapi_stats_3a`, +are obtained from "ipu3-imgu 3a stat"
> metadata capture video node, which are then +passed to user space for
> statistics analysis using :c:type:`v4l2_meta_format` interface.

How about simply

"Those statistics are obtained from the "ipu3-imgu [01] 3a stat" metadata 
capture video nodes, using the :c:type:`v4l2_meta_format` interface. They are 
formatted as described by the :c:type:`ipu3_uapi_stats_3a` structure."

> +
> +The statistics collected are AWB (Auto-white balance) RGBS (Red, Green,
> Blue and +Saturation measure) cells, AWB filter response, AF (Auto-focus)
> filter response, +and AE (Auto-exposure) histogram.

Could you please wrap lines at the 80 columns boundary ?

> +struct :c:type:`ipu3_uapi_4a_config` saves configurable parameters for all
> above.

I would write it as "The 

By the way why "4a" when the documentation talks about 3A ? Shouldn't the 
structure be called ipu3_uapi_3a_config ?

> +
> +.. code-block:: c
> +
> +	struct ipu3_uapi_stats_3a {
> +		struct ipu3_uapi_awb_raw_buffer awb_raw_buffer;
> +		struct ipu3_uapi_ae_raw_buffer_aligned
> ae_raw_buffer[IPU3_UAPI_MAX_STRIPES];
> +		struct ipu3_uapi_af_raw_buffer
> af_raw_buffer;
> +		struct ipu3_uapi_awb_fr_raw_buffer awb_fr_raw_buffer;
> +		struct ipu3_uapi_4a_config stats_4a_config;
> +		__u32 ae_join_buffers;
> +		__u8 padding[28];
> +		struct ipu3_uapi_stats_3a_bubble_info_per_stripe
> stats_3a_bubble_per_stripe;
> +		struct ipu3_uapi_ff_status stats_3a_status;
> +	};
> 
> +.. c:type:: ipu3_uapi_params

No need for c:type:: here either.

> +Pipeline parameters
> +===================
> +
> +IPU3 pipeline has a number of image processing stages, each of which takes

s/IPU3/The IPU3/

> a +set of parameters as input. The major stages of pipelines are shown
> here:
> +
> +Raw pixels -> Bayer Downscaling -> Optical Black Correction ->
> +
> +Linearization -> Lens Shading Correction -> White Balance / Exposure /
> +
> +Focus Apply -> Bayer Noise Reduction -> ANR -> Demosaicing -> Color
> +
> +Correction Matrix -> Gamma correction -> Color Space Conversion ->
> +
> +Chroma Down Scaling -> Chromatic Noise Reduction -> Total Color
> +
> +Correction -> XNR3 -> TNR -> DDR

You can replace this list with

.. kernel-render:: DOT
   :alt: IPU3 ImgU Pipeline
   :caption: IPU3 ImgU Pipeline Diagram

   digraph "IPU3 ImgU" {
       node [shape=box]
       splines="ortho"
       rankdir="LR"

       a [label="Raw pixels"]
       b [label="Bayer Downscaling"]
       c [label="Optical Black Correction"]
       d [label="Linearization"]
       e [label="Lens Shading Correction"]
       f [label="White Balance / Exposure / Focus Apply"]
       g [label="Bayer Noise Reduction"]
       h [label="ANR"]
       i [label="Demosaicing"]
       j [label="Color Correction Matrix"]
       k [label="Gamma correction"]
       l [label="Color Space Conversion"]
       m [label="Chroma Down Scaling"]
       n [label="Chromatic Noise Reduction"]
       o [label="Total Color Correction"]
       p [label="XNR3"]
       q [label="TNR"]
       r [label="DDR"]

       { rank=same; a -> b -> c -> d -> e -> f }
       { rank=same; g -> h -> i -> j -> k -> l }
       { rank=same; m -> n -> o -> p -> q -> r }

       a -> g -> m [style=invis, weight=10]

       f -> g
       l -> m
   }

to get a nicer diagram.

> +The table below presents a description of the above algorithms.
> +
> +========================
> ======================================================= 
> +Name			Description
> +========================
> =======================================================
> +Optical Black
> Correction Optical Black Correction block subtracts a pre-defined +			
> value from the respective pixel values to obtain better
> +			 image quality.
> +			 Defined in :c:type:`ipu3_uapi_obgrid_param`.
> +Linearization		 This algo block uses linearization parameters to
> +			 address non-linearity sensor effects. The Lookup table
> +			 table is defined in
> +			 :c:type:`ipu3_uapi_isp_lin_vmem_params`.
> +SHD			 Lens shading correction is used to correct spatial
> +			 non-uniformity of the pixel response due to optical
> +			 lens shading. This is done by applying a different gain
> +			 for each pixel. The gain, black level etc are
> +			 configured in :c:type:`ipu3_uapi_shd_config_static`.
> +BNR			 Bayer noise reduction block removes image noise by
> +			 applying a bilateral filter.
> +			 See :c:type:`ipu3_uapi_bnr_static_config` for details.
> +ANR			 Advanced Noise Reduction is a block based algorithm
> +			 that performs noise reduction in the Bayer domain. The
> +			 convolution matrix etc can be found in
> +			 :c:type:`ipu3_uapi_anr_config`.
> +Demosaicing		 Demosaicing converts raw sensor data in Bayer format
> +			 into RGB (Red, Green, Blue) presentation. Then add
> +			 outputs of estimation of Y channel for following stream
> +			 processing by Firmware. The struct is defined as
> +			 :c:type:`ipu3_uapi_dm_config`. (TODO)
> +Color Correction	 Color Correction algo transforms sensor specific color
> +			 space to the standard "sRGB" color space. This is done
> +			 by applying 3x3 matrix defined in
> +			 :c:type:`ipu3_uapi_ccm_mat_config`.
> +Gamma correction	 Gamma correction :c:type:`ipu3_uapi_gamma_config` is a
> +			 basic non-linear tone mapping correction that is
> +			 applied per pixel for each pixel component.
> +CSC			 Color space conversion transforms each pixel from the
> +			 RGB primary presentation to YUV (Y: brightness,
> +			 UV: Luminance) presentation. This is done by applying
> +			 a 3x3 matrix defined in
> +			 :c:type:`ipu3_uapi_csc_mat_config`
> +CDS			 Chroma down sampling
> +			 After the CSC is performed, the Chroma Down Sampling
> +			 is applied for a UV plane down sampling by a factor
> +			 of 2 in each direction for YUV 4:2:0 using a 4x2
> +			 configurable filter :c:type:`ipu3_uapi_cds_params`.
> +CHNR			 Chroma noise reduction
> +			 This block processes only the chrominance pixels and
> +			 performs noise reduction by cleaning the high
> +			 frequency noise.
> +			 See struct :c:type:`ipu3_uapi_yuvp1_chnr_config`.
> +TCC			 Total color correction as defined in struct
> +			 :c:type:`ipu3_uapi_yuvp2_tcc_static_config`.
> +XNR3			 eXtreme Noise Reduction V3 is the third revision of
> +			 noise reduction algorithm used to improve image
> +			 quality. This removes the low frequency noise in the
> +			 captured image. Two related structs are  being defined,
> +			 :c:type:`ipu3_uapi_isp_xnr3_params` for ISP data memory
> +			 and :c:type:`ipu3_uapi_isp_xnr3_vmem_params` for vector
> +			 memory.
> +TNR			 Temporal Noise Reduction block compares successive
> +			 frames in time to remove anomalies / noise in pixel
> +			 values. :c:type:`ipu3_uapi_isp_tnr3_vmem_params` and
> +			 :c:type:`ipu3_uapi_isp_tnr3_params` are defined for ISP
> +			 vector and data memory respectively.
> +========================
> =======================================================
> +
> +A few stages of the pipeline will be executed by firmware running on the
> ISP +processor, while many others will use a set of fixed hardware blocks
> also +called accelerator cluster (ACC) to crunch pixel data and produce
> statistics.
> +
> +ACC parameters of individual algorithms, as defined by
> +:c:type:`ipu3_uapi_acc_param`, can be chosen to be applied by the user
> +space through struct :c:type:`ipu3_uapi_flags` embedded in
> +:c:type:`ipu3_uapi_params` structure. For parameters that are configured as
> +not enabled by the user space, the corresponding structs are ignored by
> the +driver, in which case the existing configuration of the algorithm will
> be +preserved.
> +
> +Both 3A statistics and pipeline parameters described here are closely tied
> to +the underlying camera sub-system (CSS) APIs. They are usually consumed
> and +produced by dedicated user space libraries that comprise the important
> tuning +tools, thus freeing the developers from being bothered with the low
> level +hardware and algorithm details.
> +
> +It should be noted that IPU3 DMA operations require the addresses of all
> data +structures (that includes both input and output) to be aligned on 32
> byte +boundaries.

I think most of the above (from the diagram to here) belongs to Documentation/
media/v4l-drivers/ipu3.rst. It can be referenced here, but this file should 
focus on the description of the metadata formats, not on the description of 
the IPU3 ImgU internals.

> +The meta data :c:type:`ipu3_uapi_params` will be sent to "ipu3-imgu
> parameters" +video node in ``V4L2_BUF_TYPE_META_CAPTURE`` format.

To be consistent with the statistics documentation, how about the following ?

"The pipeline parameters are passed to the "ipu3-imgu [01] parameters" 
metadata output video nodes, using the :c:type:`v4l2_meta_format` interface. 
They are formatted as described by the :c:type:`ipu3_uapi_params` structure."

> +.. code-block:: c
> +
> +	struct ipu3_uapi_params {
> +		/* Flags which of the settings below are to be applied */
> +		struct ipu3_uapi_flags use;
> +
> +		/* Accelerator cluster parameters */
> +		struct ipu3_uapi_acc_param acc_param;
> +
> +		/* ISP vector address space parameters */
> +		struct ipu3_uapi_isp_lin_vmem_params lin_vmem_params;
> +		struct ipu3_uapi_isp_tnr3_vmem_params tnr3_vmem_params;
> +		struct ipu3_uapi_isp_xnr3_vmem_params xnr3_vmem_params;
> +
> +		/* ISP data memory (DMEM) parameters */
> +		struct ipu3_uapi_isp_tnr3_params tnr3_dmem_params;
> +		struct ipu3_uapi_isp_xnr3_params xnr3_dmem_params;
> +
> +		/* Optical black level compensation */
> +		struct ipu3_uapi_obgrid_param obgrid_param;
> +	};
> +
> +Intel IPU3 ImgU uAPI data types
> +===============================
> +
> +.. kernel-doc:: include/uapi/linux/intel-ipu3.h

This file has moved to drivers/staging/media/ipu3/include/intel-ipu3.h.

> diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c
> b/drivers/media/v4l2-core/v4l2-ioctl.c index a1806d3a1c41..0701cb8a03ef
> 100644
> --- a/drivers/media/v4l2-core/v4l2-ioctl.c
> +++ b/drivers/media/v4l2-core/v4l2-ioctl.c
> @@ -1300,6 +1300,8 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
> case V4L2_META_FMT_VSP1_HGO:	descr = "R-Car VSP1 1-D Histogram"; break;
> case V4L2_META_FMT_VSP1_HGT:	descr = "R-Car VSP1 2-D Histogram"; break;
> case V4L2_META_FMT_UVC:		descr = "UVC payload header metadata"; break;
> +	case V4L2_META_FMT_IPU3_PARAMS:	descr = "IPU3 processing parameters";
> break; +	case V4L2_META_FMT_IPU3_STAT_3A:	descr = "IPU3 3A statistics";
> break;
> 
>  	default:
>  		/* Compressed formats */
> diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
> index a9d47b1b9437..f2b973b36e29 100644
> --- a/include/uapi/linux/videodev2.h
> +++ b/include/uapi/linux/videodev2.h
> @@ -721,6 +721,10 @@ struct v4l2_pix_format {
>  #define V4L2_META_FMT_UVC         v4l2_fourcc('U', 'V', 'C', 'H') /* UVC
> Payload Header metadata */ #define V4L2_META_FMT_D4XX       
> v4l2_fourcc('D', '4', 'X', 'X') /* D4XX Payload Header metadata */
> 
> +/* Vendor specific - used for IPU3 camera sub-system */
> +#define V4L2_META_FMT_IPU3_PARAMS	v4l2_fourcc('i', 'p', '3', 'p') /* IPU3
> processing parameters */ +#define
> V4L2_META_FMT_IPU3_STAT_3A	v4l2_fourcc('i', 'p', '3', 's') /* IPU3 3A
> statistics */ +
>  /* priv field value to indicates that subsequent fields are valid. */
>  #define V4L2_PIX_FMT_PRIV_MAGIC		0xfeedcafe

-- 
Regards,

Laurent Pinchart




  reply	other threads:[~2018-12-11 12:58 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-07  1:03 [PATCH v8 00/17] Intel IPU3 ImgU patchset Yong Zhi
2018-12-07  1:03 ` [PATCH v8 01/17] media: staging/intel-ipu3: abi: Add register definitions and enum Yong Zhi
2018-12-07  1:03 ` [PATCH v8 02/17] media: staging/intel-ipu3: abi: Add structs Yong Zhi
2018-12-07  1:03 ` [PATCH v8 03/17] media: staging/intel-ipu3: mmu: Implement driver Yong Zhi
2018-12-07  1:03 ` [PATCH v8 04/17] media: staging/intel-ipu3: Implement DMA mapping functions Yong Zhi
2018-12-07  1:03 ` [PATCH v8 05/17] media: staging/intel-ipu3: css: Add dma buff pool utility functions Yong Zhi
2018-12-07  1:03 ` [PATCH v8 06/17] media: staging/intel-ipu3: css: Add support for firmware management Yong Zhi
2018-12-07  1:03 ` [PATCH v8 08/17] media: staging/intel-ipu3: css: Compute and program ccs Yong Zhi
2018-12-07  1:03 ` [PATCH v8 10/17] media: staging/intel-ipu3: Add css pipeline programming Yong Zhi
2018-12-07  1:03 ` [PATCH v8 11/17] media: staging/intel-ipu3: Add v4l2 driver based on media framework Yong Zhi
2018-12-07  1:03 ` [PATCH v8 12/17] media: staging/intel-ipu3: Add imgu top level pci device driver Yong Zhi
2018-12-07  1:03 ` [PATCH v8 13/17] media: staging/intel-ipu3: Add Intel IPU3 meta data uAPI Yong Zhi
2018-12-07  1:03 ` [PATCH v8 14/17] media: staging/intel-ipu3: Add dual pipe support Yong Zhi
2018-12-07  1:03 ` [PATCH v8 15/17] media: v4l: Add Intel IPU3 meta buffer formats Yong Zhi
2018-12-11 12:58   ` Laurent Pinchart [this message]
2019-01-10 12:29     ` Laurent Pinchart
2019-01-10 18:35     ` Zhi, Yong
2019-01-22 21:22       ` Laurent Pinchart
2019-01-22 21:46         ` Zhi, Yong
2018-12-07  1:03 ` [PATCH v8 16/17] media: v4l2-ctrls: Reserve controls for IPU3 ImgU Yong Zhi
2018-12-07  1:03 ` [PATCH v8 17/17] doc-rst: Add Intel IPU3 documentation Yong Zhi
2018-12-09 22:33   ` Sakari Ailus
2018-12-11 13:04   ` Laurent Pinchart
2018-12-14 11:02   ` Mauro Carvalho Chehab
2018-12-10 21:07 ` [PATCH v8 00/17] Intel IPU3 ImgU patchset sakari.ailus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2743727.5LazzqFdDF@avalon \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=bingbu.cao@intel.com \
    --cc=hans.verkuil@cisco.com \
    --cc=jerry.w.hu@intel.com \
    --cc=jian.xu.zheng@intel.com \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.org \
    --cc=rajmohan.mani@intel.com \
    --cc=sakari.ailus@linux.intel.com \
    --cc=tfiga@chromium.org \
    --cc=tian.shu.qiu@intel.com \
    --cc=tuukka.toivonen@intel.com \
    --cc=yong.zhi@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox