| /* |
| * 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 <[email protected]> |
| */ |
| |
| #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); |
| } |
| |
| }; |