<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>i.MX ProcessorsのトピックYUV422-&amp;gt;RGB24 - which conversion formula does IPU use?</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/YUV422-gt-RGB24-which-conversion-formula-does-IPU-use/m-p/326255#M43823</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I created a 800x600 RGB24 buffer filled with 0x80 i.e; (R, G, B) =&amp;nbsp; (128, 128, 128) or 0x808080 . I then use&amp;nbsp; IPU to convert RGB24-&amp;gt;YUV422 (see below for the code snippet). As expected the resultant buffer has YUV= 0x808080.&lt;/P&gt;&lt;P&gt;Converting back to RGB24, however, has unexpected result. The resulting RGB buffer has (R, G, B) =&amp;nbsp; (130, 128, 127) or 0x82807F.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Which conversion does IPU apply?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Based on Wikipedia's YUV page, RGB should either be 0x808080 (I&lt;SPAN style="color: #252525; font-family: sans-serif; font-size: 14px;"&gt;TU-R version&lt;/SPAN&gt;) or 0x828282 (if IPU assumes YCbCr format for YUV-&amp;gt;RGB conversion). &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Any input is greatly appreciated.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/YUV" title="http://en.wikipedia.org/wiki/YUV"&gt;YUV - Wikipedia, the free encyclopedia&lt;/A&gt;&lt;/P&gt;&lt;P&gt;Excerpt from Wikipedia:&lt;/P&gt;&lt;P style="margin-top: 0.5em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;These formulae are based on the NTSC standard;&lt;/P&gt;&lt;DL style="margin-top: 0.2em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="Y' =  0.299 \times R + 0.587 \times G + 0.114 \times B" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/d/a/7/da7a8111b0eb119b3fbd07d906c337cb.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="U  = -0.147 \times R - 0.289 \times G + 0.436 \times B" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/9/a/f/9af843618f3d15259c26b7dcc35d4f33.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="V  =  0.615 \times R - 0.515 \times G - 0.100 \times B" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/0/a/a/0aa515668097211939e45bc580474efa.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;/DL&gt;&lt;P style="margin-top: 0.5em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;On older, non-&lt;A href="http://en.wikipedia.org/wiki/SIMD" style="color: #0b0080; background: none;" title="SIMD"&gt;SIMD&lt;/A&gt; architectures, floating point arithmetic is much slower than using fixed-point arithmetic, so an alternative formulation is:&lt;/P&gt;&lt;DL style="margin-top: 0.2em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="C = Y' - 16" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/a/6/9/a69f41bd8d0f26ec65c32c1dd942786a.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="D = U - 128" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/a/4/b/a4be63b3f39c4493dd7fab47992c2b0f.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="E = V - 128" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/f/c/d/fcd161b1728583288af9daaff0e800e5.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;/DL&gt;&lt;P style="margin-top: 0.5em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;Using the previous coefficients and noting that clamp() denotes clamping a value to the range of 0 to 255, the following formulae provide the conversion from Y'UV to RGB (NTSC version):&lt;/P&gt;&lt;DL style="margin-top: 0.2em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="R = \mathrm{clamp}(( 298 \times C                + 409 \times E + 128) &amp;gt;&amp;gt; 8)" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/f/3/8/f3802e971d24c8de26569413c9b3e5fa.png" style="border-style: none; vertical-align: middle; display: inline;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="G = \mathrm{clamp}(( 298 \times C - 100 \times D - 208 \times E + 128) &amp;gt;&amp;gt; 8)" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/f/7/a/f7a359deee6087a0ee56bf2ce83600b4.png" style="border-style: none; vertical-align: middle; display: inline;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="B = \mathrm{clamp}(( 298 \times C + 516 \times D                + 128) &amp;gt;&amp;gt; 8)" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/c/6/3/c63ad4fac2d1c8f776f259065d467bac.png" style="border-style: none; vertical-align: middle; display: inline;" /&gt;&lt;/DD&gt;&lt;/DL&gt;&lt;P style="margin-top: 0.5em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;Note: The above formulae are actually implied for YCbCr. Though the term YUV is used here, it should be noted that YUV and YCbCr are not exactly the same in a strict manner.&lt;/P&gt;&lt;P style="margin-top: 0.5em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;The ITU-R version of the formulae is different:&lt;/P&gt;&lt;DL style="margin-top: 0.2em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="Y  = 0.299 \times R + 0.587 \times G + 0.114 \times B + 0" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/4/3/8/438f92526bc5d07f2f54f02b3cd48d28.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="Cb = -0.169 \times R - 0.331 \times G + 0.499 \times B + 128" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/4/b/0/4b089c5748e78d7db24d980d6507839a.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="Cr = 0.499 \times R - 0.418 \times G - 0.0813 \times B + 128" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/8/f/0/8f07aad9a0b90231147979fe9dc539e2.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;/DL&gt;&lt;DL style="margin-top: 0.2em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="R = \mathrm{clamp}(Y + 1.402 \times (Cr - 128))" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/3/2/6/3261ad178a6f0d94aa63112dad34ae1e.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="G = \mathrm{clamp}(Y - 0.344 \times (Cb - 128) - 0.714 \times (Cr - 128))" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/9/6/2/962542a04fde7f464faa3e08e3fbed9e.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="B = \mathrm{clamp}(Y + 1.772 \times (Cb - 128))" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/2/d/c/2dc9aa832bb043bdf493c58c90f8fc28.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;STRONG style=": ; color: #252525; text-decoration: underline;"&gt;Code snippet:&lt;/STRONG&gt;&lt;/DD&gt;&lt;/DL&gt;&lt;P&gt;&amp;nbsp; // set task basics&lt;/P&gt;&lt;P&gt;&amp;nbsp; memset( &amp;amp;ipuTask, 0, sizeof(ipuTask) );&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.input.width = inW;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.input.height = inH;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.input.format = inFmt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.output.width = outW;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.output.height = outH;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.output.format = outFmt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // get image file and check for failure&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // compute input size in bytes&lt;/P&gt;&lt;P&gt;&amp;nbsp; iInputSize = ipuTask.input.width * ipuTask.input.height *&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; computeBPP( ipuTask.input.format ) / 8;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // set the amount of memory needed for the task input&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.input.paddr = iInputSize;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // allocate memory for the input image and check for failure&lt;/P&gt;&lt;P&gt;&amp;nbsp; // (NOTE: input.paddr will be replaced with the physical address)&lt;/P&gt;&lt;P&gt;&amp;nbsp; iRetValue = ioctl( iIPUFD, IPU_ALLOC, &amp;amp;ipuTask.input.paddr );&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( iRetValue &amp;lt; 0 )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perror( "ioctl(IPU_ALLOC)" );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cleanup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return iRetValue;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // map virtual address to input memory&lt;/P&gt;&lt;P&gt;&amp;nbsp; pInputBuff = mmap( 0, iInputSize, PROT_READ | PROT_WRITE,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MAP_SHARED, iIPUFD, ipuTask.input.paddr );&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( !pInputBuff || pInputBuff == MAP_FAILED )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perror( "mmap" );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cleanup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // compute output size in bytes&lt;/P&gt;&lt;P&gt;&amp;nbsp; iOutputSize = ipuTask.output.width * ipuTask.output.height *&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; computeBPP( ipuTask.output.format ) / 8;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // set the amount of memory needed for the task output&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.output.paddr = iOutputSize;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // allocate memory for the output image and check for failure&lt;/P&gt;&lt;P&gt;&amp;nbsp; // (NOTE: output.paddr will be replaced with the physical address)&lt;/P&gt;&lt;P&gt;&amp;nbsp; iRetValue = ioctl( iIPUFD, IPU_ALLOC, &amp;amp;ipuTask.output.paddr );&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( iRetValue &amp;lt; 0 )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perror( "ioctl(IPU_ALLOC)" );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cleanup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return iRetValue;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // map virtual address to output memory&lt;/P&gt;&lt;P&gt;&amp;nbsp; pOutputBuff = mmap( 0, iOutputSize, PROT_READ | PROT_WRITE,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MAP_SHARED, iIPUFD, ipuTask.output.paddr );&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( !pOutputBuff || pOutputBuff == MAP_FAILED )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perror( "mmap" );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cleanup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // get output file and check for failure&lt;/P&gt;&lt;P&gt;&amp;nbsp; fOutput = fopen( outName.c_str(), "wb" );&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( fOutput &amp;lt; 0 )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cerr &amp;lt;&amp;lt; "failed to open " &amp;lt;&amp;lt; outName.c_str() &amp;lt;&amp;lt; endl;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cleanup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // read input image&lt;/P&gt;&lt;P&gt;&amp;nbsp; iRetValue = fread( pInputBuff, 1, iInputSize, fInput );&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( iRetValue &amp;lt; iInputSize )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; perror( "fread" );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cleanup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // execute the IPU task and check for failure&lt;/P&gt;&lt;P&gt;&amp;nbsp; iRetValue = ioctl( iIPUFD, IPU_QUEUE_TASK, &amp;amp;ipuTask );&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 31 Jul 2014 00:11:53 GMT</pubDate>
    <dc:creator>ssvma</dc:creator>
    <dc:date>2014-07-31T00:11:53Z</dc:date>
    <item>
      <title>YUV422-&gt;RGB24 - which conversion formula does IPU use?</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/YUV422-gt-RGB24-which-conversion-formula-does-IPU-use/m-p/326255#M43823</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I created a 800x600 RGB24 buffer filled with 0x80 i.e; (R, G, B) =&amp;nbsp; (128, 128, 128) or 0x808080 . I then use&amp;nbsp; IPU to convert RGB24-&amp;gt;YUV422 (see below for the code snippet). As expected the resultant buffer has YUV= 0x808080.&lt;/P&gt;&lt;P&gt;Converting back to RGB24, however, has unexpected result. The resulting RGB buffer has (R, G, B) =&amp;nbsp; (130, 128, 127) or 0x82807F.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Which conversion does IPU apply?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Based on Wikipedia's YUV page, RGB should either be 0x808080 (I&lt;SPAN style="color: #252525; font-family: sans-serif; font-size: 14px;"&gt;TU-R version&lt;/SPAN&gt;) or 0x828282 (if IPU assumes YCbCr format for YUV-&amp;gt;RGB conversion). &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Any input is greatly appreciated.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://en.wikipedia.org/wiki/YUV" title="http://en.wikipedia.org/wiki/YUV"&gt;YUV - Wikipedia, the free encyclopedia&lt;/A&gt;&lt;/P&gt;&lt;P&gt;Excerpt from Wikipedia:&lt;/P&gt;&lt;P style="margin-top: 0.5em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;These formulae are based on the NTSC standard;&lt;/P&gt;&lt;DL style="margin-top: 0.2em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="Y' =  0.299 \times R + 0.587 \times G + 0.114 \times B" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/d/a/7/da7a8111b0eb119b3fbd07d906c337cb.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="U  = -0.147 \times R - 0.289 \times G + 0.436 \times B" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/9/a/f/9af843618f3d15259c26b7dcc35d4f33.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="V  =  0.615 \times R - 0.515 \times G - 0.100 \times B" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/0/a/a/0aa515668097211939e45bc580474efa.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;/DL&gt;&lt;P style="margin-top: 0.5em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;On older, non-&lt;A href="http://en.wikipedia.org/wiki/SIMD" style="color: #0b0080; background: none;" title="SIMD"&gt;SIMD&lt;/A&gt; architectures, floating point arithmetic is much slower than using fixed-point arithmetic, so an alternative formulation is:&lt;/P&gt;&lt;DL style="margin-top: 0.2em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="C = Y' - 16" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/a/6/9/a69f41bd8d0f26ec65c32c1dd942786a.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="D = U - 128" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/a/4/b/a4be63b3f39c4493dd7fab47992c2b0f.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="E = V - 128" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/f/c/d/fcd161b1728583288af9daaff0e800e5.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;/DL&gt;&lt;P style="margin-top: 0.5em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;Using the previous coefficients and noting that clamp() denotes clamping a value to the range of 0 to 255, the following formulae provide the conversion from Y'UV to RGB (NTSC version):&lt;/P&gt;&lt;DL style="margin-top: 0.2em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="R = \mathrm{clamp}(( 298 \times C                + 409 \times E + 128) &amp;gt;&amp;gt; 8)" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/f/3/8/f3802e971d24c8de26569413c9b3e5fa.png" style="border-style: none; vertical-align: middle; display: inline;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="G = \mathrm{clamp}(( 298 \times C - 100 \times D - 208 \times E + 128) &amp;gt;&amp;gt; 8)" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/f/7/a/f7a359deee6087a0ee56bf2ce83600b4.png" style="border-style: none; vertical-align: middle; display: inline;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="B = \mathrm{clamp}(( 298 \times C + 516 \times D                + 128) &amp;gt;&amp;gt; 8)" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/c/6/3/c63ad4fac2d1c8f776f259065d467bac.png" style="border-style: none; vertical-align: middle; display: inline;" /&gt;&lt;/DD&gt;&lt;/DL&gt;&lt;P style="margin-top: 0.5em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;Note: The above formulae are actually implied for YCbCr. Though the term YUV is used here, it should be noted that YUV and YCbCr are not exactly the same in a strict manner.&lt;/P&gt;&lt;P style="margin-top: 0.5em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;The ITU-R version of the formulae is different:&lt;/P&gt;&lt;DL style="margin-top: 0.2em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="Y  = 0.299 \times R + 0.587 \times G + 0.114 \times B + 0" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/4/3/8/438f92526bc5d07f2f54f02b3cd48d28.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="Cb = -0.169 \times R - 0.331 \times G + 0.499 \times B + 128" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/4/b/0/4b089c5748e78d7db24d980d6507839a.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="Cr = 0.499 \times R - 0.418 \times G - 0.0813 \times B + 128" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/8/f/0/8f07aad9a0b90231147979fe9dc539e2.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;/DL&gt;&lt;DL style="margin-top: 0.2em; margin-bottom: 0.5em; color: #252525; font-family: sans-serif; font-size: 14px;"&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="R = \mathrm{clamp}(Y + 1.402 \times (Cr - 128))" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/3/2/6/3261ad178a6f0d94aa63112dad34ae1e.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="G = \mathrm{clamp}(Y - 0.344 \times (Cb - 128) - 0.714 \times (Cr - 128))" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/9/6/2/962542a04fde7f464faa3e08e3fbed9e.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;IMG alt="B = \mathrm{clamp}(Y + 1.772 \times (Cb - 128))" class="mwe-math-fallback-png-inline tex jiveImage" src="http://upload.wikimedia.org/math/2/d/c/2dc9aa832bb043bdf493c58c90f8fc28.png" style="border-style: none;" /&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;/DD&gt;&lt;DD style="margin-left: 1.6em; margin-bottom: 0.1em;"&gt;&lt;STRONG style=": ; color: #252525; text-decoration: underline;"&gt;Code snippet:&lt;/STRONG&gt;&lt;/DD&gt;&lt;/DL&gt;&lt;P&gt;&amp;nbsp; // set task basics&lt;/P&gt;&lt;P&gt;&amp;nbsp; memset( &amp;amp;ipuTask, 0, sizeof(ipuTask) );&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.input.width = inW;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.input.height = inH;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.input.format = inFmt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.output.width = outW;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.output.height = outH;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.output.format = outFmt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // get image file and check for failure&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // compute input size in bytes&lt;/P&gt;&lt;P&gt;&amp;nbsp; iInputSize = ipuTask.input.width * ipuTask.input.height *&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; computeBPP( ipuTask.input.format ) / 8;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // set the amount of memory needed for the task input&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.input.paddr = iInputSize;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // allocate memory for the input image and check for failure&lt;/P&gt;&lt;P&gt;&amp;nbsp; // (NOTE: input.paddr will be replaced with the physical address)&lt;/P&gt;&lt;P&gt;&amp;nbsp; iRetValue = ioctl( iIPUFD, IPU_ALLOC, &amp;amp;ipuTask.input.paddr );&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( iRetValue &amp;lt; 0 )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perror( "ioctl(IPU_ALLOC)" );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cleanup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return iRetValue;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // map virtual address to input memory&lt;/P&gt;&lt;P&gt;&amp;nbsp; pInputBuff = mmap( 0, iInputSize, PROT_READ | PROT_WRITE,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MAP_SHARED, iIPUFD, ipuTask.input.paddr );&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( !pInputBuff || pInputBuff == MAP_FAILED )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perror( "mmap" );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cleanup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // compute output size in bytes&lt;/P&gt;&lt;P&gt;&amp;nbsp; iOutputSize = ipuTask.output.width * ipuTask.output.height *&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; computeBPP( ipuTask.output.format ) / 8;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // set the amount of memory needed for the task output&lt;/P&gt;&lt;P&gt;&amp;nbsp; ipuTask.output.paddr = iOutputSize;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // allocate memory for the output image and check for failure&lt;/P&gt;&lt;P&gt;&amp;nbsp; // (NOTE: output.paddr will be replaced with the physical address)&lt;/P&gt;&lt;P&gt;&amp;nbsp; iRetValue = ioctl( iIPUFD, IPU_ALLOC, &amp;amp;ipuTask.output.paddr );&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( iRetValue &amp;lt; 0 )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perror( "ioctl(IPU_ALLOC)" );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cleanup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return iRetValue;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // map virtual address to output memory&lt;/P&gt;&lt;P&gt;&amp;nbsp; pOutputBuff = mmap( 0, iOutputSize, PROT_READ | PROT_WRITE,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MAP_SHARED, iIPUFD, ipuTask.output.paddr );&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( !pOutputBuff || pOutputBuff == MAP_FAILED )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perror( "mmap" );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cleanup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // get output file and check for failure&lt;/P&gt;&lt;P&gt;&amp;nbsp; fOutput = fopen( outName.c_str(), "wb" );&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( fOutput &amp;lt; 0 )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cerr &amp;lt;&amp;lt; "failed to open " &amp;lt;&amp;lt; outName.c_str() &amp;lt;&amp;lt; endl;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cleanup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // read input image&lt;/P&gt;&lt;P&gt;&amp;nbsp; iRetValue = fread( pInputBuff, 1, iInputSize, fInput );&lt;/P&gt;&lt;P&gt;&amp;nbsp; if( iRetValue &amp;lt; iInputSize )&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; perror( "fread" );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cleanup();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // execute the IPU task and check for failure&lt;/P&gt;&lt;P&gt;&amp;nbsp; iRetValue = ioctl( iIPUFD, IPU_QUEUE_TASK, &amp;amp;ipuTask );&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 31 Jul 2014 00:11:53 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/YUV422-gt-RGB24-which-conversion-formula-does-IPU-use/m-p/326255#M43823</guid>
      <dc:creator>ssvma</dc:creator>
      <dc:date>2014-07-31T00:11:53Z</dc:date>
    </item>
    <item>
      <title>Re: YUV422-&gt;RGB24 - which conversion formula does IPU use?</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/YUV422-gt-RGB24-which-conversion-formula-does-IPU-use/m-p/326256#M43824</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Please refer to section 37.4.5.4 (Main Processing Section), item 4 of the i.MX6 DQ Reference &lt;BR /&gt;Manual.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A class="moz-txt-link-rfc2396E" href="http://cache.freescale.com/files/32bit/doc/ref_manual/IMX6DQRM.pdf"&gt; http://cache.freescale.com/files/32bit/doc/ref_manual/IMX6DQRM.pdf &lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;"4. First color space conversion YUV to RGB or RGB to YUV with the conversion&lt;/P&gt;&lt;P&gt;matrix CSC1. The conversion matrix coefficients are programmable. They are stored&lt;/P&gt;&lt;P&gt;in the Task Parameter Memory."&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Have a great day,&lt;BR /&gt;Yuri&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;-----------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;Note: If this post answers your question, please click the Correct Answer button. Thank you!&lt;BR /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 31 Jul 2014 01:42:58 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/YUV422-gt-RGB24-which-conversion-formula-does-IPU-use/m-p/326256#M43824</guid>
      <dc:creator>Yuri</dc:creator>
      <dc:date>2014-07-31T01:42:58Z</dc:date>
    </item>
  </channel>
</rss>

