cl_3a: enabled display and fix 3a processor format

 * cl_3a_image_processor support most rgb and nv12 output
 * test-dev-manger support rgb display after 3a processing
 * local display with output format V4L2_PIX_FMT_XBGR32
   ./test-device-manager -f BA10 -m dma -c -d still -p
diff --git a/tests/test-device-manager.cpp b/tests/test-device-manager.cpp
index 74b611e..9dfd50a 100644
--- a/tests/test-device-manager.cpp
+++ b/tests/test-device-manager.cpp
@@ -27,7 +27,10 @@
 #include "x3a_analyzer_aiq.h"
 #endif
 #if HAVE_LIBCL
-#include "cl_image_processor.h"
+#include "cl_3a_image_processor.h"
+#endif
+#if HAVE_LIBDRM
+#include "drm_display.h"
 #endif
 
 #include <unistd.h>
@@ -47,7 +50,11 @@
         , _save_file (false)
         , _interval (1)
         , _frame_count (0)
-    {}
+    {
+#if HAVE_LIBDRM
+        _display = DrmDisplay::instance();
+#endif
+    }
 
     ~MainDeviceManager () {
         close_file ();
@@ -64,6 +71,8 @@
     virtual void handle_message (SmartPtr<XCamMessage> &msg);
     virtual void handle_buffer (SmartPtr<VideoBuffer> &buf);
 
+    int display_buf (SmartPtr<VideoBuffer> &buf);
+
 private:
     void open_file ();
     void close_file ();
@@ -72,6 +81,7 @@
     bool       _save_file;
     uint32_t   _interval;
     uint32_t   _frame_count;
+    SmartPtr<DrmDisplay> _display;
 };
 
 void
@@ -83,6 +93,8 @@
 void
 MainDeviceManager::handle_buffer (SmartPtr<VideoBuffer> &buf)
 {
+    display_buf (buf);
+
     if (!_save_file)
         return ;
 
@@ -123,6 +135,27 @@
     }
 }
 
+int
+MainDeviceManager::display_buf (SmartPtr<VideoBuffer> &buf)
+{
+#if HAVE_LIBDRM
+    XCamReturn ret = XCAM_RETURN_NO_ERROR;
+    const VideoBufferInfo & frame_info = buf->get_video_info ();
+    struct v4l2_rect rect = { 0, 0, (int)frame_info.width, (int)frame_info.height };
+
+    if (!_display->is_render_inited ()) {
+        ret = _display->render_init (9, 3, 1920, 1080, frame_info.format, &rect);
+        CHECK (ret, "display failed on render_init");
+    }
+    ret = _display->render_setup_frame_buffer (buf);
+    CHECK (ret, "display failed on framebuf set");
+    ret = _display->render_buffer (buf);
+    CHECK (ret, "display failed on rendering");
+#endif
+    return 0;
+}
+
+
 void
 MainDeviceManager::open_file ()
 {
@@ -173,6 +206,7 @@
             "\t              pixel_fmt select from [NV12, YUYV, BA10], default is [NV12]\n"
             "\t -d cap_mode  specify capture mode\n"
             "\t              cap_mode select from [video, still], default is [video]\n"
+            "\t -p           preview on local display\n"
             "\t -h           help\n"
             , bin_name
             , DEFAULT_SAVE_FILE_NAME);
@@ -186,18 +220,23 @@
     SmartPtr<V4l2SubDevice> event_device;
     SmartPtr<IspController> isp_controller;
     SmartPtr<X3aAnalyzer> analyzer;
-    SmartPtr<ImageProcessor> processor;
+    SmartPtr<ImageProcessor> isp_processor;
+#if HAVE_LIBDRM
+    SmartPtr<DrmDisplay> drm_disp = DrmDisplay::instance();
+#endif
+
 #if HAVE_LIBCL
-    SmartPtr<CLImageProcessor> cl_processor;
+    SmartPtr<CL3aImageProcessor> cl_processor;
 #endif
     bool have_cl_processor = false;
+    bool need_display = false;
     enum v4l2_memory v4l2_mem_type = V4L2_MEMORY_MMAP;
     const char *bin_name = argv[0];
     int opt;
     uint32_t capture_mode = V4L2_CAPTURE_MODE_VIDEO;
     uint32_t pixel_format = V4L2_PIX_FMT_NV12;
 
