<?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 Re: How to insert GPU shading between camera capture and preview window in i.MX Processors</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278960#M31780</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Dragan,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I will probably have to drop the DirectVIV trick too since the YUV/RGB clamping is not ok for me either. Too bad, but anyway in the meantime I realized that getting the output data is my real bottleneck (by far). I won't display the image, I just need to put my converted image in memory, and was planning on investigating the virtual framebuffer option, so thank you for the associated pointers.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 02 Sep 2013 06:17:33 GMT</pubDate>
    <dc:creator>julienheyman</dc:creator>
    <dc:date>2013-09-02T06:17:33Z</dc:date>
    <item>
      <title>How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278949#M31769</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; background-color: #ffffff;"&gt;I already have a preview working from the gray scale camera. I capture each frame as 8-bit generic data and use IPU unit to convert 8-bit gray scale raw data into ARGB8888. To do that I use custom color space conversion matrix and YUV-&amp;gt;RGB conversion IPU task. All capture buffers including one from the output of the IPU are allocated from the native window. At this point, I submit output from IPU to the preview window. I'd like to insert some additional GPU processing (custom shading) in between i.e. after IPU and before submitting to preview window. My system is imx6 android ics 13.4.1.04. Can you please give me some ideas how this could be done? If I could look into some code examples that would be great.&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 18 Jul 2013 03:38:32 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278949#M31769</guid>
      <dc:creator>DraganOstojic</dc:creator>
      <dc:date>2013-07-18T03:38:32Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278950#M31770</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;hi, Dragan&lt;/P&gt;&lt;P&gt;Camera hal in ics 13.4.1 has CaptureFrameThread, PreviewShowFrameThread, EncodeFrameThread and TakePicThread.&lt;/P&gt;&lt;P&gt;The CaptureFrameThread acquires buffer from V4L2 interface and post it to PreviewShowFrameThread, EncoderFrameThread or TakePicThread acoording to requirement.&lt;/P&gt;&lt;P&gt;You may add another thread PostProcessThread to handle buffer from CaptureFrameThread.&lt;/P&gt;&lt;P&gt;Then PostProcessThread deliver the handled buffer to PreviewShowFrameThread, EncodeFrameThread or TakePicThread according to requirement.&lt;/P&gt;&lt;P&gt;All threads share the buffer, which managed by buffer reference count.&lt;/P&gt;&lt;P&gt;You may refer the CameraHal code in hardware/imx/mx6/libcamera.&lt;/P&gt;&lt;P&gt;And you may also refer the PreviewShowFrameThread to PostProcessThread.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;BRs,&lt;/P&gt;&lt;P&gt;Xiaowen&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 18 Jul 2013 04:47:17 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278950#M31770</guid>
      <dc:creator>Ivan_liu</dc:creator>
      <dc:date>2013-07-18T04:47:17Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278951#M31771</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;After much trial and error I figured out how to integrate OpenGL ES rendering into camera HAL. The reason this is useful is that imx6 has a very powerful Vivante 3D GPU which can be used for all kinds of processing video from camera. For example it can convert raw bayer in the shader. In my case and because imx6 doesn't support 8-bit gray scale to RGBA8888 natively, I use pixel shader to do the conversion. The performance numbers are quite impressive. Processing full 2592x1944 resolution frame takes less than 19ms. Aptina mt9p031 sensor that I'm using can output this resolution at a rate of 14fps with 96 MHz pixel clock so with this GPU speed I can maintain this frame rate and have extra time for other processing that we plan to do on the frame. Vivante driver also has OpenGL extension which allows direct mapping of the capture buffers into the GPU memory space so no copy operation is required before GPU can do its job. The same thing could be done with the IPU (which I actually implemented) however it takes IPU ~150ms so this is much better.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;One point to make is that it appears that Android makes it difficult to get a pointer to ANativeWindow without a hack so I render full screen at the moment. Once I figure out how to get that pointer I'll post more detailed code.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If anybody is interested for more details let me know.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 02 Aug 2013 06:39:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278951#M31771</guid>
      <dc:creator>DraganOstojic</dc:creator>
      <dc:date>2013-08-02T06:39:29Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278952#M31772</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Dragan,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am quite interested to hear the specifics of how you setup your image chain to achieve this. I am especially interested in these two aspects:&lt;/P&gt;&lt;P&gt;- pixel shader to perform Bayer demosaicing on the GPU&lt;/P&gt;&lt;P&gt;- how to map capture buffers directly in GPU memory space&lt;/P&gt;&lt;P&gt;Any info you are willing to share on these will be greatly appreciated.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Julien&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 07 Aug 2013 13:35:55 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278952#M31772</guid>
      <dc:creator>julienheyman</dc:creator>
      <dc:date>2013-08-07T13:35:55Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278953#M31773</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Julien, I'll put steps and some code. In the meantime with regards to your questions, I used vivante specific extensions to map capture buffers into GPU space. Android ics version of these extensions as implemented in the GPU driver (imx6 13.4.1 + 13.4.1.04 patch) appears to support only YUV formats. If you want to work with ics you have to do some tricks to correct for that. In addition, once mapped as texture, GPU color space converts on the fly so your pixel shader actually samples rgba texture. In my case I capture gray scale camera as raw 8-bit so I had to resort to tricking GPU that I captured YUV planar format. I allocated 1.5x more memory and pre-filled UV planes with 128. Pre-setting U and V with 128 will cancels out U and V once YUV-&amp;gt;RGB conversion takes place (U/V appear as c1*(U-128) and c2*(V-128) in RGB components) you will get 3 identical values in RGB positions. They still will not be quite right because color space conversion from YUV to RGB transforms Y to c*(Y-16). I accomplished this last correction step in my shader code. Once I get my original Y I'm done. In your specific case you may proceed to do de-mosaicing. I came accross this shader demosaicing code so you may want to take a look:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://graphics.cs.williams.edu/papers/BayerJGT09/" title="http://graphics.cs.williams.edu/papers/BayerJGT09/"&gt;http://graphics.cs.williams.edu/papers/BayerJGT09/&lt;/A&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 07 Aug 2013 17:02:27 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278953#M31773</guid>
      <dc:creator>DraganOstojic</dc:creator>
      <dc:date>2013-08-07T17:02:27Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278954#M31774</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Good info, thank you. I'll study the paper you provided, and look forward to your code snippets.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Julien&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 08 Aug 2013 06:24:01 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278954#M31774</guid>
      <dc:creator>julienheyman</dc:creator>
      <dc:date>2013-08-08T06:24:01Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278955#M31775</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;To render camera captured images with GPU to the preview window we need to get ANativeWindow* pointer for the preview window. Camera HAL doesn't provide that pointer and in fact hides it. To get this pointer, a new API has to be added to frameworks/base/services/camera/libcameraservice/CameraHardwareInterface.h as follows:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;class CameraHardwareInterface : public virtual RefBase {&lt;/P&gt;&lt;P&gt;public:&lt;/P&gt;&lt;P&gt;...&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt; &lt;/STRONG&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static ANativeWindow* getANativeWindow(struct preview_stream_ops* w)&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return __to_anw(((struct camera_preview_window*)w)-&amp;gt;user);&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This pointer will be retrieved from hardware/imx/mx6/libcamera/CameraHal.cpp when we create EGL context. In addition, a following line has to be commented out in hardware/imx/mx6/libcamera/Android.mk to prevent warnings from including CameraHardwareInterface.h causing compilation errors:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#LOCAL_CPPFLAGS += -Werror&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Preview window will be used for GPU rendering so it can't be used for allocating buffers for camera capture any more. To allocate capture buffers we need to create another native window from the camera HAL code. This window will never be used for displaying anything so buffers will be dequeued from it and never enqueued.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Note that for capture to work through EGL, all EGL initialization and OpenGL rendering has to be done from a single thread. One simple way to do this is to put EGL code into camera capture thread.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Overall steps are:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;1. Create native window and allocate capture buffers. No buffers should be allocated from the preview window so that code in CameraHal.cpp should be skipped.&lt;/P&gt;&lt;P&gt;2. Preview window is pre-connected to NATIVE_WINDOW_API_CAMERA so it has to be disconnected before step 3.&lt;/P&gt;&lt;P&gt;3. Peform standard EGL initialization steps. Create EGL context from the ANativeWindow* pointer to the camera preview window&lt;/P&gt;&lt;P&gt;4. Map capture buffers to the GPU textures&lt;/P&gt;&lt;P&gt;5. Load shader program&lt;/P&gt;&lt;P&gt;6. On each captured buffer render in a standard way&lt;/P&gt;&lt;P&gt;7. Skip code in CameraHal.cpp that submits captured buffers to the preview window and only re-queue buffer to the camera device.&lt;/P&gt;&lt;P&gt;8. Upon camera termination, clean up allocated buffers and EGL context.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'll follow up with some code fragments for above steps.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;1. Create native window and allocate capture buffers&lt;/P&gt;&lt;P&gt;Replace original CameraHal::allocateBuffersFromNativeWindow() with the following code:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sp&amp;lt;SurfaceTexture&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mST;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sp&amp;lt;SurfaceTextureClient&amp;gt; mSTC;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sp&amp;lt;ANativeWindow&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mANW;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ANativeWindowBuffer*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; anb[6];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned long imageWidth;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned long imageHeight;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned long imageSize;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imageWidth = 640;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imageHeight = 480;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imageSize = imageWidth * imageHeight;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mST&amp;nbsp; = new SurfaceTexture(123);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mSTC = new SurfaceTextureClient(mST);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mANW = mSTC;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; native_window_set_usage(mANW.get(), GRALLOC_USAGE_SW_READ_OFTEN |&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GRALLOC_USAGE_SW_WRITE_OFTEN |&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GRALLOC_USAGE_FORCE_CONTIGUOUS |&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GRALLOC_USAGE_HW_TEXTURE);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // YV12 can be used when capturing from gray scale camera and U/V plane is a placeholder.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; native_window_set_buffers_geometry(mANW.get(), imageWidth, imageHeight, HAL_PIXEL_FORMAT_YV12);&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; native_window_set_buffer_count(mANW.get(), captureBuffersNumber);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GraphicBufferMapper&amp;amp; mapper = GraphicBufferMapper::get();&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rect rect(imageWidth, imageHeight);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void* pVaddr;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; 6; i++)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&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; mANW-&amp;gt;dequeueBuffer(mANW.get(), &amp;amp;anb[i]);&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&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; buffer_handle_t*&amp;nbsp; buf_h&amp;nbsp; = &amp;amp;anb[i]-&amp;gt;handle;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&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; private_handle_t* handle = (private_handle_t*)(*buf_h);&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; mapper.lock(handle, GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, rect, &amp;amp;pVaddr);&lt;/P&gt;&lt;P&gt;&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; mCaptureBuffers[i].virt_start = (unsigned char*)handle-&amp;gt;base;&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; mCaptureBuffers[i].phy_offset = handle-&amp;gt;phys;&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; mCaptureBuffers[i].length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;nbsp; handle-&amp;gt;size;&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; mCaptureBuffers[i].native_buf = (void*)buf_h;&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; mCaptureBuffers[i].refCount&amp;nbsp;&amp;nbsp; = 0;&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; mCaptureBuffers[i].buf_state&amp;nbsp; = WINDOW_BUFS_DEQUEUED;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // When a buffer is converted into GPU texture, YUV input is color space converted to RGBA8888 in GPU.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Placeholder U/V values will interfere so they need to be initialized to 128 to cancel out.&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; void* uvPlane&amp;nbsp;&amp;nbsp; = mCaptureBuffers[i].virt_start + imageSize;&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; memset(uvPlane, 128, imageSize * 1/2);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;To clean-up, replace original CameraHal::freeBuffersToNativeWindow() with the following code:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;GraphicBufferMapper&amp;amp; mapper = GraphicBufferMapper::get();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; 6; i++)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&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; buffer_handle_t* buf_h&amp;nbsp; = (buffer_handle_t*)mCaptureBuffers[i].native_buf;&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; mapper.unlock(*buf_h);&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; mANW-&amp;gt;cancelBuffer(mANW.get(), anb[i]);&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; &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; mCaptureBuffers[i].buf_state&amp;nbsp; = WINDOW_BUFS_INVALID;&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; mCaptureBuffers[i].refCount&amp;nbsp;&amp;nbsp; = 0;&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; mCaptureBuffers[i].native_buf = NULL;&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; mCaptureBuffers[i].virt_start = NULL;&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; mCaptureBuffers[i].length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0;&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; mCaptureBuffers[i].phy_offset = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mANW.clear();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mSTC.clear();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mST.clear();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;2. Preview window is pre-connected to NATIVE_WINDOW_API_CAMERA so it has to be disconnected before step 3:&lt;/P&gt;&lt;P&gt;native_window_api_disconnect(aNativeWindow, NATIVE_WINDOW_API_CAMERA);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Upon camera termination, make sure that you re-connect to camera API, otherwise there will be an error message:&lt;/P&gt;&lt;P&gt;native_window_api_connect(aNativeWindow, NATIVE_WINDOW_API_CAMERA);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;3. Peform standard EGL initialization steps. Create EGL context from the ANativeWindow* pointer to the camera preview window:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;EGLint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numConfigs;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGLint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; majorVersion;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGLint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; minorVersion;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGLConfig&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eglConfig;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGLContext&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eglContext;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGLSurface&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eglSurface;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGLDisplay&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eglDisplay&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static const EGLint contextAttribs[] =&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGL_CONTEXT_CLIENT_VERSION, 2,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGL_NONE&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static const EGLint configAttribs[] =&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGL_SAMPLES,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGL_RED_SIZE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGL_GREEN_SIZE,&amp;nbsp;&amp;nbsp; 8,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGL_BLUE_SIZE,&amp;nbsp;&amp;nbsp;&amp;nbsp; 8,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGL_ALPHA_SIZE,&amp;nbsp;&amp;nbsp; 8,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGL_DEPTH_SIZE,&amp;nbsp;&amp;nbsp; 0,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGL_SURFACE_TYPE, EGL_WINDOW_BIT,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGL_NONE&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;EGLint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; w;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGLint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;eglBindAPI(EGL_OPENGL_ES_API);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eglInitialize(eglDisplay, &amp;amp;majorVersion, &amp;amp;minorVersion);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eglGetConfigs(eglDisplay, NULL, 0, &amp;amp;numConfigs);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eglChooseConfig(eglDisplay, configAttribs, &amp;amp;eglConfig, 1, &amp;amp;numConfigs);&lt;/P&gt;&lt;P&gt;&amp;nbsp; ANativeWindow* anw = CameraHardwareInterface::getANativeWindow(mNativeWindow);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eglCreateWindowSurface(eglDisplay, eglConfig, anw, NULL);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, contextAttribs);&lt;/P&gt;&lt;P&gt;&amp;nbsp; eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext); &lt;/P&gt;&lt;P&gt;&amp;nbsp; eglQuerySurface(eglDisplay, eglSurface, EGL_WIDTH, &amp;amp;w);&lt;/P&gt;&lt;P&gt;&amp;nbsp; eglQuerySurface(eglDisplay, eglSurface, EGL_HEIGHT, &amp;amp;h);&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 10pt; line-height: 1.5em;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 10pt; line-height: 1.5em;"&gt;4. Map capture buffers to the GPU textures:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 10pt; line-height: 1.5em;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;#define GL_GLEXT_PROTOTYPES&lt;/P&gt;&lt;P&gt;#define EGL_EGLEXT_PROTOTYPES&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#include &amp;lt;EGL/egl.h&amp;gt;&lt;/P&gt;&lt;P&gt;#include &amp;lt;EGL/eglext.h&amp;gt;&lt;/P&gt;&lt;P&gt;#include &amp;lt;GLES2/gl2.h&amp;gt;&lt;/P&gt;&lt;P&gt;#include &amp;lt;GLES2/gl2ext.h&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGLint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imageAttrs[] =&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGL_NONE&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EGLImageKHR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eglImage[6];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GLuint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; texName[6];&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; glGenTextures(6, &amp;amp;texName[0]);&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;&amp;nbsp; for (int i = 0; i &amp;lt; 6; i++)&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; &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; eglImage[i] = eglCreateImageKHR(eglDisplay, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, (EGLClientBuffer)anb[i], imageAttrs);&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; glBindTexture(GL_TEXTURE_2D, texName[i]);&lt;/SPAN&gt;&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; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);&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; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);&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; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);&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; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);&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; glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)eglImage[i]);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;5. Load shader program:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;This is done in the standard way. Threre are examples in android code.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;6. On each captured buffer render in a standard way:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;Standard OpenGL ES code except need to pay attention to the following:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;- get the index of the currently captured buffer in the int CameraHal ::captureframeThread():&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;...&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;case CMESSAGE_TYPE_NORMAL:&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; ret = mCaptureDevice-&amp;gt;DevDequeue(&amp;amp;bufIndex);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;- start rendering code with the following:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;glBindTexture(GL_TEXTURE_2D, texName[bufIndex]);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;- setup geometry, uniforms, etc&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;- setup render target:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; glBindFramebuffer(GL_FRAMEBUFFER, 0);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; glViewport(0, 0, w, h);&lt;/P&gt;&lt;P&gt;- render&lt;/P&gt;&lt;P&gt;- swap buffers&lt;/P&gt;&lt;P&gt;eglSwapBuffers(eglDisplay, eglSurface);&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt; &lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;7. Skip code in CameraHal.cpp that submits captured buffers to the preview window and only re-queue buffer to the camera device&lt;/SPAN&gt;:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;Upon completion of the step 6, in int CameraHal ::previewshowFrameThread(), make sure to execute only this code and skip the rest&amp;nbsp; which&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;does mNativeWindow-&amp;gt;enqueue_buffer() and&amp;nbsp;&amp;nbsp; mNativeWindow-&amp;gt;dequeue_buffer():&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;case CMESSAGE_TYPE_NORMAL:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;...&lt;/SPAN&gt;&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;&amp;nbsp;&amp;nbsp; buf_index = display_index;&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;&amp;nbsp;&amp;nbsp; pInBuf-&amp;gt;buf_state = WINDOW_BUFS_QUEUED;&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;&amp;nbsp;&amp;nbsp; mEnqueuedBufs ++;&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;&amp;nbsp;&amp;nbsp; mCaptureBuffers[buf_index].buf_state = WINDOW_BUFS_DEQUEUED;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = putBufferCount(&amp;amp;mCaptureBuffers[buf_index]);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;8. Upon camera termination, clean up allocated buffers and EGL context&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;This is standard code&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 12 Aug 2013 18:51:48 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278955#M31775</guid>
      <dc:creator>DraganOstojic</dc:creator>
      <dc:date>2013-08-12T18:51:48Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278956#M31776</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I found an issue with vivante texture map functions when front and back facing cameras are switched so I changed approach to what Android is using in surface texture code. Performance is not as good as with vivante functions but still OK.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 15 Aug 2013 17:29:11 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278956#M31776</guid>
      <dc:creator>DraganOstojic</dc:creator>
      <dc:date>2013-08-15T17:29:11Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278957#M31777</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Note on the shader code for gray scale camera:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Assumption is that the YUV-&amp;gt;RGB conversion formula is as follows:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;B = 1.164(Y - 16) + 2.018(U - 128)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;R = 1.164(Y - 16) + 1.596(V - 128)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;U/V terms will cancel out because these values are set to 128 prior to starting capture and they don't change because gray scale camera input is captured only in Y plane.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;To recover original gray scale 8-bit value which came into Y position, in the pixel shader code following need to be done:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;vec4 tex = texture2D(my_Sampler, vTexcoor);&lt;/P&gt;&lt;P&gt;float y = tex.x * (1.0/1.164) + (16.0/255.0);&lt;/P&gt;&lt;P&gt;gl_FragColor = vec4(y, y, y, 1.0);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This approach works for gray scale but probably not so well for bayer color but I think it could be solved.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 15 Aug 2013 18:26:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278957#M31777</guid>
      <dc:creator>DraganOstojic</dc:creator>
      <dc:date>2013-08-15T18:26:29Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278958#M31778</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Dragan,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I put this method to practice, and the trick is great, however there seems to be one problem: all input Y values lesser than 16 will be clamped to zero by the hardware conversion (as per the formula you mention, and this is what I observe anyway when retrieving the output pixels). For similar reasons, all input values greater than 235 will end up being clamped to 235 in the output too.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Did I miss something ? Are these artefacts acceptable in your case since they are not that visible to the naked eye on "usual" images ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;On a different note, since I render into an EGL pixel buffer, I also still struggle with the issue of the performance of the required glReadPixels. Now that the input transfer is much faster thanks to the Vivante direct mapping extension, this output transfer is the bottleneck (by far) of the performance. Are you aware of any interesting options to get the output pixels into a regular/user memory buffer without going through glReadPixels ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks !&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 30 Aug 2013 13:19:27 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278958#M31778</guid>
      <dc:creator>julienheyman</dc:creator>
      <dc:date>2013-08-30T13:19:27Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278959#M31779</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Julien, thanks for noticing about clamping, it appears that's expected when you do YUV-&amp;gt;RGB conversion. However, in my case this loss of precision is to be avoided so I'll need to reconsider YUV-&amp;gt;RGB approach when handling gray scale camera input.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I guess you're rendering into pixel buffer so that you can do your de-mosaicing and copy into memory after that for display? To avoid lengthy &lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;glReadPixels&lt;/SPAN&gt; operation (which I don't believe has an efficient substitute on vivante GPU), you could do your shading in 2 passes. First pass will render into texture (attached to FBO) where you can do your de-mosaicing and 2nd pass from texture into native window for display. Do you need a code for that? I measured performance of that setup and rendering 2592x1944 input -&amp;gt; 2592x1944 texture -&amp;gt; 640x480 native window takes ~70ms/frame (for my grayscale processing which is essentially expanding Y8 to RGBA).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If you just want to put your final image into memory there is a way but I haven't tried it. It's covered in these threads:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A class="unlinked"&gt;https://community.freescale.com/thread/303338&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;A class="unlinked" title="https://github.com/Freescale/linux-module-virtfb"&gt;https://github.com/Freescale/linux-module-virtfb&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;A class="unlinked"&gt;https://community.freescale.com/thread/309677&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;A class="unlinked"&gt;https://community.freescale.com/message/292215#29221&lt;/A&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 30 Aug 2013 16:33:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278959#M31779</guid>
      <dc:creator>DraganOstojic</dc:creator>
      <dc:date>2013-08-30T16:33:52Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278960#M31780</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Dragan,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I will probably have to drop the DirectVIV trick too since the YUV/RGB clamping is not ok for me either. Too bad, but anyway in the meantime I realized that getting the output data is my real bottleneck (by far). I won't display the image, I just need to put my converted image in memory, and was planning on investigating the virtual framebuffer option, so thank you for the associated pointers.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 02 Sep 2013 06:17:33 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278960#M31780</guid>
      <dc:creator>julienheyman</dc:creator>
      <dc:date>2013-09-02T06:17:33Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278961#M31781</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Dear Mr Dragan,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do you guide more detail step 2,3,4,5? I don't known location you add new code, My camera is output raw format, and i can't preview it with Ipu of imx6, my target is android ICS. Please help me solve this issue. Thank you very much!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 18 Mar 2014 02:19:28 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278961#M31781</guid>
      <dc:creator>dinhbang</dc:creator>
      <dc:date>2014-03-18T02:19:28Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278962#M31782</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;SPAN style="color: #000000; font-family: Calibri, sans-serif; font-size: 16px;"&gt;Hi Dinh Bang, I can help you out getting GPU working. &lt;/SPAN&gt;&lt;/P&gt;&lt;P style="color: #000000; font-family: Calibri, sans-serif; font-size: 16px;"&gt;&lt;SPAN style="font-size: 12pt;"&gt;Do you have a gray scale or color Bayer raw format camera?&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 18 Mar 2014 16:45:04 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278962#M31782</guid>
      <dc:creator>DraganOstojic</dc:creator>
      <dc:date>2014-03-18T16:45:04Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278963#M31783</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Mr Dragan,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; My camera is a mipi camera 13mpx, it is only output RAW10 format and i have configured camera and edit file in kernel like here &lt;A href="https://github.com/mcmordie/linux/compare/johnweber:wandboard_imx_3.0.35_4.0.0...wandboard_imx_3.0.35_4.0.0" title="https://github.com/mcmordie/linux/compare/johnweber:wandboard_imx_3.0.35_4.0.0...wandboard_imx_3.0.35_4.0.0"&gt;Comparing johnweber:wandboard_imx_3.0.35_4.0.0...mcmordie:wandboard_imx_3.0.35_4.0.0 · mcmordie/linux · GitHub&lt;/A&gt; . I &lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 12px;"&gt;use generic mode to receive input bayer&amp;nbsp; raw data to memory because IPU don't &lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 12px;"&gt;support converting RAW 10 format to RGB/YUV on the fly , I found your discussion but i don't know location you add new code configure for GPU in HAL. Do you guide more detail step 2, 3, 4, 5? Sorry for my english, thank you!&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 19 Mar 2014 01:53:34 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278963#M31783</guid>
      <dc:creator>dinhbang</dc:creator>
      <dc:date>2014-03-19T01:53:34Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278964#M31784</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;SPAN style="color: #000000; font-family: Calibri, sans-serif; font-size: 16px;"&gt;Hi Dinh Bang, if you have your mipi capture working that's great and it's not difficult to get GPU working. Just to let you know, I didn't do de-mosaicing because my camera was gray scale so I can't help you with the actual de-mosaicing algorithm.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000; font-family: Calibri, sans-serif; font-size: 16px;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000; font-family: Calibri, sans-serif; font-size: 16px;"&gt;I'm not in office right now, but tomorrow I'll let you know the details.&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000; font-family: Calibri, sans-serif; font-size: 16px;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000; font-family: Calibri, sans-serif; font-size: 16px;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 19 Mar 2014 02:13:00 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278964#M31784</guid>
      <dc:creator>DraganOstojic</dc:creator>
      <dc:date>2014-03-19T02:13:00Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278965#M31785</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks for your help, I will refer your way to apply for my problem.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 19 Mar 2014 02:32:49 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278965#M31785</guid>
      <dc:creator>dinhbang</dc:creator>
      <dc:date>2014-03-19T02:32:49Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278966#M31786</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Dragan, I don't understand step 2:"&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 10pt; line-height: 1.5em;"&gt;Preview window is pre-connected to NATIVE_WINDOW_API_CAMERA so it has to be disconnected before step 3" So I may need to add "&lt;SPAN style="color: #3d3d3d; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;native_window_api_disconnect(aNativeWindow, NATIVE_WINDOW_API_CAMERA);&lt;/SPAN&gt;" to the function? And at step 4, How to map capture buffers to the GPU textures?&amp;nbsp; I don't have experience about GPU, I will really appreciate if you help&lt;/SPAN&gt;.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 26 Mar 2014 02:26:20 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278966#M31786</guid>
      <dc:creator>dinhbang</dc:creator>
      <dc:date>2014-03-26T02:26:20Z</dc:date>
    </item>
    <item>
      <title>Re: How to insert GPU shading between camera capture and preview window</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278967#M31787</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;SPAN style="color: #000000; font-family: Arial;"&gt;Hi, @Dragan Ostojic, I have been recently working on supporting MT9P006 image sensor on Linux/MX6Q platform. &lt;SPAN style="color: #000000; font-family: Arial;"&gt;The output data from MT9P006 are 12 bit bayer raw data, and the image size is 640 x 480. &lt;/SPAN&gt;&lt;SPAN style="color: #000000; font-family: Arial;"&gt;To make&amp;nbsp; things easy, we configure csi data width as 16 bit Bayer /Generic data, &lt;SPAN style="color: #000000; font-family: Arial;"&gt;and the input path&amp;nbsp; is CSI-&amp;gt;SMFC-&amp;gt;IDMAC-&amp;gt;Mem. At last, &lt;SPAN style="color: #000000; font-family: Arial;"&gt;I got the bayer data and convert it to ARGB use interpolation method, but it is a really slow way. &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;As you have mentioned, we can convert bayer format in the shader use GPU, but I really don't know how to do it, could give me some advice about it?&amp;nbsp; Or share some full example about it, my email is &lt;/SPAN&gt;&lt;A class="jive-link-email-small" href="mailto:liubin101015@outlook.com"&gt;liubin101015@outlook.com&lt;/A&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000; font-family: Arial;"&gt;Thanks&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 05 Feb 2016 01:03:37 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/How-to-insert-GPU-shading-between-camera-capture-and-preview/m-p/278967#M31787</guid>
      <dc:creator>clound920419</dc:creator>
      <dc:date>2016-02-05T01:03:37Z</dc:date>
    </item>
  </channel>
</rss>

