From ea8be1533a20a1634c9a1cb3a5534cba65329138 Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Wed, 17 Apr 2024 14:37:50 +0800 Subject: [PATCH] docs(jpeg): Add docs for explain pixel order supported in jpeg driver --- docs/_static/diagrams/jpeg/rgb565.png | Bin 0 -> 15102 bytes .../diagrams/jpeg/rgb565_bigendian.png | Bin 0 -> 14851 bytes docs/_static/diagrams/jpeg/rgb888.png | Bin 0 -> 18938 bytes .../diagrams/jpeg/rgb888_bigendian.png | Bin 0 -> 19105 bytes docs/_static/diagrams/jpeg/yuv420.png | Bin 0 -> 21824 bytes docs/_static/diagrams/jpeg/yuv422.png | Bin 0 -> 12857 bytes docs/_static/diagrams/jpeg/yuv444.png | Bin 0 -> 12653 bytes docs/en/api-reference/peripherals/jpeg.rst | 109 +++++++++++++++++- 8 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 docs/_static/diagrams/jpeg/rgb565.png create mode 100644 docs/_static/diagrams/jpeg/rgb565_bigendian.png create mode 100644 docs/_static/diagrams/jpeg/rgb888.png create mode 100644 docs/_static/diagrams/jpeg/rgb888_bigendian.png create mode 100644 docs/_static/diagrams/jpeg/yuv420.png create mode 100644 docs/_static/diagrams/jpeg/yuv422.png create mode 100644 docs/_static/diagrams/jpeg/yuv444.png diff --git a/docs/_static/diagrams/jpeg/rgb565.png b/docs/_static/diagrams/jpeg/rgb565.png new file mode 100644 index 0000000000000000000000000000000000000000..a76fdcdaa9409241e4dcf8b61dbf98ede7c29da9 GIT binary patch literal 15102 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 LS3j3^P6fM~ literal 0 HcmV?d00001 diff --git a/docs/_static/diagrams/jpeg/rgb565_bigendian.png b/docs/_static/diagrams/jpeg/rgb565_bigendian.png new file mode 100644 index 0000000000000000000000000000000000000000..0d55a55a4ffe4418c855956052070801cad78004 GIT binary patch literal 14851 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 literal 0 HcmV?d00001 diff --git a/docs/_static/diagrams/jpeg/rgb888.png b/docs/_static/diagrams/jpeg/rgb888.png new file mode 100644 index 0000000000000000000000000000000000000000..62f372df5b06824761ebb27bf526e3715033a570 GIT binary patch literal 18938 zcmeAS@N?(olHy`uVBq!ia0y~yU_Qvez@W*&#=yWJx?Q`7fq{XsILO_JVcj{ImkbPc zRVA(wCAk%8nK`Kps>aR`ma36KMt*ULsiLRk(h@qjXv7@1xs6HzZ;udPA5|k~RU?C(%Qdy7+5lu-g%S=uMi5k1A8aS#NfqbcI>RU?DE#9XM_fW-7v zT|B>=I4Zj=73Znn+7v8x5B+Bu^_`YKP5Fs)yN>F z0^$Ti69Z$A79)d{N{EQLsU<`py$EIx)LM{0aAp$Vf#BrC98A&h%#@N0h)XO? zq0R%T_DIc4&w$x%XaJSTO@t|i3KVA~rsS7H^n-;k!x0vmMfv$9s<@U!Vcc>=+*_JKm1H2ry9rb*5t`i6;Rb^;w5k!|C{ZV*mB}Mt!sYo&g24=2~ZmPykx%p+#cm|nUlv8SXaXDf1U6*b_=ZFb;*Tb<0Z(A2L${Gn#3=q~0vq@QHgp^LL=5APCa?id zV4xux@aobbH_U2C#5jHs&Bwt~EDQ|HjY$~?b2K$DFc~@HU}i(Mk#9uAFvVyB8~74z z$TsppV(F8W&3Cw)RHu8;#7^WCaU<04PhHN9>h=^f|(F8W&3Cv>1j^rB= zF-$R~n4c$gQ5yKRt32fjK*wAg{j}B8H?OhwR%cU&`Q6t~jS=Go5$G%vw9Lf%4 z+$QE9JZ9qZ@OKLc5oiqjIU? zu|vzYOi2>XS<1d^>6CYybnnWQ9Y1p=^7N)tZ+_Re*KPj$eU;+xE&28LKl6URfAgm9 z(d+VSTK0VXr*Pl7hkyf|% zgUWsXq9yUk>+^TTmTnUL)00rv+iUT60fV%8)6DsTXa4jE{GGutyX^lA5GU%P=RUzX zb-jD{y)1Jx*epHso2Om#6@PoR1IxPi)w>z&-sjeVWID{MJLkijW-eUM@|vCXM#V+t z%`cuCH{JXvsrbu~(d_L%Lwn^JKVh6gd*vCDQU`xIGMdGGIid6GXHUYmdQ?N9HrzSS zk=Ew6p)R1ISKQX9yUtE|#@qRVi{yn9F29riYz%Tel=I!VY34$~HS!_}k6ruEESi6w zBkgy3%ZuYIH@5sf{--D58JzRCCm}6kWIB`I{X_UYTit!J^DK)dO+GxeqVPe;pGP|z zcf4<1{H8_F!pJt>|BUwZ$?KczeyQsFbKlu-sq~|(JN$_0^cu@&XCp+M5348V|NmC; z3{Y@yKd$5ssEgpueXcu*URa<99;L;XR@6C#w&`MbJv! zx=)?yi$i9KtTv00bnn|Ar9A7Vq4_kOA4xV_(`(HiA?smxH=sGLsIL}WtzpmOFKK{2i^1yFprEr$->-Ol! z-QThKo7aacul0H@v!@?_Xe#~qY4o+_>*8|tu20T5KfO%ymEfBBb(&0T3;w5dKQL}= z(-zF$_T~7kwd*neEadU)60+h&#%>ecjM0e8{7W$_n#6yI8Xnr(G_Js`@cafU3LE_aqKJj)%4@x zrgs&e;=dnXZ+182@yj_|cYMqGpsxQvY|Hk&kJq??9JG9XUAl48{l34aMGv;``(DA5 zcTfCseuT_ryRY+Z{Jl8;=*D-kn*UE%9QIikKFKEj*3uR3bLxIA<=Aovl=#oroX-$_ zJ<~s4qMfZh`K0n*q$FiRzX{<@)~W4@-hH?^*A*wX?4G zvf1!CTYeSmho!~qR{hIg-jAba1j_sFlezVIW5;Fx{hf9HpY=U>Wo!KW z-P4cfX0Pv>zV5#-&z=7~)qhUQ9GsV5Gd+1te$UgdxpxBg?-9Jy19sWj|T7OyLP@|@-U z%iD3kg}9_sdl40@ru_z6WlGLH2!a1+VVkelh2Hc1YHn z{>$L%ve?DI`r!Zh=RT_3`n>f2oCj&QLjUKi*B8Fl|MMb8TK(^6|I6wZ^Z%M}=>Jdy zsV2cSW1HY{hOd|VIX7e?)tR^|(0A&B;947{3Wsra%ojYv)0=>+rXN*?*7O-p0TQp< zbW{HE7A7u@3$vJ}m#)b;+gzQ+DiXlJwI=E=>wlKxq5%$#*F=Aqcg#F`x@Dpi69WSS NgQu&X%Q~loCII^9(6j&m literal 0 HcmV?d00001 diff --git a/docs/_static/diagrams/jpeg/rgb888_bigendian.png b/docs/_static/diagrams/jpeg/rgb888_bigendian.png new file mode 100644 index 0000000000000000000000000000000000000000..490c95ba887d20f8fade2c6855401f4bd82ca794 GIT binary patch literal 19105 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 N44$rjF6*2UngFhTV_N_K literal 0 HcmV?d00001 diff --git a/docs/_static/diagrams/jpeg/yuv444.png b/docs/_static/diagrams/jpeg/yuv444.png new file mode 100644 index 0000000000000000000000000000000000000000..e45d274cbaab661b945a1351fcfdecce14ff8973 GIT binary patch literal 12653 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 M>FVdQ&MBb@07RqqLjV8( literal 0 HcmV?d00001 diff --git a/docs/en/api-reference/peripherals/jpeg.rst b/docs/en/api-reference/peripherals/jpeg.rst index ad24411a53..23426412b5 100644 --- a/docs/en/api-reference/peripherals/jpeg.rst +++ b/docs/en/api-reference/peripherals/jpeg.rst @@ -18,6 +18,7 @@ This document covers the following sections: - `JPEG Decoder Engine <#jpeg-decoder-engine>`__ - covers behavior of JPEG decoder engine. Introduce how to use decoder engine functions to decode an image (from jpg format to raw format). - `JPEG Encoder Engine <#jpeg-encoder-engine>`__ - covers behavior of JPEG encoder engine. Introduce how to use encoder engine functions to encode an image (from raw format to jpg format). - `Performance Overview <#performance-overview>`__ - covers encoder and decoder performance. +- `Pixel Storage Layout for Different Color Formats <#pixel-storage-layout-for-different-color-formats>`__ - covers color space order overview required in this JPEG decoder and encoder. - `Thread Safety <#thread-safety>`__ - lists which APIs are guaranteed to be thread safe by the driver. - `Power Management <#power-management>`__ - describes how jpeg driver would be affected by power consumption. - `Kconfig Options <#kconfig-options>`__ - lists the supported Kconfig options that can bring different effects to the driver. @@ -104,18 +105,28 @@ The format conversions supported by this driver are listed in the table below: | Format of the already compressed image | Format after decompressing | +========================================+===================================+ | | RGB565 | -| YUV444 +-----------------------------------+ +| YUV444 +-----------------------------------+ | | RGB888 | +| +-----------------------------------+ +| | YUV444 | +----------------------------------------+-----------------------------------+ | | RGB565 | -| YUV422 +-----------------------------------+ +| +-----------------------------------+ | | RGB888 | +| YUV422 +-----------------------------------+ +| | YUV444 | +| +-----------------------------------+ +| | YUV422 | +----------------------------------------+-----------------------------------+ | | RGB565 | -| YUV420 +-----------------------------------+ +| +-----------------------------------+ | | RGB888 | +| YUV420 +-----------------------------------+ +| | YUV444 | +| +-----------------------------------+ +| | YUV420 | +----------------------------------------+-----------------------------------+ -| GRAY | GRAY | +| GRAY | GRAY | +----------------------------------------+-----------------------------------+ Overall, You can take following code as reference, the code is going to decode a 1080*1920 picture. @@ -167,11 +178,13 @@ The format conversions supported by this driver are listed in the table below: +==========================+======================================+ | | YUV444 | | +--------------------------------------+ -| RGB565/RGB888 | YUV422 | +| RGB565/RGB888 | YUV422 | | +--------------------------------------+ | | YUV420 | +--------------------------+--------------------------------------+ -| GRAY | GRAY | +| GRAY | GRAY | ++--------------------------+--------------------------------------+ +| YUV422 | YUV422 | +--------------------------+--------------------------------------+ @@ -236,6 +249,12 @@ JPEG decoder performance +--------+-------+--------------------------------------------+----------------------------------------+------------------+ | 720 | 1280 | GRAY | GRAY | 161 | +--------+-------+--------------------------------------------+----------------------------------------+------------------+ +| 480 | 800 | YUV444 | YUV444 | 129 | ++--------+-------+--------------------------------------------+----------------------------------------+------------------+ +| 480 | 800 | YUV422 | YUV444/YUV422 | 190 | ++--------+-------+--------------------------------------------+----------------------------------------+------------------+ +| 480 | 800 | YUV420 | YUV444/YUV420 | 253 | ++--------+-------+--------------------------------------------+----------------------------------------+------------------+ JPEG encoder performance ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -269,8 +288,86 @@ JPEG encoder performance +--------+-------+-----------------------------------------+-------------------------------------------+------------------+ | 720 | 1280 | GRAY | GRAY | 163 | +--------+-------+-----------------------------------------+-------------------------------------------+------------------+ +| 480 | 800 | YUV422 | YUV422 | 146 | ++--------+-------+-----------------------------------------+-------------------------------------------+------------------+ +Pixel Storage Layout for Different Color Formats +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The encoder and decoder described in this guide use the same uncompressed raw image formats (RGB, YUV). Therefore, the encoder and decoder are not discussed separately in this section. The pixel layout of the following formats applies to the input direction of the encoder and the output direction of the decoder (if supported). The specific pixel layout is shown in the following figure: + +RGB888 +~~~~~~ + +In the following picture, each small block means one bit. + +.. figure:: ../../../_static/diagrams/jpeg/rgb888.png + :align: center + :alt: RGB888 pixel order + + RGB888 pixel order + +For RGB888, the order can be changed via :cpp:member:`jpeg_decode_cfg_t::rgb_order` sets the pixel to `RGB` order. + +.. figure:: ../../../_static/diagrams/jpeg/rgb888_bigendian.png + :align: center + :alt: RGB888 pixel big endian order + + RGB888 pixel big endian order + +RGB565 +~~~~~~ + +In the following picture, each small block means one bit. + +.. figure:: ../../../_static/diagrams/jpeg/rgb565.png + :align: center + :alt: RGB565 pixel order + + RGB565 pixel order + +For RGB565, the order can be changed via :cpp:member:`jpeg_decode_cfg_t::rgb_order` sets the pixel to `RGB` order. + +.. figure:: ../../../_static/diagrams/jpeg/rgb565_bigendian.png + :align: center + :alt: RGB565 pixel big endian order + + RGB565 pixel big endian order + +YUV444 +~~~~~~ + +In the following picture, each small block means one byte. + +.. figure:: ../../../_static/diagrams/jpeg/yuv444.png + :align: center + :alt: YUV444 pixel order + + YUV444 pixel order + +YUV422 +~~~~~~ + +In the following picture, each small block means one byte. + +.. figure:: ../../../_static/diagrams/jpeg/yuv422.png + :align: center + :alt: YUV422 pixel order + + YUV422 pixel order + +YUV420 +~~~~~~ + +In the following picture, each small block means one byte. + +.. figure:: ../../../_static/diagrams/jpeg/yuv420.png + :align: center + :alt: YUV420 pixel order + + YUV420 pixel order + Thread Safety ^^^^^^^^^^^^^