/* * isp_poll_thread.cpp - isp poll thread for event and buffer * * Copyright (c) 2014-2015 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 <feng.yuan@intel.com> * Author: Yinhang Liu <yinhangx.liu@intel.com> */ #include "isp_poll_thread.h" #include "x3a_statistics_queue.h" #include <unistd.h> namespace XCam { class IspPollThread; IspPollThread::IspPollThread () { XCAM_LOG_DEBUG ("IspPollThread constructed"); } IspPollThread::~IspPollThread () { stop(); XCAM_LOG_DEBUG ("~IspPollThread destructed"); } bool IspPollThread::set_isp_controller (SmartPtr<IspController> &isp) { XCAM_ASSERT (!_isp_controller.ptr()); _isp_controller = isp; return true; } XCamReturn IspPollThread::start () { _3a_stats_pool = new X3aStatisticsQueue; return PollThread::start (); } XCamReturn IspPollThread::stop () { if (_3a_stats_pool.ptr ()) _3a_stats_pool->stop (); return PollThread::stop (); } XCamReturn IspPollThread::init_3a_stats_pool () { XCamReturn ret = XCAM_RETURN_NO_ERROR; struct atomisp_parm parameters; xcam_mem_clear (parameters); ret = _isp_controller->get_isp_parameter (parameters); if (ret != XCAM_RETURN_NO_ERROR ) { XCAM_LOG_WARNING ("get isp parameters failed"); return ret; } if (!parameters.info.width || !parameters.info.height) { XCAM_LOG_WARNING ("get isp parameters width or height wrong"); return XCAM_RETURN_ERROR_ISP; } _3a_stats_pool.dynamic_cast_ptr<X3aStatisticsQueue>()->set_grid_info (parameters.info); if (!_3a_stats_pool->reserve (6)) { XCAM_LOG_WARNING ("init_3a_stats_pool failed to reserve stats buffer."); return XCAM_RETURN_ERROR_MEM; } return XCAM_RETURN_NO_ERROR; } XCamReturn IspPollThread::capture_3a_stats (SmartPtr<X3aStats> &stats) { XCamReturn ret = XCAM_RETURN_NO_ERROR; SmartPtr<X3aIspStatistics> new_stats = _3a_stats_pool->get_buffer (_3a_stats_pool).dynamic_cast_ptr<X3aIspStatistics> (); if (!new_stats.ptr()) { XCAM_LOG_WARNING ("request stats buffer failed."); return XCAM_RETURN_ERROR_MEM; } ret = _isp_controller->get_3a_statistics (new_stats); if (ret != XCAM_RETURN_NO_ERROR) { XCAM_LOG_WARNING ("get 3a stats from ISP failed"); return ret; } if (!new_stats->fill_standard_stats ()) { XCAM_LOG_WARNING ("isp 3a stats failed to fill standard stats but continued"); } stats = new_stats; return ret; } XCamReturn IspPollThread::handle_events (struct v4l2_event &event) { XCamReturn ret = XCAM_RETURN_NO_ERROR; switch (event.type) { case V4L2_EVENT_ATOMISP_3A_STATS_READY: ret = handle_3a_stats_event (event); break; case V4L2_EVENT_FRAME_SYNC: break; default: ret = XCAM_RETURN_ERROR_UNKNOWN; break; } return ret; } };