<?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>topic MX31 IPU Graphics/Video Combining problem in i.MX Processors</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/MX31-IPU-Graphics-Video-Combining-problem/m-p/144691#M21</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Hi All,&lt;BR /&gt;&lt;BR /&gt;For our new product it is necessary to blend an image on top of a video frame.&lt;BR /&gt;&lt;BR /&gt;I'm using Windows CE 5.0 and it's post processing driver to accomplish the task (pp.dll).&lt;BR /&gt;&lt;BR /&gt;The video frame input is stored system memory (YUV 4:4:4)&lt;BR /&gt;The overlay image is also stored in system memory (RGB 24bpp) (alpha value 128, no color keying)&lt;BR /&gt;The output image should also be stored in system memory (RGB 24bpp).&lt;BR /&gt;&lt;BR /&gt;So my use case is:&amp;nbsp;&amp;nbsp;&amp;nbsp; MEN -&amp;gt; PP -&amp;gt; MEM&lt;BR /&gt;&lt;BR /&gt;I've enabled color space conversion step 1&amp;nbsp; (YUV -&amp;gt; RGB, I assume this converts the video input image to a similar RGB format as the overlay image).&lt;BR /&gt;&lt;BR /&gt;For some reason I get a distorted output image as can be seen in out.bmp. I don't have a clue what is wrong.&lt;BR /&gt;&lt;BR /&gt;If I make the overlay completely opaque the result is identical to the overlay which is correct.&lt;BR /&gt;So somehow the input image gets messed up.&lt;BR /&gt;&lt;BR /&gt;To troubleshoot i've created a chess pattern as input video. The overlay image and the resulting combined image are presented by the following links:&lt;BR /&gt;&lt;BR /&gt;&lt;A href="http://users.pandora.be/dreamspace/out.bmp" rel="nofollow" target="_blank"&gt;http://users.pandora.be/dreamspace/out.bmp&lt;/A&gt;&lt;BR /&gt;&lt;A href="http://users.pandora.be/dreamspace/overlay.bmp" rel="nofollow" target="_blank"&gt;http://users.pandora.be/dreamspace/overlay.bmp&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;// This is my code to initialize the combining features of the post processor&lt;BR /&gt;----------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Open camera&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_hPPDll = CreateFile(TEXT("POP1:"),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // "special" file name&lt;BR /&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; GENERIC_READ|GENERIC_WRITE,&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; // desired access&lt;BR /&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; FILE_SHARE_READ|FILE_SHARE_WRITE,&amp;nbsp;&amp;nbsp; // sharing mode&lt;BR /&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; NULL,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // security attributes (=NULL)&lt;BR /&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; OPEN_EXISTING,&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; // creation disposition&lt;BR /&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; FILE_ATTRIBUTE_NORMAL,&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; // flags and attributes&lt;BR /&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; NULL);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // template file (ignored)&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(m_hPPDll == INVALID_HANDLE_VALUE)&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ppConfigData configData;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; memset(&amp;amp;configData,0,sizeof(configData));&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // enable overlay&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.bCombining = true;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // configure overlay image coming from GPU&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.alpha = 128;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.colorKey = 0xaaaaaaaa; // unused color value&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.CSCEquation = ppCSCY2R_A1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.CSCEquation2 = ppCSCNoOp;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Input image&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputSize.width&amp;nbsp;&amp;nbsp;&amp;nbsp; = m_Width;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputSize.height = m_Height;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputStride&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = configData.inputSize.width;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputFormat&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = ppFormat_YUV444;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputDataWidth&amp;nbsp;&amp;nbsp;&amp;nbsp; = ppDataWidth_8BPP;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Overlay&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombDataWidth&amp;nbsp;&amp;nbsp;&amp;nbsp; = ppDataWidth_24BPP;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombFormat&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = ppFormat_RGB;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombSize.width&amp;nbsp;&amp;nbsp;&amp;nbsp; = m_Width;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombSize.height = m_Height;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombStride = configData.inputCombSize.width*3;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombRGBPixelFormat.component0_offset = 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombRGBPixelFormat.component1_offset = 8;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombRGBPixelFormat.component2_offset = 16;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombRGBPixelFormat.component0_width = 8;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombRGBPixelFormat.component1_width = 8;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombRGBPixelFormat.component2_width = 8;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Output image format&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputFormat&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = ppFormat_RGB;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputSize.width&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = m_Width;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputSize.height&amp;nbsp;&amp;nbsp;&amp;nbsp; = m_Height;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputStride&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = configData.outputSize.width*3;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputDataWidth&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = ppDataWidth_24BPP;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputRGBPixelFormat.component0_offset = 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputRGBPixelFormat.component1_offset = 8;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputRGBPixelFormat.component2_offset = 16;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputRGBPixelFormat.component0_width = 8;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputRGBPixelFormat.component1_width = 8;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputRGBPixelFormat.component2_width = 8;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // issue the IOCTL to configure the PP&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!DeviceIoControl(m_hPPDll,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // file handle to the driver&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PP_IOCTL_CONFIGURE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // I/O control code&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;configData,&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; // in buffer&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sizeof(ppConfigData),&amp;nbsp;&amp;nbsp;&amp;nbsp; // in buffer size&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NULL,&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; // out buffer&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&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;&amp;nbsp;&amp;nbsp; // out buffer size&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&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;&amp;nbsp;&amp;nbsp; // number of bytes returned&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NULL))&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; // ignored (=NULL)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;BR /&gt;&lt;BR /&gt;----------------------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;----------------------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;This is the code to tell the post processor to process a new frame&lt;BR /&gt;----------------------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;&lt;BR /&gt;bool&amp;nbsp; AddBuffers(TRAF_UINT8 * pYUVImage, TRAF_UINT8 * pOverlay, TRAF_UINT8 * pOut)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ppBuffers pBuffers;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; memset(&amp;amp;pBuffers,0,sizeof(ppBuffers));&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.inputBuf = (UINT32*)pYUVImage;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.inputUBufOffset = m_Width * m_Height;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.inputVBufOffset = pBuffers.inputUBufOffset + m_Width * m_Height;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.inBufLen = m_Width*m_Height*3;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.inputCombBuf = (UINT32*)pOverlay;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.inCombBufLen = m_Width*m_Height*3;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.outputBuf = (UINT32*)pOut;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.outBufLen = m_Width*m_Height*3;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!DeviceIoControl(m_hPPDll,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // file handle to the driver&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PP_IOCTL_ENQUEUE_BUFFERS,&amp;nbsp; // I/O control code&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pBuffers,&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; // in buffer&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sizeof(ppBuffers),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // in buffer size&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NULL,&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; // out buffer&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; // out buffer size&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; // number of bytes returned&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NULL))&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; // ignored (=NULL)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;I hope someone has experience with this stuff..&lt;BR /&gt;&lt;BR /&gt;Regards,&lt;BR /&gt;&lt;BR /&gt;Mike&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 10 Sep 2007 16:39:08 GMT</pubDate>
    <dc:creator>IronMike</dc:creator>
    <dc:date>2007-09-10T16:39:08Z</dc:date>
    <item>
      <title>MX31 IPU Graphics/Video Combining problem</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/MX31-IPU-Graphics-Video-Combining-problem/m-p/144691#M21</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Hi All,&lt;BR /&gt;&lt;BR /&gt;For our new product it is necessary to blend an image on top of a video frame.&lt;BR /&gt;&lt;BR /&gt;I'm using Windows CE 5.0 and it's post processing driver to accomplish the task (pp.dll).&lt;BR /&gt;&lt;BR /&gt;The video frame input is stored system memory (YUV 4:4:4)&lt;BR /&gt;The overlay image is also stored in system memory (RGB 24bpp) (alpha value 128, no color keying)&lt;BR /&gt;The output image should also be stored in system memory (RGB 24bpp).&lt;BR /&gt;&lt;BR /&gt;So my use case is:&amp;nbsp;&amp;nbsp;&amp;nbsp; MEN -&amp;gt; PP -&amp;gt; MEM&lt;BR /&gt;&lt;BR /&gt;I've enabled color space conversion step 1&amp;nbsp; (YUV -&amp;gt; RGB, I assume this converts the video input image to a similar RGB format as the overlay image).&lt;BR /&gt;&lt;BR /&gt;For some reason I get a distorted output image as can be seen in out.bmp. I don't have a clue what is wrong.&lt;BR /&gt;&lt;BR /&gt;If I make the overlay completely opaque the result is identical to the overlay which is correct.&lt;BR /&gt;So somehow the input image gets messed up.&lt;BR /&gt;&lt;BR /&gt;To troubleshoot i've created a chess pattern as input video. The overlay image and the resulting combined image are presented by the following links:&lt;BR /&gt;&lt;BR /&gt;&lt;A href="http://users.pandora.be/dreamspace/out.bmp" rel="nofollow" target="_blank"&gt;http://users.pandora.be/dreamspace/out.bmp&lt;/A&gt;&lt;BR /&gt;&lt;A href="http://users.pandora.be/dreamspace/overlay.bmp" rel="nofollow" target="_blank"&gt;http://users.pandora.be/dreamspace/overlay.bmp&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;// This is my code to initialize the combining features of the post processor&lt;BR /&gt;----------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Open camera&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_hPPDll = CreateFile(TEXT("POP1:"),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // "special" file name&lt;BR /&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; GENERIC_READ|GENERIC_WRITE,&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; // desired access&lt;BR /&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; FILE_SHARE_READ|FILE_SHARE_WRITE,&amp;nbsp;&amp;nbsp; // sharing mode&lt;BR /&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; NULL,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // security attributes (=NULL)&lt;BR /&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; OPEN_EXISTING,&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; // creation disposition&lt;BR /&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; FILE_ATTRIBUTE_NORMAL,&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; // flags and attributes&lt;BR /&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; NULL);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // template file (ignored)&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(m_hPPDll == INVALID_HANDLE_VALUE)&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ppConfigData configData;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; memset(&amp;amp;configData,0,sizeof(configData));&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // enable overlay&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.bCombining = true;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // configure overlay image coming from GPU&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.alpha = 128;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.colorKey = 0xaaaaaaaa; // unused color value&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.CSCEquation = ppCSCY2R_A1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.CSCEquation2 = ppCSCNoOp;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Input image&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputSize.width&amp;nbsp;&amp;nbsp;&amp;nbsp; = m_Width;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputSize.height = m_Height;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputStride&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = configData.inputSize.width;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputFormat&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = ppFormat_YUV444;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputDataWidth&amp;nbsp;&amp;nbsp;&amp;nbsp; = ppDataWidth_8BPP;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Overlay&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombDataWidth&amp;nbsp;&amp;nbsp;&amp;nbsp; = ppDataWidth_24BPP;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombFormat&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = ppFormat_RGB;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombSize.width&amp;nbsp;&amp;nbsp;&amp;nbsp; = m_Width;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombSize.height = m_Height;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombStride = configData.inputCombSize.width*3;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombRGBPixelFormat.component0_offset = 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombRGBPixelFormat.component1_offset = 8;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombRGBPixelFormat.component2_offset = 16;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombRGBPixelFormat.component0_width = 8;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombRGBPixelFormat.component1_width = 8;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.inputCombRGBPixelFormat.component2_width = 8;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Output image format&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputFormat&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = ppFormat_RGB;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputSize.width&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = m_Width;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputSize.height&amp;nbsp;&amp;nbsp;&amp;nbsp; = m_Height;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputStride&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = configData.outputSize.width*3;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputDataWidth&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = ppDataWidth_24BPP;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputRGBPixelFormat.component0_offset = 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputRGBPixelFormat.component1_offset = 8;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputRGBPixelFormat.component2_offset = 16;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputRGBPixelFormat.component0_width = 8;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputRGBPixelFormat.component1_width = 8;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; configData.outputRGBPixelFormat.component2_width = 8;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // issue the IOCTL to configure the PP&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!DeviceIoControl(m_hPPDll,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // file handle to the driver&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PP_IOCTL_CONFIGURE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // I/O control code&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;configData,&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; // in buffer&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sizeof(ppConfigData),&amp;nbsp;&amp;nbsp;&amp;nbsp; // in buffer size&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NULL,&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; // out buffer&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&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;&amp;nbsp;&amp;nbsp; // out buffer size&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&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;&amp;nbsp;&amp;nbsp; // number of bytes returned&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NULL))&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; // ignored (=NULL)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;BR /&gt;&lt;BR /&gt;----------------------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;----------------------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;This is the code to tell the post processor to process a new frame&lt;BR /&gt;----------------------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;&lt;BR /&gt;bool&amp;nbsp; AddBuffers(TRAF_UINT8 * pYUVImage, TRAF_UINT8 * pOverlay, TRAF_UINT8 * pOut)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ppBuffers pBuffers;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; memset(&amp;amp;pBuffers,0,sizeof(ppBuffers));&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.inputBuf = (UINT32*)pYUVImage;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.inputUBufOffset = m_Width * m_Height;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.inputVBufOffset = pBuffers.inputUBufOffset + m_Width * m_Height;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.inBufLen = m_Width*m_Height*3;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.inputCombBuf = (UINT32*)pOverlay;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.inCombBufLen = m_Width*m_Height*3;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.outputBuf = (UINT32*)pOut;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pBuffers.outBufLen = m_Width*m_Height*3;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!DeviceIoControl(m_hPPDll,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // file handle to the driver&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PP_IOCTL_ENQUEUE_BUFFERS,&amp;nbsp; // I/O control code&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pBuffers,&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; // in buffer&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sizeof(ppBuffers),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // in buffer size&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NULL,&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; // out buffer&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; // out buffer size&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; // number of bytes returned&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NULL))&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; // ignored (=NULL)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;I hope someone has experience with this stuff..&lt;BR /&gt;&lt;BR /&gt;Regards,&lt;BR /&gt;&lt;BR /&gt;Mike&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 10 Sep 2007 16:39:08 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/MX31-IPU-Graphics-Video-Combining-problem/m-p/144691#M21</guid>
      <dc:creator>IronMike</dc:creator>
      <dc:date>2007-09-10T16:39:08Z</dc:date>
    </item>
    <item>
      <title>Re: MX31 IPU Graphics/Video Combining problem</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/MX31-IPU-Graphics-Video-Combining-problem/m-p/144692#M22</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Okay,&lt;BR /&gt;&lt;BR /&gt;I figured out is causing the conversion problems....&lt;BR /&gt;&lt;BR /&gt;The synchronous display driver "ipu_sdc.dll" used by windows ce is build on top of the post processor.&lt;BR /&gt;&lt;BR /&gt;So the post processor is actually active after the driver is loaded. I assume this conflicts with what my application is trying to do with the post processor.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;FONT color="#33CC00"&gt;Fortunatly&lt;/FONT&gt;&lt;FONT color="#33CC00"&gt;,&lt;/FONT&gt; I found an alternative:&lt;BR /&gt;&lt;BR /&gt;The view finder channel pre-processor is also able to apply an overlay to an image.&lt;BR /&gt;The camera image is fed to both the encoding and viewfinder channel of the preproccesor.&lt;BR /&gt;&lt;BR /&gt;The encoding channel provides a clean YUV420 video stream in memory&lt;BR /&gt;the viewfinding channel also provides a YUV420 video stream but combined with an overlay to memory (no display involved!!!).&lt;BR /&gt;This second stream is then send to the onboard hantro MPEG encoder.&lt;BR /&gt;&lt;BR /&gt;1) To accomplish this, I had the adjust the camera.dll driver to be able to active and configure the combining channel.&lt;BR /&gt;2) To use both streams simultaneously I had to make sure I could instantiate 2 camera pints. ("PIN1:") &amp;amp; ("PIN2:"). The camera driver shipped with CE could not accomplish this.&amp;nbsp; Therefore I had to add an extra entry PIN reference with index "2" to the registry . And I had to adjust the cameradriver.cpp file, so the the secdon PIN instance driver was loaded at startup (via the ActivateDevice function)..&lt;BR /&gt;&lt;BR /&gt;Cool!!!&lt;BR /&gt;&lt;BR /&gt;&lt;FONT color="#ff0000"&gt;Unfortunatly&lt;/FONT&gt;, I have one little problem left:&lt;BR /&gt;&lt;BR /&gt;&lt;A href="http://users.pandora.be/dreamspace/MPEG_output.bmp" rel="nofollow" target="_blank"&gt;http://users.pandora.be/dreamspace/MPEG_output.bmp&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;After the 2 color conversions steps the resulting image contains alternating dark columns.&lt;BR /&gt;&lt;BR /&gt;My formats:&amp;nbsp; Overlay input : RGB16&amp;nbsp; - Input image YUV420 - Output YUV420&lt;BR /&gt;&lt;BR /&gt;My equations:&lt;BR /&gt;CSC1 Equation = Y2RA1&lt;BR /&gt;CSC2 Equation = R2YA1&lt;BR /&gt;&lt;BR /&gt;I assumed CSC1 is for converting the input image to something similar of the overlay. So In my case RGB&lt;BR /&gt;I assumed CSC2 is for converting the combined image to another output format.&amp;nbsp; In my case, RGB internal to YUV420.&lt;BR /&gt;&lt;BR /&gt;Are there correct assumptions?&lt;BR /&gt;&lt;BR /&gt;Mike&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 14 Sep 2007 19:29:28 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/MX31-IPU-Graphics-Video-Combining-problem/m-p/144692#M22</guid>
      <dc:creator>IronMike</dc:creator>
      <dc:date>2007-09-14T19:29:28Z</dc:date>
    </item>
    <item>
      <title>Re: MX31 IPU Graphics/Video Combining problem</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/MX31-IPU-Graphics-Video-Combining-problem/m-p/144693#M23</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;anybody knows common CSC values used for YUV420 to RGB24 conversion?&lt;BR /&gt;&lt;BR /&gt;thanks!!&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 11 Nov 2008 21:16:19 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/MX31-IPU-Graphics-Video-Combining-problem/m-p/144693#M23</guid>
      <dc:creator>jerkins750i</dc:creator>
      <dc:date>2008-11-11T21:16:19Z</dc:date>
    </item>
  </channel>
</rss>

