41 { 36, 68, 60, 92, 34, 66, 58, 90, },
42 { 100, 4, 124, 28, 98, 2, 122, 26, },
43 { 52, 84, 44, 76, 50, 82, 42, 74, },
44 { 116, 20, 108, 12, 114, 18, 106, 10, },
45 { 32, 64, 56, 88, 38, 70, 62, 94, },
46 { 96, 0, 120, 24, 102, 6, 126, 30, },
47 { 48, 80, 40, 72, 54, 86, 46, 78, },
48 { 112, 16, 104, 8, 118, 22, 110, 14, },
49 { 36, 68, 60, 92, 34, 66, 58, 90, },
53 64, 64, 64, 64, 64, 64, 64, 64
60 uint8_t *ptr = plane + stride * y;
61 for (i = 0; i <
height; i++) {
62 memset(ptr, val, width);
69 const int32_t *filterPos,
int filterSize)
74 const uint16_t *
src = (
const uint16_t *) _src;
84 for (i = 0; i < dstW; i++) {
86 int srcPos = filterPos[
i];
89 for (j = 0; j < filterSize; j++) {
90 val += src[srcPos + j] * filter[filterSize * i + j];
93 dst[
i] =
FFMIN(val >> sh, (1 << 19) - 1);
99 const int32_t *filterPos,
int filterSize)
103 const uint16_t *
src = (
const uint16_t *) _src;
112 for (i = 0; i < dstW; i++) {
114 int srcPos = filterPos[
i];
117 for (j = 0; j < filterSize; j++) {
118 val += src[srcPos + j] * filter[filterSize * i + j];
121 dst[
i] =
FFMIN(val >> sh, (1 << 15) - 1);
128 const int32_t *filterPos,
int filterSize)
131 for (i = 0; i < dstW; i++) {
133 int srcPos = filterPos[
i];
135 for (j = 0; j < filterSize; j++) {
136 val += ((
int)src[srcPos + j]) * filter[filterSize * i + j];
138 dst[
i] =
FFMIN(val >> 7, (1 << 15) - 1);
144 const int32_t *filterPos,
int filterSize)
148 for (i = 0; i < dstW; i++) {
150 int srcPos = filterPos[
i];
152 for (j = 0; j < filterSize; j++) {
153 val += ((
int)src[srcPos + j]) * filter[filterSize * i + j];
155 dst[
i] =
FFMIN(val >> 3, (1 << 19) - 1);
164 for (i = 0; i <
width; i++) {
165 dstU[
i] = (
FFMIN(dstU[i], 30775) * 4663 - 9289992) >> 12;
166 dstV[
i] = (
FFMIN(dstV[i], 30775) * 4663 - 9289992) >> 12;
173 for (i = 0; i <
width; i++) {
174 dstU[
i] = (dstU[
i] * 1799 + 4081085) >> 11;
175 dstV[
i] = (dstV[
i] * 1799 + 4081085) >> 11;
182 for (i = 0; i <
width; i++)
183 dst[i] = (
FFMIN(dst[i], 30189) * 19077 - 39057361) >> 14;
189 for (i = 0; i <
width; i++)
190 dst[i] = (dst[i] * 14071 + 33561947) >> 14;
198 for (i = 0; i <
width; i++) {
199 dstU[
i] = (
FFMIN(dstU[i], 30775 << 4) * 4663 - (9289992 << 4)) >> 12;
200 dstV[
i] = (
FFMIN(dstV[i], 30775 << 4) * 4663 - (9289992 << 4)) >> 12;
209 for (i = 0; i <
width; i++) {
210 dstU[
i] = (dstU[
i] * 1799 + (4081085 << 4)) >> 11;
211 dstV[
i] = (dstV[
i] * 1799 + (4081085 << 4)) >> 11;
219 for (i = 0; i <
width; i++) {
220 dst[
i] = ((
int)(
FFMIN(dst[i], 30189 << 4) * 4769
U - (39057361 << 2))) >> 12;
228 for (i = 0; i <
width; i++)
229 dst[i] = (dst[i]*(14071/4) + (33561947<<4)/4)>>12;
233 #define DEBUG_SWSCALE_BUFFERS 0 234 #define DEBUG_BUFFERS(...) \ 235 if (DEBUG_SWSCALE_BUFFERS) \ 236 av_log(c, AV_LOG_DEBUG, __VA_ARGS__) 239 int srcStride[],
int srcSliceY,
244 const int dstW = c->
dstW;
245 const int dstH = c->
dstH;
275 int chrStart = lumEnd;
295 srcStride[3] = srcStride[0];
300 DEBUG_BUFFERS(
"swscale() %p[%d] %p[%d] %p[%d] %p[%d] -> %p[%d] %p[%d] %p[%d] %p[%d]\n",
301 src[0], srcStride[0], src[1], srcStride[1],
302 src[2], srcStride[2], src[3], srcStride[3],
303 dst[0], dstStride[0], dst[1], dstStride[1],
304 dst[2], dstStride[2], dst[3], dstStride[3]);
305 DEBUG_BUFFERS(
"srcSliceY: %d srcSliceH: %d dstY: %d dstH: %d\n",
306 srcSliceY, srcSliceH, dstY, dstH);
308 vLumFilterSize, vChrFilterSize);
310 if (dstStride[0]&15 || dstStride[1]&15 ||
311 dstStride[2]&15 || dstStride[3]&15) {
312 static int warnedAlready = 0;
315 "Warning: dstStride is not aligned!\n" 316 " ->cannot do aligned memory accesses anymore\n");
321 if ( (uintptr_t)dst[0]&15 || (uintptr_t)dst[1]&15 || (uintptr_t)dst[2]&15
322 || (uintptr_t)src[0]&15 || (uintptr_t)src[1]&15 || (uintptr_t)src[2]&15
323 || dstStride[0]&15 || dstStride[1]&15 || dstStride[2]&15 || dstStride[3]&15
324 || srcStride[0]&15 || srcStride[1]&15 || srcStride[2]&15 || srcStride[3]&15
326 static int warnedAlready=0;
337 if (srcSliceY == 0) {
343 if (!should_dither) {
352 srcSliceY, srcSliceH, chrSrcSliceY, chrSrcSliceH, 1);
357 if (srcSliceY == 0) {
367 hout_slice->
width = dstW;
370 for (; dstY < dstH; dstY++) {
375 const int firstLumSrcY =
FFMAX(1 - vLumFilterSize, vLumFilterPos[dstY]);
378 const int firstChrSrcY =
FFMAX(1 - vChrFilterSize, vChrFilterPos[chrDstY]);
381 int lastLumSrcY =
FFMIN(c->
srcH, firstLumSrcY + vLumFilterSize) - 1;
382 int lastLumSrcY2 =
FFMIN(c->
srcH, firstLumSrcY2 + vLumFilterSize) - 1;
383 int lastChrSrcY =
FFMIN(c->
chrSrcH, firstChrSrcY + vChrFilterSize) - 1;
387 int posY, cPosY, firstPosY, lastPosY, firstCPosY, lastCPosY;
390 if (firstLumSrcY > lastInLumBuf) {
392 hasLumHoles = lastInLumBuf != firstLumSrcY - 1;
400 lastInLumBuf = firstLumSrcY - 1;
402 if (firstChrSrcY > lastInChrBuf) {
404 hasChrHoles = lastInChrBuf != firstChrSrcY - 1;
412 lastInChrBuf = firstChrSrcY - 1;
416 DEBUG_BUFFERS(
"\tfirstLumSrcY: %d lastLumSrcY: %d lastInLumBuf: %d\n",
417 firstLumSrcY, lastLumSrcY, lastInLumBuf);
418 DEBUG_BUFFERS(
"\tfirstChrSrcY: %d lastChrSrcY: %d lastInChrBuf: %d\n",
419 firstChrSrcY, lastChrSrcY, lastInChrBuf);
422 enough_lines = lastLumSrcY2 < srcSliceY + srcSliceH &&
426 lastLumSrcY = srcSliceY + srcSliceH - 1;
427 lastChrSrcY = chrSrcSliceY + chrSrcSliceH - 1;
428 DEBUG_BUFFERS(
"buffering slice: lastLumSrcY %d lastChrSrcY %d\n",
429 lastLumSrcY, lastChrSrcY);
437 if (posY <= lastLumSrcY && !hasLumHoles) {
438 firstPosY =
FFMAX(firstLumSrcY, posY);
442 lastPosY = lastLumSrcY;
446 if (cPosY <= lastChrSrcY && !hasChrHoles) {
447 firstCPosY =
FFMAX(firstChrSrcY, cPosY);
451 lastCPosY = lastChrSrcY;
456 if (posY < lastLumSrcY + 1) {
457 for (i = lumStart; i < lumEnd; ++
i)
458 desc[i].
process(c, &desc[i], firstPosY, lastPosY - firstPosY + 1);
461 lastInLumBuf = lastLumSrcY;
463 if (cPosY < lastChrSrcY + 1) {
464 for (i = chrStart; i < chrEnd; ++
i)
465 desc[i].
process(c, &desc[i], firstCPosY, lastCPosY - firstCPosY + 1);
468 lastInChrBuf = lastChrSrcY;
480 if (dstY >= dstH - 2) {
484 &yuv2packed1, &yuv2packed2, &yuv2packedX, &yuv2anyX);
487 yuv2packed1, yuv2packed2, yuv2packedX, yuv2anyX, use_mmx_vfilter);
491 for (i = vStart; i < vEnd; ++
i)
492 desc[i].
process(c, &desc[i], dstY, 1);
497 int height = dstY - lastDstY;
501 fillPlane16(dst[3], dstStride[3], length, height, lastDstY,
504 }
else if (
is32BPS(dstFormat)) {
506 fillPlane32(dst[3], dstStride[3], length, height, lastDstY,
510 fillPlane(dst[3], dstStride[3], length, height, lastDstY, 255);
513 #if HAVE_MMXEXT_INLINE 515 __asm__ volatile (
"sfence" :::
"memory");
524 return dstY - lastDstY;
605 src[3] = src[2] =
NULL;
613 const int linesizes[4])
620 for (i = 0; i < 4; i++) {
622 if (!data[plane] || !linesizes[plane])
635 for (yp=0; yp<
h; yp++) {
636 for (xp=0; xp+2<
stride; xp+=3) {
637 int x, y, z,
r,
g,
b;
691 for (yp=0; yp<
h; yp++) {
692 for (xp=0; xp+2<
stride; xp+=3) {
693 int x, y, z,
r,
g,
b;
746 const uint8_t *
const srcSlice[],
747 const int srcStride[],
int srcSliceY,
749 const int dstStride[])
759 int srcSliceY_internal = srcSliceY;
761 if (!srcStride || !dstStride || !dst || !srcSlice) {
762 av_log(c,
AV_LOG_ERROR,
"One of the input parameters to sws_scale() is NULL, please check the calling code\n");
766 for (i=0; i<4; i++) {
767 srcStride2[
i] = srcStride[
i];
768 dstStride2[
i] = dstStride[
i];
771 if ((srcSliceY & (macro_height-1)) ||
772 ((srcSliceH& (macro_height-1)) && srcSliceY + srcSliceH != c->
srcH) ||
773 srcSliceY + srcSliceH > c->
srcH) {
774 av_log(c,
AV_LOG_ERROR,
"Slice parameters %d, %d are invalid\n", srcSliceY, srcSliceH);
780 srcSlice, srcStride, srcSliceY, srcSliceH,
804 srcSlice, srcStride, srcSliceY, srcSliceH,
814 memcpy(src2, srcSlice,
sizeof(src2));
815 memcpy(dst2, dst,
sizeof(dst2));
830 if (c->
sliceDir == 0 && srcSliceY != 0 && srcSliceY + srcSliceH != c->
srcH) {
839 for (i = 0; i < 256; i++) {
840 int r,
g,
b, y,
u, v,
a = 0xff;
842 uint32_t p = ((
const uint32_t *)(srcSlice[1]))[i];
843 a = (p >> 24) & 0xFF;
844 r = (p >> 16) & 0xFF;
849 g = ((i >> 2) & 7) * 36;
853 g = ((i >> 3) & 7) * 36;
856 r = ( i >> 3 ) * 255;
857 g = ((i >> 1) & 3) * 85;
863 b = ( i >> 3 ) * 255;
864 g = ((i >> 1) & 3) * 85;
867 #define RGB2YUV_SHIFT 15 868 #define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 869 #define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 870 #define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 871 #define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 872 #define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 873 #define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 874 #define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 875 #define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 876 #define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) 881 c->
pal_yuv[
i]= y + (u<<8) + (v<<16) + ((unsigned)a<<24);
888 c->
pal_rgb[
i]= r + (g<<8) + (b<<16) + ((unsigned)a<<24);
894 c->
pal_rgb[
i]= a + (r<<8) + (g<<16) + ((unsigned)b<<24);
900 c->
pal_rgb[
i]= a + (b<<8) + (g<<16) + ((unsigned)r<<24);
907 c->
pal_rgb[
i]= b + (g<<8) + (r<<16) + ((unsigned)a<<24);
919 base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (srcSliceH-1) : rgb0_tmp;
921 memcpy(base + srcStride[0]*y, src2[0] + srcStride[0]*y, 4*c->
srcW);
922 for (x=c->
src0Alpha-1; x<4*c->srcW; x+=4) {
923 base[ srcStride[0]*y + x] = 0xFF;
935 base = srcStride[0] < 0 ? rgb0_tmp - srcStride[0] * (srcSliceH-1) : rgb0_tmp;
937 xyz12Torgb48(c, (uint16_t*)base, (
const uint16_t*)src2[0], srcStride[0]/2, srcSliceH);
942 for (i = 0; i < 4; i++)
947 for (i=0; i<4; i++) {
952 src2[0] += (srcSliceH - 1) * srcStride[0];
956 src2[3] += (srcSliceH - 1) * srcStride[3];
957 dst2[0] += ( c->
dstH - 1) * dstStride[0];
960 dst2[3] += ( c->
dstH - 1) * dstStride[3];
968 if (srcSliceY_internal + srcSliceH == c->
srcH)
970 ret = c->
swscale(c, src2, srcStride2, srcSliceY_internal, srcSliceH, dst2, dstStride2);
974 uint16_t *dst16 = (uint16_t*)(dst2[0] + (dstY - ret) * dstStride2[0]);
int plane
Which of the 4 planes contains the component.
void(* hcScale)(struct SwsContext *c, int16_t *dst, int dstW, const uint8_t *src, const int16_t *filter, const int32_t *filterPos, int filterSize)
static void lumRangeToJpeg_c(int16_t *dst, int width)
static av_always_inline int isAnyRGB(enum AVPixelFormat pix_fmt)
av_cold void ff_sws_init_output_funcs(SwsContext *c, yuv2planar1_fn *yuv2plane1, yuv2planarX_fn *yuv2planeX, yuv2interleavedX_fn *yuv2nv12cX, yuv2packed1_fn *yuv2packed1, yuv2packed2_fn *yuv2packed2, yuv2packedX_fn *yuv2packedX, yuv2anyX_fn *yuv2anyX)
static enum AVPixelFormat pix_fmt
static void chrRangeFromJpeg_c(int16_t *dstU, int16_t *dstV, int width)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
int chrSrcH
Height of source chroma planes.
void(* chrConvertRange)(int16_t *dst1, int16_t *dst2, int width)
Color range conversion function for chroma planes if needed.
ptrdiff_t const GLvoid * data
static void reset_ptr(const uint8_t *src[], enum AVPixelFormat format)
#define AV_LOG_WARNING
Something somehow does not look correct.
packed RGB 8:8:8, 24bpp, RGBRGB...
int ff_init_slice_from_src(SwsSlice *s, uint8_t *src[4], int stride[4], int srcW, int lumY, int lumH, int chrY, int chrH, int relative)
int vChrDrop
Binary logarithm of extra vertical subsampling factor in source image chroma planes specified by user...
static void lumRangeToJpeg16_c(int16_t *_dst, int width)
Struct which holds all necessary data for processing a slice.
static av_always_inline int is16BPS(enum AVPixelFormat pix_fmt)
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Convenience header that includes libavutil's core.
void(* hyScale)(struct SwsContext *c, int16_t *dst, int dstW, const uint8_t *src, const int16_t *filter, const int32_t *filterPos, int filterSize)
Scale one horizontal line of input data using a filter over the input lines, to produce one (differen...
static atomic_int cpu_flags
int srcRange
0 = MPG YUV range, 1 = JPG YUV range (source image).
const uint8_t * lumDither8
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
void(* hyscale_fast)(struct SwsContext *c, int16_t *dst, int dstWidth, const uint8_t *src, int srcW, int xInc)
Scale one horizontal line of input data using a bilinear filter to produce one line of output data...
int dstY
Last destination vertical line output from last slice.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate.The lists are not just lists
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
void ff_sws_init_input_funcs(SwsContext *c)
int srcH
Height of source luma/alpha planes.
packed RGB 1:2:1, 8bpp, (msb)1B 2G 1R(lsb)
static void rgb48Toxyz12(struct SwsContext *c, uint16_t *dst, const uint16_t *src, int stride, int h)
static void hScale16To19_c(SwsContext *c, int16_t *_dst, int dstW, const uint8_t *_src, const int16_t *filter, const int32_t *filterPos, int filterSize)
int ff_rotate_slice(SwsSlice *s, int lum, int chr)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int chrDstVSubSample
Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in destination i...
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
static void lumRangeFromJpeg_c(int16_t *dst, int width)
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
8 bits with AV_PIX_FMT_RGB32 palette
int vChrFilterSize
Vertical filter size for chroma pixels.
#define AV_PIX_FMT_FLAG_FLOAT
The pixel format contains IEEE-754 floating point values.
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
#define AV_CPU_FLAG_MMXEXT
SSE integer functions or AMD MMX ext.
#define u(width, name, range_min, range_max)
int cascaded_tmpStride[4]
av_cold void ff_sws_init_swscale_x86(SwsContext *c)
#define SWS_FAST_BILINEAR
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
int lastInLumBuf
Last scaled horizontal luma/alpha line from source in the ring buffer.
void(* yuv2planar1_fn)(const int16_t *src, uint8_t *dest, int dstW, const uint8_t *dither, int offset)
Write one line of horizontally scaled data to planar output without any additional vertical scaling (...
int16_t rgb2xyz_matrix[3][4]
enum AVPixelFormat dstFormat
Destination pixel format.
yuv2packedX_fn yuv2packedX
void ff_init_vscale_pfn(SwsContext *c, yuv2planar1_fn yuv2plane1, yuv2planarX_fn yuv2planeX, yuv2interleavedX_fn yuv2nv12cX, yuv2packed1_fn yuv2packed1, yuv2packed2_fn yuv2packed2, yuv2packedX_fn yuv2packedX, yuv2anyX_fn yuv2anyX, int use_mmx)
setup vertical scaler functions
av_cold void ff_sws_init_swscale_aarch64(SwsContext *c)
int32_t * vChrFilterPos
Array of vertical filter starting positions for each dst[i] for chroma planes.
#define DEBUG_BUFFERS(...)
int dstH
Height of destination luma/alpha planes.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AV_PIX_FMT_BGR32_1
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
SwsFunc ff_getSwsFunc(SwsContext *c)
Return function pointer to fastest main scaler path function depending on architecture and available ...
static void chrRangeToJpeg_c(int16_t *dstU, int16_t *dstV, int width)
yuv2packed1_fn yuv2packed1
simple assert() macros that are a bit more flexible than ISO C assert().
static void hScale16To15_c(SwsContext *c, int16_t *dst, int dstW, const uint8_t *_src, const int16_t *filter, const int32_t *filterPos, int filterSize)
void ff_hcscale_fast_c(SwsContext *c, int16_t *dst1, int16_t *dst2, int dstWidth, const uint8_t *src1, const uint8_t *src2, int srcW, int xInc)
void(* hcscale_fast)(struct SwsContext *c, int16_t *dst1, int16_t *dst2, int dstWidth, const uint8_t *src1, const uint8_t *src2, int srcW, int xInc)
static int check_image_pointers(const uint8_t *const data[4], enum AVPixelFormat pix_fmt, const int linesizes[4])
uint8_t * cascaded1_tmp[4]
static av_cold void sws_init_swscale(SwsContext *c)
SwsPlane plane[MAX_SLICE_PLANES]
color planes
static void fillPlane32(uint8_t *plane, int stride, int width, int height, int y, int alpha, int bits, const int big_endian, int is_float)
int sliceH
number of lines
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
static void xyz12Torgb48(struct SwsContext *c, uint16_t *dst, const uint16_t *src, int stride, int h)
av_cold void ff_sws_init_swscale_ppc(SwsContext *c)
int dstRange
0 = MPG YUV range, 1 = JPG YUV range (destination image).
void ff_updateMMXDitherTables(SwsContext *c, int dstY)
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
packed RGB 1:2:1, 8bpp, (msb)1R 2G 1B(lsb)
yuv2planar1_fn yuv2plane1
static av_always_inline int isBayer(enum AVPixelFormat pix_fmt)
yuv2interleavedX_fn yuv2nv12cX
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
int available_lines
max number of lines that can be hold by this plane
packed RGB 8:8:8, 24bpp, BGRBGR...
av_cold void ff_sws_init_range_convert(SwsContext *c)
struct SwsFilterDescriptor * desc
void(* lumConvertRange)(int16_t *dst, int width)
Color range conversion function for luma plane if needed.
int dstW
Width of destination luma/alpha planes.
uint8_t * cascaded_tmp[4]
int sliceDir
Direction that slices are fed to the scaler (1 = top-to-bottom, -1 = bottom-to-top).
int(* SwsFunc)(struct SwsContext *context, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
int cascaded1_tmpStride[4]
int needs_hcscale
Set if there are chroma planes to be converted.
int32_t * vLumFilterPos
Array of vertical filter starting positions for each dst[i] for luma/alpha planes.
static av_always_inline int isBE(enum AVPixelFormat pix_fmt)
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
int width
Slice line width.
void(* yuv2packedX_fn)(struct SwsContext *c, const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, const int16_t *chrFilter, const int16_t **chrUSrc, const int16_t **chrVSrc, int chrFilterSize, const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB output by doing multi-point ver...
int16_t xyz2rgb_matrix[3][4]
static av_always_inline int isPlanar(enum AVPixelFormat pix_fmt)
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
yuv2planarX_fn yuv2planeX
void(* yuv2packed1_fn)(struct SwsContext *c, const int16_t *lumSrc, const int16_t *chrUSrc[2], const int16_t *chrVSrc[2], const int16_t *alpSrc, uint8_t *dest, int dstW, int uvalpha, int y)
Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB output without any additional v...
const uint8_t ff_dither_8x8_128[9][8]
Struct which defines a slice of an image to be scaled or an output for a scaled slice.
int attribute_align_arg sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
swscale wrapper, so we don't need to export the SwsContext.
static av_always_inline void fillPlane(uint8_t *plane, int stride, int width, int height, int y, uint8_t val)
static void lumRangeFromJpeg16_c(int16_t *_dst, int width)
void ff_hyscale_fast_c(SwsContext *c, int16_t *dst, int dstWidth, const uint8_t *src, int srcW, int xInc)
void(* yuv2planarX_fn)(const int16_t *filter, int filterSize, const int16_t **src, uint8_t *dest, int dstW, const uint8_t *dither, int offset)
Write one line of horizontally scaled data to planar output with multi-point vertical scaling between...
int vLumFilterSize
Vertical filter size for luma/alpha pixels.
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
static void fillPlane16(uint8_t *plane, int stride, int width, int height, int y, int alpha, int bits, const int big_endian)
const uint8_t * chrDither8
static void chrRangeToJpeg16_c(int16_t *_dstU, int16_t *_dstV, int width)
#define flags(name, subs,...)
static int swscale(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb...
int lastInChrBuf
Last scaled horizontal chroma line from source in the ring buffer.
GLint GLenum GLboolean GLsizei stride
yuv2packed2_fn yuv2packed2
static void FUNC() yuv2planeX(const int16_t *filter, int filterSize, const int16_t **src, uint8_t *dest, int dstW, const uint8_t *dither, int offset)
Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb...
__asm__(".macro parse_r var r\n\t""\\var = -1\n\t"_IFC_REG(0) _IFC_REG(1) _IFC_REG(2) _IFC_REG(3) _IFC_REG(4) _IFC_REG(5) _IFC_REG(6) _IFC_REG(7) _IFC_REG(8) _IFC_REG(9) _IFC_REG(10) _IFC_REG(11) _IFC_REG(12) _IFC_REG(13) _IFC_REG(14) _IFC_REG(15) _IFC_REG(16) _IFC_REG(17) _IFC_REG(18) _IFC_REG(19) _IFC_REG(20) _IFC_REG(21) _IFC_REG(22) _IFC_REG(23) _IFC_REG(24) _IFC_REG(25) _IFC_REG(26) _IFC_REG(27) _IFC_REG(28) _IFC_REG(29) _IFC_REG(30) _IFC_REG(31)".iflt \\var\n\t"".error \"Unable to parse register name \\r\"\n\t"".endif\n\t"".endm")
void(* yuv2packed2_fn)(struct SwsContext *c, const int16_t *lumSrc[2], const int16_t *chrUSrc[2], const int16_t *chrVSrc[2], const int16_t *alpSrc[2], uint8_t *dest, int dstW, int yalpha, int uvalpha, int y)
Write one line of horizontally scaled Y/U/V/A to packed-pixel YUV/RGB output by doing bilinear scalin...
enum AVPixelFormat srcFormat
Source pixel format.
packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
struct SwsContext * cascaded_context[3]
#define AV_PIX_FMT_FLAG_BE
Pixel format is big-endian.
SwsFunc swscale
Note that src, dst, srcStride, dstStride will be copied in the sws_scale() wrapper so they can be fre...
static av_always_inline int is32BPS(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_RGB32_1
void(* yuv2anyX_fn)(struct SwsContext *c, const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize, const int16_t *chrFilter, const int16_t **chrUSrc, const int16_t **chrVSrc, int chrFilterSize, const int16_t **alpSrc, uint8_t **dest, int dstW, int y)
Write one line of horizontally scaled Y/U/V/A to YUV/RGB output by doing multi-point vertical scaling...
static void chrRangeFromJpeg16_c(int16_t *_dstU, int16_t *_dstV, int width)
#define AV_CPU_FLAG_SSE2
PIV SSE2 functions.
static const uint8_t sws_pb_64[8]
static av_always_inline int usePal(enum AVPixelFormat pix_fmt)
static av_always_inline int isPacked(enum AVPixelFormat pix_fmt)
static void hScale8To15_c(SwsContext *c, int16_t *dst, int dstW, const uint8_t *src, const int16_t *filter, const int32_t *filterPos, int filterSize)
int sliceY
index of first line
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
int depth
Number of bits in the component.
int srcW
Width of source luma/alpha planes.
int chrSrcVSubSample
Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in source image...
int flags
Flags passed by the user to select scaler algorithm, optimizations, subsampling, etc...
static void process(NormalizeContext *s, AVFrame *in, AVFrame *out)
AVPixelFormat
Pixel format.
static double val(void *priv, double ch)
void(* yuv2interleavedX_fn)(enum AVPixelFormat dstFormat, const uint8_t *chrDither, const int16_t *chrFilter, int chrFilterSize, const int16_t **chrUSrc, const int16_t **chrVSrc, uint8_t *dest, int dstW)
Write one line of horizontally scaled chroma to interleaved output with multi-point vertical scaling ...
static av_always_inline int isNBPS(enum AVPixelFormat pix_fmt)
av_cold void ff_sws_init_swscale_arm(SwsContext *c)
#define AV_CEIL_RSHIFT(a, b)
static void hScale8To19_c(SwsContext *c, int16_t *_dst, int dstW, const uint8_t *src, const int16_t *filter, const int32_t *filterPos, int filterSize)