-    while ((opt =  getopt(argc, argv, "sca:n:m:f:d:h")) != -1) {
+    while ((opt =  getopt(argc, argv, "sca:n:m:f:d:ph")) != -1) {
         switch (opt) {
         case 'a': {
             if (!strcmp (optarg, "simple"))
@@ -249,6 +288,9 @@
                 return -1;
             }
             break;
+        case 'p':
+            need_display = true;
+            break;
         case 'h':
             print_help (bin_name);
             return 0;
@@ -271,8 +313,8 @@
         event_device = new V4l2SubDevice (DEFAULT_EVENT_DEVICE);
     if (!isp_controller.ptr ())
         isp_controller = new IspController (device);
-    if (!processor.ptr ())
-        processor = new IspImageProcessor (isp_controller);
+    if (!isp_processor.ptr ())
+        isp_processor = new IspImageProcessor (isp_controller);
     //if (!analyzer.ptr())
     //    analyzer = new X3aAnalyzerSimple ();
 
@@ -309,13 +351,18 @@
     device_manager->set_isp_controller (isp_controller);
     if (analyzer.ptr())
         device_manager->set_analyzer (analyzer);
-    device_manager->add_image_processor (processor);
+    device_manager->add_image_processor (isp_processor);
 #if HAVE_LIBCL
     if (have_cl_processor) {
-        cl_processor = new CLImageProcessor ();
+        cl_processor = new CL3aImageProcessor ();
+        cl_processor->set_hdr (true);
+        if (need_display) {
+            cl_processor->set_output_format (V4L2_PIX_FMT_XBGR32);
+        }
         device_manager->add_image_processor (cl_processor);
     }
 #endif
+
     ret = device_manager->start ();
     CHECK (ret, "device manager start failed");
 
diff --git a/xcore/cl_3a_image_processor.cpp b/xcore/cl_3a_image_processor.cpp
index 591e7a6..17c9252 100644
--- a/xcore/cl_3a_image_processor.cpp
+++ b/xcore/cl_3a_image_processor.cpp
@@ -30,6 +30,7 @@
     : CLImageProcessor ("CL3aImageProcessor")
     , _output_fourcc (V4L2_PIX_FMT_NV12)
     , _enable_hdr (false)
+    , _out_smaple_type (OutSampleYuv)
 {
     XCAM_LOG_DEBUG ("CL3aImageProcessor constructed");
 }
@@ -42,12 +43,25 @@
 bool
 CL3aImageProcessor::set_output_format (uint32_t fourcc)
 {
-    XCAM_FAIL_RETURN (
-        WARNING,
-        fourcc == V4L2_PIX_FMT_NV12 || fourcc == V4L2_PIX_FMT_RGB32,
-        false,
-        "CL3aImageProcessor doesn't support format(%s) output",
-        xcam_fourcc_to_string (fourcc));
+    switch (fourcc) {
+    case XCAM_PIX_FMT_RGBA64:
+    case V4L2_PIX_FMT_XBGR32:
+    case V4L2_PIX_FMT_ABGR32:
+    case V4L2_PIX_FMT_BGR32:
+    case V4L2_PIX_FMT_RGB32:
+    case V4L2_PIX_FMT_ARGB32:
+    case V4L2_PIX_FMT_XRGB32:
+        _out_smaple_type = OutSampleRGB;
+        break;
+    case V4L2_PIX_FMT_NV12:
+        _out_smaple_type = OutSampleYuv;
+        break;
+    default:
+        XCAM_LOG_WARNING (
+            "cl 3a processor doesn't support output format:%s",
+            xcam_fourcc_to_string(fourcc));
+        return false;
+    }
 
     _output_fourcc = fourcc;
     return true;
@@ -92,16 +106,6 @@
         "CL3aImageProcessor create blc handler failed");
     add_handler (image_handler);
 
-    /* demosaic */
-    image_handler = create_cl_demosaic_image_handler (context);
-    _demosaic = image_handler.dynamic_cast_ptr<CLBayer2RGBImageHandler> ();
-    XCAM_FAIL_RETURN (
-        WARNING,
-        _demosaic.ptr (),
-        XCAM_RETURN_ERROR_CL,
-        "CL3aImageProcessor create demosaic handler failed");
-    add_handler (image_handler);
-
     /* hdr */
     if (_enable_hdr) {
         image_handler = create_cl_hdr_image_handler (context);
@@ -114,8 +118,18 @@
         add_handler (image_handler);
     }
 
+    /* demosaic */
+    image_handler = create_cl_demosaic_image_handler (context);
+    _demosaic = image_handler.dynamic_cast_ptr<CLBayer2RGBImageHandler> ();
+    XCAM_FAIL_RETURN (
+        WARNING,
+        _demosaic.ptr (),
+        XCAM_RETURN_ERROR_CL,
+        "CL3aImageProcessor create demosaic handler failed");
+    add_handler (image_handler);
+
     /* color space conversion */
-    if (_output_fourcc == V4L2_PIX_FMT_NV12) {
+    if (_out_smaple_type == OutSampleYuv) {
         image_handler = create_cl_csc_image_handler (context, CL_CSC_TYPE_RGBATONV12);
         _csc = image_handler.dynamic_cast_ptr<CLCscImageHandler> ();
         XCAM_FAIL_RETURN (
@@ -124,6 +138,8 @@
             XCAM_RETURN_ERROR_CL,
             "CL3aImageProcessor create csc handler failed");
         add_handler (image_handler);
+    } else if (_out_smaple_type == OutSampleRGB) {
+        _demosaic->set_output_format (_output_fourcc);
     }
 
     return XCAM_RETURN_NO_ERROR;
diff --git a/xcore/cl_3a_image_processor.h b/xcore/cl_3a_image_processor.h
index 56c8b3f..e0f7507 100644
--- a/xcore/cl_3a_image_processor.h
+++ b/xcore/cl_3a_image_processor.h
@@ -32,6 +32,12 @@
 class CL3aImageProcessor
     : public CLImageProcessor
 {
+    enum OutSampleType {
+        OutSampleYuv,
+        OutSampleRGB,
+        OutSampleBayer,
+    };
+
 public:
     explicit CL3aImageProcessor ();
     virtual ~CL3aImageProcessor ();
@@ -55,11 +61,12 @@
 private:
     uint32_t                           _output_fourcc;
     bool                               _enable_hdr;
+    OutSampleType                      _out_smaple_type;
 
     SmartPtr<CLImageHandler>           _black_level;
     SmartPtr<CLBayer2RGBImageHandler>  _demosaic;
     SmartPtr<CLImageHandler>           _hdr;
-    SmartPtr<CLCscImageHandler>  _csc;
+    SmartPtr<CLCscImageHandler>        _csc;
 };
 
 };