| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/camera/lib/image_utils/blc.h" |
| |
| #include <array> |
| |
| #include "src/camera/lib/image_utils/raw12_writer.h" |
| |
| namespace camera { |
| |
| BlcResult BlcRaw12(const zx::vmo* vmo, uint32_t width, uint32_t height, uint8_t bytes_per_pixel) { |
| std::vector<uint8_t> buf(width * height * bytes_per_pixel); |
| std::pair<uint16_t, uint16_t> pixel_pair; |
| |
| vmo->read(&buf.front(), 0, buf.size()); |
| |
| std::array<uint8_t, kBytesPerDoublePixel> mega_pixel; |
| uint32_t r = 0, gr = 0, gb = 0, b = 0; |
| uint32_t num_r = 0, num_b = 0; |
| |
| for (uint32_t i = 0; i < buf.size(); i += bytes_per_pixel) { |
| mega_pixel[0] = buf[i]; |
| mega_pixel[1] = buf[i + 1]; |
| mega_pixel[2] = buf[i + 2]; |
| pixel_pair = DoublePixelToPixelValues(mega_pixel); |
| |
| if ((i / width / bytes_per_pixel) % 2 == 0) { |
| camera::AddValsFromPairToTargetInts(&r, &gr, pixel_pair); |
| ++num_r; |
| } else { |
| camera::AddValsFromPairToTargetInts(&gb, &b, pixel_pair); |
| ++num_b; |
| } |
| } |
| |
| uint32_t avg_r = r / num_r, avg_gr = gr / num_r, avg_gb = gb / num_b, avg_b = b / num_b; |
| |
| return BlcResult{avg_r, avg_gr, avg_gb, avg_b}; |
| } |
| |
| void AddValsFromPairToTargetInts(uint32_t* first_val, uint32_t* second_val, |
| std::pair<uint16_t, uint16_t> p) { |
| *first_val += p.first; |
| *second_val += p.second; |
| } |
| |
| } // namespace camera |