1*abb65b4bSAndroid Build Coastguard Worker /*
2*abb65b4bSAndroid Build Coastguard Worker * Copyright (c) 2022 Samsung Electronics Co., Ltd.
3*abb65b4bSAndroid Build Coastguard Worker * All Rights Reserved.
4*abb65b4bSAndroid Build Coastguard Worker *
5*abb65b4bSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*abb65b4bSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*abb65b4bSAndroid Build Coastguard Worker *
8*abb65b4bSAndroid Build Coastguard Worker * - Redistributions of source code must retain the above copyright notice,
9*abb65b4bSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer.
10*abb65b4bSAndroid Build Coastguard Worker *
11*abb65b4bSAndroid Build Coastguard Worker * - Redistributions in binary form must reproduce the above copyright notice,
12*abb65b4bSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation
13*abb65b4bSAndroid Build Coastguard Worker * and/or other materials provided with the distribution.
14*abb65b4bSAndroid Build Coastguard Worker *
15*abb65b4bSAndroid Build Coastguard Worker * - Neither the name of the copyright owner, nor the names of its contributors
16*abb65b4bSAndroid Build Coastguard Worker * may be used to endorse or promote products derived from this software
17*abb65b4bSAndroid Build Coastguard Worker * without specific prior written permission.
18*abb65b4bSAndroid Build Coastguard Worker *
19*abb65b4bSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*abb65b4bSAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*abb65b4bSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*abb65b4bSAndroid Build Coastguard Worker * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23*abb65b4bSAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*abb65b4bSAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*abb65b4bSAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*abb65b4bSAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*abb65b4bSAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*abb65b4bSAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*abb65b4bSAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
30*abb65b4bSAndroid Build Coastguard Worker */
31*abb65b4bSAndroid Build Coastguard Worker
32*abb65b4bSAndroid Build Coastguard Worker #ifndef __OAPV_UTIL_H__
33*abb65b4bSAndroid Build Coastguard Worker #define __OAPV_UTIL_H__
34*abb65b4bSAndroid Build Coastguard Worker
35*abb65b4bSAndroid Build Coastguard Worker #include "oapv_def.h"
36*abb65b4bSAndroid Build Coastguard Worker
37*abb65b4bSAndroid Build Coastguard Worker #define oapv_max(a, b) (((a) > (b)) ? (a) : (b))
38*abb65b4bSAndroid Build Coastguard Worker #define oapv_min(a, b) (((a) < (b)) ? (a) : (b))
39*abb65b4bSAndroid Build Coastguard Worker #define oapv_median(x, y, z) ((((y) < (z)) ^ ((z) < (x))) ? (((x) < (y)) ^ ((z) < (x))) ? (y) : (x) : (z))
40*abb65b4bSAndroid Build Coastguard Worker
41*abb65b4bSAndroid Build Coastguard Worker #define oapv_abs(a) (((a) > (0)) ? (a) : (-(a)))
42*abb65b4bSAndroid Build Coastguard Worker #define oapv_abs64(a) (((a) ^ ((a) >> 63)) - ((a) >> 63)) // only for 64bit variable
43*abb65b4bSAndroid Build Coastguard Worker #define oapv_abs32(a) (((a) ^ ((a) >> 31)) - ((a) >> 31)) // only for 32bit variable
44*abb65b4bSAndroid Build Coastguard Worker #define oapv_abs16(a) (((a) ^ ((a) >> 15)) - ((a) >> 15)) // only for 16bit variable
45*abb65b4bSAndroid Build Coastguard Worker
46*abb65b4bSAndroid Build Coastguard Worker #define oapv_clip3(min, max, val) oapv_max((min), oapv_min((max), (val)))
47*abb65b4bSAndroid Build Coastguard Worker #define oapv_clip16_add(a, b) (oapv_min((a) + (b), 0xffff)) // clipping addition
48*abb65b4bSAndroid Build Coastguard Worker
49*abb65b4bSAndroid Build Coastguard Worker // macro to get a sign from a value.
50*abb65b4bSAndroid Build Coastguard Worker // operation: if(val < 0) return 1, else return 0
51*abb65b4bSAndroid Build Coastguard Worker #define oapv_get_sign(val) ((val < 0) ? 1 : 0)
52*abb65b4bSAndroid Build Coastguard Worker
53*abb65b4bSAndroid Build Coastguard Worker // macro to set sign into a value.
54*abb65b4bSAndroid Build Coastguard Worker // operation: if(sign == 0) return val, else if(sign == 1) return -val
55*abb65b4bSAndroid Build Coastguard Worker #define oapv_set_sign(val, sign) ((sign) ? -val : val)
56*abb65b4bSAndroid Build Coastguard Worker
57*abb65b4bSAndroid Build Coastguard Worker // macro to get a sign from a 16-bit value.
58*abb65b4bSAndroid Build Coastguard Worker // operation: if(val < 0) return 1, else return 0
59*abb65b4bSAndroid Build Coastguard Worker #define oapv_get_sign16(val) (((val) >> 15) & 1)
60*abb65b4bSAndroid Build Coastguard Worker
61*abb65b4bSAndroid Build Coastguard Worker // macro to set sign to a 16-bit value.
62*abb65b4bSAndroid Build Coastguard Worker // operation: if(sign == 0) return val, else if(sign == 1) return -val
63*abb65b4bSAndroid Build Coastguard Worker #define oapv_set_sign16(val, sign) (((val) ^ ((s16)((sign) << 15) >> 15)) + (sign))
64*abb65b4bSAndroid Build Coastguard Worker
65*abb65b4bSAndroid Build Coastguard Worker #define oapv_modulo_idx(num, mod) (((num) + (mod)) % (mod))
66*abb65b4bSAndroid Build Coastguard Worker
67*abb65b4bSAndroid Build Coastguard Worker #define oapv_align_value(val, align) ((((val) + (align) - 1) / (align)) * (align))
68*abb65b4bSAndroid Build Coastguard Worker
chroma_format_idc_to_color_format(int chroma_format_idc)69*abb65b4bSAndroid Build Coastguard Worker static inline int chroma_format_idc_to_color_format(int chroma_format_idc)
70*abb65b4bSAndroid Build Coastguard Worker {
71*abb65b4bSAndroid Build Coastguard Worker return ((chroma_format_idc == 0) ? OAPV_CF_YCBCR400
72*abb65b4bSAndroid Build Coastguard Worker : (chroma_format_idc == 1) ? OAPV_CF_YCBCR420
73*abb65b4bSAndroid Build Coastguard Worker : (chroma_format_idc == 2) ? OAPV_CF_YCBCR422
74*abb65b4bSAndroid Build Coastguard Worker : (chroma_format_idc == 3) ? OAPV_CF_YCBCR444
75*abb65b4bSAndroid Build Coastguard Worker : OAPV_CF_YCBCR4444);
76*abb65b4bSAndroid Build Coastguard Worker }
77*abb65b4bSAndroid Build Coastguard Worker
color_format_to_chroma_format_idc(int color_format)78*abb65b4bSAndroid Build Coastguard Worker static inline int color_format_to_chroma_format_idc(int color_format)
79*abb65b4bSAndroid Build Coastguard Worker {
80*abb65b4bSAndroid Build Coastguard Worker if(color_format == OAPV_CF_PLANAR2) {
81*abb65b4bSAndroid Build Coastguard Worker return 2;
82*abb65b4bSAndroid Build Coastguard Worker }
83*abb65b4bSAndroid Build Coastguard Worker else {
84*abb65b4bSAndroid Build Coastguard Worker return ((color_format == OAPV_CF_YCBCR400) ? 0
85*abb65b4bSAndroid Build Coastguard Worker : (color_format == OAPV_CF_YCBCR420) ? 1
86*abb65b4bSAndroid Build Coastguard Worker : (color_format == OAPV_CF_YCBCR422) ? 2
87*abb65b4bSAndroid Build Coastguard Worker : (color_format == OAPV_CF_YCBCR444) ? 3
88*abb65b4bSAndroid Build Coastguard Worker : 4);
89*abb65b4bSAndroid Build Coastguard Worker }
90*abb65b4bSAndroid Build Coastguard Worker }
91*abb65b4bSAndroid Build Coastguard Worker
get_chroma_sft_w(int chroma_format_idc)92*abb65b4bSAndroid Build Coastguard Worker static inline int get_chroma_sft_w(int chroma_format_idc)
93*abb65b4bSAndroid Build Coastguard Worker {
94*abb65b4bSAndroid Build Coastguard Worker return ((chroma_format_idc == 0) ? 1
95*abb65b4bSAndroid Build Coastguard Worker : (chroma_format_idc == 1) ? 1
96*abb65b4bSAndroid Build Coastguard Worker : (chroma_format_idc == 2) ? 1
97*abb65b4bSAndroid Build Coastguard Worker : 0);
98*abb65b4bSAndroid Build Coastguard Worker }
99*abb65b4bSAndroid Build Coastguard Worker
get_chroma_sft_h(int chroma_format_idc)100*abb65b4bSAndroid Build Coastguard Worker static inline int get_chroma_sft_h(int chroma_format_idc)
101*abb65b4bSAndroid Build Coastguard Worker {
102*abb65b4bSAndroid Build Coastguard Worker return ((chroma_format_idc == 0) ? 1
103*abb65b4bSAndroid Build Coastguard Worker : (chroma_format_idc == 1) ? 1
104*abb65b4bSAndroid Build Coastguard Worker : 0);
105*abb65b4bSAndroid Build Coastguard Worker }
get_num_comp(int chroma_format_idc)106*abb65b4bSAndroid Build Coastguard Worker static inline int get_num_comp(int chroma_format_idc)
107*abb65b4bSAndroid Build Coastguard Worker {
108*abb65b4bSAndroid Build Coastguard Worker
109*abb65b4bSAndroid Build Coastguard Worker return (chroma_format_idc == 0) ? 1
110*abb65b4bSAndroid Build Coastguard Worker : (chroma_format_idc == 4) ? 4
111*abb65b4bSAndroid Build Coastguard Worker : 3;
112*abb65b4bSAndroid Build Coastguard Worker }
113*abb65b4bSAndroid Build Coastguard Worker
imgb_addref(oapv_imgb_t * imgb)114*abb65b4bSAndroid Build Coastguard Worker static inline void imgb_addref(oapv_imgb_t *imgb)
115*abb65b4bSAndroid Build Coastguard Worker {
116*abb65b4bSAndroid Build Coastguard Worker if(imgb->addref) {
117*abb65b4bSAndroid Build Coastguard Worker imgb->addref(imgb);
118*abb65b4bSAndroid Build Coastguard Worker }
119*abb65b4bSAndroid Build Coastguard Worker }
120*abb65b4bSAndroid Build Coastguard Worker
imgb_release(oapv_imgb_t * imgb)121*abb65b4bSAndroid Build Coastguard Worker static inline void imgb_release(oapv_imgb_t *imgb)
122*abb65b4bSAndroid Build Coastguard Worker {
123*abb65b4bSAndroid Build Coastguard Worker if(imgb->release) {
124*abb65b4bSAndroid Build Coastguard Worker imgb->release(imgb);
125*abb65b4bSAndroid Build Coastguard Worker }
126*abb65b4bSAndroid Build Coastguard Worker }
127*abb65b4bSAndroid Build Coastguard Worker
128*abb65b4bSAndroid Build Coastguard Worker /* MD5 structure */
129*abb65b4bSAndroid Build Coastguard Worker typedef struct
130*abb65b4bSAndroid Build Coastguard Worker {
131*abb65b4bSAndroid Build Coastguard Worker u32 h[4]; /* hash state ABCD */
132*abb65b4bSAndroid Build Coastguard Worker u8 msg[64]; /*input buffer */
133*abb65b4bSAndroid Build Coastguard Worker u32 bits[2]; /* number of bits, modulo 2^64 (lsb first)*/
134*abb65b4bSAndroid Build Coastguard Worker } oapv_md5_t;
135*abb65b4bSAndroid Build Coastguard Worker
136*abb65b4bSAndroid Build Coastguard Worker /* MD5 Functions */
137*abb65b4bSAndroid Build Coastguard Worker void oapv_imgb_set_md5(oapv_imgb_t *imgb);
138*abb65b4bSAndroid Build Coastguard Worker void oapv_block_copy(s16 *src, int src_stride, s16 *dst, int dst_stride, int log2_copy_w, int log2_copy_h);
139*abb65b4bSAndroid Build Coastguard Worker int oapv_set_md5_pld(oapvm_t mid, int group_id, oapv_imgb_t *rec);
140*abb65b4bSAndroid Build Coastguard Worker
141*abb65b4bSAndroid Build Coastguard Worker #if X86_SSE
142*abb65b4bSAndroid Build Coastguard Worker int oapv_check_cpu_info_x86();
143*abb65b4bSAndroid Build Coastguard Worker #endif
144*abb65b4bSAndroid Build Coastguard Worker
145*abb65b4bSAndroid Build Coastguard Worker /* For debugging (START) */
146*abb65b4bSAndroid Build Coastguard Worker #define ENC_DEC_DUMP 0
147*abb65b4bSAndroid Build Coastguard Worker #if ENC_DEC_DUMP
148*abb65b4bSAndroid Build Coastguard Worker #if defined(__GNUC__)
149*abb65b4bSAndroid Build Coastguard Worker #pragma message "warning! syntax dump is on"
150*abb65b4bSAndroid Build Coastguard Worker #else
151*abb65b4bSAndroid Build Coastguard Worker #pragma message("warning! syntax dump is on")
152*abb65b4bSAndroid Build Coastguard Worker #endif
153*abb65b4bSAndroid Build Coastguard Worker
154*abb65b4bSAndroid Build Coastguard Worker #define DUMP_ENABLE_HLS 1
155*abb65b4bSAndroid Build Coastguard Worker #define DUMP_ENABLE_COEF 1
156*abb65b4bSAndroid Build Coastguard Worker
157*abb65b4bSAndroid Build Coastguard Worker typedef enum _OAPV_DUMP_OPTION {
158*abb65b4bSAndroid Build Coastguard Worker OAPV_DUMP_HLS,
159*abb65b4bSAndroid Build Coastguard Worker OAPV_DUMP_COEF,
160*abb65b4bSAndroid Build Coastguard Worker } OAPV_DUMP_OPTION;
161*abb65b4bSAndroid Build Coastguard Worker
162*abb65b4bSAndroid Build Coastguard Worker extern FILE *oapv_fp_dump;
163*abb65b4bSAndroid Build Coastguard Worker extern int oapv_is_dump;
164*abb65b4bSAndroid Build Coastguard Worker
165*abb65b4bSAndroid Build Coastguard Worker void oapv_dump_string0(int cond, const char *fmt, ...);
166*abb65b4bSAndroid Build Coastguard Worker void oapv_dump_coef0(short *coef, int size, int x, int y, int c);
167*abb65b4bSAndroid Build Coastguard Worker void oapv_dump_create0(int is_enc);
168*abb65b4bSAndroid Build Coastguard Worker void oapv_dump_delete0();
169*abb65b4bSAndroid Build Coastguard Worker
170*abb65b4bSAndroid Build Coastguard Worker // Syntax dump macro functions
171*abb65b4bSAndroid Build Coastguard Worker #define DUMP_CREATE(is_enc) oapv_dump_create0(is_enc)
172*abb65b4bSAndroid Build Coastguard Worker #define DUMP_DELETE() oapv_dump_delete0()
173*abb65b4bSAndroid Build Coastguard Worker #define DUMP_SET(val) oapv_is_dump = val
174*abb65b4bSAndroid Build Coastguard Worker #define DUMP_HLS(name, val) \
175*abb65b4bSAndroid Build Coastguard Worker oapv_dump_string0(OAPV_DUMP_HLS, "%-34s: %12d\n", #name, val)
176*abb65b4bSAndroid Build Coastguard Worker #define DUMP_COEF(coef, size, x, y, c) \
177*abb65b4bSAndroid Build Coastguard Worker oapv_dump_coef0(coef, size, x, y, c)
178*abb65b4bSAndroid Build Coastguard Worker #define DUMP_SAVE(id) long dump32u8i90432890_##id = ftell(oapv_fp_dump)
179*abb65b4bSAndroid Build Coastguard Worker #define DUMP_LOAD(id) fseek(oapv_fp_dump, dump32u8i90432890_##id, SEEK_SET)
180*abb65b4bSAndroid Build Coastguard Worker #else
181*abb65b4bSAndroid Build Coastguard Worker #define DUMP_CREATE(is_enc)
182*abb65b4bSAndroid Build Coastguard Worker #define DUMP_DELETE()
183*abb65b4bSAndroid Build Coastguard Worker #define DUMP_SET(val)
184*abb65b4bSAndroid Build Coastguard Worker #define DUMP_HLS(name, val)
185*abb65b4bSAndroid Build Coastguard Worker #define DUMP_COEF(coef, size, args, ...)
186*abb65b4bSAndroid Build Coastguard Worker #define DUMP_SAVE(id)
187*abb65b4bSAndroid Build Coastguard Worker #define DUMP_LOAD(id)
188*abb65b4bSAndroid Build Coastguard Worker #endif
189*abb65b4bSAndroid Build Coastguard Worker /* For debugging (END) */
190*abb65b4bSAndroid Build Coastguard Worker
191*abb65b4bSAndroid Build Coastguard Worker #endif /* __OAPV_UTIL_H__ */
192