| /* |
| * Copyright (C) 2019 The Android Open Source Project |
| * |
| * 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. |
| */ |
| |
| #include <ui/GraphicTypes.h> // ui::Dataspace |
| #include <ui/PublicFormat.h> |
| |
| // ---------------------------------------------------------------------------- |
| namespace android { |
| // ---------------------------------------------------------------------------- |
| |
| using ui::Dataspace; |
| |
| int mapPublicFormatToHalFormat(PublicFormat f) { |
| switch (f) { |
| case PublicFormat::JPEG: |
| case PublicFormat::DEPTH_POINT_CLOUD: |
| case PublicFormat::DEPTH_JPEG: |
| case PublicFormat::HEIC: |
| return HAL_PIXEL_FORMAT_BLOB; |
| case PublicFormat::DEPTH16: |
| return HAL_PIXEL_FORMAT_Y16; |
| case PublicFormat::RAW_SENSOR: |
| case PublicFormat::RAW_DEPTH: |
| return HAL_PIXEL_FORMAT_RAW16; |
| default: |
| // Most formats map 1:1 |
| return static_cast<int>(f); |
| } |
| } |
| |
| android_dataspace mapPublicFormatToHalDataspace(PublicFormat f) { |
| Dataspace dataspace; |
| switch (f) { |
| case PublicFormat::JPEG: |
| dataspace = Dataspace::V0_JFIF; |
| break; |
| case PublicFormat::DEPTH_POINT_CLOUD: |
| case PublicFormat::DEPTH16: |
| case PublicFormat::RAW_DEPTH: |
| dataspace = Dataspace::DEPTH; |
| break; |
| case PublicFormat::RAW_SENSOR: |
| case PublicFormat::RAW_PRIVATE: |
| case PublicFormat::RAW10: |
| case PublicFormat::RAW12: |
| dataspace = Dataspace::ARBITRARY; |
| break; |
| case PublicFormat::YUV_420_888: |
| case PublicFormat::NV21: |
| case PublicFormat::YV12: |
| dataspace = Dataspace::V0_JFIF; |
| break; |
| case PublicFormat::DEPTH_JPEG: |
| dataspace = Dataspace::DYNAMIC_DEPTH; |
| break; |
| case PublicFormat::HEIC: |
| dataspace = Dataspace::HEIF; |
| break; |
| default: |
| // Most formats map to UNKNOWN |
| dataspace = Dataspace::UNKNOWN; |
| break; |
| } |
| return static_cast<android_dataspace>(dataspace); |
| } |
| |
| PublicFormat mapHalFormatDataspaceToPublicFormat(int format, android_dataspace dataSpace) { |
| Dataspace ds = static_cast<Dataspace>(dataSpace); |
| switch (format) { |
| case HAL_PIXEL_FORMAT_RGBA_8888: |
| case HAL_PIXEL_FORMAT_RGBX_8888: |
| case HAL_PIXEL_FORMAT_RGBA_FP16: |
| case HAL_PIXEL_FORMAT_RGBA_1010102: |
| case HAL_PIXEL_FORMAT_RGB_888: |
| case HAL_PIXEL_FORMAT_RGB_565: |
| case HAL_PIXEL_FORMAT_Y8: |
| case HAL_PIXEL_FORMAT_RAW10: |
| case HAL_PIXEL_FORMAT_RAW12: |
| case HAL_PIXEL_FORMAT_YCbCr_420_888: |
| case HAL_PIXEL_FORMAT_YV12: |
| // Enums overlap in both name and value |
| return static_cast<PublicFormat>(format); |
| case HAL_PIXEL_FORMAT_RAW16: |
| switch (ds) { |
| case Dataspace::DEPTH: |
| return PublicFormat::RAW_DEPTH; |
| default: |
| return PublicFormat::RAW_SENSOR; |
| } |
| case HAL_PIXEL_FORMAT_RAW_OPAQUE: |
| // Name differs, though value is the same |
| return PublicFormat::RAW_PRIVATE; |
| case HAL_PIXEL_FORMAT_YCbCr_422_SP: |
| // Name differs, though the value is the same |
| return PublicFormat::NV16; |
| case HAL_PIXEL_FORMAT_YCrCb_420_SP: |
| // Name differs, though the value is the same |
| return PublicFormat::NV21; |
| case HAL_PIXEL_FORMAT_YCbCr_422_I: |
| // Name differs, though the value is the same |
| return PublicFormat::YUY2; |
| case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: |
| // Name differs, though the value is the same |
| return PublicFormat::PRIVATE; |
| case HAL_PIXEL_FORMAT_Y16: |
| // Dataspace-dependent |
| switch (ds) { |
| case Dataspace::DEPTH: |
| return PublicFormat::DEPTH16; |
| default: |
| // Assume non-depth Y16 is just Y16. |
| return PublicFormat::Y16; |
| } |
| case HAL_PIXEL_FORMAT_BLOB: |
| // Dataspace-dependent |
| switch (ds) { |
| case Dataspace::DEPTH: |
| return PublicFormat::DEPTH_POINT_CLOUD; |
| case Dataspace::V0_JFIF: |
| return PublicFormat::JPEG; |
| case Dataspace::HEIF: |
| return PublicFormat::HEIC; |
| default: |
| if (dataSpace == static_cast<android_dataspace>(HAL_DATASPACE_DYNAMIC_DEPTH)) { |
| return PublicFormat::DEPTH_JPEG; |
| } else { |
| // Assume otherwise-marked blobs are also JPEG |
| return PublicFormat::JPEG; |
| } |
| } |
| case HAL_PIXEL_FORMAT_BGRA_8888: |
| // Not defined in public API |
| return PublicFormat::UNKNOWN; |
| |
| default: |
| return PublicFormat::UNKNOWN; |
| } |
| } |
| |
| // ---------------------------------------------------------------------------- |
| }; // namespace android |
| // ---------------------------------------------------------------------------- |