// 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