Move utility functions to a common library
This change creates a library that contains utility functions commonly used in different EVS versions. Bug: 13542573 Test: VTS Change-Id: Ica8f5e6228d7d4b1426d8cc9cd2c570d6b584897 Signed-off-by: Changyeon Jo <changyeon@google.com>
This commit is contained in:
parent
1d0f024bd7
commit
e472971e96
7 changed files with 205 additions and 131 deletions
|
@ -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
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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 <queue>
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
// 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
|
|
@ -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;
|
||||
|
|
31
automotive/evs/common/utils/default/Android.bp
Normal file
31
automotive/evs/common/utils/default/Android.bp
Normal file
|
@ -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: [
|
||||
],
|
||||
}
|
|
@ -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<unsigned alignment>
|
||||
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
|
||||
|
99
automotive/evs/common/utils/default/include/FormatConvert.h
Normal file
99
automotive/evs/common/utils/default/include/FormatConvert.h
Normal file
|
@ -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 <queue>
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
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<unsigned alignment>
|
||||
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
|
Loading…
Reference in a new issue