/* * x3a_stats_pool.cpp - 3a stats pool * * Copyright (c) 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> */ #include "x3a_stats_pool.h" #define XCAM_3A_STATS_DEFAULT_BIT_DEPTH 8 namespace XCam { X3aStatsData::X3aStatsData (XCam3AStats *data) : _data (data) { XCAM_ASSERT (_data); } X3aStatsData::~X3aStatsData () { if (_data) xcam_free (_data); } uint8_t * X3aStatsData::map () { return (uint8_t*)(intptr_t)(_data); } bool X3aStatsData::unmap () { return true; } X3aStats::X3aStats (const SmartPtr<X3aStatsData> &data) : BufferProxy (SmartPtr<BufferData>(data)) { } XCam3AStats * X3aStats::get_stats () { SmartPtr<BufferData> data = get_buffer_data (); SmartPtr<X3aStatsData> stats = data.dynamic_cast_ptr<X3aStatsData> (); XCAM_FAIL_RETURN( WARNING, stats.ptr(), NULL, "X3aStats get_stats failed with NULL"); return stats->get_stats (); } X3aStatsPool::X3aStatsPool () : _bit_depth (XCAM_3A_STATS_DEFAULT_BIT_DEPTH) { } void X3aStatsPool::set_stats_info (const XCam3AStatsInfo &info) { _stats_info = info; } bool X3aStatsPool::fixate_video_info (VideoBufferInfo &info) { const uint32_t grid = 16; _stats_info.aligned_width = (info.width + grid - 1) / grid; _stats_info.aligned_height = (info.height + grid - 1) / grid; _stats_info.width = info.width / grid; _stats_info.height = info.height / grid; _stats_info.grid_pixel_size = grid; _stats_info.bit_depth = _bit_depth; _stats_info.histogram_bins = (1 << _bit_depth); return true; } SmartPtr<BufferData> X3aStatsPool::allocate_data (const VideoBufferInfo &buffer_info) { XCAM_UNUSED (buffer_info); XCam3AStats *stats = NULL; stats = (XCam3AStats *) xcam_malloc0 ( sizeof (XCam3AStats) + sizeof (XCamHistogram) * _stats_info.histogram_bins + sizeof (uint32_t) * _stats_info.histogram_bins + sizeof (XCamGridStat) * _stats_info.aligned_width * _stats_info.aligned_height); XCAM_ASSERT (stats); stats->info = _stats_info; stats->hist_rgb = (XCamHistogram *) (stats->stats + _stats_info.aligned_width * _stats_info.aligned_height); stats->hist_y = (uint32_t *) (stats->hist_rgb + _stats_info.histogram_bins); return new X3aStatsData (stats); } SmartPtr<BufferProxy> X3aStatsPool::create_buffer_from_data (SmartPtr<BufferData> &data) { SmartPtr<X3aStatsData> stats_data = data.dynamic_cast_ptr<X3aStatsData> (); XCAM_ASSERT (stats_data.ptr ()); return new X3aStats (stats_data); } };