diff options
Diffstat (limited to 'xcore/image_handler.cpp')
-rw-r--r-- | xcore/image_handler.cpp | 121 |
1 files changed, 115 insertions, 6 deletions
diff --git a/xcore/image_handler.cpp b/xcore/image_handler.cpp index 6e47a62..2dabc97 100644 --- a/xcore/image_handler.cpp +++ b/xcore/image_handler.cpp @@ -23,7 +23,10 @@ namespace XCam { ImageHandler::ImageHandler (const char* name) - : _name (NULL) + : _need_configure (true) + , _enable_allocator (true) + , _buf_capacity (XCAM_DEFAULT_HANDLER_BUF_CAP) + , _name (NULL) { if (name) _name = strndup (name, XCAM_MAX_STR_SIZE); @@ -35,21 +38,127 @@ ImageHandler::~ImageHandler() } bool +ImageHandler::set_out_video_info (const VideoBufferInfo &info) +{ + XCAM_ASSERT (info.width && info.height && info.format); + _out_video_info = info; + return true; +} + +bool +ImageHandler::enable_allocator (bool enable, uint32_t buf_count) +{ + + if (enable && !buf_count) { + XCAM_LOG_ERROR ( + "ImageHandler(%s) enable allocator must with buf_count>0", XCAM_STR(get_name ())); + return false; + } + + _enable_allocator = enable; + if (enable) + _buf_capacity = buf_count; + + return true; +} + +bool ImageHandler::set_allocator (const SmartPtr<BufferPool> &allocator) { XCAM_FAIL_RETURN ( ERROR, allocator.ptr (), false, - "softhandler(%s) set allocator(is NULL)", XCAM_STR(get_name ())); + "ImageHandler(%s) set allocator(is NULL)", XCAM_STR(get_name ())); _allocator = allocator; return true; } XCamReturn -ImageHandler::finish () +ImageHandler::configure_rest () { + if (_enable_allocator) { + XCAM_FAIL_RETURN ( + ERROR, _out_video_info.is_valid (), XCAM_RETURN_ERROR_PARAM, + "image_hander(%s) configure reset failed before reserver buffer since out_video_info was not set", + XCAM_STR (get_name ())); + + SmartPtr<BufferPool> allocator = create_allocator (); + XCAM_FAIL_RETURN ( + ERROR, allocator.ptr (), XCAM_RETURN_ERROR_PARAM, + "image_hander(%s) configure reset failed since allocator not created", XCAM_STR (get_name ())); + _allocator = allocator; + XCamReturn ret = reserve_buffers (_out_video_info, _buf_capacity); + XCAM_FAIL_RETURN ( + ERROR, xcam_ret_is_ok (ret), ret, + "soft_hander(%s) configure resource failed in reserving buffers", XCAM_STR (get_name ())); + } return XCAM_RETURN_NO_ERROR; } +XCamReturn +ImageHandler::execute_buffer (const SmartPtr<ImageHandler::Parameters> ¶m, bool sync) +{ + XCAM_UNUSED (sync); + + XCamReturn ret = XCAM_RETURN_NO_ERROR; + + XCAM_FAIL_RETURN ( + ERROR, param.ptr (), XCAM_RETURN_ERROR_PARAM, + "image_handler(%s) execute buffer failed, params is null", + XCAM_STR (get_name ())); + + if (_need_configure) { + ret = configure_resource (param); + XCAM_FAIL_RETURN ( + WARNING, xcam_ret_is_ok (ret), ret, + "image_handler(%s) configure resource failed", XCAM_STR (get_name ())); + + ret = configure_rest (); + XCAM_FAIL_RETURN ( + WARNING, xcam_ret_is_ok (ret), ret, + "image_handler(%s) configure rest failed", XCAM_STR (get_name ())); + _need_configure = false; + } + + if (!param->out_buf.ptr () && _enable_allocator) { + param->out_buf = get_free_buf (); + XCAM_FAIL_RETURN ( + ERROR, param->out_buf.ptr (), XCAM_RETURN_ERROR_PARAM, + "image_handler:%s execute buffer failed, output buffer failed in allocation.", + XCAM_STR (get_name ())); + } + + ret = start_work (param); + XCAM_FAIL_RETURN ( + ERROR, xcam_ret_is_ok (ret), ret, + "image_handler(%s) execute buffer failed in starting workers", XCAM_STR (get_name ())); + + return ret; +} + +void +ImageHandler::execute_done (const SmartPtr<ImageHandler::Parameters> ¶m, XCamReturn err) +{ + XCAM_ASSERT (param.ptr ()); + + if (err < XCAM_RETURN_NO_ERROR) { + XCAM_LOG_WARNING ( + "image_handler(%s) broken with errno %d", XCAM_STR (get_name ()), (int)err); + return ; + } + + if (err > XCAM_RETURN_NO_ERROR) { + XCAM_LOG_WARNING ( + "image_handler(%s) continued with errno %d", XCAM_STR (get_name ()), (int)err); + } + + execute_status_check (param, err); +} + +XCamReturn +ImageHandler::finish () +{ + return XCAM_RETURN_NO_ERROR; +} XCamReturn ImageHandler::terminate () @@ -72,13 +181,13 @@ ImageHandler::reserve_buffers (const VideoBufferInfo &info, uint32_t count) { XCAM_FAIL_RETURN ( ERROR, _allocator.ptr (), XCAM_RETURN_ERROR_PARAM, - "softhandler(%s) reserve buffers failed, alloctor was not set", XCAM_STR(get_name ())); + "ImageHandler(%s) reserve buffers failed, alloctor was not set", XCAM_STR(get_name ())); _allocator->set_video_info (info); XCAM_FAIL_RETURN ( ERROR, _allocator->reserve (count), XCAM_RETURN_ERROR_MEM, - "softhandler(%s) reserve buffers(%d) failed", XCAM_STR(get_name ()), count); + "ImageHandler(%s) reserve buffers(%d) failed", XCAM_STR(get_name ()), count); return XCAM_RETURN_NO_ERROR; } @@ -88,7 +197,7 @@ ImageHandler::get_free_buf () { XCAM_FAIL_RETURN ( ERROR, _allocator.ptr (), NULL, - "softhandler(%s) get free buffer failed since allocator was not initilized", XCAM_STR(get_name ())); + "ImageHandler(%s) get free buffer failed since allocator was not initilized", XCAM_STR(get_name ())); return _allocator->get_buffer (_allocator); } |