blind

suckless command-line video editing utility
git clone git://git.suckless.org/blind
Log | Files | Refs | README | LICENSE

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)