xref: /openbmc/linux/Documentation/admin-guide/media/ipu3.rst (revision 32e2eae23f8fd1b90d86f4d04ca9790952d9d928)
1*32e2eae2SMauro Carvalho Chehab.. SPDX-License-Identifier: GPL-2.0
2*32e2eae2SMauro Carvalho Chehab
3*32e2eae2SMauro Carvalho Chehab.. include:: <isonum.txt>
4*32e2eae2SMauro Carvalho Chehab
5*32e2eae2SMauro Carvalho Chehab===============================================================
6*32e2eae2SMauro Carvalho ChehabIntel Image Processing Unit 3 (IPU3) Imaging Unit (ImgU) driver
7*32e2eae2SMauro Carvalho Chehab===============================================================
8*32e2eae2SMauro Carvalho Chehab
9*32e2eae2SMauro Carvalho ChehabCopyright |copy| 2018 Intel Corporation
10*32e2eae2SMauro Carvalho Chehab
11*32e2eae2SMauro Carvalho ChehabIntroduction
12*32e2eae2SMauro Carvalho Chehab============
13*32e2eae2SMauro Carvalho Chehab
14*32e2eae2SMauro Carvalho ChehabThis file documents the Intel IPU3 (3rd generation Image Processing Unit)
15*32e2eae2SMauro Carvalho ChehabImaging Unit drivers located under drivers/media/pci/intel/ipu3 (CIO2) as well
16*32e2eae2SMauro Carvalho Chehabas under drivers/staging/media/ipu3 (ImgU).
17*32e2eae2SMauro Carvalho Chehab
18*32e2eae2SMauro Carvalho ChehabThe Intel IPU3 found in certain Kaby Lake (as well as certain Sky Lake)
19*32e2eae2SMauro Carvalho Chehabplatforms (U/Y processor lines) is made up of two parts namely the Imaging Unit
20*32e2eae2SMauro Carvalho Chehab(ImgU) and the CIO2 device (MIPI CSI2 receiver).
21*32e2eae2SMauro Carvalho Chehab
22*32e2eae2SMauro Carvalho ChehabThe CIO2 device receives the raw Bayer data from the sensors and outputs the
23*32e2eae2SMauro Carvalho Chehabframes in a format that is specific to the IPU3 (for consumption by the IPU3
24*32e2eae2SMauro Carvalho ChehabImgU). The CIO2 driver is available as drivers/media/pci/intel/ipu3/ipu3-cio2*
25*32e2eae2SMauro Carvalho Chehaband is enabled through the CONFIG_VIDEO_IPU3_CIO2 config option.
26*32e2eae2SMauro Carvalho Chehab
27*32e2eae2SMauro Carvalho ChehabThe Imaging Unit (ImgU) is responsible for processing images captured
28*32e2eae2SMauro Carvalho Chehabby the IPU3 CIO2 device. The ImgU driver sources can be found under
29*32e2eae2SMauro Carvalho Chehabdrivers/staging/media/ipu3 directory. The driver is enabled through the
30*32e2eae2SMauro Carvalho ChehabCONFIG_VIDEO_IPU3_IMGU config option.
31*32e2eae2SMauro Carvalho Chehab
32*32e2eae2SMauro Carvalho ChehabThe two driver modules are named ipu3_csi2 and ipu3_imgu, respectively.
33*32e2eae2SMauro Carvalho Chehab
34*32e2eae2SMauro Carvalho ChehabThe drivers has been tested on Kaby Lake platforms (U/Y processor lines).
35*32e2eae2SMauro Carvalho Chehab
36*32e2eae2SMauro Carvalho ChehabBoth of the drivers implement V4L2, Media Controller and V4L2 sub-device
37*32e2eae2SMauro Carvalho Chehabinterfaces. The IPU3 CIO2 driver supports camera sensors connected to the CIO2
38*32e2eae2SMauro Carvalho ChehabMIPI CSI-2 interfaces through V4L2 sub-device sensor drivers.
39*32e2eae2SMauro Carvalho Chehab
40*32e2eae2SMauro Carvalho ChehabCIO2
41*32e2eae2SMauro Carvalho Chehab====
42*32e2eae2SMauro Carvalho Chehab
43*32e2eae2SMauro Carvalho ChehabThe CIO2 is represented as a single V4L2 subdev, which provides a V4L2 subdev
44*32e2eae2SMauro Carvalho Chehabinterface to the user space. There is a video node for each CSI-2 receiver,
45*32e2eae2SMauro Carvalho Chehabwith a single media controller interface for the entire device.
46*32e2eae2SMauro Carvalho Chehab
47*32e2eae2SMauro Carvalho ChehabThe CIO2 contains four independent capture channel, each with its own MIPI CSI-2
48*32e2eae2SMauro Carvalho Chehabreceiver and DMA engine. Each channel is modelled as a V4L2 sub-device exposed
49*32e2eae2SMauro Carvalho Chehabto userspace as a V4L2 sub-device node and has two pads:
50*32e2eae2SMauro Carvalho Chehab
51*32e2eae2SMauro Carvalho Chehab.. tabularcolumns:: |p{0.8cm}|p{4.0cm}|p{4.0cm}|
52*32e2eae2SMauro Carvalho Chehab
53*32e2eae2SMauro Carvalho Chehab.. flat-table::
54*32e2eae2SMauro Carvalho Chehab
55*32e2eae2SMauro Carvalho Chehab    * - pad
56*32e2eae2SMauro Carvalho Chehab      - direction
57*32e2eae2SMauro Carvalho Chehab      - purpose
58*32e2eae2SMauro Carvalho Chehab
59*32e2eae2SMauro Carvalho Chehab    * - 0
60*32e2eae2SMauro Carvalho Chehab      - sink
61*32e2eae2SMauro Carvalho Chehab      - MIPI CSI-2 input, connected to the sensor subdev
62*32e2eae2SMauro Carvalho Chehab
63*32e2eae2SMauro Carvalho Chehab    * - 1
64*32e2eae2SMauro Carvalho Chehab      - source
65*32e2eae2SMauro Carvalho Chehab      - Raw video capture, connected to the V4L2 video interface
66*32e2eae2SMauro Carvalho Chehab
67*32e2eae2SMauro Carvalho ChehabThe V4L2 video interfaces model the DMA engines. They are exposed to userspace
68*32e2eae2SMauro Carvalho Chehabas V4L2 video device nodes.
69*32e2eae2SMauro Carvalho Chehab
70*32e2eae2SMauro Carvalho ChehabCapturing frames in raw Bayer format
71*32e2eae2SMauro Carvalho Chehab------------------------------------
72*32e2eae2SMauro Carvalho Chehab
73*32e2eae2SMauro Carvalho ChehabCIO2 MIPI CSI2 receiver is used to capture frames (in packed raw Bayer format)
74*32e2eae2SMauro Carvalho Chehabfrom the raw sensors connected to the CSI2 ports. The captured frames are used
75*32e2eae2SMauro Carvalho Chehabas input to the ImgU driver.
76*32e2eae2SMauro Carvalho Chehab
77*32e2eae2SMauro Carvalho ChehabImage processing using IPU3 ImgU requires tools such as raw2pnm [#f1]_, and
78*32e2eae2SMauro Carvalho Chehabyavta [#f2]_ due to the following unique requirements and / or features specific
79*32e2eae2SMauro Carvalho Chehabto IPU3.
80*32e2eae2SMauro Carvalho Chehab
81*32e2eae2SMauro Carvalho Chehab-- The IPU3 CSI2 receiver outputs the captured frames from the sensor in packed
82*32e2eae2SMauro Carvalho Chehabraw Bayer format that is specific to IPU3.
83*32e2eae2SMauro Carvalho Chehab
84*32e2eae2SMauro Carvalho Chehab-- Multiple video nodes have to be operated simultaneously.
85*32e2eae2SMauro Carvalho Chehab
86*32e2eae2SMauro Carvalho ChehabLet us take the example of ov5670 sensor connected to CSI2 port 0, for a
87*32e2eae2SMauro Carvalho Chehab2592x1944 image capture.
88*32e2eae2SMauro Carvalho Chehab
89*32e2eae2SMauro Carvalho ChehabUsing the media contorller APIs, the ov5670 sensor is configured to send
90*32e2eae2SMauro Carvalho Chehabframes in packed raw Bayer format to IPU3 CSI2 receiver.
91*32e2eae2SMauro Carvalho Chehab
92*32e2eae2SMauro Carvalho Chehab# This example assumes /dev/media0 as the CIO2 media device
93*32e2eae2SMauro Carvalho Chehab
94*32e2eae2SMauro Carvalho Chehabexport MDEV=/dev/media0
95*32e2eae2SMauro Carvalho Chehab
96*32e2eae2SMauro Carvalho Chehab# and that ov5670 sensor is connected to i2c bus 10 with address 0x36
97*32e2eae2SMauro Carvalho Chehab
98*32e2eae2SMauro Carvalho Chehabexport SDEV=$(media-ctl -d $MDEV -e "ov5670 10-0036")
99*32e2eae2SMauro Carvalho Chehab
100*32e2eae2SMauro Carvalho Chehab# Establish the link for the media devices using media-ctl [#f3]_
101*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -l "ov5670:0 -> ipu3-csi2 0:0[1]"
102*32e2eae2SMauro Carvalho Chehab
103*32e2eae2SMauro Carvalho Chehab# Set the format for the media devices
104*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -V "ov5670:0 [fmt:SGRBG10/2592x1944]"
105*32e2eae2SMauro Carvalho Chehab
106*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -V "ipu3-csi2 0:0 [fmt:SGRBG10/2592x1944]"
107*32e2eae2SMauro Carvalho Chehab
108*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -V "ipu3-csi2 0:1 [fmt:SGRBG10/2592x1944]"
109*32e2eae2SMauro Carvalho Chehab
110*32e2eae2SMauro Carvalho ChehabOnce the media pipeline is configured, desired sensor specific settings
111*32e2eae2SMauro Carvalho Chehab(such as exposure and gain settings) can be set, using the yavta tool.
112*32e2eae2SMauro Carvalho Chehab
113*32e2eae2SMauro Carvalho Chehabe.g
114*32e2eae2SMauro Carvalho Chehab
115*32e2eae2SMauro Carvalho Chehabyavta -w 0x009e0903 444 $SDEV
116*32e2eae2SMauro Carvalho Chehab
117*32e2eae2SMauro Carvalho Chehabyavta -w 0x009e0913 1024 $SDEV
118*32e2eae2SMauro Carvalho Chehab
119*32e2eae2SMauro Carvalho Chehabyavta -w 0x009e0911 2046 $SDEV
120*32e2eae2SMauro Carvalho Chehab
121*32e2eae2SMauro Carvalho ChehabOnce the desired sensor settings are set, frame captures can be done as below.
122*32e2eae2SMauro Carvalho Chehab
123*32e2eae2SMauro Carvalho Chehabe.g
124*32e2eae2SMauro Carvalho Chehab
125*32e2eae2SMauro Carvalho Chehabyavta --data-prefix -u -c10 -n5 -I -s2592x1944 --file=/tmp/frame-#.bin \
126*32e2eae2SMauro Carvalho Chehab      -f IPU3_SGRBG10 $(media-ctl -d $MDEV -e "ipu3-cio2 0")
127*32e2eae2SMauro Carvalho Chehab
128*32e2eae2SMauro Carvalho ChehabWith the above command, 10 frames are captured at 2592x1944 resolution, with
129*32e2eae2SMauro Carvalho ChehabsGRBG10 format and output as IPU3_SGRBG10 format.
130*32e2eae2SMauro Carvalho Chehab
131*32e2eae2SMauro Carvalho ChehabThe captured frames are available as /tmp/frame-#.bin files.
132*32e2eae2SMauro Carvalho Chehab
133*32e2eae2SMauro Carvalho ChehabImgU
134*32e2eae2SMauro Carvalho Chehab====
135*32e2eae2SMauro Carvalho Chehab
136*32e2eae2SMauro Carvalho ChehabThe ImgU is represented as two V4L2 subdevs, each of which provides a V4L2
137*32e2eae2SMauro Carvalho Chehabsubdev interface to the user space.
138*32e2eae2SMauro Carvalho Chehab
139*32e2eae2SMauro Carvalho ChehabEach V4L2 subdev represents a pipe, which can support a maximum of 2 streams.
140*32e2eae2SMauro Carvalho ChehabThis helps to support advanced camera features like Continuous View Finder (CVF)
141*32e2eae2SMauro Carvalho Chehaband Snapshot During Video(SDV).
142*32e2eae2SMauro Carvalho Chehab
143*32e2eae2SMauro Carvalho ChehabThe ImgU contains two independent pipes, each modelled as a V4L2 sub-device
144*32e2eae2SMauro Carvalho Chehabexposed to userspace as a V4L2 sub-device node.
145*32e2eae2SMauro Carvalho Chehab
146*32e2eae2SMauro Carvalho ChehabEach pipe has two sink pads and three source pads for the following purpose:
147*32e2eae2SMauro Carvalho Chehab
148*32e2eae2SMauro Carvalho Chehab.. tabularcolumns:: |p{0.8cm}|p{4.0cm}|p{4.0cm}|
149*32e2eae2SMauro Carvalho Chehab
150*32e2eae2SMauro Carvalho Chehab.. flat-table::
151*32e2eae2SMauro Carvalho Chehab
152*32e2eae2SMauro Carvalho Chehab    * - pad
153*32e2eae2SMauro Carvalho Chehab      - direction
154*32e2eae2SMauro Carvalho Chehab      - purpose
155*32e2eae2SMauro Carvalho Chehab
156*32e2eae2SMauro Carvalho Chehab    * - 0
157*32e2eae2SMauro Carvalho Chehab      - sink
158*32e2eae2SMauro Carvalho Chehab      - Input raw video stream
159*32e2eae2SMauro Carvalho Chehab
160*32e2eae2SMauro Carvalho Chehab    * - 1
161*32e2eae2SMauro Carvalho Chehab      - sink
162*32e2eae2SMauro Carvalho Chehab      - Processing parameters
163*32e2eae2SMauro Carvalho Chehab
164*32e2eae2SMauro Carvalho Chehab    * - 2
165*32e2eae2SMauro Carvalho Chehab      - source
166*32e2eae2SMauro Carvalho Chehab      - Output processed video stream
167*32e2eae2SMauro Carvalho Chehab
168*32e2eae2SMauro Carvalho Chehab    * - 3
169*32e2eae2SMauro Carvalho Chehab      - source
170*32e2eae2SMauro Carvalho Chehab      - Output viewfinder video stream
171*32e2eae2SMauro Carvalho Chehab
172*32e2eae2SMauro Carvalho Chehab    * - 4
173*32e2eae2SMauro Carvalho Chehab      - source
174*32e2eae2SMauro Carvalho Chehab      - 3A statistics
175*32e2eae2SMauro Carvalho Chehab
176*32e2eae2SMauro Carvalho ChehabEach pad is connected to a corresponding V4L2 video interface, exposed to
177*32e2eae2SMauro Carvalho Chehabuserspace as a V4L2 video device node.
178*32e2eae2SMauro Carvalho Chehab
179*32e2eae2SMauro Carvalho ChehabDevice operation
180*32e2eae2SMauro Carvalho Chehab----------------
181*32e2eae2SMauro Carvalho Chehab
182*32e2eae2SMauro Carvalho ChehabWith ImgU, once the input video node ("ipu3-imgu 0/1":0, in
183*32e2eae2SMauro Carvalho Chehab<entity>:<pad-number> format) is queued with buffer (in packed raw Bayer
184*32e2eae2SMauro Carvalho Chehabformat), ImgU starts processing the buffer and produces the video output in YUV
185*32e2eae2SMauro Carvalho Chehabformat and statistics output on respective output nodes. The driver is expected
186*32e2eae2SMauro Carvalho Chehabto have buffers ready for all of parameter, output and statistics nodes, when
187*32e2eae2SMauro Carvalho Chehabinput video node is queued with buffer.
188*32e2eae2SMauro Carvalho Chehab
189*32e2eae2SMauro Carvalho ChehabAt a minimum, all of input, main output, 3A statistics and viewfinder
190*32e2eae2SMauro Carvalho Chehabvideo nodes should be enabled for IPU3 to start image processing.
191*32e2eae2SMauro Carvalho Chehab
192*32e2eae2SMauro Carvalho ChehabEach ImgU V4L2 subdev has the following set of video nodes.
193*32e2eae2SMauro Carvalho Chehab
194*32e2eae2SMauro Carvalho Chehabinput, output and viewfinder video nodes
195*32e2eae2SMauro Carvalho Chehab----------------------------------------
196*32e2eae2SMauro Carvalho Chehab
197*32e2eae2SMauro Carvalho ChehabThe frames (in packed raw Bayer format specific to the IPU3) received by the
198*32e2eae2SMauro Carvalho Chehabinput video node is processed by the IPU3 Imaging Unit and are output to 2 video
199*32e2eae2SMauro Carvalho Chehabnodes, with each targeting a different purpose (main output and viewfinder
200*32e2eae2SMauro Carvalho Chehaboutput).
201*32e2eae2SMauro Carvalho Chehab
202*32e2eae2SMauro Carvalho ChehabDetails onand the Bayer format specific to the IPU3 can be found in
203*32e2eae2SMauro Carvalho Chehab:ref:`v4l2-pix-fmt-ipu3-sbggr10`.
204*32e2eae2SMauro Carvalho Chehab
205*32e2eae2SMauro Carvalho ChehabThe driver supports V4L2 Video Capture Interface as defined at :ref:`devices`.
206*32e2eae2SMauro Carvalho Chehab
207*32e2eae2SMauro Carvalho ChehabOnly the multi-planar API is supported. More details can be found at
208*32e2eae2SMauro Carvalho Chehab:ref:`planar-apis`.
209*32e2eae2SMauro Carvalho Chehab
210*32e2eae2SMauro Carvalho ChehabParameters video node
211*32e2eae2SMauro Carvalho Chehab---------------------
212*32e2eae2SMauro Carvalho Chehab
213*32e2eae2SMauro Carvalho ChehabThe parameters video node receives the ImgU algorithm parameters that are used
214*32e2eae2SMauro Carvalho Chehabto configure how the ImgU algorithms process the image.
215*32e2eae2SMauro Carvalho Chehab
216*32e2eae2SMauro Carvalho ChehabDetails on processing parameters specific to the IPU3 can be found in
217*32e2eae2SMauro Carvalho Chehab:ref:`v4l2-meta-fmt-params`.
218*32e2eae2SMauro Carvalho Chehab
219*32e2eae2SMauro Carvalho Chehab3A statistics video node
220*32e2eae2SMauro Carvalho Chehab------------------------
221*32e2eae2SMauro Carvalho Chehab
222*32e2eae2SMauro Carvalho Chehab3A statistics video node is used by the ImgU driver to output the 3A (auto
223*32e2eae2SMauro Carvalho Chehabfocus, auto exposure and auto white balance) statistics for the frames that are
224*32e2eae2SMauro Carvalho Chehabbeing processed by the ImgU to user space applications. User space applications
225*32e2eae2SMauro Carvalho Chehabcan use this statistics data to compute the desired algorithm parameters for
226*32e2eae2SMauro Carvalho Chehabthe ImgU.
227*32e2eae2SMauro Carvalho Chehab
228*32e2eae2SMauro Carvalho ChehabConfiguring the Intel IPU3
229*32e2eae2SMauro Carvalho Chehab==========================
230*32e2eae2SMauro Carvalho Chehab
231*32e2eae2SMauro Carvalho ChehabThe IPU3 ImgU pipelines can be configured using the Media Controller, defined at
232*32e2eae2SMauro Carvalho Chehab:ref:`media_controller`.
233*32e2eae2SMauro Carvalho Chehab
234*32e2eae2SMauro Carvalho ChehabFirmware binary selection
235*32e2eae2SMauro Carvalho Chehab-------------------------
236*32e2eae2SMauro Carvalho Chehab
237*32e2eae2SMauro Carvalho ChehabThe firmware binary is selected using the V4L2_CID_INTEL_IPU3_MODE, currently
238*32e2eae2SMauro Carvalho Chehabdefined in drivers/staging/media/ipu3/include/intel-ipu3.h . "VIDEO" and "STILL"
239*32e2eae2SMauro Carvalho Chehabmodes are available.
240*32e2eae2SMauro Carvalho Chehab
241*32e2eae2SMauro Carvalho ChehabProcessing the image in raw Bayer format
242*32e2eae2SMauro Carvalho Chehab----------------------------------------
243*32e2eae2SMauro Carvalho Chehab
244*32e2eae2SMauro Carvalho ChehabConfiguring ImgU V4L2 subdev for image processing
245*32e2eae2SMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
246*32e2eae2SMauro Carvalho Chehab
247*32e2eae2SMauro Carvalho ChehabThe ImgU V4L2 subdevs have to be configured with media controller APIs to have
248*32e2eae2SMauro Carvalho Chehaball the video nodes setup correctly.
249*32e2eae2SMauro Carvalho Chehab
250*32e2eae2SMauro Carvalho ChehabLet us take "ipu3-imgu 0" subdev as an example.
251*32e2eae2SMauro Carvalho Chehab
252*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -r
253*32e2eae2SMauro Carvalho Chehab
254*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -l "ipu3-imgu 0 input":0 -> "ipu3-imgu 0":0[1]
255*32e2eae2SMauro Carvalho Chehab
256*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -l "ipu3-imgu 0":2 -> "ipu3-imgu 0 output":0[1]
257*32e2eae2SMauro Carvalho Chehab
258*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -l "ipu3-imgu 0":3 -> "ipu3-imgu 0 viewfinder":0[1]
259*32e2eae2SMauro Carvalho Chehab
260*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -l "ipu3-imgu 0":4 -> "ipu3-imgu 0 3a stat":0[1]
261*32e2eae2SMauro Carvalho Chehab
262*32e2eae2SMauro Carvalho ChehabAlso the pipe mode of the corresponding V4L2 subdev should be set as desired
263*32e2eae2SMauro Carvalho Chehab(e.g 0 for video mode or 1 for still mode) through the control id 0x009819a1 as
264*32e2eae2SMauro Carvalho Chehabbelow.
265*32e2eae2SMauro Carvalho Chehab
266*32e2eae2SMauro Carvalho Chehabyavta -w "0x009819A1 1" /dev/v4l-subdev7
267*32e2eae2SMauro Carvalho Chehab
268*32e2eae2SMauro Carvalho ChehabCertain hardware blocks in ImgU pipeline can change the frame resolution by
269*32e2eae2SMauro Carvalho Chehabcropping or scaling, these hardware blocks include Input Feeder(IF), Bayer Down
270*32e2eae2SMauro Carvalho ChehabScaler (BDS) and Geometric Distortion Correction (GDC).
271*32e2eae2SMauro Carvalho ChehabThere is also a block which can change the frame resolution - YUV Scaler, it is
272*32e2eae2SMauro Carvalho Chehabonly applicable to the secondary output.
273*32e2eae2SMauro Carvalho Chehab
274*32e2eae2SMauro Carvalho ChehabRAW Bayer frames go through these ImgU pipeline hardware blocks and the final
275*32e2eae2SMauro Carvalho Chehabprocessed image output to the DDR memory.
276*32e2eae2SMauro Carvalho Chehab
277*32e2eae2SMauro Carvalho Chehab.. kernel-figure::  ipu3_rcb.svg
278*32e2eae2SMauro Carvalho Chehab   :alt: ipu3 resolution blocks image
279*32e2eae2SMauro Carvalho Chehab
280*32e2eae2SMauro Carvalho Chehab   IPU3 resolution change hardware blocks
281*32e2eae2SMauro Carvalho Chehab
282*32e2eae2SMauro Carvalho Chehab**Input Feeder**
283*32e2eae2SMauro Carvalho Chehab
284*32e2eae2SMauro Carvalho ChehabInput Feeder gets the Bayer frame data from the sensor, it can enable cropping
285*32e2eae2SMauro Carvalho Chehabof lines and columns from the frame and then store pixels into device's internal
286*32e2eae2SMauro Carvalho Chehabpixel buffer which are ready to readout by following blocks.
287*32e2eae2SMauro Carvalho Chehab
288*32e2eae2SMauro Carvalho Chehab**Bayer Down Scaler**
289*32e2eae2SMauro Carvalho Chehab
290*32e2eae2SMauro Carvalho ChehabBayer Down Scaler is capable of performing image scaling in Bayer domain, the
291*32e2eae2SMauro Carvalho Chehabdownscale factor can be configured from 1X to 1/4X in each axis with
292*32e2eae2SMauro Carvalho Chehabconfiguration steps of 0.03125 (1/32).
293*32e2eae2SMauro Carvalho Chehab
294*32e2eae2SMauro Carvalho Chehab**Geometric Distortion Correction**
295*32e2eae2SMauro Carvalho Chehab
296*32e2eae2SMauro Carvalho ChehabGeometric Distortion Correction is used to performe correction of distortions
297*32e2eae2SMauro Carvalho Chehaband image filtering. It needs some extra filter and envelop padding pixels to
298*32e2eae2SMauro Carvalho Chehabwork, so the input resolution of GDC should be larger than the output
299*32e2eae2SMauro Carvalho Chehabresolution.
300*32e2eae2SMauro Carvalho Chehab
301*32e2eae2SMauro Carvalho Chehab**YUV Scaler**
302*32e2eae2SMauro Carvalho Chehab
303*32e2eae2SMauro Carvalho ChehabYUV Scaler which similar with BDS, but it is mainly do image down scaling in
304*32e2eae2SMauro Carvalho ChehabYUV domain, it can support up to 1/12X down scaling, but it can not be applied
305*32e2eae2SMauro Carvalho Chehabto the main output.
306*32e2eae2SMauro Carvalho Chehab
307*32e2eae2SMauro Carvalho ChehabThe ImgU V4L2 subdev has to be configured with the supported resolutions in all
308*32e2eae2SMauro Carvalho Chehabthe above hardware blocks, for a given input resolution.
309*32e2eae2SMauro Carvalho ChehabFor a given supported resolution for an input frame, the Input Feeder, Bayer
310*32e2eae2SMauro Carvalho ChehabDown Scaler and GDC blocks should be configured with the supported resolutions
311*32e2eae2SMauro Carvalho Chehabas each hardware block has its own alignment requirement.
312*32e2eae2SMauro Carvalho Chehab
313*32e2eae2SMauro Carvalho ChehabYou must configure the output resolution of the hardware blocks smartly to meet
314*32e2eae2SMauro Carvalho Chehabthe hardware requirement along with keeping the maximum field of view. The
315*32e2eae2SMauro Carvalho Chehabintermediate resolutions can be generated by specific tool -
316*32e2eae2SMauro Carvalho Chehab
317*32e2eae2SMauro Carvalho Chehabhttps://github.com/intel/intel-ipu3-pipecfg
318*32e2eae2SMauro Carvalho Chehab
319*32e2eae2SMauro Carvalho ChehabThis tool can be used to generate intermediate resolutions. More information can
320*32e2eae2SMauro Carvalho Chehabbe obtained by looking at the following IPU3 ImgU configuration table.
321*32e2eae2SMauro Carvalho Chehab
322*32e2eae2SMauro Carvalho Chehabhttps://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/master
323*32e2eae2SMauro Carvalho Chehab
324*32e2eae2SMauro Carvalho ChehabUnder baseboard-poppy/media-libs/cros-camera-hal-configs-poppy/files/gcss
325*32e2eae2SMauro Carvalho Chehabdirectory, graph_settings_ov5670.xml can be used as an example.
326*32e2eae2SMauro Carvalho Chehab
327*32e2eae2SMauro Carvalho ChehabThe following steps prepare the ImgU pipeline for the image processing.
328*32e2eae2SMauro Carvalho Chehab
329*32e2eae2SMauro Carvalho Chehab1. The ImgU V4L2 subdev data format should be set by using the
330*32e2eae2SMauro Carvalho ChehabVIDIOC_SUBDEV_S_FMT on pad 0, using the GDC width and height obtained above.
331*32e2eae2SMauro Carvalho Chehab
332*32e2eae2SMauro Carvalho Chehab2. The ImgU V4L2 subdev cropping should be set by using the
333*32e2eae2SMauro Carvalho ChehabVIDIOC_SUBDEV_S_SELECTION on pad 0, with V4L2_SEL_TGT_CROP as the target,
334*32e2eae2SMauro Carvalho Chehabusing the input feeder height and width.
335*32e2eae2SMauro Carvalho Chehab
336*32e2eae2SMauro Carvalho Chehab3. The ImgU V4L2 subdev composing should be set by using the
337*32e2eae2SMauro Carvalho ChehabVIDIOC_SUBDEV_S_SELECTION on pad 0, with V4L2_SEL_TGT_COMPOSE as the target,
338*32e2eae2SMauro Carvalho Chehabusing the BDS height and width.
339*32e2eae2SMauro Carvalho Chehab
340*32e2eae2SMauro Carvalho ChehabFor the ov5670 example, for an input frame with a resolution of 2592x1944
341*32e2eae2SMauro Carvalho Chehab(which is input to the ImgU subdev pad 0), the corresponding resolutions
342*32e2eae2SMauro Carvalho Chehabfor input feeder, BDS and GDC are 2592x1944, 2592x1944 and 2560x1920
343*32e2eae2SMauro Carvalho Chehabrespectively.
344*32e2eae2SMauro Carvalho Chehab
345*32e2eae2SMauro Carvalho ChehabOnce this is done, the received raw Bayer frames can be input to the ImgU
346*32e2eae2SMauro Carvalho ChehabV4L2 subdev as below, using the open source application v4l2n [#f1]_.
347*32e2eae2SMauro Carvalho Chehab
348*32e2eae2SMauro Carvalho ChehabFor an image captured with 2592x1944 [#f4]_ resolution, with desired output
349*32e2eae2SMauro Carvalho Chehabresolution as 2560x1920 and viewfinder resolution as 2560x1920, the following
350*32e2eae2SMauro Carvalho Chehabv4l2n command can be used. This helps process the raw Bayer frames and produces
351*32e2eae2SMauro Carvalho Chehabthe desired results for the main output image and the viewfinder output, in NV12
352*32e2eae2SMauro Carvalho Chehabformat.
353*32e2eae2SMauro Carvalho Chehab
354*32e2eae2SMauro Carvalho Chehabv4l2n --pipe=4 --load=/tmp/frame-#.bin --open=/dev/video4
355*32e2eae2SMauro Carvalho Chehab--fmt=type:VIDEO_OUTPUT_MPLANE,width=2592,height=1944,pixelformat=0X47337069
356*32e2eae2SMauro Carvalho Chehab--reqbufs=type:VIDEO_OUTPUT_MPLANE,count:1 --pipe=1 --output=/tmp/frames.out
357*32e2eae2SMauro Carvalho Chehab--open=/dev/video5
358*32e2eae2SMauro Carvalho Chehab--fmt=type:VIDEO_CAPTURE_MPLANE,width=2560,height=1920,pixelformat=NV12
359*32e2eae2SMauro Carvalho Chehab--reqbufs=type:VIDEO_CAPTURE_MPLANE,count:1 --pipe=2 --output=/tmp/frames.vf
360*32e2eae2SMauro Carvalho Chehab--open=/dev/video6
361*32e2eae2SMauro Carvalho Chehab--fmt=type:VIDEO_CAPTURE_MPLANE,width=2560,height=1920,pixelformat=NV12
362*32e2eae2SMauro Carvalho Chehab--reqbufs=type:VIDEO_CAPTURE_MPLANE,count:1 --pipe=3 --open=/dev/video7
363*32e2eae2SMauro Carvalho Chehab--output=/tmp/frames.3A --fmt=type:META_CAPTURE,?
364*32e2eae2SMauro Carvalho Chehab--reqbufs=count:1,type:META_CAPTURE --pipe=1,2,3,4 --stream=5
365*32e2eae2SMauro Carvalho Chehab
366*32e2eae2SMauro Carvalho Chehabwhere /dev/video4, /dev/video5, /dev/video6 and /dev/video7 devices point to
367*32e2eae2SMauro Carvalho Chehabinput, output, viewfinder and 3A statistics video nodes respectively.
368*32e2eae2SMauro Carvalho Chehab
369*32e2eae2SMauro Carvalho ChehabConverting the raw Bayer image into YUV domain
370*32e2eae2SMauro Carvalho Chehab----------------------------------------------
371*32e2eae2SMauro Carvalho Chehab
372*32e2eae2SMauro Carvalho ChehabThe processed images after the above step, can be converted to YUV domain
373*32e2eae2SMauro Carvalho Chehabas below.
374*32e2eae2SMauro Carvalho Chehab
375*32e2eae2SMauro Carvalho ChehabMain output frames
376*32e2eae2SMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~
377*32e2eae2SMauro Carvalho Chehab
378*32e2eae2SMauro Carvalho Chehabraw2pnm -x2560 -y1920 -fNV12 /tmp/frames.out /tmp/frames.out.ppm
379*32e2eae2SMauro Carvalho Chehab
380*32e2eae2SMauro Carvalho Chehabwhere 2560x1920 is output resolution, NV12 is the video format, followed
381*32e2eae2SMauro Carvalho Chehabby input frame and output PNM file.
382*32e2eae2SMauro Carvalho Chehab
383*32e2eae2SMauro Carvalho ChehabViewfinder output frames
384*32e2eae2SMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~~~~~~
385*32e2eae2SMauro Carvalho Chehab
386*32e2eae2SMauro Carvalho Chehabraw2pnm -x2560 -y1920 -fNV12 /tmp/frames.vf /tmp/frames.vf.ppm
387*32e2eae2SMauro Carvalho Chehab
388*32e2eae2SMauro Carvalho Chehabwhere 2560x1920 is output resolution, NV12 is the video format, followed
389*32e2eae2SMauro Carvalho Chehabby input frame and output PNM file.
390*32e2eae2SMauro Carvalho Chehab
391*32e2eae2SMauro Carvalho ChehabExample user space code for IPU3
392*32e2eae2SMauro Carvalho Chehab================================
393*32e2eae2SMauro Carvalho Chehab
394*32e2eae2SMauro Carvalho ChehabUser space code that configures and uses IPU3 is available here.
395*32e2eae2SMauro Carvalho Chehab
396*32e2eae2SMauro Carvalho Chehabhttps://chromium.googlesource.com/chromiumos/platform/arc-camera/+/master/
397*32e2eae2SMauro Carvalho Chehab
398*32e2eae2SMauro Carvalho ChehabThe source can be located under hal/intel directory.
399*32e2eae2SMauro Carvalho Chehab
400*32e2eae2SMauro Carvalho ChehabOverview of IPU3 pipeline
401*32e2eae2SMauro Carvalho Chehab=========================
402*32e2eae2SMauro Carvalho Chehab
403*32e2eae2SMauro Carvalho ChehabIPU3 pipeline has a number of image processing stages, each of which takes a
404*32e2eae2SMauro Carvalho Chehabset of parameters as input. The major stages of pipelines are shown here:
405*32e2eae2SMauro Carvalho Chehab
406*32e2eae2SMauro Carvalho Chehab.. kernel-render:: DOT
407*32e2eae2SMauro Carvalho Chehab   :alt: IPU3 ImgU Pipeline
408*32e2eae2SMauro Carvalho Chehab   :caption: IPU3 ImgU Pipeline Diagram
409*32e2eae2SMauro Carvalho Chehab
410*32e2eae2SMauro Carvalho Chehab   digraph "IPU3 ImgU" {
411*32e2eae2SMauro Carvalho Chehab       node [shape=box]
412*32e2eae2SMauro Carvalho Chehab       splines="ortho"
413*32e2eae2SMauro Carvalho Chehab       rankdir="LR"
414*32e2eae2SMauro Carvalho Chehab
415*32e2eae2SMauro Carvalho Chehab       a [label="Raw pixels"]
416*32e2eae2SMauro Carvalho Chehab       b [label="Bayer Downscaling"]
417*32e2eae2SMauro Carvalho Chehab       c [label="Optical Black Correction"]
418*32e2eae2SMauro Carvalho Chehab       d [label="Linearization"]
419*32e2eae2SMauro Carvalho Chehab       e [label="Lens Shading Correction"]
420*32e2eae2SMauro Carvalho Chehab       f [label="White Balance / Exposure / Focus Apply"]
421*32e2eae2SMauro Carvalho Chehab       g [label="Bayer Noise Reduction"]
422*32e2eae2SMauro Carvalho Chehab       h [label="ANR"]
423*32e2eae2SMauro Carvalho Chehab       i [label="Demosaicing"]
424*32e2eae2SMauro Carvalho Chehab       j [label="Color Correction Matrix"]
425*32e2eae2SMauro Carvalho Chehab       k [label="Gamma correction"]
426*32e2eae2SMauro Carvalho Chehab       l [label="Color Space Conversion"]
427*32e2eae2SMauro Carvalho Chehab       m [label="Chroma Down Scaling"]
428*32e2eae2SMauro Carvalho Chehab       n [label="Chromatic Noise Reduction"]
429*32e2eae2SMauro Carvalho Chehab       o [label="Total Color Correction"]
430*32e2eae2SMauro Carvalho Chehab       p [label="XNR3"]
431*32e2eae2SMauro Carvalho Chehab       q [label="TNR"]
432*32e2eae2SMauro Carvalho Chehab       r [label="DDR"]
433*32e2eae2SMauro Carvalho Chehab
434*32e2eae2SMauro Carvalho Chehab       { rank=same; a -> b -> c -> d -> e -> f }
435*32e2eae2SMauro Carvalho Chehab       { rank=same; g -> h -> i -> j -> k -> l }
436*32e2eae2SMauro Carvalho Chehab       { rank=same; m -> n -> o -> p -> q -> r }
437*32e2eae2SMauro Carvalho Chehab
438*32e2eae2SMauro Carvalho Chehab       a -> g -> m [style=invis, weight=10]
439*32e2eae2SMauro Carvalho Chehab
440*32e2eae2SMauro Carvalho Chehab       f -> g
441*32e2eae2SMauro Carvalho Chehab       l -> m
442*32e2eae2SMauro Carvalho Chehab   }
443*32e2eae2SMauro Carvalho Chehab
444*32e2eae2SMauro Carvalho ChehabThe table below presents a description of the above algorithms.
445*32e2eae2SMauro Carvalho Chehab
446*32e2eae2SMauro Carvalho Chehab======================== =======================================================
447*32e2eae2SMauro Carvalho ChehabName			 Description
448*32e2eae2SMauro Carvalho Chehab======================== =======================================================
449*32e2eae2SMauro Carvalho ChehabOptical Black Correction Optical Black Correction block subtracts a pre-defined
450*32e2eae2SMauro Carvalho Chehab			 value from the respective pixel values to obtain better
451*32e2eae2SMauro Carvalho Chehab			 image quality.
452*32e2eae2SMauro Carvalho Chehab			 Defined in :c:type:`ipu3_uapi_obgrid_param`.
453*32e2eae2SMauro Carvalho ChehabLinearization		 This algo block uses linearization parameters to
454*32e2eae2SMauro Carvalho Chehab			 address non-linearity sensor effects. The Lookup table
455*32e2eae2SMauro Carvalho Chehab			 table is defined in
456*32e2eae2SMauro Carvalho Chehab			 :c:type:`ipu3_uapi_isp_lin_vmem_params`.
457*32e2eae2SMauro Carvalho ChehabSHD			 Lens shading correction is used to correct spatial
458*32e2eae2SMauro Carvalho Chehab			 non-uniformity of the pixel response due to optical
459*32e2eae2SMauro Carvalho Chehab			 lens shading. This is done by applying a different gain
460*32e2eae2SMauro Carvalho Chehab			 for each pixel. The gain, black level etc are
461*32e2eae2SMauro Carvalho Chehab			 configured in :c:type:`ipu3_uapi_shd_config_static`.
462*32e2eae2SMauro Carvalho ChehabBNR			 Bayer noise reduction block removes image noise by
463*32e2eae2SMauro Carvalho Chehab			 applying a bilateral filter.
464*32e2eae2SMauro Carvalho Chehab			 See :c:type:`ipu3_uapi_bnr_static_config` for details.
465*32e2eae2SMauro Carvalho ChehabANR			 Advanced Noise Reduction is a block based algorithm
466*32e2eae2SMauro Carvalho Chehab			 that performs noise reduction in the Bayer domain. The
467*32e2eae2SMauro Carvalho Chehab			 convolution matrix etc can be found in
468*32e2eae2SMauro Carvalho Chehab			 :c:type:`ipu3_uapi_anr_config`.
469*32e2eae2SMauro Carvalho ChehabDM			 Demosaicing converts raw sensor data in Bayer format
470*32e2eae2SMauro Carvalho Chehab			 into RGB (Red, Green, Blue) presentation. Then add
471*32e2eae2SMauro Carvalho Chehab			 outputs of estimation of Y channel for following stream
472*32e2eae2SMauro Carvalho Chehab			 processing by Firmware. The struct is defined as
473*32e2eae2SMauro Carvalho Chehab			 :c:type:`ipu3_uapi_dm_config`.
474*32e2eae2SMauro Carvalho ChehabColor Correction	 Color Correction algo transforms sensor specific color
475*32e2eae2SMauro Carvalho Chehab			 space to the standard "sRGB" color space. This is done
476*32e2eae2SMauro Carvalho Chehab			 by applying 3x3 matrix defined in
477*32e2eae2SMauro Carvalho Chehab			 :c:type:`ipu3_uapi_ccm_mat_config`.
478*32e2eae2SMauro Carvalho ChehabGamma correction	 Gamma correction :c:type:`ipu3_uapi_gamma_config` is a
479*32e2eae2SMauro Carvalho Chehab			 basic non-linear tone mapping correction that is
480*32e2eae2SMauro Carvalho Chehab			 applied per pixel for each pixel component.
481*32e2eae2SMauro Carvalho ChehabCSC			 Color space conversion transforms each pixel from the
482*32e2eae2SMauro Carvalho Chehab			 RGB primary presentation to YUV (Y: brightness,
483*32e2eae2SMauro Carvalho Chehab			 UV: Luminance) presentation. This is done by applying
484*32e2eae2SMauro Carvalho Chehab			 a 3x3 matrix defined in
485*32e2eae2SMauro Carvalho Chehab			 :c:type:`ipu3_uapi_csc_mat_config`
486*32e2eae2SMauro Carvalho ChehabCDS			 Chroma down sampling
487*32e2eae2SMauro Carvalho Chehab			 After the CSC is performed, the Chroma Down Sampling
488*32e2eae2SMauro Carvalho Chehab			 is applied for a UV plane down sampling by a factor
489*32e2eae2SMauro Carvalho Chehab			 of 2 in each direction for YUV 4:2:0 using a 4x2
490*32e2eae2SMauro Carvalho Chehab			 configurable filter :c:type:`ipu3_uapi_cds_params`.
491*32e2eae2SMauro Carvalho ChehabCHNR			 Chroma noise reduction
492*32e2eae2SMauro Carvalho Chehab			 This block processes only the chrominance pixels and
493*32e2eae2SMauro Carvalho Chehab			 performs noise reduction by cleaning the high
494*32e2eae2SMauro Carvalho Chehab			 frequency noise.
495*32e2eae2SMauro Carvalho Chehab			 See struct :c:type:`ipu3_uapi_yuvp1_chnr_config`.
496*32e2eae2SMauro Carvalho ChehabTCC			 Total color correction as defined in struct
497*32e2eae2SMauro Carvalho Chehab			 :c:type:`ipu3_uapi_yuvp2_tcc_static_config`.
498*32e2eae2SMauro Carvalho ChehabXNR3			 eXtreme Noise Reduction V3 is the third revision of
499*32e2eae2SMauro Carvalho Chehab			 noise reduction algorithm used to improve image
500*32e2eae2SMauro Carvalho Chehab			 quality. This removes the low frequency noise in the
501*32e2eae2SMauro Carvalho Chehab			 captured image. Two related structs are  being defined,
502*32e2eae2SMauro Carvalho Chehab			 :c:type:`ipu3_uapi_isp_xnr3_params` for ISP data memory
503*32e2eae2SMauro Carvalho Chehab			 and :c:type:`ipu3_uapi_isp_xnr3_vmem_params` for vector
504*32e2eae2SMauro Carvalho Chehab			 memory.
505*32e2eae2SMauro Carvalho ChehabTNR			 Temporal Noise Reduction block compares successive
506*32e2eae2SMauro Carvalho Chehab			 frames in time to remove anomalies / noise in pixel
507*32e2eae2SMauro Carvalho Chehab			 values. :c:type:`ipu3_uapi_isp_tnr3_vmem_params` and
508*32e2eae2SMauro Carvalho Chehab			 :c:type:`ipu3_uapi_isp_tnr3_params` are defined for ISP
509*32e2eae2SMauro Carvalho Chehab			 vector and data memory respectively.
510*32e2eae2SMauro Carvalho Chehab======================== =======================================================
511*32e2eae2SMauro Carvalho Chehab
512*32e2eae2SMauro Carvalho ChehabOther often encountered acronyms not listed in above table:
513*32e2eae2SMauro Carvalho Chehab
514*32e2eae2SMauro Carvalho Chehab	ACC
515*32e2eae2SMauro Carvalho Chehab		Accelerator cluster
516*32e2eae2SMauro Carvalho Chehab	AWB_FR
517*32e2eae2SMauro Carvalho Chehab		Auto white balance filter response statistics
518*32e2eae2SMauro Carvalho Chehab	BDS
519*32e2eae2SMauro Carvalho Chehab		Bayer downscaler parameters
520*32e2eae2SMauro Carvalho Chehab	CCM
521*32e2eae2SMauro Carvalho Chehab		Color correction matrix coefficients
522*32e2eae2SMauro Carvalho Chehab	IEFd
523*32e2eae2SMauro Carvalho Chehab		Image enhancement filter directed
524*32e2eae2SMauro Carvalho Chehab	Obgrid
525*32e2eae2SMauro Carvalho Chehab		Optical black level compensation
526*32e2eae2SMauro Carvalho Chehab	OSYS
527*32e2eae2SMauro Carvalho Chehab		Output system configuration
528*32e2eae2SMauro Carvalho Chehab	ROI
529*32e2eae2SMauro Carvalho Chehab		Region of interest
530*32e2eae2SMauro Carvalho Chehab	YDS
531*32e2eae2SMauro Carvalho Chehab		Y down sampling
532*32e2eae2SMauro Carvalho Chehab	YTM
533*32e2eae2SMauro Carvalho Chehab		Y-tone mapping
534*32e2eae2SMauro Carvalho Chehab
535*32e2eae2SMauro Carvalho ChehabA few stages of the pipeline will be executed by firmware running on the ISP
536*32e2eae2SMauro Carvalho Chehabprocessor, while many others will use a set of fixed hardware blocks also
537*32e2eae2SMauro Carvalho Chehabcalled accelerator cluster (ACC) to crunch pixel data and produce statistics.
538*32e2eae2SMauro Carvalho Chehab
539*32e2eae2SMauro Carvalho ChehabACC parameters of individual algorithms, as defined by
540*32e2eae2SMauro Carvalho Chehab:c:type:`ipu3_uapi_acc_param`, can be chosen to be applied by the user
541*32e2eae2SMauro Carvalho Chehabspace through struct :c:type:`ipu3_uapi_flags` embedded in
542*32e2eae2SMauro Carvalho Chehab:c:type:`ipu3_uapi_params` structure. For parameters that are configured as
543*32e2eae2SMauro Carvalho Chehabnot enabled by the user space, the corresponding structs are ignored by the
544*32e2eae2SMauro Carvalho Chehabdriver, in which case the existing configuration of the algorithm will be
545*32e2eae2SMauro Carvalho Chehabpreserved.
546*32e2eae2SMauro Carvalho Chehab
547*32e2eae2SMauro Carvalho ChehabReferences
548*32e2eae2SMauro Carvalho Chehab==========
549*32e2eae2SMauro Carvalho Chehab
550*32e2eae2SMauro Carvalho Chehab.. [#f5] drivers/staging/media/ipu3/include/intel-ipu3.h
551*32e2eae2SMauro Carvalho Chehab
552*32e2eae2SMauro Carvalho Chehab.. [#f1] https://github.com/intel/nvt
553*32e2eae2SMauro Carvalho Chehab
554*32e2eae2SMauro Carvalho Chehab.. [#f2] http://git.ideasonboard.org/yavta.git
555*32e2eae2SMauro Carvalho Chehab
556*32e2eae2SMauro Carvalho Chehab.. [#f3] http://git.ideasonboard.org/?p=media-ctl.git;a=summary
557*32e2eae2SMauro Carvalho Chehab
558*32e2eae2SMauro Carvalho Chehab.. [#f4] ImgU limitation requires an additional 16x16 for all input resolutions
559