The open imaging DSP library
Loading...
Searching...
No Matches
formats.h
1
7#ifndef MPIX_FORMAT_H
8#define MPIX_FORMAT_H
9
10#include <stdint.h>
11#include <stdlib.h>
12#include <string.h>
13
14#include <mpix/types.h>
15#include <mpix/utils.h>
16
23#define MPIX_FOURCC_TO_STR(fourcc) \
24 ((char[5]){ \
25 (char)(((fourcc) >> 0) & 0xFF), \
26 (char)(((fourcc) >> 8) & 0xFF), \
27 (char)(((fourcc) >> 16) & 0xFF), \
28 (char)(((fourcc) >> 24) & 0xFF), \
29 '\0', \
30 })
31
40#define MPIX_FOURCC(a, b, c, d) \
41 ((uint32_t)(a) | ((uint32_t)(b) << 8) | ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24))
42
52static inline uint8_t mpix_palette_bit_depth(uint32_t fourcc)
53{
54 char *str = MPIX_FOURCC_TO_STR(fourcc);
55
56 if (strncmp(str, "PLT", 3) != 0 || !IN_RANGE(str[3], '1', '9')) {
57 return 0;
58 }
59
60 return str[3] - '0';
61}
62
72static inline uint32_t mpix_palette_fourcc(uint8_t bit_depth)
73{
74 if (!IN_RANGE(bit_depth, 1, 9)) {
75 return 0;
76 }
77
78 return MPIX_FOURCC('P', 'L', 'T', '0' + bit_depth);
79}
80
94#define MPIX_FMT_RGB332 MPIX_FOURCC('R', 'G', 'B', '1')
95
105#define MPIX_FMT_RGB565 MPIX_FOURCC('R', 'G', 'B', 'P')
106
116#define MPIX_FMT_RGB565X MPIX_FOURCC('R', 'G', 'B', 'R')
117
125#define MPIX_FMT_RGB24 MPIX_FOURCC('R', 'G', 'B', '3')
126
134#define MPIX_FMT_XRGB32 MPIX_FOURCC('B', 'X', '2', '4')
135
153#define MPIX_FMT_YUV12 MPIX_FOURCC('Y', 'U', 'V', 'C')
154
160#define MPIX_FMT_YUV24 MPIX_FOURCC('Y', 'U', 'V', '3')
161
170#define MPIX_FMT_YUYV MPIX_FOURCC('Y', 'U', 'Y', 'V')
171
189#define MPIX_FMT_GREY MPIX_FOURCC('G', 'R', 'E', 'Y')
190
199#define MPIX_FMT_Y10 MPIX_FOURCC('Y', '1', '0', ' ')
200
209#define MPIX_FMT_Y12 MPIX_FOURCC('Y', '1', '2', ' ')
210
219#define MPIX_FMT_Y14 MPIX_FOURCC('Y', '1', '4', ' ')
220
229#define MPIX_FMT_Y16 MPIX_FOURCC('Y', '1', '6', ' ')
230
246#define MPIX_FMT_SBGGR8 MPIX_FOURCC('B', 'A', '8', '1')
247
255#define MPIX_FMT_SGBRG8 MPIX_FOURCC('G', 'B', 'R', 'G')
256
264#define MPIX_FMT_SGRBG8 MPIX_FOURCC('G', 'R', 'B', 'G')
265
273#define MPIX_FMT_SRGGB8 MPIX_FOURCC('R', 'G', 'G', 'B')
274
293#define MPIX_FMT_SRGGI8 MPIX_FOURCC('R', 'G', 'I', '8')
294
304#define MPIX_FMT_SGRIG8 MPIX_FOURCC('G', 'R', 'I', '8')
305
311#define MPIX_FMT_SBGGI8 MPIX_FOURCC('B', 'G', 'I', '8')
312
318#define MPIX_FMT_SGBIG8 MPIX_FOURCC('G', 'B', 'I', '8')
319
325#define MPIX_FMT_SGIRG8 MPIX_FOURCC('G', 'I', 'R', '8')
326
332#define MPIX_FMT_SIGGR8 MPIX_FOURCC('I', 'G', 'R', '8')
333
339#define MPIX_FMT_SGIBG8 MPIX_FOURCC('G', 'I', 'B', '8')
340
346#define MPIX_FMT_SIGGB8 MPIX_FOURCC('I', 'G', 'B', '8')
347
357#define MPIX_FMT_SRGGI10 MPIX_FOURCC('R', 'G', 'I', '0')
358
364#define MPIX_FMT_SGRIG10 MPIX_FOURCC('G', 'R', 'I', '0')
365
371#define MPIX_FMT_SBGGI10 MPIX_FOURCC('B', 'G', 'I', '0')
372
378#define MPIX_FMT_SGBIG10 MPIX_FOURCC('G', 'B', 'I', '0')
379
385#define MPIX_FMT_SGIRG10 MPIX_FOURCC('G', 'I', 'R', '0')
386
392#define MPIX_FMT_SIGGR10 MPIX_FOURCC('I', 'G', 'R', '0')
393
399#define MPIX_FMT_SGIBG10 MPIX_FOURCC('G', 'I', 'B', '0')
400
406#define MPIX_FMT_SIGGB10 MPIX_FOURCC('I', 'G', 'B', '0')
407
425#define MPIX_FMT_PALETTE1 MPIX_FOURCC('P', 'L', 'T', '1')
426
436#define MPIX_FMT_PALETTE2 MPIX_FOURCC('P', 'L', 'T', '2')
437
448#define MPIX_FMT_PALETTE3 MPIX_FOURCC('P', 'L', 'T', '3')
449
459#define MPIX_FMT_PALETTE4 MPIX_FOURCC('P', 'L', 'T', '4')
460
471#define MPIX_FMT_PALETTE5 MPIX_FOURCC('P', 'L', 'T', '5')
472
483#define MPIX_FMT_PALETTE6 MPIX_FOURCC('P', 'L', 'T', '6')
484
495#define MPIX_FMT_PALETTE7 MPIX_FOURCC('P', 'L', 'T', '7')
496
506#define MPIX_FMT_PALETTE8 MPIX_FOURCC('P', 'L', 'T', '8')
507
521#define MPIX_FMT_JPEG MPIX_FOURCC('J', 'P', 'E', 'G')
522
527#define MPIX_FMT_QOI MPIX_FOURCC('Q', 'O', 'I', 'F')
528
538static inline uint8_t mpix_bits_per_pixel(uint32_t fourcc)
539{
540 switch (fourcc) {
541
542 /* RGB formats */
543 case MPIX_FMT_RGB332:
544 return 8;
545 case MPIX_FMT_RGB565:
546 case MPIX_FMT_RGB565X:
547 return 16;
548 case MPIX_FMT_RGB24:
549 return 24;
550
551 /* YUV formats */
552 case MPIX_FMT_YUV12:
553 return 12;
554 case MPIX_FMT_YUV24:
555 return 24;
556 case MPIX_FMT_YUYV:
557 return 16;
558 case MPIX_FMT_GREY:
559 return 8;
560
561 /* Bayer formats */
562 case MPIX_FMT_SRGGB8:
563 case MPIX_FMT_SBGGR8:
564 case MPIX_FMT_SGBRG8:
565 case MPIX_FMT_SGRBG8:
566 return 8;
567
568 /* Indexed formats */
570 return 1;
572 return 2;
575 return 4;
580 return 8;
581
582 /* Compressed formats */
583 case MPIX_FMT_JPEG:
584 case MPIX_FMT_QOI:
585 return 0;
586
587 /* Unhandled format */
588 default:
589 return 0;
590 }
591}
592
601static inline size_t mpix_format_pitch(const struct mpix_format *fmt)
602{
603 return mpix_bits_per_pixel(fmt->fourcc) * fmt->width / BITS_PER_BYTE;
604}
605
611static inline uint32_t mpix_format_line_down(uint32_t fourcc)
612{
613 return fourcc == MPIX_FMT_SRGGB8 ? MPIX_FMT_SGBRG8 :
614 fourcc == MPIX_FMT_SBGGR8 ? MPIX_FMT_SGRBG8 :
615 fourcc == MPIX_FMT_SGBRG8 ? MPIX_FMT_SRGGB8 :
616 fourcc == MPIX_FMT_SGRBG8 ? MPIX_FMT_SBGGR8 :
617 fourcc;
618}
619
620#endif
#define MPIX_FMT_PALETTE1
Definition formats.h:425
#define MPIX_FMT_RGB565
Definition formats.h:105
#define MPIX_FMT_RGB24
Definition formats.h:125
#define MPIX_FMT_PALETTE8
Definition formats.h:506
#define MPIX_FMT_PALETTE4
Definition formats.h:459
#define MPIX_FMT_SRGGB8
Definition formats.h:273
#define MPIX_FMT_YUV24
Definition formats.h:160
#define MPIX_FMT_GREY
Definition formats.h:189
static uint32_t mpix_palette_fourcc(uint8_t bit_depth)
Convert an image and store it into a color palette.
Definition formats.h:72
static size_t mpix_format_pitch(const struct mpix_format *fmt)
Get the pitch for a given pixel format.
Definition formats.h:601
#define MPIX_FMT_PALETTE2
Definition formats.h:436
static uint8_t mpix_bits_per_pixel(uint32_t fourcc)
Get the average number of bits per pixel of a pixel format.
Definition formats.h:538
#define MPIX_FMT_PALETTE7
Definition formats.h:495
#define MPIX_FOURCC_TO_STR(fourcc)
Generate a string out of a pixel format.
Definition formats.h:23
static uint8_t mpix_palette_bit_depth(uint32_t fourcc)
Convert an image and store it into a color palette.
Definition formats.h:52
#define MPIX_FMT_PALETTE3
Definition formats.h:448
#define MPIX_FMT_JPEG
Definition formats.h:521
#define MPIX_FMT_YUV12
12-bit per pixel, 2 pixels every 3 bytes, 4-bit per component.
Definition formats.h:153
#define MPIX_FMT_RGB565X
Definition formats.h:116
#define MPIX_FMT_SGRBG8
Definition formats.h:264
#define MPIX_FMT_RGB332
Definition formats.h:94
static uint32_t mpix_format_line_down(uint32_t fourcc)
Get the pixel format of the buffer if looking one line below.
Definition formats.h:611
#define MPIX_FMT_PALETTE6
Definition formats.h:483
#define MPIX_FMT_YUYV
Definition formats.h:170
#define MPIX_FMT_SGBRG8
Definition formats.h:255
#define MPIX_FMT_SBGGR8
Definition formats.h:246
#define MPIX_FMT_QOI
Definition formats.h:527
#define MPIX_FMT_PALETTE5
Definition formats.h:471
#define MPIX_FOURCC(a, b, c, d)
Define a new pixel format, with defaults for most common values.
Definition formats.h:40
Image format description.
Definition types.h:72
uint16_t width
Definition types.h:76
uint32_t fourcc
Definition types.h:74