/* * context_priv.cpp - capi private context * * Copyright (c) 2017 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Author: Wind Yuan */ #include "context_priv.h" #include #include #include #include #include #include #include #include #include #include #include #include using namespace XCam; #define DEFAULT_INPUT_BUFFER_POOL_COUNT 20 static const char *HandleNames[] = { "None", "3DNR", "WaveletNR", "Fisheye", "Defog", "DVS", "Stitch", }; bool handle_name_equal (const char *name, HandleType type) { return !strncmp (name, HandleNames[type], strlen(HandleNames[type])); } ContextBase::ContextBase (HandleType type) : _type (type) , _usage (NULL) , _image_width (0) , _image_height (0) , _alloc_out_buf (false) { if (!_inbuf_pool.ptr()) { SmartPtr pool = new CLVideoBufferPool (); XCAM_ASSERT (pool.ptr ()); _inbuf_pool = pool; } } ContextBase::~ContextBase () { xcam_free (_usage); } const char* ContextBase::get_type_name () const { XCAM_ASSERT ((int)_type < sizeof(HandleNames) / sizeof (HandleNames[0])); return HandleNames [_type]; } static const char* find_value (const ContextParams ¶m_list, const char *name) { ContextParams::const_iterator i = param_list.find (name); if (i != param_list.end ()) return (i->second); return NULL; } XCamReturn ContextBase::set_parameters (ContextParams ¶m_list) { VideoBufferInfo buf_info; uint32_t image_format = V4L2_PIX_FMT_NV12; _image_width = 1920; _image_height = 1080; const char *width = find_value (param_list, "width"); if (width) { _image_width = atoi(width); } const char *height = find_value (param_list, "height"); if (height) { _image_height = atoi(height); } if (_image_width == 0 || _image_height == 0) { XCAM_LOG_ERROR ("illegal image size width:%d height:%d", _image_width, _image_height); return XCAM_RETURN_ERROR_PARAM; } buf_info.init (image_format, _image_width, _image_height); _inbuf_pool->set_video_info (buf_info); if (!_inbuf_pool->reserve (DEFAULT_INPUT_BUFFER_POOL_COUNT)) { XCAM_LOG_ERROR ("init buffer pool failed"); return XCAM_RETURN_ERROR_MEM; } const char *flag = find_value (param_list, "alloc-out-buf"); if (flag && !strncasecmp (flag, "true", strlen("true"))) { _alloc_out_buf = true; } else { _alloc_out_buf = false; } return XCAM_RETURN_NO_ERROR; } XCamReturn ContextBase::init_handler () { SmartPtr cl_context = CLDevice::instance()->get_context (); XCAM_FAIL_RETURN ( ERROR, cl_context.ptr (), XCAM_RETURN_ERROR_UNKNOWN, "ContextBase::init_handler(%s) failed since cl-context is NULL", get_type_name ()); SmartPtr handler = create_handler (cl_context); XCAM_FAIL_RETURN ( ERROR, handler.ptr (), XCAM_RETURN_ERROR_UNKNOWN, "ContextBase::init_handler(%s) create handler failed", get_type_name ()); handler->disable_buf_pool (!_alloc_out_buf); set_handler (handler); return XCAM_RETURN_NO_ERROR; } XCamReturn ContextBase::uinit_handler () { if (!_handler.ptr ()) return XCAM_RETURN_NO_ERROR; _handler->emit_stop (); _handler.release (); return XCAM_RETURN_NO_ERROR; } XCamReturn ContextBase::execute (SmartPtr &buf_in, SmartPtr &buf_out) { if (!_alloc_out_buf) { XCAM_FAIL_RETURN ( ERROR, buf_out.ptr (), XCAM_RETURN_ERROR_MEM, "context (%s) execute failed, buf_out need set.", get_type_name ()); } else { XCAM_FAIL_RETURN ( ERROR, !buf_out.ptr (), XCAM_RETURN_ERROR_MEM, "context (%s) execute failed, buf_out need NULL.", get_type_name ()); } return _handler->execute (buf_in, buf_out); } SmartPtr NR3DContext::create_handler (SmartPtr &context) { return create_cl_3d_denoise_image_handler ( context, CL_IMAGE_CHANNEL_Y | CL_IMAGE_CHANNEL_UV, 3); } SmartPtr NRWaveletContext::create_handler (SmartPtr &context) { return create_cl_newwavelet_denoise_image_handler ( context, CL_IMAGE_CHANNEL_UV | CL_IMAGE_CHANNEL_Y, false); } SmartPtr FisheyeContext::create_handler (SmartPtr &context) { return create_fisheye_handler (context); } SmartPtr DefogContext::create_handler (SmartPtr &context) { return create_cl_defog_dcp_image_handler (context);; } SmartPtr DVSContext::create_handler (SmartPtr &context) { return create_cl_image_warp_handler (context); } SmartPtr StitchContext::create_handler (SmartPtr &context) { uint32_t sttch_width = _image_width; uint32_t sttch_height = XCAM_ALIGN_UP (sttch_width / 2, 16); if (sttch_width != sttch_height * 2) { XCAM_LOG_ERROR ("incorrect stitch size width:%d height:%d", sttch_width, sttch_height); return NULL; } SurroundMode surround_mode = SphereView; StitchResMode res_mode = StitchRes1080P; if (_res_mode == StitchRes4K) res_mode = StitchRes4K; SmartPtr image_360 = create_image_360_stitch (context, _need_seam, _scale_mode, _fisheye_map, _need_lsc, surround_mode, res_mode).dynamic_cast_ptr (); XCAM_FAIL_RETURN (ERROR, image_360.ptr (), NULL, "create image stitch handler failed"); image_360->set_output_size (sttch_width, sttch_height); XCAM_LOG_INFO ("stitch output size width:%d height:%d", sttch_width, sttch_height); return image_360; }