diff --git a/automotive/evs/1.0/default/android.hardware.automotive.evs@1.0-service.rc b/automotive/evs/1.0/default/android.hardware.automotive.evs@1.0-service.rc index 117c249a51..8dcd9694b0 100644 --- a/automotive/evs/1.0/default/android.hardware.automotive.evs@1.0-service.rc +++ b/automotive/evs/1.0/default/android.hardware.automotive.evs@1.0-service.rc @@ -2,3 +2,4 @@ service vendor.evs-hal-mock /vendor/bin/hw/android.hardware.automotive.evs@1.0-s class hal user automotive_evs group automotive_evs + disabled # do not start automatically diff --git a/automotive/evs/1.0/vts/functional/Android.bp b/automotive/evs/1.0/vts/functional/Android.bp index 2ef33fdd11..8988bfd8b1 100644 --- a/automotive/evs/1.0/vts/functional/Android.bp +++ b/automotive/evs/1.0/vts/functional/Android.bp @@ -19,13 +19,15 @@ cc_test { srcs: [ "VtsHalEvsV1_0TargetTest.cpp", "FrameHandler.cpp", - "FormatConvert.cpp" ], defaults: ["VtsHalTargetTestDefaults"], shared_libs: [ "libui", ], - static_libs: ["android.hardware.automotive.evs@1.0"], + static_libs: [ + "android.hardware.automotive.evs@1.0", + "android.hardware.automotive.evs@common-default-lib", + ], test_suites: ["general-tests"], cflags: [ "-O0", diff --git a/automotive/evs/1.0/vts/functional/FormatConvert.h b/automotive/evs/1.0/vts/functional/FormatConvert.h deleted file mode 100644 index 4a94f996d0..0000000000 --- a/automotive/evs/1.0/vts/functional/FormatConvert.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2017 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. - */ - -#ifndef EVS_VTS_FORMATCONVERT_H -#define EVS_VTS_FORMATCONVERT_H - -#include -#include - - -// Given an image buffer in NV21 format (HAL_PIXEL_FORMAT_YCRCB_420_SP), output 32bit RGBx/BGRx -// values. The NV21 format provides a Y array of 8bit values, followed by a 1/2 x 1/2 interleaved -// U/V array. It assumes an even width and height for the overall image, and a horizontal -// stride that is an even multiple of 16 bytes for both the Y and UV arrays. -void copyNV21toRGB32(unsigned width, unsigned height, - uint8_t* src, - uint32_t* dst, unsigned dstStridePixels, - bool bgrxFormat = false); - -void copyNV21toBGR32(unsigned width, unsigned height, - uint8_t* src, - uint32_t* dst, unsigned dstStridePixels); - - -// Given an image buffer in YV12 format (HAL_PIXEL_FORMAT_YV12), output 32bit RGBx/BGRx values. -// The YV12 format provides a Y array of 8bit values, followed by a 1/2 x 1/2 U array, followed -// by another 1/2 x 1/2 V array. It assumes an even width and height for the overall image, -// and a horizontal stride that is an even multiple of 16 bytes for each of the Y, U, -// and V arrays. -void copyYV12toRGB32(unsigned width, unsigned height, - uint8_t* src, - uint32_t* dst, unsigned dstStridePixels, - bool bgrxFormat = false); - -void copyYV12toBGR32(unsigned width, unsigned height, - uint8_t* src, - uint32_t* dst, unsigned dstStridePixels); - -// Given an image buffer in YUYV format (HAL_PIXEL_FORMAT_YCBCR_422_I), output 32bit RGBx/BGRx -// values. The NV21 format provides a Y array of 8bit values, followed by a 1/2 x 1/2 interleaved -// U/V array. It assumes an even width and height for the overall image, and a horizontal -// stride that is an even multiple of 16 bytes for both the Y and UV arrays. -void copyYUYVtoRGB32(unsigned width, unsigned height, - uint8_t* src, unsigned srcStrideBytes, - uint32_t* dst, unsigned dstStrideBytes, - bool bgrxFormat = false); - -void copyYUYVtoBGR32(unsigned width, unsigned height, - uint8_t* src, unsigned srcStrideBytes, - uint32_t* dst, unsigned dstStrideBytes); - - -// Given an simple rectangular image buffer with an integer number of bytes per pixel, -// copy the pixel values into a new rectangular buffer (potentially with a different stride). -// This is typically used to copy RGBx data into an RGBx output buffer. -void copyMatchedInterleavedFormats(unsigned width, unsigned height, - void* src, unsigned srcStridePixels, - void* dst, unsigned dstStridePixels, - unsigned pixelSize); - -#endif // EVS_VTS_FORMATCONVERT_H diff --git a/automotive/evs/1.0/vts/functional/FrameHandler.cpp b/automotive/evs/1.0/vts/functional/FrameHandler.cpp index bc3790f385..6a01a44dfe 100644 --- a/automotive/evs/1.0/vts/functional/FrameHandler.cpp +++ b/automotive/evs/1.0/vts/functional/FrameHandler.cpp @@ -240,46 +240,47 @@ bool FrameHandler::copyBufferContents(const BufferDesc& tgtBuffer, tgt->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)&tgtPixels); if (srcPixels && tgtPixels) { + using namespace ::android::hardware::automotive::evs::common; if (tgtBuffer.format == HAL_PIXEL_FORMAT_RGBA_8888) { if (srcBuffer.format == HAL_PIXEL_FORMAT_YCRCB_420_SP) { // 420SP == NV21 - copyNV21toRGB32(width, height, - srcPixels, - tgtPixels, tgtBuffer.stride); + Utils::copyNV21toRGB32(width, height, + srcPixels, + tgtPixels, tgtBuffer.stride); } else if (srcBuffer.format == HAL_PIXEL_FORMAT_YV12) { // YUV_420P == YV12 - copyYV12toRGB32(width, height, - srcPixels, - tgtPixels, tgtBuffer.stride); + Utils::copyYV12toRGB32(width, height, + srcPixels, + tgtPixels, tgtBuffer.stride); } else if (srcBuffer.format == HAL_PIXEL_FORMAT_YCBCR_422_I) { // YUYV - copyYUYVtoRGB32(width, height, - srcPixels, srcBuffer.stride, - tgtPixels, tgtBuffer.stride); + Utils::copyYUYVtoRGB32(width, height, + srcPixels, srcBuffer.stride, + tgtPixels, tgtBuffer.stride); } else if (srcBuffer.format == tgtBuffer.format) { // 32bit RGBA - copyMatchedInterleavedFormats(width, height, - srcPixels, srcBuffer.stride, - tgtPixels, tgtBuffer.stride, - tgtBuffer.pixelSize); + Utils::copyMatchedInterleavedFormats(width, height, + srcPixels, srcBuffer.stride, + tgtPixels, tgtBuffer.stride, + tgtBuffer.pixelSize); } else { ALOGE("Camera buffer format is not supported"); success = false; } } else if (tgtBuffer.format == HAL_PIXEL_FORMAT_BGRA_8888) { if (srcBuffer.format == HAL_PIXEL_FORMAT_YCRCB_420_SP) { // 420SP == NV21 - copyNV21toBGR32(width, height, - srcPixels, - tgtPixels, tgtBuffer.stride); + Utils::copyNV21toBGR32(width, height, + srcPixels, + tgtPixels, tgtBuffer.stride); } else if (srcBuffer.format == HAL_PIXEL_FORMAT_YV12) { // YUV_420P == YV12 - copyYV12toBGR32(width, height, - srcPixels, - tgtPixels, tgtBuffer.stride); + Utils::copyYV12toBGR32(width, height, + srcPixels, + tgtPixels, tgtBuffer.stride); } else if (srcBuffer.format == HAL_PIXEL_FORMAT_YCBCR_422_I) { // YUYV - copyYUYVtoBGR32(width, height, - srcPixels, srcBuffer.stride, - tgtPixels, tgtBuffer.stride); + Utils::copyYUYVtoBGR32(width, height, + srcPixels, srcBuffer.stride, + tgtPixels, tgtBuffer.stride); } else if (srcBuffer.format == tgtBuffer.format) { // 32bit RGBA - copyMatchedInterleavedFormats(width, height, - srcPixels, srcBuffer.stride, - tgtPixels, tgtBuffer.stride, - tgtBuffer.pixelSize); + Utils::copyMatchedInterleavedFormats(width, height, + srcPixels, srcBuffer.stride, + tgtPixels, tgtBuffer.stride, + tgtBuffer.pixelSize); } else { ALOGE("Camera buffer format is not supported"); success = false; diff --git a/automotive/evs/common/utils/default/Android.bp b/automotive/evs/common/utils/default/Android.bp new file mode 100644 index 0000000000..7734f5c19e --- /dev/null +++ b/automotive/evs/common/utils/default/Android.bp @@ -0,0 +1,31 @@ +// +// 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. +// + +cc_library_static { + name: "android.hardware.automotive.evs@common-default-lib", + vendor_available: true, + relative_install_path: "hw", + cflags: [ + "-O0", + "-g", + ], + srcs: [ + "FormatConvert.cpp" + ], + export_include_dirs: ["include"], + shared_libs: [ + ], +} diff --git a/automotive/evs/1.0/vts/functional/FormatConvert.cpp b/automotive/evs/common/utils/default/FormatConvert.cpp similarity index 74% rename from automotive/evs/1.0/vts/functional/FormatConvert.cpp rename to automotive/evs/common/utils/default/FormatConvert.cpp index 3d82d32cac..d4c7da0363 100644 --- a/automotive/evs/1.0/vts/functional/FormatConvert.cpp +++ b/automotive/evs/common/utils/default/FormatConvert.cpp @@ -18,10 +18,15 @@ #include "FormatConvert.h" +namespace android { +namespace hardware { +namespace automotive { +namespace evs { +namespace common { // Round up to the nearest multiple of the given alignment value template -int align(int value) { +int Utils::align(int value) { static_assert((alignment && !(alignment & (alignment - 1))), "alignment must be a power of 2"); @@ -31,15 +36,17 @@ int align(int value) { // Limit the given value to the provided range. :) -static inline float clamp(float v, float min, float max) { +inline float Utils::clamp(float v, float min, float max) { if (v < min) return min; if (v > max) return max; return v; } -static uint32_t yuvToRgbx(const unsigned char Y, const unsigned char Uin, const unsigned char Vin, - bool bgrxFormat = false) { +uint32_t Utils::yuvToRgbx(const unsigned char Y, + const unsigned char Uin, + const unsigned char Vin, + bool bgrxFormat) { // Don't use this if you want to see the best performance. :) // Better to do this in a pixel shader if we really have to, but on actual // embedded hardware we expect to be able to texture directly from the YUV data @@ -67,10 +74,10 @@ static uint32_t yuvToRgbx(const unsigned char Y, const unsigned char Uin, const } -void copyNV21toRGB32(unsigned width, unsigned height, - uint8_t* src, - uint32_t* dst, unsigned dstStridePixels, - bool bgrxFormat) +void Utils::copyNV21toRGB32(unsigned width, unsigned height, + uint8_t* src, + uint32_t* dst, unsigned dstStridePixels, + bool bgrxFormat) { // The NV21 format provides a Y array of 8bit values, followed by a 1/2 x 1/2 interleaved // U/V array. It assumes an even width and height for the overall image, and a horizontal @@ -99,10 +106,10 @@ void copyNV21toRGB32(unsigned width, unsigned height, } -void copyYV12toRGB32(unsigned width, unsigned height, - uint8_t* src, - uint32_t* dst, unsigned dstStridePixels, - bool bgrxFormat) +void Utils::copyYV12toRGB32(unsigned width, unsigned height, + uint8_t* src, + uint32_t* dst, unsigned dstStridePixels, + bool bgrxFormat) { // The YV12 format provides a Y array of 8bit values, followed by a 1/2 x 1/2 U array, followed // by another 1/2 x 1/2 V array. It assumes an even width and height for the overall image, @@ -134,10 +141,10 @@ void copyYV12toRGB32(unsigned width, unsigned height, } -void copyYUYVtoRGB32(unsigned width, unsigned height, - uint8_t* src, unsigned srcStridePixels, - uint32_t* dst, unsigned dstStridePixels, - bool bgrxFormat) +void Utils::copyYUYVtoRGB32(unsigned width, unsigned height, + uint8_t* src, unsigned srcStridePixels, + uint32_t* dst, unsigned dstStridePixels, + bool bgrxFormat) { uint32_t* srcWords = (uint32_t*)src; @@ -167,34 +174,34 @@ void copyYUYVtoRGB32(unsigned width, unsigned height, } -void copyNV21toBGR32(unsigned width, unsigned height, - uint8_t* src, - uint32_t* dst, unsigned dstStridePixels) +void Utils::copyNV21toBGR32(unsigned width, unsigned height, + uint8_t* src, + uint32_t* dst, unsigned dstStridePixels) { return copyNV21toRGB32(width, height, src, dst, dstStridePixels, true); } -void copyYV12toBGR32(unsigned width, unsigned height, - uint8_t* src, - uint32_t* dst, unsigned dstStridePixels) +void Utils::copyYV12toBGR32(unsigned width, unsigned height, + uint8_t* src, + uint32_t* dst, unsigned dstStridePixels) { return copyYV12toRGB32(width, height, src, dst, dstStridePixels, true); } -void copyYUYVtoBGR32(unsigned width, unsigned height, - uint8_t* src, unsigned srcStridePixels, - uint32_t* dst, unsigned dstStridePixels) +void Utils::copyYUYVtoBGR32(unsigned width, unsigned height, + uint8_t* src, unsigned srcStridePixels, + uint32_t* dst, unsigned dstStridePixels) { return copyYUYVtoRGB32(width, height, src, srcStridePixels, dst, dstStridePixels, true); } -void copyMatchedInterleavedFormats(unsigned width, unsigned height, - void* src, unsigned srcStridePixels, - void* dst, unsigned dstStridePixels, - unsigned pixelSize) { +void Utils::copyMatchedInterleavedFormats(unsigned width, unsigned height, + void* src, unsigned srcStridePixels, + void* dst, unsigned dstStridePixels, + unsigned pixelSize) { for (unsigned row = 0; row < height; row++) { // Copy the entire row of pixel data memcpy(dst, src, width * pixelSize); @@ -204,3 +211,10 @@ void copyMatchedInterleavedFormats(unsigned width, unsigned height, dst = (uint8_t*)dst + dstStridePixels * pixelSize; } } + +} // namespace common +} // namespace evs +} // namespace automotive +} // namespace hardware +} // namespace android + diff --git a/automotive/evs/common/utils/default/include/FormatConvert.h b/automotive/evs/common/utils/default/include/FormatConvert.h new file mode 100644 index 0000000000..2bb89554da --- /dev/null +++ b/automotive/evs/common/utils/default/include/FormatConvert.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2017 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. + */ + +#ifndef EVS_VTS_FORMATCONVERT_H +#define EVS_VTS_FORMATCONVERT_H + +#include +#include + + +namespace android { +namespace hardware { +namespace automotive { +namespace evs { +namespace common { + +class Utils { +public: + // Given an image buffer in NV21 format (HAL_PIXEL_FORMAT_YCRCB_420_SP), output 32bit RGBx/BGRx + // values. The NV21 format provides a Y array of 8bit values, followed by a 1/2 x 1/2 interleaved + // U/V array. It assumes an even width and height for the overall image, and a horizontal + // stride that is an even multiple of 16 bytes for both the Y and UV arrays. + static void copyNV21toRGB32(unsigned width, unsigned height, + uint8_t* src, + uint32_t* dst, unsigned dstStridePixels, + bool bgrxFormat = false); + + static void copyNV21toBGR32(unsigned width, unsigned height, + uint8_t* src, + uint32_t* dst, unsigned dstStridePixels); + + + // Given an image buffer in YV12 format (HAL_PIXEL_FORMAT_YV12), output 32bit RGBx/BGRx values. + // The YV12 format provides a Y array of 8bit values, followed by a 1/2 x 1/2 U array, followed + // by another 1/2 x 1/2 V array. It assumes an even width and height for the overall image, + // and a horizontal stride that is an even multiple of 16 bytes for each of the Y, U, + // and V arrays. + static void copyYV12toRGB32(unsigned width, unsigned height, + uint8_t* src, + uint32_t* dst, unsigned dstStridePixels, + bool bgrxFormat = false); + + static void copyYV12toBGR32(unsigned width, unsigned height, + uint8_t* src, + uint32_t* dst, unsigned dstStridePixels); + + // Given an image buffer in YUYV format (HAL_PIXEL_FORMAT_YCBCR_422_I), output 32bit RGBx/BGRx + // values. The NV21 format provides a Y array of 8bit values, followed by a 1/2 x 1/2 interleaved + // U/V array. It assumes an even width and height for the overall image, and a horizontal + // stride that is an even multiple of 16 bytes for both the Y and UV arrays. + static void copyYUYVtoRGB32(unsigned width, unsigned height, + uint8_t* src, unsigned srcStrideBytes, + uint32_t* dst, unsigned dstStrideBytes, + bool bgrxFormat = false); + + static void copyYUYVtoBGR32(unsigned width, unsigned height, + uint8_t* src, unsigned srcStrideBytes, + uint32_t* dst, unsigned dstStrideBytes); + + + // Given an simple rectangular image buffer with an integer number of bytes per pixel, + // copy the pixel values into a new rectangular buffer (potentially with a different stride). + // This is typically used to copy RGBx data into an RGBx output buffer. + static void copyMatchedInterleavedFormats(unsigned width, unsigned height, + void* src, unsigned srcStridePixels, + void* dst, unsigned dstStridePixels, + unsigned pixelSize); + +private: + template + static int align(int value); + + static inline float clamp(float v, float min, float max); + static uint32_t yuvToRgbx(const unsigned char Y, + const unsigned char Uin, + const unsigned char Vin, + bool bgrxFormat = false); +}; + +} // namespace common +} // namespace evs +} // namespace automotive +} // namespace hardware +} // namespace android + +#endif // EVS_VTS_FORMATCONVERT_H