1 | /***************************************************************************** |
2 | * vlc_common.h: common definitions |
3 | * Collection of useful common types and macros definitions |
4 | ***************************************************************************** |
5 | * Copyright (C) 1998-2011 VLC authors and VideoLAN |
6 | * |
7 | * Authors: Samuel Hocevar <sam@via.ecp.fr> |
8 | * Vincent Seguin <seguin@via.ecp.fr> |
9 | * Gildas Bazin <gbazin@videolan.org> |
10 | * RĂ©mi Denis-Courmont |
11 | * |
12 | * This program is free software; you can redistribute it and/or modify it |
13 | * under the terms of the GNU Lesser General Public License as published by |
14 | * the Free Software Foundation; either version 2.1 of the License, or |
15 | * (at your option) any later version. |
16 | * |
17 | * This program is distributed in the hope that it will be useful, |
18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
20 | * GNU Lesser General Public License for more details. |
21 | * |
22 | * You should have received a copy of the GNU Lesser General Public License |
23 | * along with this program; if not, write to the Free Software Foundation, |
24 | * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
25 | *****************************************************************************/ |
26 | |
27 | /** |
28 | * \file |
29 | * This file is a collection of common definitions and types |
30 | */ |
31 | |
32 | #ifndef VLC_COMMON_H |
33 | # define VLC_COMMON_H 1 |
34 | |
35 | /***************************************************************************** |
36 | * Required vlc headers |
37 | *****************************************************************************/ |
38 | #include "vlc_config.h" |
39 | |
40 | /***************************************************************************** |
41 | * Required system headers |
42 | *****************************************************************************/ |
43 | #include <stdlib.h> |
44 | #include <stdarg.h> |
45 | |
46 | #include <string.h> |
47 | #include <stdio.h> |
48 | #include <inttypes.h> |
49 | #include <stddef.h> |
50 | |
51 | #ifndef __cplusplus |
52 | # include <stdbool.h> |
53 | #endif |
54 | |
55 | /***************************************************************************** |
56 | * Compilers definitions |
57 | *****************************************************************************/ |
58 | /* Helper for GCC version checks */ |
59 | #ifdef __GNUC__ |
60 | # define VLC_GCC_VERSION(maj,min) \ |
61 | ((__GNUC__ > (maj)) || (__GNUC__ == (maj) && __GNUC_MINOR__ >= (min))) |
62 | #else |
63 | # define VLC_GCC_VERSION(maj,min) (0) |
64 | #endif |
65 | |
66 | /* Try to fix format strings for all versions of mingw and mingw64 */ |
67 | #if defined( _WIN32 ) && defined( __USE_MINGW_ANSI_STDIO ) |
68 | #undef PRId64 |
69 | #define PRId64 "lld" |
70 | #undef PRIi64 |
71 | #define PRIi64 "lli" |
72 | #undef PRIu64 |
73 | #define PRIu64 "llu" |
74 | #undef PRIo64 |
75 | #define PRIo64 "llo" |
76 | #undef PRIx64 |
77 | #define PRIx64 "llx" |
78 | #define snprintf __mingw_snprintf |
79 | #define vsnprintf __mingw_vsnprintf |
80 | #define swprintf _snwprintf |
81 | #endif |
82 | |
83 | /* Function attributes for compiler warnings */ |
84 | #ifdef __GNUC__ |
85 | # define VLC_DEPRECATED __attribute__((deprecated)) |
86 | # if VLC_GCC_VERSION(6,0) |
87 | # define VLC_DEPRECATED_ENUM __attribute__((deprecated)) |
88 | # else |
89 | # define VLC_DEPRECATED_ENUM |
90 | # endif |
91 | |
92 | # if defined( _WIN32 ) |
93 | # define VLC_FORMAT(x,y) __attribute__ ((format(gnu_printf,x,y))) |
94 | # else |
95 | # define VLC_FORMAT(x,y) __attribute__ ((format(printf,x,y))) |
96 | # endif |
97 | # define VLC_FORMAT_ARG(x) __attribute__ ((format_arg(x))) |
98 | # define VLC_MALLOC __attribute__ ((malloc)) |
99 | # define VLC_USED __attribute__ ((warn_unused_result)) |
100 | |
101 | #else |
102 | # define VLC_DEPRECATED |
103 | # define VLC_DEPRECATED_ENUM |
104 | # define VLC_FORMAT(x,y) |
105 | # define VLC_FORMAT_ARG(x) |
106 | # define VLC_MALLOC |
107 | # define VLC_USED |
108 | #endif |
109 | |
110 | |
111 | /* Branch prediction */ |
112 | #ifdef __GNUC__ |
113 | # define likely(p) __builtin_expect(!!(p), 1) |
114 | # define unlikely(p) __builtin_expect(!!(p), 0) |
115 | # define unreachable() __builtin_unreachable() |
116 | #else |
117 | # define likely(p) (!!(p)) |
118 | # define unlikely(p) (!!(p)) |
119 | # define unreachable() ((void)0) |
120 | #endif |
121 | |
122 | #define vlc_assert_unreachable() (assert(!"unreachable"), unreachable()) |
123 | |
124 | /* Linkage */ |
125 | #ifdef __cplusplus |
126 | # define VLC_EXTERN extern "C" |
127 | #else |
128 | # define VLC_EXTERN |
129 | #endif |
130 | |
131 | #if defined (_WIN32) && defined (DLL_EXPORT) |
132 | # define VLC_EXPORT __declspec(dllexport) |
133 | #elif defined (__GNUC__) |
134 | # define VLC_EXPORT __attribute__((visibility("default"))) |
135 | #else |
136 | # define VLC_EXPORT |
137 | #endif |
138 | |
139 | #define VLC_API VLC_EXTERN VLC_EXPORT |
140 | |
141 | |
142 | /***************************************************************************** |
143 | * Basic types definitions |
144 | *****************************************************************************/ |
145 | /** |
146 | * High precision date or time interval |
147 | * |
148 | * Store a high precision date or time interval. The maximum precision is the |
149 | * microsecond, and a 64 bits integer is used to avoid overflows (maximum |
150 | * time interval is then 292271 years, which should be long enough for any |
151 | * video). Dates are stored as microseconds since a common date (usually the |
152 | * epoch). Note that date and time intervals can be manipulated using regular |
153 | * arithmetic operators, and that no special functions are required. |
154 | */ |
155 | typedef int64_t mtime_t; |
156 | |
157 | /** |
158 | * The vlc_fourcc_t type. |
159 | * |
160 | * See http://www.webartz.com/fourcc/ for a very detailed list. |
161 | */ |
162 | typedef uint32_t vlc_fourcc_t; |
163 | |
164 | #ifdef WORDS_BIGENDIAN |
165 | # define VLC_FOURCC( a, b, c, d ) \ |
166 | ( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \ |
167 | | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) ) |
168 | # define VLC_TWOCC( a, b ) \ |
169 | ( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) ) |
170 | |
171 | #else |
172 | # define VLC_FOURCC( a, b, c, d ) \ |
173 | ( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \ |
174 | | ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) ) |
175 | # define VLC_TWOCC( a, b ) \ |
176 | ( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) ) |
177 | |
178 | #endif |
179 | |
180 | /** |
181 | * Translate a vlc_fourcc into its string representation. This function |
182 | * assumes there is enough room in psz_fourcc to store 4 characters in. |
183 | * |
184 | * \param fcc a vlc_fourcc_t |
185 | * \param psz_fourcc string to store string representation of vlc_fourcc in |
186 | */ |
187 | static inline void vlc_fourcc_to_char( vlc_fourcc_t fcc, char *psz_fourcc ) |
188 | { |
189 | memcpy( dest: psz_fourcc, src: &fcc, n: 4 ); |
190 | } |
191 | |
192 | /***************************************************************************** |
193 | * Classes declaration |
194 | *****************************************************************************/ |
195 | |
196 | /* Internal types */ |
197 | typedef struct vlc_list_t vlc_list_t; |
198 | typedef struct vlc_object_t vlc_object_t; |
199 | typedef struct libvlc_int_t libvlc_int_t; |
200 | typedef struct date_t date_t; |
201 | |
202 | /* Playlist */ |
203 | |
204 | typedef struct playlist_t playlist_t; |
205 | typedef struct playlist_item_t playlist_item_t; |
206 | typedef struct services_discovery_t services_discovery_t; |
207 | typedef struct services_discovery_sys_t services_discovery_sys_t; |
208 | typedef struct vlc_renderer_discovery_t vlc_renderer_discovery_t; |
209 | typedef struct vlc_renderer_item_t vlc_renderer_item_t; |
210 | |
211 | /* Modules */ |
212 | typedef struct module_t module_t; |
213 | typedef struct module_config_t module_config_t; |
214 | |
215 | typedef struct config_category_t config_category_t; |
216 | |
217 | /* Input */ |
218 | typedef struct input_thread_t input_thread_t; |
219 | typedef struct input_item_t input_item_t; |
220 | typedef struct input_item_node_t input_item_node_t; |
221 | typedef struct access_sys_t access_sys_t; |
222 | typedef struct stream_t stream_t; |
223 | typedef struct stream_sys_t stream_sys_t; |
224 | typedef struct demux_t demux_t; |
225 | typedef struct demux_sys_t demux_sys_t; |
226 | typedef struct es_out_t es_out_t; |
227 | typedef struct es_out_id_t es_out_id_t; |
228 | typedef struct es_out_sys_t es_out_sys_t; |
229 | typedef struct seekpoint_t seekpoint_t; |
230 | typedef struct info_t info_t; |
231 | typedef struct info_category_t info_category_t; |
232 | typedef struct input_attachment_t input_attachment_t; |
233 | |
234 | /* Format */ |
235 | typedef struct audio_format_t audio_format_t; |
236 | typedef struct video_format_t video_format_t; |
237 | typedef struct subs_format_t subs_format_t; |
238 | typedef struct es_format_t es_format_t; |
239 | typedef struct video_palette_t video_palette_t; |
240 | |
241 | /* Audio */ |
242 | typedef struct audio_output audio_output_t; |
243 | typedef struct aout_sys_t aout_sys_t; |
244 | typedef audio_format_t audio_sample_format_t; |
245 | |
246 | /* Video */ |
247 | typedef struct vout_thread_t vout_thread_t; |
248 | typedef struct vlc_viewpoint_t vlc_viewpoint_t; |
249 | |
250 | typedef video_format_t video_frame_format_t; |
251 | typedef struct picture_t picture_t; |
252 | typedef struct picture_sys_t picture_sys_t; |
253 | |
254 | /* Subpictures */ |
255 | typedef struct spu_t spu_t; |
256 | typedef struct subpicture_t subpicture_t; |
257 | typedef struct subpicture_region_t subpicture_region_t; |
258 | |
259 | typedef struct image_handler_t image_handler_t; |
260 | |
261 | /* Stream output */ |
262 | typedef struct sout_instance_t sout_instance_t; |
263 | |
264 | typedef struct sout_input_t sout_input_t; |
265 | typedef struct sout_packetizer_input_t sout_packetizer_input_t; |
266 | |
267 | typedef struct sout_access_out_t sout_access_out_t; |
268 | typedef struct sout_access_out_sys_t sout_access_out_sys_t; |
269 | |
270 | typedef struct sout_mux_t sout_mux_t; |
271 | typedef struct sout_mux_sys_t sout_mux_sys_t; |
272 | |
273 | typedef struct sout_stream_t sout_stream_t; |
274 | typedef struct sout_stream_sys_t sout_stream_sys_t; |
275 | |
276 | typedef struct config_chain_t config_chain_t; |
277 | typedef struct session_descriptor_t session_descriptor_t; |
278 | |
279 | /* Decoders */ |
280 | typedef struct decoder_t decoder_t; |
281 | typedef struct decoder_sys_t decoder_sys_t; |
282 | typedef struct decoder_synchro_t decoder_synchro_t; |
283 | |
284 | /* Encoders */ |
285 | typedef struct encoder_t encoder_t; |
286 | typedef struct encoder_sys_t encoder_sys_t; |
287 | |
288 | /* Filters */ |
289 | typedef struct filter_t filter_t; |
290 | typedef struct filter_sys_t filter_sys_t; |
291 | |
292 | /* Network */ |
293 | typedef struct vlc_url_t vlc_url_t; |
294 | |
295 | /* Misc */ |
296 | typedef struct iso639_lang_t iso639_lang_t; |
297 | |
298 | /* block */ |
299 | typedef struct block_t block_t; |
300 | typedef struct block_fifo_t block_fifo_t; |
301 | |
302 | /* Hashing */ |
303 | typedef struct md5_s md5_t; |
304 | |
305 | /* XML */ |
306 | typedef struct xml_t xml_t; |
307 | typedef struct xml_sys_t xml_sys_t; |
308 | typedef struct xml_reader_t xml_reader_t; |
309 | typedef struct xml_reader_sys_t xml_reader_sys_t; |
310 | |
311 | /* vod server */ |
312 | typedef struct vod_t vod_t; |
313 | typedef struct vod_sys_t vod_sys_t; |
314 | typedef struct vod_media_t vod_media_t; |
315 | |
316 | /* VLM */ |
317 | typedef struct vlm_t vlm_t; |
318 | typedef struct vlm_message_t vlm_message_t; |
319 | |
320 | /* misc */ |
321 | typedef struct vlc_meta_t vlc_meta_t; |
322 | typedef struct input_stats_t input_stats_t; |
323 | typedef struct addon_entry_t addon_entry_t; |
324 | |
325 | /* Update */ |
326 | typedef struct update_t update_t; |
327 | |
328 | /** |
329 | * VLC value structure |
330 | */ |
331 | typedef union |
332 | { |
333 | int64_t i_int; |
334 | bool b_bool; |
335 | float f_float; |
336 | char * psz_string; |
337 | void * p_address; |
338 | vlc_list_t * p_list; |
339 | struct { int32_t x; int32_t y; } coords; |
340 | |
341 | } vlc_value_t; |
342 | |
343 | /** |
344 | * VLC list structure |
345 | */ |
346 | struct vlc_list_t |
347 | { |
348 | int i_type; |
349 | int i_count; |
350 | vlc_value_t *p_values; |
351 | }; |
352 | |
353 | /***************************************************************************** |
354 | * Error values (shouldn't be exposed) |
355 | *****************************************************************************/ |
356 | #define VLC_SUCCESS (-0) /**< No error */ |
357 | #define VLC_EGENERIC (-1) /**< Unspecified error */ |
358 | #define VLC_ENOMEM (-2) /**< Not enough memory */ |
359 | #define VLC_ETIMEOUT (-3) /**< Timeout */ |
360 | #define VLC_ENOMOD (-4) /**< Module not found */ |
361 | #define VLC_ENOOBJ (-5) /**< Object not found */ |
362 | #define VLC_ENOVAR (-6) /**< Variable not found */ |
363 | #define VLC_EBADVAR (-7) /**< Bad variable value */ |
364 | #define VLC_ENOITEM (-8) /**< Item not found */ |
365 | |
366 | /***************************************************************************** |
367 | * Variable callbacks: called when the value is modified |
368 | *****************************************************************************/ |
369 | typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */ |
370 | char const *, /* variable name */ |
371 | vlc_value_t, /* old value */ |
372 | vlc_value_t, /* new value */ |
373 | void * ); /* callback data */ |
374 | |
375 | /***************************************************************************** |
376 | * List callbacks: called when elements are added/removed from the list |
377 | *****************************************************************************/ |
378 | typedef int ( * vlc_list_callback_t ) ( vlc_object_t *, /* variable's object */ |
379 | char const *, /* variable name */ |
380 | int, /* VLC_VAR_* action */ |
381 | vlc_value_t *, /* new/deleted value */ |
382 | void *); /* callback data */ |
383 | |
384 | /***************************************************************************** |
385 | * OS-specific headers and thread types |
386 | *****************************************************************************/ |
387 | #if defined( _WIN32 ) |
388 | # include <malloc.h> |
389 | # ifndef PATH_MAX |
390 | # define PATH_MAX MAX_PATH |
391 | # endif |
392 | # include <windows.h> |
393 | #endif |
394 | |
395 | #ifdef __APPLE__ |
396 | #include <sys/syslimits.h> |
397 | #include <AvailabilityMacros.h> |
398 | #endif |
399 | |
400 | #ifdef __OS2__ |
401 | # define OS2EMX_PLAIN_CHAR |
402 | # define INCL_BASE |
403 | # define INCL_PM |
404 | # include <os2safe.h> |
405 | # include <os2.h> |
406 | #endif |
407 | |
408 | #include "vlc_mtime.h" |
409 | #include "vlc_threads.h" |
410 | |
411 | /** |
412 | * Common structure members |
413 | *****************************************************************************/ |
414 | |
415 | /** |
416 | * VLC object common members |
417 | * |
418 | * Common public properties for all VLC objects. |
419 | * Object also have private properties maintained by the core, see |
420 | * \ref vlc_object_internals_t |
421 | */ |
422 | struct vlc_common_members |
423 | { |
424 | /** Object type name |
425 | * |
426 | * A constant string identifying the type of the object (for logging) |
427 | */ |
428 | const char *object_type; |
429 | |
430 | /** Log messages header |
431 | * |
432 | * Human-readable header for log messages. This is not thread-safe and |
433 | * only used by VLM and Lua interfaces. |
434 | */ |
435 | char *; |
436 | |
437 | int flags; |
438 | |
439 | /** Module probe flag |
440 | * |
441 | * A boolean during module probing when the probe is "forced". |
442 | * See \ref module_need(). |
443 | */ |
444 | bool force; |
445 | |
446 | /** LibVLC instance |
447 | * |
448 | * Root VLC object of the objects tree that this object belongs in. |
449 | */ |
450 | libvlc_int_t *libvlc; |
451 | |
452 | /** Parent object |
453 | * |
454 | * The parent VLC object in the objects tree. For the root (the LibVLC |
455 | * instance) object, this is NULL. |
456 | */ |
457 | vlc_object_t *parent; |
458 | }; |
459 | |
460 | /** |
461 | * Backward compatibility macro |
462 | */ |
463 | #define VLC_COMMON_MEMBERS struct vlc_common_members obj; |
464 | |
465 | /** |
466 | * Type-safe vlc_object_t cast |
467 | * |
468 | * This macro attempts to cast a pointer to a compound type to a |
469 | * \ref vlc_object_t pointer in a type-safe manner. |
470 | * It checks if the compound type actually starts with an embedded |
471 | * \ref vlc_object_t structure. |
472 | */ |
473 | #if !defined(__cplusplus) |
474 | # define VLC_OBJECT(x) \ |
475 | _Generic((x)->obj, \ |
476 | struct vlc_common_members: (vlc_object_t *)(&(x)->obj), \ |
477 | const struct vlc_common_members: (const vlc_object_t *)(&(x)->obj) \ |
478 | ) |
479 | #else |
480 | # define VLC_OBJECT( x ) ((vlc_object_t *)&(x)->obj) |
481 | #endif |
482 | |
483 | /***************************************************************************** |
484 | * Macros and inline functions |
485 | *****************************************************************************/ |
486 | |
487 | /* __MAX and __MIN: self explanatory */ |
488 | #ifndef __MAX |
489 | # define __MAX(a, b) ( ((a) > (b)) ? (a) : (b) ) |
490 | #endif |
491 | #ifndef __MIN |
492 | # define __MIN(a, b) ( ((a) < (b)) ? (a) : (b) ) |
493 | #endif |
494 | |
495 | /* clip v in [min, max] */ |
496 | #define VLC_CLIP(v, min, max) __MIN(__MAX((v), (min)), (max)) |
497 | |
498 | VLC_USED |
499 | static inline int64_t GCD ( int64_t a, int64_t b ) |
500 | { |
501 | while( b ) |
502 | { |
503 | int64_t c = a % b; |
504 | a = b; |
505 | b = c; |
506 | } |
507 | return a; |
508 | } |
509 | |
510 | /* function imported from libavutil/common.h */ |
511 | VLC_USED |
512 | static inline uint8_t clip_uint8_vlc( int32_t a ) |
513 | { |
514 | if( a&(~255) ) return (-a)>>31; |
515 | else return a; |
516 | } |
517 | |
518 | /** Count leading zeroes */ |
519 | VLC_USED |
520 | static inline unsigned (clz)(unsigned x) |
521 | { |
522 | #ifdef __GNUC__ |
523 | return __builtin_clz (x); |
524 | #else |
525 | unsigned i = sizeof (x) * 8; |
526 | |
527 | while (x) |
528 | { |
529 | x >>= 1; |
530 | i--; |
531 | } |
532 | return i; |
533 | #endif |
534 | } |
535 | |
536 | #define clz8( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint8_t)) * 8)) |
537 | #define clz16( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint16_t)) * 8)) |
538 | /* XXX: this assumes that int is 32-bits or more */ |
539 | #define clz32( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint32_t)) * 8)) |
540 | |
541 | /** Count trailing zeroes */ |
542 | VLC_USED |
543 | static inline unsigned (ctz)(unsigned x) |
544 | { |
545 | #ifdef __GNUC__ |
546 | return __builtin_ctz (x); |
547 | #else |
548 | unsigned i = sizeof (x) * 8; |
549 | |
550 | while (x) |
551 | { |
552 | x <<= 1; |
553 | i--; |
554 | } |
555 | return i; |
556 | #endif |
557 | } |
558 | |
559 | #if !defined(__NetBSD__) |
560 | /** Bit weight */ |
561 | VLC_USED |
562 | static inline unsigned (popcount)(unsigned x) |
563 | { |
564 | #ifdef __GNUC__ |
565 | return __builtin_popcount (x); |
566 | #else |
567 | unsigned count = 0; |
568 | while (x) |
569 | { |
570 | count += x & 1; |
571 | x = x >> 1; |
572 | } |
573 | return count; |
574 | #endif |
575 | } |
576 | |
577 | /** Bit weight of long long */ |
578 | VLC_USED |
579 | static inline int (popcountll)(unsigned long long x) |
580 | { |
581 | #ifdef __GNUC__ |
582 | return __builtin_popcountll(x); |
583 | #else |
584 | int count = 0; |
585 | while (x) |
586 | { |
587 | count += x & 1; |
588 | x = x >> 1; |
589 | } |
590 | return count; |
591 | #endif |
592 | } |
593 | #endif |
594 | |
595 | VLC_USED |
596 | static inline unsigned (parity)(unsigned x) |
597 | { |
598 | #ifdef __GNUC__ |
599 | return __builtin_parity (x); |
600 | #else |
601 | for (unsigned i = 4 * sizeof (x); i > 0; i /= 2) |
602 | x ^= x >> i; |
603 | return x & 1; |
604 | #endif |
605 | } |
606 | |
607 | #if !defined(__NetBSD__) |
608 | /** Byte swap (16 bits) */ |
609 | VLC_USED |
610 | static inline uint16_t (bswap16)(uint16_t x) |
611 | { |
612 | return (x << 8) | (x >> 8); |
613 | } |
614 | |
615 | /** Byte swap (32 bits) */ |
616 | VLC_USED |
617 | static inline uint32_t (bswap32)(uint32_t x) |
618 | { |
619 | #if defined (__GNUC__) || defined(__clang__) |
620 | return __builtin_bswap32 (x); |
621 | #else |
622 | return ((x & 0x000000FF) << 24) |
623 | | ((x & 0x0000FF00) << 8) |
624 | | ((x & 0x00FF0000) >> 8) |
625 | | ((x & 0xFF000000) >> 24); |
626 | #endif |
627 | } |
628 | |
629 | /** Byte swap (64 bits) */ |
630 | VLC_USED |
631 | static inline uint64_t (bswap64)(uint64_t x) |
632 | { |
633 | #if defined (__GNUC__) || defined(__clang__) |
634 | return __builtin_bswap64 (x); |
635 | #elif !defined (__cplusplus) |
636 | return ((x & 0x00000000000000FF) << 56) |
637 | | ((x & 0x000000000000FF00) << 40) |
638 | | ((x & 0x0000000000FF0000) << 24) |
639 | | ((x & 0x00000000FF000000) << 8) |
640 | | ((x & 0x000000FF00000000) >> 8) |
641 | | ((x & 0x0000FF0000000000) >> 24) |
642 | | ((x & 0x00FF000000000000) >> 40) |
643 | | ((x & 0xFF00000000000000) >> 56); |
644 | #else |
645 | return ((x & 0x00000000000000FFULL) << 56) |
646 | | ((x & 0x000000000000FF00ULL) << 40) |
647 | | ((x & 0x0000000000FF0000ULL) << 24) |
648 | | ((x & 0x00000000FF000000ULL) << 8) |
649 | | ((x & 0x000000FF00000000ULL) >> 8) |
650 | | ((x & 0x0000FF0000000000ULL) >> 24) |
651 | | ((x & 0x00FF000000000000ULL) >> 40) |
652 | | ((x & 0xFF00000000000000ULL) >> 56); |
653 | #endif |
654 | } |
655 | #endif |
656 | |
657 | /* Integer overflow */ |
658 | static inline bool uadd_overflow(unsigned a, unsigned b, unsigned *res) |
659 | { |
660 | #if VLC_GCC_VERSION(5,0) || defined(__clang__) |
661 | return __builtin_uadd_overflow(a, b, res); |
662 | #else |
663 | *res = a + b; |
664 | return (a + b) < a; |
665 | #endif |
666 | } |
667 | |
668 | static inline bool uaddl_overflow(unsigned long a, unsigned long b, |
669 | unsigned long *res) |
670 | { |
671 | #if VLC_GCC_VERSION(5,0) || defined(__clang__) |
672 | return __builtin_uaddl_overflow(a, b, res); |
673 | #else |
674 | *res = a + b; |
675 | return (a + b) < a; |
676 | #endif |
677 | } |
678 | |
679 | static inline bool uaddll_overflow(unsigned long long a, unsigned long long b, |
680 | unsigned long long *res) |
681 | { |
682 | #if VLC_GCC_VERSION(5,0) || defined(__clang__) |
683 | return __builtin_uaddll_overflow(a, b, res); |
684 | #else |
685 | *res = a + b; |
686 | return (a + b) < a; |
687 | #endif |
688 | } |
689 | |
690 | #ifndef __cplusplus |
691 | # define add_overflow(a,b,r) \ |
692 | _Generic(*(r), \ |
693 | unsigned: uadd_overflow(a, b, (unsigned *)(r)), \ |
694 | unsigned long: uaddl_overflow(a, b, (unsigned long *)(r)), \ |
695 | unsigned long long: uaddll_overflow(a, b, (unsigned long long *)(r))) |
696 | #else |
697 | static inline bool add_overflow(unsigned a, unsigned b, unsigned *res) |
698 | { |
699 | return uadd_overflow(a, b, res); |
700 | } |
701 | |
702 | static inline bool add_overflow(unsigned long a, unsigned long b, |
703 | unsigned long *res) |
704 | { |
705 | return uaddl_overflow(a, b, res); |
706 | } |
707 | |
708 | static inline bool add_overflow(unsigned long long a, unsigned long long b, |
709 | unsigned long long *res) |
710 | { |
711 | return uaddll_overflow(a, b, res); |
712 | } |
713 | #endif |
714 | |
715 | #if !(VLC_GCC_VERSION(5,0) || defined(__clang__)) |
716 | # include <limits.h> |
717 | #endif |
718 | |
719 | static inline bool umul_overflow(unsigned a, unsigned b, unsigned *res) |
720 | { |
721 | #if VLC_GCC_VERSION(5,0) || defined(__clang__) |
722 | return __builtin_umul_overflow(a, b, res); |
723 | #else |
724 | *res = a * b; |
725 | return b > 0 && a > (UINT_MAX / b); |
726 | #endif |
727 | } |
728 | |
729 | static inline bool umull_overflow(unsigned long a, unsigned long b, |
730 | unsigned long *res) |
731 | { |
732 | #if VLC_GCC_VERSION(5,0) || defined(__clang__) |
733 | return __builtin_umull_overflow(a, b, res); |
734 | #else |
735 | *res = a * b; |
736 | return b > 0 && a > (ULONG_MAX / b); |
737 | #endif |
738 | } |
739 | |
740 | static inline bool umulll_overflow(unsigned long long a, unsigned long long b, |
741 | unsigned long long *res) |
742 | { |
743 | #if VLC_GCC_VERSION(5,0) || defined(__clang__) |
744 | return __builtin_umulll_overflow(a, b, res); |
745 | #else |
746 | *res = a * b; |
747 | return b > 0 && a > (ULLONG_MAX / b); |
748 | #endif |
749 | } |
750 | |
751 | #ifndef __cplusplus |
752 | #define mul_overflow(a,b,r) \ |
753 | _Generic(*(r), \ |
754 | unsigned: umul_overflow(a, b, (unsigned *)(r)), \ |
755 | unsigned long: umull_overflow(a, b, (unsigned long *)(r)), \ |
756 | unsigned long long: umulll_overflow(a, b, (unsigned long long *)(r))) |
757 | #else |
758 | static inline bool mul_overflow(unsigned a, unsigned b, unsigned *res) |
759 | { |
760 | return umul_overflow(a, b, res); |
761 | } |
762 | |
763 | static inline bool mul_overflow(unsigned long a, unsigned long b, |
764 | unsigned long *res) |
765 | { |
766 | return umull_overflow(a, b, res); |
767 | } |
768 | |
769 | static inline bool mul_overflow(unsigned long long a, unsigned long long b, |
770 | unsigned long long *res) |
771 | { |
772 | return umulll_overflow(a, b, res); |
773 | } |
774 | #endif |
775 | |
776 | /* Free and set set the variable to NULL */ |
777 | #define FREENULL(a) do { free( a ); a = NULL; } while(0) |
778 | |
779 | #define EMPTY_STR(str) (!str || !*str) |
780 | |
781 | VLC_API char const * vlc_error( int ) VLC_USED; |
782 | |
783 | #include <vlc_arrays.h> |
784 | |
785 | /* MSB (big endian)/LSB (little endian) conversions - network order is always |
786 | * MSB, and should be used for both network communications and files. */ |
787 | |
788 | #ifdef WORDS_BIGENDIAN |
789 | # define hton16(i) ((uint16_t)(i)) |
790 | # define hton32(i) ((uint32_t)(i)) |
791 | # define hton64(i) ((uint64_t)(i)) |
792 | #else |
793 | # define hton16(i) bswap16(i) |
794 | # define hton32(i) bswap32(i) |
795 | # define hton64(i) bswap64(i) |
796 | #endif |
797 | #define ntoh16(i) hton16(i) |
798 | #define ntoh32(i) hton32(i) |
799 | #define ntoh64(i) hton64(i) |
800 | |
801 | /** Reads 16 bits in network byte order */ |
802 | VLC_USED |
803 | static inline uint16_t U16_AT (const void *p) |
804 | { |
805 | uint16_t x; |
806 | |
807 | memcpy (dest: &x, src: p, n: sizeof (x)); |
808 | return ntoh16 (x); |
809 | } |
810 | |
811 | /** Reads 32 bits in network byte order */ |
812 | VLC_USED |
813 | static inline uint32_t U32_AT (const void *p) |
814 | { |
815 | uint32_t x; |
816 | |
817 | memcpy (dest: &x, src: p, n: sizeof (x)); |
818 | return ntoh32 (x); |
819 | } |
820 | |
821 | /** Reads 64 bits in network byte order */ |
822 | VLC_USED |
823 | static inline uint64_t U64_AT (const void *p) |
824 | { |
825 | uint64_t x; |
826 | |
827 | memcpy (dest: &x, src: p, n: sizeof (x)); |
828 | return ntoh64 (x); |
829 | } |
830 | |
831 | #define GetWBE(p) U16_AT(p) |
832 | #define GetDWBE(p) U32_AT(p) |
833 | #define GetQWBE(p) U64_AT(p) |
834 | |
835 | /** Reads 16 bits in little-endian order */ |
836 | VLC_USED |
837 | static inline uint16_t GetWLE (const void *p) |
838 | { |
839 | uint16_t x; |
840 | |
841 | memcpy (dest: &x, src: p, n: sizeof (x)); |
842 | #ifdef WORDS_BIGENDIAN |
843 | x = bswap16 (x); |
844 | #endif |
845 | return x; |
846 | } |
847 | |
848 | /** Reads 32 bits in little-endian order */ |
849 | VLC_USED |
850 | static inline uint32_t GetDWLE (const void *p) |
851 | { |
852 | uint32_t x; |
853 | |
854 | memcpy (dest: &x, src: p, n: sizeof (x)); |
855 | #ifdef WORDS_BIGENDIAN |
856 | x = bswap32 (x); |
857 | #endif |
858 | return x; |
859 | } |
860 | |
861 | /** Reads 64 bits in little-endian order */ |
862 | VLC_USED |
863 | static inline uint64_t GetQWLE (const void *p) |
864 | { |
865 | uint64_t x; |
866 | |
867 | memcpy (dest: &x, src: p, n: sizeof (x)); |
868 | #ifdef WORDS_BIGENDIAN |
869 | x = bswap64 (x); |
870 | #endif |
871 | return x; |
872 | } |
873 | |
874 | /** Writes 16 bits in network byte order */ |
875 | static inline void SetWBE (void *p, uint16_t w) |
876 | { |
877 | w = hton16 (w); |
878 | memcpy (dest: p, src: &w, n: sizeof (w)); |
879 | } |
880 | |
881 | /** Writes 32 bits in network byte order */ |
882 | static inline void SetDWBE (void *p, uint32_t dw) |
883 | { |
884 | dw = hton32 (dw); |
885 | memcpy (dest: p, src: &dw, n: sizeof (dw)); |
886 | } |
887 | |
888 | /** Writes 64 bits in network byte order */ |
889 | static inline void SetQWBE (void *p, uint64_t qw) |
890 | { |
891 | qw = hton64 (qw); |
892 | memcpy (dest: p, src: &qw, n: sizeof (qw)); |
893 | } |
894 | |
895 | /** Writes 16 bits in little endian order */ |
896 | static inline void SetWLE (void *p, uint16_t w) |
897 | { |
898 | #ifdef WORDS_BIGENDIAN |
899 | w = bswap16 (w); |
900 | #endif |
901 | memcpy (dest: p, src: &w, n: sizeof (w)); |
902 | } |
903 | |
904 | /** Writes 32 bits in little endian order */ |
905 | static inline void SetDWLE (void *p, uint32_t dw) |
906 | { |
907 | #ifdef WORDS_BIGENDIAN |
908 | dw = bswap32 (dw); |
909 | #endif |
910 | memcpy (dest: p, src: &dw, n: sizeof (dw)); |
911 | } |
912 | |
913 | /** Writes 64 bits in little endian order */ |
914 | static inline void SetQWLE (void *p, uint64_t qw) |
915 | { |
916 | #ifdef WORDS_BIGENDIAN |
917 | qw = bswap64 (qw); |
918 | #endif |
919 | memcpy (dest: p, src: &qw, n: sizeof (qw)); |
920 | } |
921 | |
922 | /* */ |
923 | #define VLC_UNUSED(x) (void)(x) |
924 | |
925 | /* Stuff defined in src/extras/libc.c */ |
926 | |
927 | #if defined(_WIN32) |
928 | /* several type definitions */ |
929 | # if defined( __MINGW32__ ) |
930 | # if !defined( _OFF_T_ ) |
931 | typedef long long _off_t; |
932 | typedef _off_t off_t; |
933 | # define _OFF_T_ |
934 | # else |
935 | # ifdef off_t |
936 | # undef off_t |
937 | # endif |
938 | # define off_t long long |
939 | # endif |
940 | # endif |
941 | |
942 | # ifndef O_NONBLOCK |
943 | # define O_NONBLOCK 0 |
944 | # endif |
945 | |
946 | # include <tchar.h> |
947 | #endif /* _WIN32 */ |
948 | |
949 | typedef struct { |
950 | unsigned num, den; |
951 | } vlc_rational_t; |
952 | |
953 | VLC_API bool vlc_ureduce( unsigned *, unsigned *, uint64_t, uint64_t, uint64_t ); |
954 | |
955 | #define container_of(ptr, type, member) \ |
956 | ((type *)(((char *)(ptr)) - offsetof(type, member))) |
957 | |
958 | VLC_USED VLC_MALLOC |
959 | static inline void *vlc_alloc(size_t count, size_t size) |
960 | { |
961 | return mul_overflow(a: count, b: size, res: &size) ? NULL : malloc(size: size); |
962 | } |
963 | |
964 | /***************************************************************************** |
965 | * I18n stuff |
966 | *****************************************************************************/ |
967 | VLC_API char *vlc_gettext( const char *msgid ) VLC_FORMAT_ARG(1); |
968 | VLC_API char *vlc_ngettext( const char *s, const char *p, unsigned long n ) VLC_FORMAT_ARG(1) VLC_FORMAT_ARG(2); |
969 | |
970 | #define vlc_pgettext( ctx, id ) \ |
971 | vlc_pgettext_aux( ctx "\004" id, id ) |
972 | |
973 | VLC_FORMAT_ARG(2) |
974 | static inline const char *vlc_pgettext_aux( const char *ctx, const char *id ) |
975 | { |
976 | const char *tr = vlc_gettext( msgid: ctx ); |
977 | return (tr == ctx) ? id : tr; |
978 | } |
979 | |
980 | /***************************************************************************** |
981 | * Loosy memory allocation functions. Do not use in new code. |
982 | *****************************************************************************/ |
983 | static inline void *xmalloc(size_t len) |
984 | { |
985 | void *ptr = malloc(size: len); |
986 | if (unlikely(ptr == NULL && len > 0)) |
987 | abort(); |
988 | return ptr; |
989 | } |
990 | |
991 | static inline void *xrealloc(void *ptr, size_t len) |
992 | { |
993 | void *nptr = realloc(ptr: ptr, size: len); |
994 | if (unlikely(nptr == NULL && len > 0)) |
995 | abort(); |
996 | return nptr; |
997 | } |
998 | |
999 | static inline void *xcalloc(size_t n, size_t size) |
1000 | { |
1001 | void *ptr = calloc(nmemb: n, size: size); |
1002 | if (unlikely(ptr == NULL && (n > 0 || size > 0))) |
1003 | abort (); |
1004 | return ptr; |
1005 | } |
1006 | |
1007 | static inline char *xstrdup (const char *str) |
1008 | { |
1009 | char *ptr = strdup (s: str); |
1010 | if (unlikely(ptr == NULL)) |
1011 | abort (); |
1012 | return ptr; |
1013 | } |
1014 | |
1015 | /***************************************************************************** |
1016 | * libvlc features |
1017 | *****************************************************************************/ |
1018 | VLC_API const char * VLC_CompileBy( void ) VLC_USED; |
1019 | VLC_API const char * VLC_CompileHost( void ) VLC_USED; |
1020 | VLC_API const char * VLC_Compiler( void ) VLC_USED; |
1021 | |
1022 | /***************************************************************************** |
1023 | * Additional vlc stuff |
1024 | *****************************************************************************/ |
1025 | #include "vlc_messages.h" |
1026 | #include "vlc_objects.h" |
1027 | #include "vlc_variables.h" |
1028 | #include "vlc_main.h" |
1029 | #include "vlc_configuration.h" |
1030 | |
1031 | #if defined( _WIN32 ) || defined( __OS2__ ) |
1032 | # define DIR_SEP_CHAR '\\' |
1033 | # define DIR_SEP "\\" |
1034 | # define PATH_SEP_CHAR ';' |
1035 | # define PATH_SEP ";" |
1036 | #else |
1037 | # define DIR_SEP_CHAR '/' |
1038 | # define DIR_SEP "/" |
1039 | # define PATH_SEP_CHAR ':' |
1040 | # define PATH_SEP ":" |
1041 | #endif |
1042 | |
1043 | #define LICENSE_MSG \ |
1044 | _("This program comes with NO WARRANTY, to the extent permitted by " \ |
1045 | "law.\nYou may redistribute it under the terms of the GNU General " \ |
1046 | "Public License;\nsee the file named COPYING for details.\n" \ |
1047 | "Written by the VideoLAN team; see the AUTHORS file.\n") |
1048 | |
1049 | #endif /* !VLC_COMMON_H */ |
1050 | |