diff options
| author | Mattias Andrée <maandree@kth.se> | 2017-12-07 23:48:45 +0100 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2017-12-07 23:48:45 +0100 |
| commit | 4d7c506a29a5153a2b6ab903d2f4731bbab6abcb (patch) | |
| tree | 67bdf5fa8d517cd9fc137f45567f4e312a0f4fc9 /src/libblind.h | |
| parent | blind-peek-head: fix minor compile-time bug (diff) | |
| download | blind-4d7c506a29a5153a2b6ab903d2f4731bbab6abcb.tar.gz blind-4d7c506a29a5153a2b6ab903d2f4731bbab6abcb.tar.bz2 blind-4d7c506a29a5153a2b6ab903d2f4731bbab6abcb.tar.xz | |
Start on libblind
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src/libblind.h')
| -rw-r--r-- | src/libblind.h | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/src/libblind.h b/src/libblind.h new file mode 100644 index 0000000..e358dd9 --- /dev/null +++ b/src/libblind.h @@ -0,0 +1,190 @@ +/* See LICENSE file for copyright and license details. */ +#ifndef LIBBLIND_H +#define LIBBLIND_H + + +#include <stdlib.h> + + +#ifdef LIBBLIND_NO_NAMESPACE +/* errors and error related functions are still namespaced */ +# define libblind_dimension dimension +# define LIBBLIND_WIDTH WIDTH +# define LIBBLIND_HEIGHT HEIGHT +# define LIBBLIND_LENGTH LENGTH +# define libblind_colour_space colour_space +# define LIBBLIND_CIEXYZ CIEXYZ +# define LIBBLIND_YUV_NONLINEAR YUV_NONLINEAR +# define LIBBLIND_SRGB_NONLINEAR SRGB_NONLINEAR +# define LIBBLIND_SRGB SRGB +# define libblind_alpha alpha +# define LIBBLIND_NO_ALPHA NO_ALPHA +# define LIBBLIND_UNPREMULTIPLIED UNPREMULTIPLIED +# define LIBBLIND_PREMULTIPLIED PREMULTIPLIED +# define libblind_encoding encoding +# define LIBBLIND_FLOAT FLOAT +# define LIBBLIND_DOUBLE DOUBLE +# define LIBBLIND_LONG_DOUBLE LONG_DOUBLE +# define LIBBLIND_UINT8 UINT8 +# define LIBBLIND_UINT16 UINT16 +# define LIBBLIND_UINT32 UINT32 +# define LIBBLIND_UINT64 UINT64 +# define libblind_endian endian +# define LIBBLIND_HOST HOST +# define LIBBLIND_LITTLE LITTLE +# define LIBBLIND_BIG BIG +# define libblind_stream stream +# define get_pixfmt libblind_get_pixfmt +# define set_pixfmt libblind_set_pixfmt +# define read_stream libblind_read_stream +# define init_stream libblind_init_stream +# define check_dimensions libblind_check_dimensions +# define read_segment libblind_read_segment +# define read_frame libblind_read_frame +# define read_row libblind_read_row +# define read_pixel libblind_read_pixel +# define send_frames libblind_send_frames +# define send_rows libblind_send_rows +# define send_pixels libblind_send_pixels +# define send_stream libblind_send_stream +#endif + + +#ifndef LIBBLIND_BUFSIZ +# define LIBBLIND_BUFSIZ 8192 +#endif + + +#define LIBBLIND_HEAD_MAX\ + (((sizeof(size_t) == 1 ? 3 : (5 * sizeof(size_t) / 2)) + ((size_t)-1 < 1))\ + * 3 + sizeof(((struct libblind_stream *)0)->pixfmt) + 10) + + +enum libblind_dimension { + LIBBLIND_WIDTH = 1, + LIBBLIND_HEIGHT = 2, + LIBBLIND_LENGTH = 4 +}; + +enum libblind_colour_space { + LIBBLIND_CIEXYZ, + LIBBLIND_YUV_NONLINEAR, + LIBBLIND_SRGB_NONLINEAR, + LIBBLIND_SRGB +}; + +enum libblind_alpha { + LIBBLIND_NO_ALPHA, + LIBBLIND_UNPREMULTIPLIED, + LIBBLIND_PREMULTIPLIED /* currently unused */ +}; + +enum libblind_encoding { + LIBBLIND_FLOAT, + LIBBLIND_DOUBLE, + LIBBLIND_LONG_DOUBLE, /* currently unused */ + LIBBLIND_UINT8, /* currently unused */ + LIBBLIND_UINT16, + LIBBLIND_UINT32, /* currently unused */ + LIBBLIND_UINT64 /* currently unused */ +}; + +enum libblind_endian { + LIBBLIND_HOST, + LIBBLIND_LITTLE, + LIBBLIND_BIG /* currently unused */ +}; + +struct libblind_stream { + size_t frames; + size_t width; + size_t height; + size_t n_chan; + size_t chan_size; + size_t pixel_size; + char pixfmt[32]; + enum libblind_colour_space space; + enum libblind_alpha alpha; + enum libblind_encoding encoding; + enum libblind_endian endian; + short int alpha_chan; + short int luma_chan; + int fd; + size_t ptr; + size_t xptr; + char buf[LIBBLIND_BUFSIZ]; + const char *file; + size_t headlen; + size_t row_size; + size_t col_size; + size_t frame_size; +}; + + +#define LIBBLIND_LIST_ERRORS(_)\ + _( -2, LIBBLIND_EVIDTOOLONG, "Video is too long")\ + _( -3, LIBBLIND_EVIDTOOWIDE, "Video is too wide")\ + _( -4, LIBBLIND_EVIDTOOTALL, "Video is too tall")\ + _( -5, LIBBLIND_EVIDTOOLARGE, "Video is too large")\ + _( -6, LIBBLIND_EFRMTOOWIDE, "Video frame is too wide")\ + _( -7, LIBBLIND_EFRMTOOTALL, "Video frame is too tall")\ + _( -8, LIBBLIND_EFRMTOOLARGE, "Video frame is too large")\ + _( -9, LIBBLIND_EZEROWIDTH, "Video has zero width")\ + _(-10, LIBBLIND_EZEROHEIGHT, "Video has zero height")\ + _(-11, LIBBLIND_EBADFORMAT, "File format not supported")\ + _(-12, LIBBLIND_EPIXFMTNOSUPPORT, "Pixel format not supported")\ + _(-13, LIBBLIND_EGEOMDIFF, "Videos do not have the same geometries")\ + _(-14, LIBBLIND_EGEOMNOCOMPAT, "Videos have incompatible geometries")\ + _(-15, LIBBLIND_EPIXFMTDIFF, "Videos do not have the same pixel formats")\ + _(-16, LIBBLIND_EPIXFMTNOCOMPAT, "Videos have incompatible pixel formats")\ + _(-17, LIBBLIND_ECORRUPTSTATE, "State corrupted")\ + _(-18, LIBBLIND_EINCOMPLETE, "Incomplete segment")\ + _(-19, LIBBLIND_EINCOMPLETEFRAME, "Incomplete frame")\ + _(-20, LIBBLIND_EINCOMPLETEROW, "Incomplete row")\ + _(-21, LIBBLIND_EINCOMPLETEPIX, "Incomplete pixel") + +enum { + LIBBLIND_ESYSTEM = -1 /* errno set */ +#define LIBBLIND_X(NUM, NAM, STR) , NAM = NUM + LIBBLIND_LIST_ERRORS(LIBBLIND_X) +#undef LIBBLIND_X +}; + + +const char *libblind_strerror(int); +void libblind_perror(const char *, int); + +const char *libblind_get_pixfmt(const char *, const char *); +int libblind_set_pixfmt(struct libblind_stream *, const char *); +ssize_t libblind_read_stream(struct libblind_stream *, size_t); +int libblind_init_stream(struct libblind_stream *); +int libblind_check_dimensions(const struct libblind_stream *, enum dimension); +int libblind_read_segment(struct libblind_stream *, void *, size_t); +ssize_t libblind_send_frames(struct libblind_stream *, int, size_t, int *); +ssize_t libblind_send_rows(struct libblind_stream *, int, size_t, int *); +ssize_t libblind_send_pixels(struct libblind_stream *, int, size_t, int *); +int libblind_send_stream(struct libblind_stream *, int, int *); + +static inline int +libblind_read_frame(struct libblind_stream *stream, void *buf) +{ + int r = libblind_read_segment(stream, buf, stream->frame_size); + return r == LIBBLIND_EINCOMPLETE ? LIBBLIND_EINCOMPLETEFRAME : r; +} + +static inline int +libblind_read_row(struct libblind_stream *stream, void *buf) +{ + int r = libblind_read_segment(stream, buf, stream->row_size); + return r == LIBBLIND_EINCOMPLETE ? LIBBLIND_EINCOMPLETEROW : r; +} + +static inline int +libblind_read_pixel(struct libblind_stream *stream, void *buf) +{ + int r = libblind_read_segment(stream, buf, stream->pixel_size); + return r == LIBBLIND_EINCOMPLETE ? LIBBLIND_EINCOMPLETEROW : r; +} + + +#endif |
