common.h (4899B)
1 /* See LICENSE file for copyright and license details. */ 2 #if defined(__clang__) 3 # pragma clang diagnostic ignored "-Wdisabled-macro-expansion" 4 # pragma clang diagnostic ignored "-Wcomma" 5 # pragma clang diagnostic ignored "-Wcast-align" 6 # pragma clang diagnostic ignored "-Wassign-enum" 7 # pragma clang diagnostic ignored "-Wfloat-equal" 8 # pragma clang diagnostic ignored "-Wformat-nonliteral" 9 # pragma clang diagnostic ignored "-Wcovered-switch-default" 10 # pragma clang diagnostic ignored "-Wfloat-conversion" 11 # pragma clang diagnostic ignored "-Wabsolute-value" 12 # pragma clang diagnostic ignored "-Wconditional-uninitialized" 13 # pragma clang diagnostic ignored "-Wunreachable-code-return" 14 #elif defined(__GNUC__) 15 # pragma GCC diagnostic ignored "-Wfloat-equal" 16 # pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations" 17 # pragma GCC diagnostic ignored "-Wfloat-conversion" 18 #endif 19 20 #include "../build/platform.h" 21 #include "stream.h" 22 #include "util.h" 23 #include "video-math.h" 24 25 #include <arpa/inet.h> 26 #if defined(HAVE_EPOLL) 27 # include <sys/epoll.h> 28 #endif 29 #include <sys/mman.h> 30 #if defined(HAVE_SENDFILE) 31 # include <sys/sendfile.h> 32 #endif 33 #include <sys/stat.h> 34 #include <sys/socket.h> 35 #include <sys/uio.h> 36 #include <sys/un.h> 37 #include <sys/wait.h> 38 #include <alloca.h> 39 #include <ctype.h> 40 #include <errno.h> 41 #include <fcntl.h> 42 #include <inttypes.h> 43 #include <limits.h> 44 #include <signal.h> 45 #include <stdarg.h> 46 #include <stdio.h> 47 #include <stdlib.h> 48 #include <string.h> 49 #include <strings.h> 50 #include <unistd.h> 51 52 #ifndef CMSG_ALIGN 53 # ifdef __sun__ 54 # define CMSG_ALIGN _CMSG_DATA_ALIGN 55 # else 56 # define CMSG_ALIGN(len) (((len) + sizeof(long) - 1) & ~(sizeof(long) - 1)) 57 # endif 58 #endif 59 60 #ifndef CMSG_SPACE 61 # define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len)) 62 #endif 63 64 #ifndef CMSG_LEN 65 # define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len)) 66 #endif 67 68 #if !defined(PIPE_BUF) 69 # define PIPE_BUF 512 70 #endif 71 72 #ifndef DONT_INCLUDE_FLOAT 73 # define SELECT_PROCESS_FUNCTION_FLOAT(stream) else if ((stream)->encoding == FLOAT) process = process_f 74 #else 75 # define SELECT_PROCESS_FUNCTION_FLOAT(stream) else if (0) 76 #endif 77 78 #ifndef DONT_INCLUDE_DOUBLE 79 # define SELECT_PROCESS_FUNCTION_DOUBLE(stream) else if ((stream)->encoding == DOUBLE) process = process_lf 80 #else 81 # define SELECT_PROCESS_FUNCTION_DOUBLE(stream) else if (0) 82 #endif 83 84 #ifdef INCLUDE_LONG_DOUBLE 85 # define SELECT_PROCESS_FUNCTION_LONG_DOUBLE(stream) else if ((stream)->encoding == LONG_DOUBLE) process = process_llf 86 #else 87 # define SELECT_PROCESS_FUNCTION_LONG_DOUBLE(stream) else if (0) 88 #endif 89 90 #ifdef INCLUDE_UINT8 91 # define SELECT_PROCESS_FUNCTION_UINT8(stream) else if ((stream)->encoding == UINT8) process = process_u8 92 #else 93 # define SELECT_PROCESS_FUNCTION_UINT8(stream) else if (0) 94 #endif 95 96 #ifdef INCLUDE_UINT16 97 # define SELECT_PROCESS_FUNCTION_UINT16(stream) else if ((stream)->encoding == UINT16) process = process_u16 98 #else 99 # define SELECT_PROCESS_FUNCTION_UINT16(stream) else if (0) 100 #endif 101 102 #ifdef INCLUDE_UINT32 103 # define SELECT_PROCESS_FUNCTION_UINT32(stream) else if ((stream)->encoding == UINT32) process = process_u32 104 #else 105 # define SELECT_PROCESS_FUNCTION_UINT32(stream) else if (0) 106 #endif 107 108 #ifdef INCLUDE_UINT64 109 # define SELECT_PROCESS_FUNCTION_UINT64(stream) else if ((stream)->encoding == UINT64) process = process_u64 110 #else 111 # define SELECT_PROCESS_FUNCTION_UINT64(stream) else if (0) 112 #endif 113 114 #define SELECT_PROCESS_FUNCTION(stream)\ 115 do {\ 116 if ((stream)->endian != HOST)\ 117 eprintf("pixel format %s is not supported, try xyza\n", (stream)->pixfmt);\ 118 SELECT_PROCESS_FUNCTION_FLOAT(stream);\ 119 SELECT_PROCESS_FUNCTION_DOUBLE(stream);\ 120 SELECT_PROCESS_FUNCTION_LONG_DOUBLE(stream);\ 121 SELECT_PROCESS_FUNCTION_UINT8(stream);\ 122 SELECT_PROCESS_FUNCTION_UINT16(stream);\ 123 SELECT_PROCESS_FUNCTION_UINT32(stream);\ 124 SELECT_PROCESS_FUNCTION_UINT64(stream);\ 125 else\ 126 eprintf("pixel format %s is not supported, try xyza\n", (stream)->pixfmt);\ 127 } while (0) 128 129 #define CHECK_ALPHA_CHAN(stream)\ 130 do {\ 131 if ((stream)->alpha_chan != 3)\ 132 eprintf("pixel format %s is not supported, try xyza\n", (stream)->pixfmt);\ 133 } while (0) 134 135 #define CHECK_CHANS(stream, ALPHA, LUMA)\ 136 do {\ 137 if (!(((stream)->alpha_chan ALPHA) && ((stream)->luma_chan LUMA)))\ 138 eprintf("pixel format %s is not supported, try xyza\n", (stream)->pixfmt);\ 139 } while (0) 140 141 #define CHECK_ALPHA(stream)\ 142 do {\ 143 if ((stream)->alpha != UNPREMULTIPLIED)\ 144 eprintf("pixel format %s is not supported, try xyza\n", (stream)->pixfmt);\ 145 } while (0) 146 147 #define CHECK_COLOUR_SPACE(stream, colour_space)\ 148 do {\ 149 if ((stream)->space != (colour_space))\ 150 eprintf("pixel format %s is not supported, try xyza\n", (stream)->pixfmt);\ 151 } while (0) 152 153 #define CHECK_N_CHAN(stream, low, high)\ 154 do {\ 155 if ((stream)->n_chan < (low) || (stream)->n_chan > (high))\ 156 eprintf("pixel format %s is not supported, try xyza\n", (stream)->pixfmt);\ 157 } while (0)