Coverage Report

Created: 2026-05-30 06:08

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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