blob: a62d13b97144bcb0c080c5cc143ba42e54a94e74 [file] [log] [blame]
/*
* Copyright (c) 2012-2017 The Khronos Group Inc.
*
* 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 __VX_CT_IMAGE_H__
#define __VX_CT_IMAGE_H__
#include <VX/vx.h>
typedef enum CT_ImageCopyDirection_ {
COPY_CT_IMAGE_TO_VX_IMAGE = 0,
COPY_VX_IMAGE_TO_CT_IMAGE
} CT_ImageCopyDirection;
typedef struct CT_Rect_ {
uint32_t x;
uint32_t y;
uint32_t width;
uint32_t height;
} CT_Rect;
typedef struct CT_ImageHdr {
uint32_t width; // in pixels
uint32_t height;
uint32_t stride; // in pixels
vx_df_image format;
CT_Rect roi; // stores top left corner offset and full size of parent image
union
{
uint8_t* y;
uint16_t* u16;
int16_t* s16;
uint32_t* u32;
int32_t* s32;
struct { uint8_t r,g,b; }* rgb;
struct { uint8_t y,u,v; }* yuv;
struct { uint8_t r,g,b,x; }* rgbx;
struct { uint8_t y0,u,y1,v; }* yuyv;
struct { uint8_t u,y0,v,y1; }* uyvy;
} data;
// private area
void* data_begin_;
uint32_t* refcount_;
} *CT_Image;
int ct_channels(vx_df_image format);
uint32_t ct_stride_bytes(CT_Image image);
uint32_t ct_image_bits_per_pixel(vx_df_image format);
uint8_t* ct_image_get_plane_base(CT_Image img, int plane);
int ct_image_get_channel_step_x(CT_Image image, vx_enum channel);
int ct_image_get_channel_step_y(CT_Image image, vx_enum channel);
int ct_image_get_channel_subsampling_x(CT_Image image, vx_enum channel);
int ct_image_get_channel_subsampling_y(CT_Image image, vx_enum channel);
int ct_image_get_channel_plane(CT_Image image, vx_enum channel);
int ct_image_get_channel_component(CT_Image image, vx_enum channel);
uint32_t ct_get_num_planes(vx_df_image format);
int ct_get_num_channels(vx_df_image format);
CT_Image ct_allocate_image(uint32_t width, uint32_t height, vx_df_image format);
CT_Image ct_allocate_image_hdr(uint32_t width, uint32_t height, uint32_t stride, vx_df_image format, void* data);
CT_Image ct_get_image_roi(CT_Image img, CT_Rect roi);
CT_Image ct_get_image_roi_(CT_Image img, uint32_t x_start, uint32_t y_start, uint32_t width, uint32_t height);
void ct_adjust_roi(CT_Image img, int left, int top, int right, int bottom);
uint8_t* ct_image_data_ptr_1u(CT_Image image, uint32_t x, uint32_t y);
#define CT_IMAGE_DATA_PTR_1U(image, x, y) ct_image_data_ptr_1u(image, x, y)
uint8_t ct_image_data_replicate_1u(CT_Image image, int32_t x, int32_t y);
#define CT_IMAGE_DATA_REPLICATE_1U(image, x, y) ct_image_data_replicate_1u(image, x, y)
uint8_t ct_image_data_constant_1u(CT_Image image, int32_t x, int32_t y, vx_bool constant_value);
#define CT_IMAGE_DATA_CONSTANT_1U(image, x, y, constant_value) ct_image_data_constant_1u(image, x, y, constant_value)
#if 1
#define CT_IMAGE_DATA_PTR_8U(image, x, y_) &(image)->data.y[(y_) * (image)->stride + (x)]
#else
uint8_t* ct_image_data_ptr_8u(CT_Image image, uint32_t x, uint32_t y);
#define CT_IMAGE_DATA_PTR_8U(image, x, y) ct_image_data_ptr_8u(image, x, y)
#endif
uint8_t ct_image_data_replicate_8u(CT_Image image, int32_t x, int32_t y);
#define CT_IMAGE_DATA_REPLICATE_8U(image, x, y) ct_image_data_replicate_8u(image, x, y)
uint8_t ct_image_data_constant_8u(CT_Image image, int32_t x, int32_t y, vx_uint32 constant_value);
#define CT_IMAGE_DATA_CONSTANT_8U(image, x, y, constant_value) ct_image_data_constant_8u(image, x, y, constant_value)
#define CT_IMAGE_DATA_PTR_16S(image, x, y) &(image)->data.s16[(y) * (image)->stride + (x)]
#define CT_IMAGE_DATA_PTR_32U(image, x, y) &(image)->data.u32[(y) * (image)->stride + (x)]
#define CT_IMAGE_DATA_PTR_RGB(image, x, y) &(image)->data.rgb[(y) * (image)->stride + (x)]
#define CT_IMAGE_DATA_PTR_RGBX(image, x, y) &(image)->data.rgbx[(y) * (image)->stride + (x)]
#define CT_FILL_IMAGE_1U(ret_error, image, op) \
ASSERT_(ret_error, image != NULL); \
ASSERT_(ret_error, image->format == VX_DF_IMAGE_U1); \
ASSERT_(ret_error, image->width > 0); \
ASSERT_(ret_error, image->height > 0); \
{ \
uint32_t x, y; \
for (y = 0; y < image->height; y++) { \
for (x = 0; x < image->width; x++) { \
uint32_t xShftd = x + image->roi.x % 8; /* x respecting start of ROI in first byte */ \
uint8_t offset = xShftd % 8; (void)offset; \
uint8_t* dst_data = CT_IMAGE_DATA_PTR_1U(image, xShftd, y); (void)dst_data; \
op; \
} \
} \
}
#define CT_FILL_IMAGE_8U(ret_error, image, op) \
ASSERT_(ret_error, image != NULL); \
ASSERT_(ret_error, image->format == VX_DF_IMAGE_U8); \
ASSERT_(ret_error, image->width > 0); \
ASSERT_(ret_error, image->height > 0); \
{ \
uint32_t x, y; \
for (y = 0; y < image->height; y++) { \
for (x = 0; x < image->width; x++) { \
uint8_t* dst_data = CT_IMAGE_DATA_PTR_8U(image, x, y); (void)dst_data; \
op; \
} \
} \
}
#define CT_FILL_IMAGE_16S(ret_error, image, op) \
ASSERT_(ret_error, image != NULL); \
ASSERT_(ret_error, image->format == VX_DF_IMAGE_S16); \
ASSERT_(ret_error, image->width > 0); \
ASSERT_(ret_error, image->height > 0); \
{ \
uint32_t x, y; \
for (y = 0; y < image->height; y++) { \
for (x = 0; x < image->width; x++) { \
int16_t* dst_data = CT_IMAGE_DATA_PTR_16S(image, x, y); \
op; \
} \
} \
}
#define CT_FILL_IMAGE_32U(ret_error, image, op) \
ASSERT_(ret_error, image != NULL); \
ASSERT_(ret_error, image->format == VX_DF_IMAGE_U32); \
ASSERT_(ret_error, image->width > 0); \
ASSERT_(ret_error, image->height > 0); \
{ \
uint32_t x, y; \
for (y = 0; y < image->height; y++) { \
for (x = 0; x < image->width; x++) { \
uint32_t* dst_data = CT_IMAGE_DATA_PTR_32U(image, x, y); \
op; \
} \
} \
}
CT_Image ct_read_image(const char* fileName, int dcn);
void ct_write_image(const char* fileName, CT_Image image);
#define ct_image_from_vx_image(vximg) ct_image_from_vx_image_impl(vximg, __FUNCTION__, __FILE__, __LINE__)
CT_Image ct_image_from_vx_image_impl(vx_image vximg, const char* func, const char* file, int line);
#define ct_image_to_vx_image(ctimg, context) ct_image_to_vx_image_impl(ctimg, context, __FUNCTION__, __FILE__, __LINE__)
vx_image ct_image_to_vx_image_impl(CT_Image ctimg, vx_context context, const char* func, const char* file, int line);
void *ct_image_copy_impl(CT_Image ctimg, vx_image vximg, CT_ImageCopyDirection dir, const char* func, const char* file, int line);
#define ct_image_copyto_vx_image(vximg, ctimg) ct_image_copy_impl(ctimg, vximg, COPY_CT_IMAGE_TO_VX_IMAGE, __FUNCTION__, __FILE__, __LINE__)
#define ct_image_copyfrom_vx_image(ctimg, vximg) ct_image_copy_impl(ctimg, vximg, COPY_VX_IMAGE_TO_CT_IMAGE, __FUNCTION__, __FILE__, __LINE__)
void U8_ct_image_to_U1_ct_image(CT_Image img_in, CT_Image img_out);
void U1_ct_image_to_U8_ct_image(CT_Image img_in, CT_Image img_out);
void threshold_U8_ct_image(CT_Image img, uint8_t thresh);
#define EXPECT_EQ_CTIMAGE(expected, actual) ct_assert_eq_ctimage_impl(expected, actual, 0, (uint32_t)-1, #expected, #actual, __FUNCTION__, __FILE__, __LINE__)
#define ASSERT_EQ_CTIMAGE(expected, actual) \
do { if (ct_assert_eq_ctimage_impl(expected, actual, 0, (uint32_t)-1, #expected, #actual, __FUNCTION__, __FILE__, __LINE__))\
{} else { CT_DO_FAIL; }} while(0)
#define EXPECT_CTIMAGE_NEAR(expected, actual, threshold) ct_assert_eq_ctimage_impl(expected, actual, threshold, (uint32_t)-1, #expected, #actual, __FUNCTION__, __FILE__, __LINE__)
#define ASSERT_CTIMAGE_NEAR(expected, actual, threshold) \
do { if (ct_assert_eq_ctimage_impl(expected, actual, threshold, (uint32_t)-1, #expected, #actual, __FUNCTION__, __FILE__, __LINE__))\
{} else { CT_DO_FAIL; }} while(0)
#define CTIMAGE_ALLOW_WRAP 0
#define EXPECT_CTIMAGE_NEARWRAP(expected, actual, threshold, modulo) ct_assert_eq_ctimage_impl(expected, actual, threshold, modulo, #expected, #actual, __FUNCTION__, __FILE__, __LINE__)
#define ASSERT_CTIMAGE_NEARWRAP(expected, actual, threshold, modulo) \
do { if (ct_assert_eq_ctimage_impl(expected, actual, threshold, modulo, #expected, #actual, __FUNCTION__, __FILE__, __LINE__)) \
{} else { CT_DO_FAIL; }} while(0)
int ct_assert_eq_ctimage_impl(CT_Image expected, CT_Image actual, uint32_t threshold, uint32_t wrap_modulo,
const char* expected_str, const char* actual_str,
const char* func, const char* file, int line);
void ct_dump_image_info_ex(CT_Image image, int dump_width, int dump_height);
#define ct_dump_image_info(image) ct_dump_image_info_ex(image, -1, -1);
void ct_fill_ct_image_random(CT_Image image, uint64_t* seed, int a, int b);
CT_Image ct_allocate_ct_image_random(uint32_t width, uint32_t height, vx_df_image format, uint64_t* rng, int a, int b);
CT_Image ct_image_create_clone(CT_Image image);
int ct_image_read_rect_S32(CT_Image img, int32_t *dst, int32_t sx, int32_t sy, int32_t ex, int32_t ey, vx_border_t border);
#endif // __VX_CT_IMAGE_H__