#endif
#include "libavutil/avutil.h"
-#include "libavutil/internal.h"
#define STR(s) AV_TOSTRING(s) //AV_STRINGIFY is too long
#define VOF (VOFW*2)
-#ifdef WORDS_BIGENDIAN
+#if HAVE_BIGENDIAN
#define ALT32_CORR (-1)
#else
#define ALT32_CORR 1
struct SwsContext;
-typedef int (*SwsFunc)(struct SwsContext *context, uint8_t* src[],
+typedef int (*SwsFunc)(struct SwsContext *context, const uint8_t* src[],
int srcStride[], int srcSliceY, int srcSliceH,
uint8_t* dst[], int dstStride[]);
/* This struct should be aligned on at least a 32-byte boundary. */
-typedef struct SwsContext{
+typedef struct SwsContext {
/**
* info on struct for av_log
*/
* sws_scale() wrapper so they can be freely modified here.
*/
SwsFunc swScale;
- int srcW, srcH, dstH;
- int chrSrcW, chrSrcH, chrDstW, chrDstH;
+ int srcW; ///< Width of source luma/alpha planes.
+ int srcH; ///< Height of source luma/alpha planes.
+ int dstH; ///< Height of destination luma/alpha planes.
+ int chrSrcW; ///< Width of source chroma planes.
+ int chrSrcH; ///< Height of source chroma planes.
+ int chrDstW; ///< Width of destination chroma planes.
+ int chrDstH; ///< Height of destination chroma planes.
int lumXInc, chrXInc;
int lumYInc, chrYInc;
- enum PixelFormat dstFormat, srcFormat; ///< format 4:2:0 type is always YV12
- int origDstFormat, origSrcFormat; ///< format
+ enum PixelFormat dstFormat; ///< Destination pixel format.
+ enum PixelFormat srcFormat; ///< Source pixel format.
int chrSrcHSubSample, chrSrcVSubSample;
- int chrIntHSubSample, chrIntVSubSample;
int chrDstHSubSample, chrDstVSubSample;
int vChrDrop;
int sliceDir;
- double param[2];
+ double param[2]; ///< Input parameters for scaling algorithms that need them.
uint32_t pal_yuv[256];
uint32_t pal_rgb[256];
int vLumBufSize;
int vChrBufSize;
- uint8_t *funnyYCode;
- uint8_t *funnyUVCode;
- int32_t *lumMmx2FilterPos;
- int32_t *chrMmx2FilterPos;
- int16_t *lumMmx2Filter;
- int16_t *chrMmx2Filter;
+ int lumMmx2FilterCodeSize; ///< Runtime-generated MMX2 horizontal fast bilinear scaler code size for luma/alpha planes.
+ int chrMmx2FilterCodeSize; ///< Runtime-generated MMX2 horizontal fast bilinear scaler code size for chroma planes.
+ uint8_t *lumMmx2FilterCode; ///< Runtime-generated MMX2 horizontal fast bilinear scaler code for luma/alpha planes.
+ uint8_t *chrMmx2FilterCode; ///< Runtime-generated MMX2 horizontal fast bilinear scaler code for chroma planes.
int canMMX2BeUsed;
int lastInChrBuf;
int lumBufIndex;
int chrBufIndex;
- int dstY;
- int flags;
+ int dstY; ///< Last destination vertical line output from last slice.
+ int flags; ///< Flags passed by the user to select scaler algorithm, optimizations, subsampling, etc...
void * yuvTable; // pointer to the yuv->rgb table start so it can be freed()
uint8_t * table_rV[256];
uint8_t * table_gU[256];
int contrast, brightness, saturation; // for sws_getColorspaceDetails
int srcColorspaceTable[4];
int dstColorspaceTable[4];
- int srcRange, dstRange;
+ int srcRange; ///< 0 = MPG YUV range, 1 = JPG YUV range (source image).
+ int dstRange; ///< 0 = MPG YUV range, 1 = JPG YUV range (destination image).
int yuv2rgb_y_offset;
int yuv2rgb_y_coeff;
int yuv2rgb_v2r_coeff;
int32_t alpMmxFilter[4*MAX_FILTER_SIZE];
#if HAVE_ALTIVEC
- vector signed short CY;
- vector signed short CRV;
- vector signed short CBU;
- vector signed short CGU;
- vector signed short CGV;
- vector signed short OY;
- vector unsigned short CSHIFT;
- vector signed short *vYCoeffsBank, *vCCoeffsBank;
+ vector signed short CY;
+ vector signed short CRV;
+ vector signed short CBU;
+ vector signed short CGU;
+ vector signed short CGV;
+ vector signed short OY;
+ vector unsigned short CSHIFT;
+ vector signed short *vYCoeffsBank, *vCCoeffsBank;
#endif
#if ARCH_BFIN
const int16_t **alpSrc, uint8_t *dest,
long dstW, long dstY);
- void (*hyscale_internal)(uint8_t *dst, const uint8_t *src,
- long width, uint32_t *pal);
- void (*hascale_internal)(uint8_t *dst, const uint8_t *src,
- long width, uint32_t *pal);
- void (*hcscale_internal)(uint8_t *dstU, uint8_t *dstV,
- const uint8_t *src1, const uint8_t *src2,
- long width, uint32_t *pal);
+ void (*lumToYV12)(uint8_t *dst, const uint8_t *src,
+ long width, uint32_t *pal); ///< Unscaled conversion of luma plane to YV12 for horizontal scaler.
+ void (*alpToYV12)(uint8_t *dst, const uint8_t *src,
+ long width, uint32_t *pal); ///< Unscaled conversion of alpha plane to YV12 for horizontal scaler.
+ void (*chrToYV12)(uint8_t *dstU, uint8_t *dstV,
+ const uint8_t *src1, const uint8_t *src2,
+ long width, uint32_t *pal); ///< Unscaled conversion of chroma planes to YV12 for horizontal scaler.
void (*hyscale_fast)(struct SwsContext *c,
- int16_t *dst, int dstWidth,
+ int16_t *dst, long dstWidth,
const uint8_t *src, int srcW, int xInc);
void (*hcscale_fast)(struct SwsContext *c,
- int16_t *dst, int dstWidth,
+ int16_t *dst, long dstWidth,
const uint8_t *src1, const uint8_t *src2,
int srcW, int xInc);
int xInc, const int16_t *filter, const int16_t *filterPos,
long filterSize);
+ void (*lumConvertRange)(uint16_t *dst, int width); ///< Color range conversion function for luma plane if needed.
+ void (*chrConvertRange)(uint16_t *dst, int width); ///< Color range conversion function for chroma planes if needed.
+
+ int lumSrcOffset; ///< Offset given to luma src pointers passed to horizontal input functions.
+ int chrSrcOffset; ///< Offset given to chroma src pointers passed to horizontal input functions.
+ int alpSrcOffset; ///< Offset given to alpha src pointers passed to horizontal input functions.
+
+ int needs_hcscale; ///< Set if there are chroma planes to be converted.
+
} SwsContext;
//FIXME check init (where 0)
const int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize,
uint8_t *dest, int dstW, int dstY);
-const char *sws_format_name(int format);
+const char *sws_format_name(enum PixelFormat format);
//FIXME replace this with something faster
#define is16BPS(x) ( \
|| (x)==PIX_FMT_GRAY16LE \
|| (x)==PIX_FMT_RGB48BE \
|| (x)==PIX_FMT_RGB48LE \
- || (x)==PIX_FMT_YUV420PLE \
- || (x)==PIX_FMT_YUV422PLE \
- || (x)==PIX_FMT_YUV444PLE \
- || (x)==PIX_FMT_YUV420PBE \
- || (x)==PIX_FMT_YUV422PBE \
- || (x)==PIX_FMT_YUV444PBE \
+ || (x)==PIX_FMT_YUV420P16LE \
+ || (x)==PIX_FMT_YUV422P16LE \
+ || (x)==PIX_FMT_YUV444P16LE \
+ || (x)==PIX_FMT_YUV420P16BE \
+ || (x)==PIX_FMT_YUV422P16BE \
+ || (x)==PIX_FMT_YUV444P16BE \
)
#define isBE(x) ((x)&1)
#define isPlanar8YUV(x) ( \
)
#define isPlanarYUV(x) ( \
isPlanar8YUV(x) \
- || (x)==PIX_FMT_YUV420PLE \
- || (x)==PIX_FMT_YUV422PLE \
- || (x)==PIX_FMT_YUV444PLE \
- || (x)==PIX_FMT_YUV420PBE \
- || (x)==PIX_FMT_YUV422PBE \
- || (x)==PIX_FMT_YUV444PBE \
+ || (x)==PIX_FMT_YUV420P16LE \
+ || (x)==PIX_FMT_YUV422P16LE \
+ || (x)==PIX_FMT_YUV444P16LE \
+ || (x)==PIX_FMT_YUV420P16BE \
+ || (x)==PIX_FMT_YUV422P16BE \
+ || (x)==PIX_FMT_YUV444P16BE \
)
#define isYUV(x) ( \
(x)==PIX_FMT_UYVY422 \
|| (x)==PIX_FMT_YUVA420P \
)
-static inline int fmt_depth(int fmt)
+static inline int fmt_depth(enum PixelFormat fmt)
{
switch(fmt) {
- case PIX_FMT_RGB48BE:
- case PIX_FMT_RGB48LE:
- return 48;
- case PIX_FMT_BGRA:
- case PIX_FMT_ABGR:
- case PIX_FMT_RGBA:
- case PIX_FMT_ARGB:
- return 32;
- case PIX_FMT_BGR24:
- case PIX_FMT_RGB24:
- return 24;
- case PIX_FMT_BGR565:
- case PIX_FMT_RGB565:
- case PIX_FMT_GRAY16BE:
- case PIX_FMT_GRAY16LE:
- return 16;
- case PIX_FMT_BGR555:
- case PIX_FMT_RGB555:
- return 15;
- case PIX_FMT_BGR8:
- case PIX_FMT_RGB8:
- return 8;
- case PIX_FMT_BGR4:
- case PIX_FMT_RGB4:
- case PIX_FMT_BGR4_BYTE:
- case PIX_FMT_RGB4_BYTE:
- return 4;
- case PIX_FMT_MONOBLACK:
- case PIX_FMT_MONOWHITE:
- return 1;
- default:
- return 0;
+ case PIX_FMT_RGB48BE:
+ case PIX_FMT_RGB48LE:
+ return 48;
+ case PIX_FMT_BGRA:
+ case PIX_FMT_ABGR:
+ case PIX_FMT_RGBA:
+ case PIX_FMT_ARGB:
+ return 32;
+ case PIX_FMT_BGR24:
+ case PIX_FMT_RGB24:
+ return 24;
+ case PIX_FMT_BGR565:
+ case PIX_FMT_RGB565:
+ case PIX_FMT_GRAY16BE:
+ case PIX_FMT_GRAY16LE:
+ return 16;
+ case PIX_FMT_BGR555:
+ case PIX_FMT_RGB555:
+ return 15;
+ case PIX_FMT_BGR8:
+ case PIX_FMT_RGB8:
+ return 8;
+ case PIX_FMT_BGR4:
+ case PIX_FMT_RGB4:
+ case PIX_FMT_BGR4_BYTE:
+ case PIX_FMT_RGB4_BYTE:
+ return 4;
+ case PIX_FMT_MONOBLACK:
+ case PIX_FMT_MONOWHITE:
+ return 1;
+ default:
+ return 0;
}
}