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;
};
};