| // Copyright 2018 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 "lib/images/cpp/images.h" |
| |
| #include <zircon/assert.h> |
| |
| namespace images { |
| |
| // Overall bits per pixel, across all pixel data in the whole image. |
| size_t BitsPerPixel(const fuchsia::images::PixelFormat& pixel_format) { |
| switch (pixel_format) { |
| case fuchsia::images::PixelFormat::BGRA_8: |
| return 4u * 8u; |
| case fuchsia::images::PixelFormat::YUY2: |
| return 2u * 8u; |
| case fuchsia::images::PixelFormat::NV12: |
| return 12; |
| case fuchsia::images::PixelFormat::YV12: |
| return 12; |
| } |
| ZX_PANIC("Unknown Pixel Format: %d", static_cast<int>(pixel_format)); |
| return 0; |
| } |
| |
| size_t StrideBytesPerWidthPixel( |
| const fuchsia::images::PixelFormat& pixel_format) { |
| switch (pixel_format) { |
| case fuchsia::images::PixelFormat::BGRA_8: |
| return 4u; |
| case fuchsia::images::PixelFormat::YUY2: |
| return 2u; |
| case fuchsia::images::PixelFormat::NV12: |
| return 1u; |
| case fuchsia::images::PixelFormat::YV12: |
| return 1u; |
| } |
| ZX_PANIC("Unknown Pixel Format: %d", static_cast<int>(pixel_format)); |
| return 0; |
| } |
| |
| size_t MaxSampleAlignment(const fuchsia::images::PixelFormat& pixel_format) { |
| switch (pixel_format) { |
| case fuchsia::images::PixelFormat::BGRA_8: |
| return 4u; |
| case fuchsia::images::PixelFormat::YUY2: |
| return 2u; |
| case fuchsia::images::PixelFormat::NV12: |
| // In the sense that line stride "must preserve pixel alignment", which is |
| // what MaxSampleAlignment() is used for, NV12 ~~has (very roughly |
| // speaking) a pixel alignment of 2, ~~because the width of the Y plane in |
| // this implementation must be even, and ~because the interleaved UV data |
| // after the planar Y data is 2 bytes per sample, so we may as well |
| // require UV samples to remain aligned UV line to UV line. |
| return 2u; |
| case fuchsia::images::PixelFormat::YV12: |
| // In the sense that line stride "must preserve pixel alignment", which is |
| // what MaxSampleAlignment() is used for, YV12 ~~has (very roughly |
| // speaking) a pixel alignment of 2, ~~because the width of the Y plane in |
| // this implementation must be even. |
| return 2u; |
| } |
| ZX_PANIC("Unknown Pixel Format: %d", static_cast<int>(pixel_format)); |
| return 0; |
| } |
| |
| size_t ImageSize(const fuchsia::images::ImageInfo& image_info) { |
| ZX_DEBUG_ASSERT(image_info.tiling == fuchsia::images::Tiling::LINEAR); |
| switch (image_info.pixel_format) { |
| case fuchsia::images::PixelFormat::BGRA_8: |
| case fuchsia::images::PixelFormat::YUY2: |
| return image_info.height * image_info.stride; |
| case fuchsia::images::PixelFormat::NV12: |
| return image_info.height * image_info.stride * 3 / 2; |
| case fuchsia::images::PixelFormat::YV12: |
| return image_info.height * image_info.stride * 3 / 2; |
| } |
| ZX_PANIC("Unknown Pixel Format: %d", |
| static_cast<int>(image_info.pixel_format)); |
| return 0; |
| } |
| |
| } // namespace images |