You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
4.2 KiB
106 lines
4.2 KiB
/*
|
|
* imgconvert.h - defines for image format conversion routines
|
|
* Written by Andrew Church <achurch@achurch.org>
|
|
*
|
|
* This file is part of transcode, a video stream processing tool.
|
|
* transcode is free software, distributable under the terms of the GNU
|
|
* General Public License (version 2 or later). See the file COPYING
|
|
* for details.
|
|
*/
|
|
|
|
#ifndef ACLIB_IMGCONVERT_H
|
|
#define ACLIB_IMGCONVERT_H
|
|
|
|
/*************************************************************************/
|
|
|
|
/* Image format defines */
|
|
typedef enum {
|
|
IMG_UNKNOWN = 0, /* Unknown/unset (dummy value, guaranteed to be 0) */
|
|
/* YUV formats */
|
|
IMG_YUV_BASE = 0x1000,
|
|
IMG_YUV420P, /* YUV planar, 1 U/V per 2x2 Y pixels */
|
|
IMG_YV12, /* YUV420P with U and V reversed */
|
|
IMG_YUV411P, /* YUV planar, 1 U/V per 4x1 Y pixels */
|
|
IMG_YUV422P, /* YUV planar, 1 U/V per 2x1 Y pixels */
|
|
IMG_YUV444P, /* YUV planar, 1 U/V per 1x1 Y pixels */
|
|
IMG_YUY2, /* YUV packed, 1 U/V per 2x1 Y pixels, Y:U:Y:V */
|
|
IMG_UYVY, /* YUV packed, 1 U/V per 2x1 Y pixels, U:Y:V:Y */
|
|
IMG_YVYU, /* YUV packed, 1 U/V per 2x1 Y pixels, Y:V:Y:U */
|
|
IMG_Y8, /* Y-only 8-bit data */
|
|
IMG_YUV_LAST,
|
|
/* RGB formats */
|
|
IMG_RGB_BASE = 0x2000,
|
|
IMG_RGB24, /* RGB packed, 8 bits per component, R:G:B */
|
|
IMG_BGR24, /* RGB packed, 8 bits per component, B:G:R */
|
|
IMG_RGBA32, /* RGB+alpha packed, 8 bits per component, R:G:B:A */
|
|
IMG_ABGR32, /* RGB+alpha packed, 8 bits per component, A:B:G:R */
|
|
IMG_ARGB32, /* RGB+alpha packed, 8 bits per component, A:R:G:B */
|
|
IMG_BGRA32, /* RGB+alpha packed, 8 bits per component, B:G:R:A */
|
|
IMG_GRAY8, /* Grayscale 8-bit data */
|
|
IMG_RGB_LAST,
|
|
} ImageFormat;
|
|
|
|
/* Alias */
|
|
#define IMG_NONE IMG_UNKNOWN
|
|
|
|
/* Default YUV and RGB formats */
|
|
#define IMG_YUV_DEFAULT IMG_YUV420P
|
|
#define IMG_RGB_DEFAULT IMG_RGB24
|
|
|
|
/* Is the given image format a YUV/RGB one? */
|
|
#define IS_YUV_FORMAT(fmt) ((fmt) > IMG_YUV_BASE && (fmt) < IMG_YUV_LAST)
|
|
#define IS_RGB_FORMAT(fmt) ((fmt) > IMG_RGB_BASE && (fmt) < IMG_RGB_LAST)
|
|
|
|
/* U/V plane size for YUV planar formats (Y plane size is always w*h) */
|
|
#define UV_PLANE_SIZE(fmt,w,h) \
|
|
((fmt)==IMG_YUV420P ? ((w)/2)*((h)/2) : \
|
|
(fmt)==IMG_YV12 ? ((w)/2)*((h)/2) : \
|
|
(fmt)==IMG_YUV411P ? ((w)/4)* (h) : \
|
|
(fmt)==IMG_YUV422P ? ((w)/2)* (h) : \
|
|
(fmt)==IMG_YUV444P ? (w) * (h) : 0)
|
|
|
|
/* Macro to initialize an array of planes from a buffer */
|
|
#define YUV_INIT_PLANES(planes,buffer,fmt,w,h) \
|
|
((planes)[0] = (buffer), \
|
|
(planes)[1] = (planes)[0] + (w)*(h), \
|
|
(planes)[2] = (planes)[1] + UV_PLANE_SIZE((fmt),(w),(h)))
|
|
|
|
#if 0
|
|
/* Structure describing an image. FIXME: not currently used--this should
|
|
* eventually replace the (planes,format) pairs passed to ac_imgconvert. */
|
|
typedef struct {
|
|
ImageFormat format; /* Format of image data */
|
|
int width, height; /* Size of image */
|
|
uint8_t *planes[4]; /* Data planes (use planes[0] for packed data) */
|
|
int stride[4]; /* Length of one row in each plane, incl. padding */
|
|
} Image;
|
|
#endif
|
|
|
|
/*************************************************************************/
|
|
|
|
/* Initialization routine. Returns 1 on success, 0 on failure. */
|
|
extern int ac_imgconvert_init(int accel);
|
|
|
|
/* Conversion routine. Returns 1 on success, 0 on failure. */
|
|
extern int ac_imgconvert(uint8_t **src, /* Array of source planes */
|
|
ImageFormat srcfmt, /* Source image format */
|
|
uint8_t **dest, /* Array of dest planes */
|
|
ImageFormat destfmt, /* Destination image format */
|
|
int width, /* Image width in pixels */
|
|
int height /* Image height in pixels */
|
|
);
|
|
|
|
/*************************************************************************/
|
|
|
|
#endif /* ACLIB_IMGCONVERT_H */
|
|
|
|
/*
|
|
* Local variables:
|
|
* c-file-style: "stroustrup"
|
|
* c-file-offsets: ((case-label . *) (statement-case-intro . *))
|
|
* indent-tabs-mode: nil
|
|
* End:
|
|
*
|
|
* vim: expandtab shiftwidth=4:
|
|
*/
|