1 /*
2  * This file is part of mpv.
3  *
4  * mpv is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * mpv is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with mpv.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef MPLAYER_MPCOMMON_H
19 #define MPLAYER_MPCOMMON_H
20 
21 #include <assert.h>
22 #include <stddef.h>
23 #include <stdlib.h>
24 #include <stdbool.h>
25 #include <stdint.h>
26 
27 #include "osdep/compiler.h"
28 #include "mpv_talloc.h"
29 
30 // double should be able to represent this exactly
31 #define MP_NOPTS_VALUE (-0x1p+63)
32 
33 #define MP_CONCAT_(a, b) a ## b
34 #define MP_CONCAT(a, b) MP_CONCAT_(a, b)
35 
36 #define MPMAX(a, b) ((a) > (b) ? (a) : (b))
37 #define MPMIN(a, b) ((a) > (b) ? (b) : (a))
38 #define MPCLAMP(a, min, max) (((a) < (min)) ? (min) : (((a) > (max)) ? (max) : (a)))
39 #define MPSWAP(type, a, b) \
40     do { type SWAP_tmp = b; b = a; a = SWAP_tmp; } while (0)
41 #define MP_ARRAY_SIZE(s) (sizeof(s) / sizeof((s)[0]))
42 
43 // align must be a power of two (align >= 1), x >= 0
44 #define MP_ALIGN_UP(x, align) (((x) + (align) - 1) & ~((align) - 1))
45 #define MP_ALIGN_DOWN(x, align) ((x) & ~((align) - 1))
46 #define MP_IS_ALIGNED(x, align) (!((x) & ((align) - 1)))
47 #define MP_IS_POWER_OF_2(x) ((x) > 0 && !((x) & ((x) - 1)))
48 
49 // Return "a", or if that is NOPTS, return "def".
50 #define MP_PTS_OR_DEF(a, def) ((a) == MP_NOPTS_VALUE ? (def) : (a))
51 // If one of the values is NOPTS, always pick the other one.
52 #define MP_PTS_MIN(a, b) MPMIN(MP_PTS_OR_DEF(a, b), MP_PTS_OR_DEF(b, a))
53 #define MP_PTS_MAX(a, b) MPMAX(MP_PTS_OR_DEF(a, b), MP_PTS_OR_DEF(b, a))
54 // Return a+b, unless a is NOPTS. b must not be NOPTS.
55 #define MP_ADD_PTS(a, b) ((a) == MP_NOPTS_VALUE ? (a) : ((a) + (b)))
56 
57 #define CONTROL_OK 1
58 #define CONTROL_TRUE 1
59 #define CONTROL_FALSE 0
60 #define CONTROL_UNKNOWN -1
61 #define CONTROL_ERROR -2
62 #define CONTROL_NA -3
63 
64 enum stream_type {
65     STREAM_VIDEO,
66     STREAM_AUDIO,
67     STREAM_SUB,
68     STREAM_TYPE_COUNT,
69 };
70 
71 extern const char mpv_version[];
72 extern const char mpv_builddate[];
73 extern const char mpv_copyright[];
74 
75 char *mp_format_time(double time, bool fractions);
76 char *mp_format_time_fmt(const char *fmt, double time);
77 
78 struct mp_rect {
79     int x0, y0;
80     int x1, y1;
81 };
82 
83 #define mp_rect_w(r) ((r).x1 - (r).x0)
84 #define mp_rect_h(r) ((r).y1 - (r).y0)
85 
86 void mp_rect_union(struct mp_rect *rc, const struct mp_rect *src);
87 bool mp_rect_intersection(struct mp_rect *rc, const struct mp_rect *rc2);
88 bool mp_rect_contains(struct mp_rect *rc, int x, int y);
89 bool mp_rect_equals(struct mp_rect *rc1, struct mp_rect *rc2);
90 int mp_rect_subtract(const struct mp_rect *rc1, const struct mp_rect *rc2,
91                      struct mp_rect res_array[4]);
92 
93 unsigned int mp_log2(uint32_t v);
94 uint32_t mp_round_next_power_of_2(uint32_t v);
95 
96 int mp_snprintf_cat(char *str, size_t size, const char *format, ...)
97     PRINTF_ATTRIBUTE(3, 4);
98 
99 struct bstr;
100 
101 void mp_append_utf8_bstr(void *talloc_ctx, struct bstr *buf, uint32_t codepoint);
102 
103 bool mp_append_escaped_string_noalloc(void *talloc_ctx, struct bstr *dst,
104                                       struct bstr *src);
105 bool mp_append_escaped_string(void *talloc_ctx, struct bstr *dst,
106                               struct bstr *src);
107 
108 char *mp_strerror_buf(char *buf, size_t buf_size, int errnum);
109 #define mp_strerror(e) mp_strerror_buf((char[80]){0}, 80, e)
110 
111 char *mp_tag_str_buf(char *buf, size_t buf_size, uint32_t tag);
112 #define mp_tag_str(t) mp_tag_str_buf((char[22]){0}, 22, t)
113 
114 // Return a printf(format, ...) formatted string of the given SIZE. SIZE must
115 // be a compile time constant. The result is allocated on the stack and valid
116 // only within the current block scope.
117 #define mp_tprintf(SIZE, format, ...) \
118     mp_tprintf_buf((char[SIZE]){0}, (SIZE), (format), __VA_ARGS__)
119 char *mp_tprintf_buf(char *buf, size_t buf_size, const char *format, ...)
120     PRINTF_ATTRIBUTE(3, 4);
121 
122 char **mp_dup_str_array(void *tctx, char **s);
123 
124 // We generally do not handle allocation failure of small malloc()s. This would
125 // create a large number of rarely tested code paths, which would probably
126 // regress and cause security issues. We prefer to fail fast.
127 // This macro generally behaves like an assert(), except it will make sure to
128 // kill the process even with NDEBUG.
129 #define MP_HANDLE_OOM(x) do {   \
130         assert(x);              \
131         if (!(x))               \
132             abort();            \
133     } while (0)
134 
135 #endif /* MPLAYER_MPCOMMON_H */
136