/* * Copyright (c) 2022 Samsung Electronics Co., Ltd. * All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * - Neither the name of the copyright owner, nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __OAPV_UTIL_H__ #define __OAPV_UTIL_H__ #include "oapv_def.h" #define oapv_max(a, b) (((a) > (b)) ? (a) : (b)) #define oapv_min(a, b) (((a) < (b)) ? (a) : (b)) #define oapv_median(x, y, z) ((((y) < (z)) ^ ((z) < (x))) ? (((x) < (y)) ^ ((z) < (x))) ? (y) : (x) : (z)) #define oapv_abs(a) (((a) > (0)) ? (a) : (-(a))) #define oapv_abs64(a) (((a) ^ ((a) >> 63)) - ((a) >> 63)) // only for 64bit variable #define oapv_abs32(a) (((a) ^ ((a) >> 31)) - ((a) >> 31)) // only for 32bit variable #define oapv_abs16(a) (((a) ^ ((a) >> 15)) - ((a) >> 15)) // only for 16bit variable #define oapv_clip3(min, max, val) oapv_max((min), oapv_min((max), (val))) #define oapv_clip16_add(a, b) (oapv_min((a) + (b), 0xffff)) // clipping addition // macro to get a sign from a value. // operation: if(val < 0) return 1, else return 0 #define oapv_get_sign(val) ((val < 0) ? 1 : 0) // macro to set sign into a value. // operation: if(sign == 0) return val, else if(sign == 1) return -val #define oapv_set_sign(val, sign) ((sign) ? -val : val) // macro to get a sign from a 16-bit value. // operation: if(val < 0) return 1, else return 0 #define oapv_get_sign16(val) (((val) >> 15) & 1) // macro to set sign to a 16-bit value. // operation: if(sign == 0) return val, else if(sign == 1) return -val #define oapv_set_sign16(val, sign) (((val) ^ ((s16)((sign) << 15) >> 15)) + (sign)) #define oapv_modulo_idx(num, mod) (((num) + (mod)) % (mod)) #define oapv_align_value(val, align) ((((val) + (align) - 1) / (align)) * (align)) static inline int chroma_format_idc_to_color_format(int chroma_format_idc) { return ((chroma_format_idc == 0) ? OAPV_CF_YCBCR400 : (chroma_format_idc == 1) ? OAPV_CF_YCBCR420 : (chroma_format_idc == 2) ? OAPV_CF_YCBCR422 : (chroma_format_idc == 3) ? OAPV_CF_YCBCR444 : OAPV_CF_YCBCR4444); } static inline int color_format_to_chroma_format_idc(int color_format) { if(color_format == OAPV_CF_PLANAR2) { return 2; } else { return ((color_format == OAPV_CF_YCBCR400) ? 0 : (color_format == OAPV_CF_YCBCR420) ? 1 : (color_format == OAPV_CF_YCBCR422) ? 2 : (color_format == OAPV_CF_YCBCR444) ? 3 : 4); } } static inline int get_chroma_sft_w(int chroma_format_idc) { return ((chroma_format_idc == 0) ? 1 : (chroma_format_idc == 1) ? 1 : (chroma_format_idc == 2) ? 1 : 0); } static inline int get_chroma_sft_h(int chroma_format_idc) { return ((chroma_format_idc == 0) ? 1 : (chroma_format_idc == 1) ? 1 : 0); } static inline int get_num_comp(int chroma_format_idc) { return (chroma_format_idc == 0) ? 1 : (chroma_format_idc == 4) ? 4 : 3; } static inline void imgb_addref(oapv_imgb_t *imgb) { if(imgb->addref) { imgb->addref(imgb); } } static inline void imgb_release(oapv_imgb_t *imgb) { if(imgb->release) { imgb->release(imgb); } } /* MD5 structure */ typedef struct { u32 h[4]; /* hash state ABCD */ u8 msg[64]; /*input buffer */ u32 bits[2]; /* number of bits, modulo 2^64 (lsb first)*/ } oapv_md5_t; /* MD5 Functions */ void oapv_imgb_set_md5(oapv_imgb_t *imgb); void oapv_block_copy(s16 *src, int src_stride, s16 *dst, int dst_stride, int log2_copy_w, int log2_copy_h); int oapv_set_md5_pld(oapvm_t mid, int group_id, oapv_imgb_t *rec); #if X86_SSE int oapv_check_cpu_info_x86(); #endif /* For debugging (START) */ #define ENC_DEC_DUMP 0 #if ENC_DEC_DUMP #if defined(__GNUC__) #pragma message "warning! syntax dump is on" #else #pragma message("warning! syntax dump is on") #endif #define DUMP_ENABLE_HLS 1 #define DUMP_ENABLE_COEF 1 typedef enum _OAPV_DUMP_OPTION { OAPV_DUMP_HLS, OAPV_DUMP_COEF, } OAPV_DUMP_OPTION; extern FILE *oapv_fp_dump; extern int oapv_is_dump; void oapv_dump_string0(int cond, const char *fmt, ...); void oapv_dump_coef0(short *coef, int size, int x, int y, int c); void oapv_dump_create0(int is_enc); void oapv_dump_delete0(); // Syntax dump macro functions #define DUMP_CREATE(is_enc) oapv_dump_create0(is_enc) #define DUMP_DELETE() oapv_dump_delete0() #define DUMP_SET(val) oapv_is_dump = val #define DUMP_HLS(name, val) \ oapv_dump_string0(OAPV_DUMP_HLS, "%-34s: %12d\n", #name, val) #define DUMP_COEF(coef, size, x, y, c) \ oapv_dump_coef0(coef, size, x, y, c) #define DUMP_SAVE(id) long dump32u8i90432890_##id = ftell(oapv_fp_dump) #define DUMP_LOAD(id) fseek(oapv_fp_dump, dump32u8i90432890_##id, SEEK_SET) #else #define DUMP_CREATE(is_enc) #define DUMP_DELETE() #define DUMP_SET(val) #define DUMP_HLS(name, val) #define DUMP_COEF(coef, size, args, ...) #define DUMP_SAVE(id) #define DUMP_LOAD(id) #endif /* For debugging (END) */ #endif /* __OAPV_UTIL_H__ */