/work/libde265/libde265/util.h
Line | Count | Source |
1 | | /* |
2 | | * H.265 video codec. |
3 | | * Copyright (c) 2013-2014 struktur AG, Dirk Farin <farin@struktur.de> |
4 | | * |
5 | | * This file is part of libde265. |
6 | | * |
7 | | * libde265 is free software: you can redistribute it and/or modify |
8 | | * it under the terms of the GNU Lesser General Public License as |
9 | | * published by the Free Software Foundation, either version 3 of |
10 | | * the License, or (at your option) any later version. |
11 | | * |
12 | | * libde265 is distributed in the hope that it will be useful, |
13 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | | * GNU Lesser General Public License for more details. |
16 | | * |
17 | | * You should have received a copy of the GNU Lesser General Public License |
18 | | * along with libde265. If not, see <http://www.gnu.org/licenses/>. |
19 | | */ |
20 | | |
21 | | #ifndef DE265_UTIL_H |
22 | | #define DE265_UTIL_H |
23 | | |
24 | | #ifdef HAVE_CONFIG_H |
25 | | #include "config.h" |
26 | | #endif |
27 | | |
28 | | #ifndef _MSC_VER |
29 | | #include <inttypes.h> |
30 | | #endif |
31 | | |
32 | | #include <stdio.h> |
33 | | #include <string> |
34 | | #include <cstdlib> |
35 | | |
36 | | #include "libde265/de265.h" |
37 | | |
38 | | #ifdef __GNUC__ |
39 | | #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) |
40 | | #endif |
41 | | |
42 | | #ifdef _MSC_VER |
43 | | #define LIBDE265_DECLARE_ALIGNED( var, n ) __declspec(align(n)) var |
44 | | #define likely(x) (x) |
45 | | #define unlikely(x) (x) |
46 | | #else |
47 | 0 | #define LIBDE265_DECLARE_ALIGNED( var, n ) var __attribute__((aligned(n))) |
48 | 0 | #define likely(x) __builtin_expect(!!(x), 1) |
49 | 0 | #define unlikely(x) __builtin_expect(!!(x), 0) |
50 | | #endif |
51 | | |
52 | | #if defined(__GNUC__) && (__GNUC__ >= 4) |
53 | | #define LIBDE265_CHECK_RESULT __attribute__ ((warn_unused_result)) |
54 | | #elif defined(_MSC_VER) && (_MSC_VER >= 1700) |
55 | | #define LIBDE265_CHECK_RESULT _Check_return_ |
56 | | #else |
57 | | #define LIBDE265_CHECK_RESULT |
58 | | #endif |
59 | | |
60 | | // Be careful with these alignment instructions. They only specify the alignment within |
61 | | // a struct. But they cannot make sure that the base address of the struct has the same alignment |
62 | | // when it is dynamically allocated. |
63 | 0 | #define ALIGNED_32( var ) LIBDE265_DECLARE_ALIGNED( var, 32 ) |
64 | 0 | #define ALIGNED_16( var ) LIBDE265_DECLARE_ALIGNED( var, 16 ) |
65 | | #define ALIGNED_8( var ) LIBDE265_DECLARE_ALIGNED( var, 8 ) |
66 | | #define ALIGNED_4( var ) LIBDE265_DECLARE_ALIGNED( var, 4 ) |
67 | | |
68 | | #ifdef _MSC_VER |
69 | | #ifdef _CPPRTTI |
70 | | #define RTTI_ENABLED |
71 | | #endif |
72 | | #else |
73 | | #ifdef __GXX_RTTI |
74 | | #define RTTI_ENABLED |
75 | | #endif |
76 | | #endif |
77 | | |
78 | | inline static int Clip1_8bit(int value) |
79 | 0 | { |
80 | 0 | return value<0 ? 0 : value>255 ? 255 : value; |
81 | 0 | } Unexecuted instantiation: de265.cc:Clip1_8bit(int) Unexecuted instantiation: decctx.cc:Clip1_8bit(int) Unexecuted instantiation: dpb.cc:Clip1_8bit(int) Unexecuted instantiation: fallback.cc:Clip1_8bit(int) Unexecuted instantiation: image.cc:Clip1_8bit(int) Unexecuted instantiation: nal-parser.cc:Clip1_8bit(int) Unexecuted instantiation: pps.cc:Clip1_8bit(int) Unexecuted instantiation: sao.cc:Clip1_8bit(int) Unexecuted instantiation: sei.cc:Clip1_8bit(int) Unexecuted instantiation: slice.cc:Clip1_8bit(int) Unexecuted instantiation: sps.cc:Clip1_8bit(int) Unexecuted instantiation: threads.cc:Clip1_8bit(int) Unexecuted instantiation: transform.cc:Clip1_8bit(int) Unexecuted instantiation: util.cc:Clip1_8bit(int) Unexecuted instantiation: vps.cc:Clip1_8bit(int) Unexecuted instantiation: vui.cc:Clip1_8bit(int) Unexecuted instantiation: sse-motion.cc:Clip1_8bit(int) Unexecuted instantiation: sse-dct.cc:Clip1_8bit(int) Unexecuted instantiation: cabac.cc:Clip1_8bit(int) Unexecuted instantiation: contextmodel.cc:Clip1_8bit(int) Unexecuted instantiation: deblock.cc:Clip1_8bit(int) Unexecuted instantiation: fallback-dct.cc:Clip1_8bit(int) Unexecuted instantiation: fallback-motion.cc:Clip1_8bit(int) Unexecuted instantiation: intrapred.cc:Clip1_8bit(int) Unexecuted instantiation: motion.cc:Clip1_8bit(int) Unexecuted instantiation: refpic.cc:Clip1_8bit(int) |
82 | | |
83 | | inline static int Clip_BitDepth(int value, int bit_depth) |
84 | 0 | { |
85 | 0 | const int maxval = (1<<bit_depth)-1; |
86 | 0 | return value<0 ? 0 : value>maxval ? maxval : value; |
87 | 0 | } Unexecuted instantiation: de265.cc:Clip_BitDepth(int, int) Unexecuted instantiation: decctx.cc:Clip_BitDepth(int, int) Unexecuted instantiation: dpb.cc:Clip_BitDepth(int, int) Unexecuted instantiation: fallback.cc:Clip_BitDepth(int, int) Unexecuted instantiation: image.cc:Clip_BitDepth(int, int) Unexecuted instantiation: nal-parser.cc:Clip_BitDepth(int, int) Unexecuted instantiation: pps.cc:Clip_BitDepth(int, int) Unexecuted instantiation: sao.cc:Clip_BitDepth(int, int) Unexecuted instantiation: sei.cc:Clip_BitDepth(int, int) Unexecuted instantiation: slice.cc:Clip_BitDepth(int, int) Unexecuted instantiation: sps.cc:Clip_BitDepth(int, int) Unexecuted instantiation: threads.cc:Clip_BitDepth(int, int) Unexecuted instantiation: transform.cc:Clip_BitDepth(int, int) Unexecuted instantiation: util.cc:Clip_BitDepth(int, int) Unexecuted instantiation: vps.cc:Clip_BitDepth(int, int) Unexecuted instantiation: vui.cc:Clip_BitDepth(int, int) Unexecuted instantiation: sse-motion.cc:Clip_BitDepth(int, int) Unexecuted instantiation: sse-dct.cc:Clip_BitDepth(int, int) Unexecuted instantiation: cabac.cc:Clip_BitDepth(int, int) Unexecuted instantiation: contextmodel.cc:Clip_BitDepth(int, int) Unexecuted instantiation: deblock.cc:Clip_BitDepth(int, int) Unexecuted instantiation: fallback-dct.cc:Clip_BitDepth(int, int) Unexecuted instantiation: fallback-motion.cc:Clip_BitDepth(int, int) Unexecuted instantiation: intrapred.cc:Clip_BitDepth(int, int) Unexecuted instantiation: motion.cc:Clip_BitDepth(int, int) Unexecuted instantiation: refpic.cc:Clip_BitDepth(int, int) |
88 | | |
89 | | inline static int Clip3(int low, int high, int value) |
90 | 0 | { |
91 | 0 | return value<low ? low : value>high ? high : value; |
92 | 0 | } Unexecuted instantiation: de265.cc:Clip3(int, int, int) Unexecuted instantiation: decctx.cc:Clip3(int, int, int) Unexecuted instantiation: dpb.cc:Clip3(int, int, int) Unexecuted instantiation: fallback.cc:Clip3(int, int, int) Unexecuted instantiation: image.cc:Clip3(int, int, int) Unexecuted instantiation: nal-parser.cc:Clip3(int, int, int) Unexecuted instantiation: pps.cc:Clip3(int, int, int) Unexecuted instantiation: sao.cc:Clip3(int, int, int) Unexecuted instantiation: sei.cc:Clip3(int, int, int) Unexecuted instantiation: slice.cc:Clip3(int, int, int) Unexecuted instantiation: sps.cc:Clip3(int, int, int) Unexecuted instantiation: threads.cc:Clip3(int, int, int) Unexecuted instantiation: transform.cc:Clip3(int, int, int) Unexecuted instantiation: util.cc:Clip3(int, int, int) Unexecuted instantiation: vps.cc:Clip3(int, int, int) Unexecuted instantiation: vui.cc:Clip3(int, int, int) Unexecuted instantiation: sse-motion.cc:Clip3(int, int, int) Unexecuted instantiation: sse-dct.cc:Clip3(int, int, int) Unexecuted instantiation: cabac.cc:Clip3(int, int, int) Unexecuted instantiation: contextmodel.cc:Clip3(int, int, int) Unexecuted instantiation: deblock.cc:Clip3(int, int, int) Unexecuted instantiation: fallback-dct.cc:Clip3(int, int, int) Unexecuted instantiation: fallback-motion.cc:Clip3(int, int, int) Unexecuted instantiation: intrapred.cc:Clip3(int, int, int) Unexecuted instantiation: motion.cc:Clip3(int, int, int) Unexecuted instantiation: refpic.cc:Clip3(int, int, int) |
93 | | |
94 | | // three-valued sign: returns -1, 0, or +1 |
95 | | template <typename T> inline int Sign(T value) |
96 | 0 | { |
97 | 0 | return (T(0) < value) - (value < T(0)); |
98 | 0 | } |
99 | | |
100 | | inline static int ceil_div(int num,int denom) |
101 | 0 | { |
102 | 0 | num += denom-1; |
103 | 0 | return num/denom; |
104 | 0 | } Unexecuted instantiation: de265.cc:ceil_div(int, int) Unexecuted instantiation: decctx.cc:ceil_div(int, int) Unexecuted instantiation: dpb.cc:ceil_div(int, int) Unexecuted instantiation: fallback.cc:ceil_div(int, int) Unexecuted instantiation: image.cc:ceil_div(int, int) Unexecuted instantiation: nal-parser.cc:ceil_div(int, int) Unexecuted instantiation: pps.cc:ceil_div(int, int) Unexecuted instantiation: sao.cc:ceil_div(int, int) Unexecuted instantiation: sei.cc:ceil_div(int, int) Unexecuted instantiation: slice.cc:ceil_div(int, int) Unexecuted instantiation: sps.cc:ceil_div(int, int) Unexecuted instantiation: threads.cc:ceil_div(int, int) Unexecuted instantiation: transform.cc:ceil_div(int, int) Unexecuted instantiation: util.cc:ceil_div(int, int) Unexecuted instantiation: vps.cc:ceil_div(int, int) Unexecuted instantiation: vui.cc:ceil_div(int, int) Unexecuted instantiation: sse-motion.cc:ceil_div(int, int) Unexecuted instantiation: sse-dct.cc:ceil_div(int, int) Unexecuted instantiation: cabac.cc:ceil_div(int, int) Unexecuted instantiation: contextmodel.cc:ceil_div(int, int) Unexecuted instantiation: deblock.cc:ceil_div(int, int) Unexecuted instantiation: fallback-dct.cc:ceil_div(int, int) Unexecuted instantiation: fallback-motion.cc:ceil_div(int, int) Unexecuted instantiation: intrapred.cc:ceil_div(int, int) Unexecuted instantiation: motion.cc:ceil_div(int, int) Unexecuted instantiation: refpic.cc:ceil_div(int, int) |
105 | | |
106 | | inline static int ceil_log2(int val) |
107 | 0 | { |
108 | 0 | int n=0; |
109 | 0 | while (val > (1<<n)) { |
110 | 0 | n++; |
111 | 0 | } |
112 | |
|
113 | 0 | return n; |
114 | 0 | } Unexecuted instantiation: de265.cc:ceil_log2(int) Unexecuted instantiation: decctx.cc:ceil_log2(int) Unexecuted instantiation: dpb.cc:ceil_log2(int) Unexecuted instantiation: fallback.cc:ceil_log2(int) Unexecuted instantiation: image.cc:ceil_log2(int) Unexecuted instantiation: nal-parser.cc:ceil_log2(int) Unexecuted instantiation: pps.cc:ceil_log2(int) Unexecuted instantiation: sao.cc:ceil_log2(int) Unexecuted instantiation: sei.cc:ceil_log2(int) Unexecuted instantiation: slice.cc:ceil_log2(int) Unexecuted instantiation: sps.cc:ceil_log2(int) Unexecuted instantiation: threads.cc:ceil_log2(int) Unexecuted instantiation: transform.cc:ceil_log2(int) Unexecuted instantiation: util.cc:ceil_log2(int) Unexecuted instantiation: vps.cc:ceil_log2(int) Unexecuted instantiation: vui.cc:ceil_log2(int) Unexecuted instantiation: sse-motion.cc:ceil_log2(int) Unexecuted instantiation: sse-dct.cc:ceil_log2(int) Unexecuted instantiation: cabac.cc:ceil_log2(int) Unexecuted instantiation: contextmodel.cc:ceil_log2(int) Unexecuted instantiation: deblock.cc:ceil_log2(int) Unexecuted instantiation: fallback-dct.cc:ceil_log2(int) Unexecuted instantiation: fallback-motion.cc:ceil_log2(int) Unexecuted instantiation: intrapred.cc:ceil_log2(int) Unexecuted instantiation: motion.cc:ceil_log2(int) Unexecuted instantiation: refpic.cc:ceil_log2(int) |
115 | | |
116 | | inline static int Log2(int v) |
117 | 0 | { |
118 | 0 | int n=0; |
119 | 0 | while (v>1) { |
120 | 0 | n++; |
121 | 0 | v>>=1; |
122 | 0 | } |
123 | |
|
124 | 0 | return n; |
125 | 0 | } Unexecuted instantiation: de265.cc:Log2(int) Unexecuted instantiation: decctx.cc:Log2(int) Unexecuted instantiation: dpb.cc:Log2(int) Unexecuted instantiation: fallback.cc:Log2(int) Unexecuted instantiation: image.cc:Log2(int) Unexecuted instantiation: nal-parser.cc:Log2(int) Unexecuted instantiation: pps.cc:Log2(int) Unexecuted instantiation: sao.cc:Log2(int) Unexecuted instantiation: sei.cc:Log2(int) Unexecuted instantiation: slice.cc:Log2(int) Unexecuted instantiation: sps.cc:Log2(int) Unexecuted instantiation: threads.cc:Log2(int) Unexecuted instantiation: transform.cc:Log2(int) Unexecuted instantiation: util.cc:Log2(int) Unexecuted instantiation: vps.cc:Log2(int) Unexecuted instantiation: vui.cc:Log2(int) Unexecuted instantiation: sse-motion.cc:Log2(int) Unexecuted instantiation: sse-dct.cc:Log2(int) Unexecuted instantiation: cabac.cc:Log2(int) Unexecuted instantiation: contextmodel.cc:Log2(int) Unexecuted instantiation: deblock.cc:Log2(int) Unexecuted instantiation: fallback-dct.cc:Log2(int) Unexecuted instantiation: fallback-motion.cc:Log2(int) Unexecuted instantiation: intrapred.cc:Log2(int) Unexecuted instantiation: motion.cc:Log2(int) Unexecuted instantiation: refpic.cc:Log2(int) |
126 | | |
127 | | inline static int Log2SizeToArea(int v) |
128 | 0 | { |
129 | 0 | return (1<<(v<<1)); |
130 | 0 | } Unexecuted instantiation: de265.cc:Log2SizeToArea(int) Unexecuted instantiation: decctx.cc:Log2SizeToArea(int) Unexecuted instantiation: dpb.cc:Log2SizeToArea(int) Unexecuted instantiation: fallback.cc:Log2SizeToArea(int) Unexecuted instantiation: image.cc:Log2SizeToArea(int) Unexecuted instantiation: nal-parser.cc:Log2SizeToArea(int) Unexecuted instantiation: pps.cc:Log2SizeToArea(int) Unexecuted instantiation: sao.cc:Log2SizeToArea(int) Unexecuted instantiation: sei.cc:Log2SizeToArea(int) Unexecuted instantiation: slice.cc:Log2SizeToArea(int) Unexecuted instantiation: sps.cc:Log2SizeToArea(int) Unexecuted instantiation: threads.cc:Log2SizeToArea(int) Unexecuted instantiation: transform.cc:Log2SizeToArea(int) Unexecuted instantiation: util.cc:Log2SizeToArea(int) Unexecuted instantiation: vps.cc:Log2SizeToArea(int) Unexecuted instantiation: vui.cc:Log2SizeToArea(int) Unexecuted instantiation: sse-motion.cc:Log2SizeToArea(int) Unexecuted instantiation: sse-dct.cc:Log2SizeToArea(int) Unexecuted instantiation: cabac.cc:Log2SizeToArea(int) Unexecuted instantiation: contextmodel.cc:Log2SizeToArea(int) Unexecuted instantiation: deblock.cc:Log2SizeToArea(int) Unexecuted instantiation: fallback-dct.cc:Log2SizeToArea(int) Unexecuted instantiation: fallback-motion.cc:Log2SizeToArea(int) Unexecuted instantiation: intrapred.cc:Log2SizeToArea(int) Unexecuted instantiation: motion.cc:Log2SizeToArea(int) Unexecuted instantiation: refpic.cc:Log2SizeToArea(int) |
131 | | |
132 | | void copy_subimage(uint8_t* dst,int dststride, |
133 | | const uint8_t* src,int srcstride, |
134 | | int w, int h); |
135 | | |
136 | | |
137 | | // === logging === |
138 | | |
139 | | enum LogModule { |
140 | | LogHighlevel, |
141 | | LogHeaders, |
142 | | LogSlice, |
143 | | LogDPB, |
144 | | LogMotion, |
145 | | LogTransform, |
146 | | LogDeblock, |
147 | | LogSAO, |
148 | | LogSEI, |
149 | | LogIntraPred, |
150 | | LogPixels, |
151 | | LogSymbols, |
152 | | LogCABAC, |
153 | | LogEncoder, |
154 | | LogEncoderMetadata, |
155 | | NUMBER_OF_LogModules |
156 | | }; |
157 | | |
158 | | |
159 | | #if defined(DE265_LOG_ERROR) || defined(DE265_LOG_INFO) || defined(DE265_LOG_DEBUG) || defined(DE265_LOG_TRACE) |
160 | | # define DE265_LOGGING 1 |
161 | | void enable_logging(enum LogModule); |
162 | | void disable_logging(enum LogModule); |
163 | | #else |
164 | | #define enable_logging(x) { } |
165 | | #define disable_logging(x) { } |
166 | | #endif |
167 | | |
168 | | #ifdef DE265_LOGGING |
169 | | void log_set_current_POC(int poc); |
170 | | #else |
171 | | #define log_set_current_POC(poc) { } |
172 | | #endif |
173 | | |
174 | | #ifdef DE265_LOG_ERROR |
175 | | void logerror(enum LogModule module, const char* string, ...); |
176 | | #else |
177 | | #define logerror(...) { } |
178 | | #endif |
179 | | |
180 | | #ifdef DE265_LOG_INFO |
181 | | void loginfo (enum LogModule module, const char* string, ...); |
182 | | #else |
183 | 273 | #define loginfo(...) { } |
184 | | #endif |
185 | | |
186 | | #ifdef DE265_LOG_DEBUG |
187 | | void logdebug(enum LogModule module, const char* string, ...); |
188 | | bool logdebug_enabled(enum LogModule module); |
189 | | #else |
190 | 234 | #define logdebug(...) { } |
191 | 0 | inline bool logdebug_enabled(enum LogModule module) { return false; } |
192 | | #endif |
193 | | |
194 | | #ifdef DE265_LOG_TRACE |
195 | | void logtrace(enum LogModule module, const char* string, ...); |
196 | | #else |
197 | 0 | #define logtrace(...) { } |
198 | | #endif |
199 | | |
200 | | void log2fh(FILE* fh, const char* string, ...); |
201 | | |
202 | | |
203 | | void printBlk(const char* title,const int32_t* data, int blksize, int stride, const std::string& prefix=" "); |
204 | | void printBlk(const char* title,const int16_t* data, int blksize, int stride, const std::string& prefix=" "); |
205 | | void printBlk(const char* title,const uint8_t* data, int blksize, int stride, const std::string& prefix=" "); |
206 | | |
207 | | void debug_set_image_output(void (*)(const struct de265_image*, int slot)); |
208 | | void debug_show_image(const struct de265_image*, int slot); |
209 | | |
210 | | #endif |