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