common.h - blind - suckless command-line video editing utility
 (HTM) git clone git://git.suckless.org/blind
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) 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)