/**
|
* @file rem_vid.h Basic video types
|
*
|
* Copyright (C) 2010 Creytiv.com
|
*/
|
|
|
/** Pixel format */
|
enum vidfmt {
|
VID_FMT_YUV420P = 0, /* planar YUV 4:2:0 12bpp */
|
VID_FMT_YUYV422, /* packed YUV 4:2:2 16bpp */
|
VID_FMT_UYVY422, /* packed YUV 4:2:2 16bpp */
|
VID_FMT_RGB32, /* packed RGBA 8:8:8:8 32bpp (native endian) */
|
VID_FMT_ARGB, /* packed RGBA 8:8:8:8 32bpp (big endian) */
|
VID_FMT_RGB565, /* packed RGB 5:6:5 16bpp (native endian) */
|
VID_FMT_RGB555, /* packed RGB 5:5:5 16bpp (native endian) */
|
VID_FMT_NV12, /* planar YUV 4:2:0 12bpp UV interleaved */
|
VID_FMT_NV21, /* planar YUV 4:2:0 12bpp VU interleaved */
|
VID_FMT_YUV444P, /* planar YUV 4:4:4 24bpp */
|
/* marker */
|
VID_FMT_N
|
};
|
|
/** Video pixel format component description */
|
struct vidfmt_compdesc {
|
unsigned plane_index:2;
|
unsigned step:3;
|
};
|
|
/** Video pixel format description */
|
struct vidfmt_desc {
|
const char *name;
|
uint8_t planes;
|
uint8_t compn;
|
struct vidfmt_compdesc compv[4];
|
};
|
|
/** Video orientation */
|
enum vidorient {
|
VIDORIENT_PORTRAIT,
|
VIDORIENT_PORTRAIT_UPSIDEDOWN,
|
VIDORIENT_LANDSCAPE_LEFT,
|
VIDORIENT_LANDSCAPE_RIGHT,
|
};
|
|
/** Video size */
|
struct vidsz {
|
unsigned w; /**< Width */
|
unsigned h; /**< Height */
|
};
|
|
/** Video frame */
|
struct vidframe {
|
uint8_t *data[4]; /**< Video planes */
|
uint16_t linesize[4]; /**< Array of line-sizes */
|
struct vidsz size; /**< Frame resolution */
|
enum vidfmt fmt; /**< Video pixel format */
|
};
|
|
/** Video point */
|
struct vidpt {
|
unsigned x; /**< X position */
|
unsigned y; /**< Y position */
|
};
|
|
/** Video rectangle */
|
struct vidrect {
|
unsigned x; /**< X position */
|
unsigned y; /**< Y position */
|
unsigned w; /**< Width */
|
unsigned h; /**< Height */
|
};
|
|
static inline bool vidsz_cmp(const struct vidsz *a, const struct vidsz *b)
|
{
|
if (!a || !b)
|
return false;
|
|
if (a == b)
|
return true;
|
|
return a->w == b->w && a->h == b->h;
|
}
|
|
|
static inline bool vidrect_cmp(const struct vidrect *a,
|
const struct vidrect *b)
|
{
|
if (!a || !b)
|
return false;
|
|
if (a == b)
|
return true;
|
|
return a->x == b->x && a->y == b->y && a->w == b->w && a->h == b->h;
|
}
|
|
|
static inline int rgb2y(uint8_t r, uint8_t g, uint8_t b)
|
{
|
return ((66 * r + 129 * g + 25 * b + 128) >> 8) + 16;
|
}
|
|
|
static inline int rgb2u(uint8_t r, uint8_t g, uint8_t b)
|
{
|
return ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
|
}
|
|
|
static inline int rgb2v(uint8_t r, uint8_t g, uint8_t b)
|
{
|
return ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
|
}
|
|
|
size_t vidframe_size(enum vidfmt fmt, const struct vidsz *sz);
|
void vidframe_init(struct vidframe *vf, enum vidfmt fmt,
|
const struct vidsz *sz, void *data[4],
|
unsigned linesize[4]);
|
void vidframe_init_buf(struct vidframe *vf, enum vidfmt fmt,
|
const struct vidsz *sz, uint8_t *buf);
|
int vidframe_alloc(struct vidframe **vfp, enum vidfmt fmt,
|
const struct vidsz *sz);
|
void vidframe_fill(struct vidframe *vf, uint32_t r, uint32_t g, uint32_t b);
|
void vidframe_copy(struct vidframe *dst, const struct vidframe *src);
|
|
|
const char *vidfmt_name(enum vidfmt fmt);
|
|
|
static inline bool vidframe_isvalid(const struct vidframe *f)
|
{
|
return f ? f->data[0] != NULL : false;
|
}
|
|
|
extern const struct vidfmt_desc vidfmt_descv[VID_FMT_N];
|
|
|
/* draw */
|
void vidframe_draw_point(struct vidframe *f, unsigned x, unsigned y,
|
uint8_t r, uint8_t g, uint8_t b);
|
void vidframe_draw_hline(struct vidframe *f,
|
unsigned x0, unsigned y0, unsigned w,
|
uint8_t r, uint8_t g, uint8_t b);
|
void vidframe_draw_vline(struct vidframe *f,
|
unsigned x0, unsigned y0, unsigned h,
|
uint8_t r, uint8_t g, uint8_t b);
|
void vidframe_draw_rect(struct vidframe *f,
|
unsigned x0, unsigned y0, unsigned w, unsigned h,
|
uint8_t r, uint8_t g, uint8_t b);
|