FFmpeg
Loading...
Searching...
No Matches
swscale.c File Reference
#include <inttypes.h>
#include "config.h"
#include "libswscale/swscale.h"
#include "libswscale/swscale_internal.h"
#include "libavutil/attributes.h"
#include "libavutil/avassert.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/x86/cpu.h"
#include "libavutil/cpu.h"
#include "libavutil/mem_internal.h"
#include "libavutil/pixdesc.h"

Go to the source code of this file.

Macros

#define YUV2YUVX_FUNC(opt, step)
 
#define SCALE_FUNC(filter_n, from_bpc, to_bpc, opt)
 
#define SCALE_FUNCS(filter_n, opt)
 
#define SCALE_FUNCS_MMX(opt)
 
#define SCALE_FUNCS_SSE(opt)
 
#define VSCALEX_FUNC(size, opt)
 
#define VSCALEX_FUNCS(opt)
 
#define VSCALE_FUNC(size, opt)
 
#define VSCALE_FUNCS(opt1, opt2)
 
#define INPUT_Y_FUNC(fmt, opt)
 
#define INPUT_UV_FUNC(fmt, opt)
 
#define INPUT_FUNC(fmt, opt)
 
#define INPUT_FUNCS(opt)
 
#define RANGE_CONVERT_FUNCS(opt, bpc)
 
#define RANGE_CONVERT_FUNCS_DECL(opt, bpc)
 
#define ASSIGN_SCALE_FUNC2(hscalefn, filtersize, opt1, opt2)
 
#define ASSIGN_VSCALEX_FUNC(vscalefn, opt, do_16_case)
 
#define ASSIGN_VSCALE_FUNC(vscalefn, opt)
 
#define case_rgb(x, X, opt)
 
#define ASSIGN_SSE_SCALE_FUNC(hscalefn, filtersize, opt1, opt2)
 

Functions

void ff_updateMMXDitherTables (SwsInternal *c, int dstY)
 
 SCALE_FUNCS_SSE (sse2)
 
 SCALE_FUNCS_SSE (ssse3)
 
 SCALE_FUNCS_SSE (sse4)
 
 SCALE_FUNC (4, 8, 15, avx2)
 
 SCALE_FUNC (X4, 8, 15, avx2)
 
 VSCALEX_FUNCS (sse2)
 
 VSCALEX_FUNCS (sse4)
 
 VSCALEX_FUNC (16, sse4)
 
 VSCALEX_FUNCS (avx)
 
 VSCALE_FUNCS (sse2, sse2)
 
 VSCALE_FUNC (16, sse4)
 
 VSCALE_FUNCS (avx, avx)
 
 INPUT_FUNCS (sse2)
 
 INPUT_FUNCS (ssse3)
 
 INPUT_FUNCS (avx)
 
 INPUT_FUNC (rgba, avx2)
 
 INPUT_FUNC (bgra, avx2)
 
 INPUT_FUNC (argb, avx2)
 
 INPUT_FUNC (abgr, avx2)
 
 INPUT_FUNC (rgb24, avx2)
 
 INPUT_FUNC (bgr24, avx2)
 
av_cold void ff_sws_init_range_convert_x86 (SwsInternal *c)
 
av_cold void ff_sws_init_swscale_x86 (SwsInternal *c)
 

Variables

const uint64_t ff_dither4 [2]
 
const uint64_t ff_dither8 [2]
 

Macro Definition Documentation

◆ YUV2YUVX_FUNC

#define YUV2YUVX_FUNC ( opt,
step )
Value:
void ff_yuv2yuvX_ ##opt(const int16_t *filter, int filterSize, int srcOffset, \
uint8_t *dest, int dstW, \
const uint8_t *dither, int offset); \
static void yuv2yuvX_ ##opt(const int16_t *filter, int filterSize, \
const int16_t **src, uint8_t *dest, int dstW, \
const uint8_t *dither, int offset) \
{ \
int remainder = (dstW % step); \
int pixelsProcessed = dstW - remainder; \
if(((uintptr_t)dest) & 15){ \
yuv2yuvX_sse2(filter, filterSize, src, dest, dstW, dither, offset); \
return; \
} \
if(pixelsProcessed > 0) \
ff_yuv2yuvX_ ##opt(filter, filterSize - 1, 0, dest - offset, pixelsProcessed + offset, dither, offset); \
if(remainder > 0){ \
ff_yuv2yuvX_sse2(filter, filterSize - 1, pixelsProcessed, dest - offset, pixelsProcessed + remainder + offset, dither, offset); \
} \
return; \
}
unsigned offset
Definition libaomenc.c:763
void(* filter)(uint8_t *src, ptrdiff_t stride, int qscale)
Definition h263dsp.c:29
#define src
Definition vp8dsp.c:248
static const uint16_t dither[8][8]
Definition vf_gradfun.c:46

Definition at line 176 of file swscale.c.

◆ SCALE_FUNC

#define SCALE_FUNC ( filter_n,
from_bpc,
to_bpc,
opt )
Value:
void ff_hscale ## from_bpc ## to ## to_bpc ## _ ## filter_n ## _ ## opt( \
SwsInternal *c, int16_t *data, \
int dstW, const uint8_t *src, \
const int16_t *filter, \
const int32_t *filterPos, int filterSize)
#define _
int32_t
const char * to
Definition webvttdec.c:36
const char data[16]
Definition mxf.c:149
static double c[64]

Definition at line 218 of file swscale.c.

◆ SCALE_FUNCS

#define SCALE_FUNCS ( filter_n,
opt )
Value:
SCALE_FUNC(filter_n, 8, 15, opt); \
SCALE_FUNC(filter_n, 9, 15, opt); \
SCALE_FUNC(filter_n, 10, 15, opt); \
SCALE_FUNC(filter_n, 12, 15, opt); \
SCALE_FUNC(filter_n, 14, 15, opt); \
SCALE_FUNC(filter_n, 16, 15, opt); \
SCALE_FUNC(filter_n, 8, 19, opt); \
SCALE_FUNC(filter_n, 9, 19, opt); \
SCALE_FUNC(filter_n, 10, 19, opt); \
SCALE_FUNC(filter_n, 12, 19, opt); \
SCALE_FUNC(filter_n, 14, 19, opt); \
SCALE_FUNC(filter_n, 16, 19, opt)
#define SCALE_FUNC(filter_n, from_bpc, to_bpc, opt)
Definition swscale.c:174

Definition at line 225 of file swscale.c.

◆ SCALE_FUNCS_MMX

#define SCALE_FUNCS_MMX ( opt)
Value:
SCALE_FUNCS(4, opt); \
SCALE_FUNCS(8, opt); \
SCALE_FUNCS(X, opt)
#define SCALE_FUNCS(filter_n, opt)
Definition swscale.c:180
#define X
Definition f_ebur128.c:157

Definition at line 239 of file swscale.c.

◆ SCALE_FUNCS_SSE

#define SCALE_FUNCS_SSE ( opt)
Value:
SCALE_FUNCS(4, opt); \
SCALE_FUNCS(8, opt); \
SCALE_FUNCS(X4, opt); \
SCALE_FUNCS(X8, opt)

Definition at line 244 of file swscale.c.

◆ VSCALEX_FUNC

#define VSCALEX_FUNC ( size,
opt )
Value:
void ff_yuv2planeX_ ## size ## _ ## opt(const int16_t *filter, int filterSize, \
const int16_t **src, uint8_t *dest, int dstW, \
const uint8_t *dither, int offset)
int size

Definition at line 257 of file swscale.c.

◆ VSCALEX_FUNCS

#define VSCALEX_FUNCS ( opt)
Value:
VSCALEX_FUNC(8, opt); \
VSCALEX_FUNC(9, opt); \
VSCALEX_FUNC(10, opt)
#define VSCALEX_FUNC(size, opt)
Definition swscale.c:257

Definition at line 261 of file swscale.c.

◆ VSCALE_FUNC

#define VSCALE_FUNC ( size,
opt )
Value:
void ff_yuv2plane1_ ## size ## _ ## opt(const int16_t *src, uint8_t *dst, int dstW, \
const uint8_t *dither, int offset)
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87

Definition at line 271 of file swscale.c.

◆ VSCALE_FUNCS

#define VSCALE_FUNCS ( opt1,
opt2 )
Value:
VSCALE_FUNC(8, opt1); \
VSCALE_FUNC(9, opt2); \
VSCALE_FUNC(10, opt2); \
VSCALE_FUNC(16, opt1)
#define VSCALE_FUNC(size, opt)
Definition swscale.c:271

Definition at line 274 of file swscale.c.

◆ INPUT_Y_FUNC

#define INPUT_Y_FUNC ( fmt,
opt )
Value:
void ff_ ## fmt ## ToY_ ## opt(uint8_t *dst, const uint8_t *src, \
const uint8_t *unused1, const uint8_t *unused2, \
int w, uint32_t *unused, void *opq)
uint8_t w
Definition llvidencdsp.c:39

Definition at line 284 of file swscale.c.

◆ INPUT_UV_FUNC

#define INPUT_UV_FUNC ( fmt,
opt )
Value:
void ff_ ## fmt ## ToUV_ ## opt(uint8_t *dstU, uint8_t *dstV, \
const uint8_t *unused0, \
const uint8_t *src1, \
const uint8_t *src2, \
int w, uint32_t *unused, void *opq)
const pixel * src2
#define src1
Definition h264pred.c:141

Definition at line 288 of file swscale.c.

◆ INPUT_FUNC

#define INPUT_FUNC ( fmt,
opt )
Value:
INPUT_Y_FUNC(fmt, opt); \
INPUT_UV_FUNC(fmt, opt)
#define INPUT_Y_FUNC(fmt, opt)
Definition swscale.c:284

Definition at line 294 of file swscale.c.

◆ INPUT_FUNCS

#define INPUT_FUNCS ( opt)
Value:
INPUT_FUNC(uyvy, opt); \
INPUT_FUNC(yuyv, opt); \
INPUT_UV_FUNC(nv12, opt); \
INPUT_UV_FUNC(nv21, opt); \
INPUT_FUNC(rgba, opt); \
INPUT_FUNC(bgra, opt); \
INPUT_FUNC(argb, opt); \
INPUT_FUNC(abgr, opt); \
INPUT_FUNC(rgb24, opt); \
INPUT_FUNC(bgr24, opt)
#define INPUT_FUNC(fmt, opt)
Definition swscale.c:294

Definition at line 297 of file swscale.c.

◆ RANGE_CONVERT_FUNCS

#define RANGE_CONVERT_FUNCS ( opt,
bpc )
Value:
do { \
if (c->opts.src_range) { \
c->lumConvertRange = ff_lumRangeFromJpeg##bpc##_##opt; \
c->chrConvertRange = ff_chrRangeFromJpeg##bpc##_##opt; \
} else { \
c->lumConvertRange = ff_lumRangeToJpeg##bpc##_##opt; \
c->chrConvertRange = ff_chrRangeToJpeg##bpc##_##opt; \
} \
} while (0)

Definition at line 444 of file swscale.c.

Referenced by ff_sws_init_range_convert_x86().

◆ RANGE_CONVERT_FUNCS_DECL

#define RANGE_CONVERT_FUNCS_DECL ( opt,
bpc )
Value:
void ff_lumRangeFromJpeg##bpc##_##opt(int16_t *dst, int width, \
uint32_t coeff, int64_t offset); \
void ff_chrRangeFromJpeg##bpc##_##opt(int16_t *dstU, int16_t *dstV, int width, \
uint32_t coeff, int64_t offset); \
void ff_lumRangeToJpeg##bpc##_##opt(int16_t *dst, int width, \
uint32_t coeff, int64_t offset); \
void ff_chrRangeToJpeg##bpc##_##opt(int16_t *dstU, int16_t *dstV, int width, \
uint32_t coeff, int64_t offset); \
long long int64_t
Definition coverity.c:34
#define width
Definition dsp.h:89
static const double coeff[2][5]

Definition at line 454 of file swscale.c.

◆ ASSIGN_SCALE_FUNC2

#define ASSIGN_SCALE_FUNC2 ( hscalefn,
filtersize,
opt1,
opt2 )
Value:
do { \
if (c->srcBpc == 8) { \
hscalefn = c->dstBpc <= 14 ? ff_hscale8to15_ ## filtersize ## _ ## opt2 : \
ff_hscale8to19_ ## filtersize ## _ ## opt1; \
} else if (c->srcBpc == 9) { \
hscalefn = c->dstBpc <= 14 ? ff_hscale9to15_ ## filtersize ## _ ## opt2 : \
ff_hscale9to19_ ## filtersize ## _ ## opt1; \
} else if (c->srcBpc == 10) { \
hscalefn = c->dstBpc <= 14 ? ff_hscale10to15_ ## filtersize ## _ ## opt2 : \
ff_hscale10to19_ ## filtersize ## _ ## opt1; \
} else if (c->srcBpc == 12) { \
hscalefn = c->dstBpc <= 14 ? ff_hscale12to15_ ## filtersize ## _ ## opt2 : \
ff_hscale12to19_ ## filtersize ## _ ## opt1; \
} else if (c->srcBpc == 14 || ((c->opts.src_format==AV_PIX_FMT_PAL8||isAnyRGB(c->opts.src_format)) && av_pix_fmt_desc_get(c->opts.src_format)->comp[0].depth<16)) { \
hscalefn = c->dstBpc <= 14 ? ff_hscale14to15_ ## filtersize ## _ ## opt2 : \
ff_hscale14to19_ ## filtersize ## _ ## opt1; \
} else { /* c->srcBpc == 16 */ \
av_assert0(c->srcBpc == 16);\
hscalefn = c->dstBpc <= 14 ? ff_hscale16to15_ ## filtersize ## _ ## opt2 : \
ff_hscale16to19_ ## filtersize ## _ ## opt1; \
} \
} while (0)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
Definition pixfmt.h:84
int depth
Number of bits in the component.
Definition pixdesc.h:57
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition pixdesc.h:105
static av_always_inline int isAnyRGB(enum AVPixelFormat pix_fmt)

◆ ASSIGN_VSCALEX_FUNC

#define ASSIGN_VSCALEX_FUNC ( vscalefn,
opt,
do_16_case )
Value:
switch(c->dstBpc){ \
case 16: do_16_case; break; \
case 10: if (!isBE(c->opts.dst_format) && !isSemiPlanarYUV(c->opts.dst_format) && !isDataInHighBits(c->opts.dst_format)) vscalefn = ff_yuv2planeX_10_ ## opt; break; \
case 9: if (!isBE(c->opts.dst_format)) vscalefn = ff_yuv2planeX_9_ ## opt; break; \
case 8: if (!c->use_mmx_vfilter) vscalefn = ff_yuv2planeX_8_ ## opt; break; \
}
static av_always_inline int isDataInHighBits(enum AVPixelFormat pix_fmt)
static av_always_inline int isSemiPlanarYUV(enum AVPixelFormat pix_fmt)
static av_always_inline int isBE(enum AVPixelFormat pix_fmt)

Referenced by ff_sws_init_swscale_x86().

◆ ASSIGN_VSCALE_FUNC

#define ASSIGN_VSCALE_FUNC ( vscalefn,
opt )
Value:
switch(c->dstBpc){ \
case 16: if (!isBE(c->opts.dst_format)) vscalefn = ff_yuv2plane1_16_ ## opt; break; \
case 10: if (!isBE(c->opts.dst_format) && !isSemiPlanarYUV(c->opts.dst_format) && !isDataInHighBits(c->opts.dst_format)) vscalefn = ff_yuv2plane1_10_ ## opt; break; \
case 9: if (!isBE(c->opts.dst_format)) vscalefn = ff_yuv2plane1_9_ ## opt; break; \
case 8: vscalefn = ff_yuv2plane1_8_ ## opt; break; \
default: av_assert0(c->dstBpc>8); \
}
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42

◆ case_rgb

#define case_rgb ( x,
X,
opt )
Value:
case AV_PIX_FMT_ ## X: \
c->lumToYV12 = ff_ ## x ## ToY_ ## opt; \
if (!c->chrSrcHSubSample) \
c->chrToYV12 = ff_ ## x ## ToUV_ ## opt; \
break

Referenced by ff_sws_init_swscale_x86().

◆ ASSIGN_SSE_SCALE_FUNC

#define ASSIGN_SSE_SCALE_FUNC ( hscalefn,
filtersize,
opt1,
opt2 )
Value:
switch (filtersize) { \
case 4: ASSIGN_SCALE_FUNC2(hscalefn, 4, opt1, opt2); break; \
case 8: ASSIGN_SCALE_FUNC2(hscalefn, 8, opt1, opt2); break; \
default: if (filtersize & 4) ASSIGN_SCALE_FUNC2(hscalefn, X4, opt1, opt2); \
else ASSIGN_SCALE_FUNC2(hscalefn, X8, opt1, opt2); \
break; \
}
#define ASSIGN_SCALE_FUNC2(hscalefn, filtersize, opt)
Definition swscale.c:242

Referenced by ff_sws_init_swscale_x86().

Function Documentation

◆ ff_updateMMXDitherTables()

void ff_updateMMXDitherTables ( SwsInternal * c,
int dstY )

Definition at line 60 of file swscale.c.

Referenced by ff_swscale().

◆ SCALE_FUNCS_SSE() [1/3]

SCALE_FUNCS_SSE ( sse2 )

◆ SCALE_FUNCS_SSE() [2/3]

SCALE_FUNCS_SSE ( ssse3 )

◆ SCALE_FUNCS_SSE() [3/3]

SCALE_FUNCS_SSE ( sse4 )

◆ SCALE_FUNC() [1/2]

SCALE_FUNC ( 4 ,
8 ,
15 ,
avx2  )

◆ SCALE_FUNC() [2/2]

SCALE_FUNC ( X4 ,
8 ,
15 ,
avx2  )

◆ VSCALEX_FUNCS() [1/3]

VSCALEX_FUNCS ( sse2 )

◆ VSCALEX_FUNCS() [2/3]

VSCALEX_FUNCS ( sse4 )

◆ VSCALEX_FUNC()

VSCALEX_FUNC ( 16 ,
sse4  )

◆ VSCALEX_FUNCS() [3/3]

VSCALEX_FUNCS ( avx )

◆ VSCALE_FUNCS() [1/2]

VSCALE_FUNCS ( sse2 ,
sse2  )

◆ VSCALE_FUNC()

VSCALE_FUNC ( 16 ,
sse4  )

◆ VSCALE_FUNCS() [2/2]

VSCALE_FUNCS ( avx ,
avx  )

◆ INPUT_FUNCS() [1/3]

INPUT_FUNCS ( sse2 )

◆ INPUT_FUNCS() [2/3]

INPUT_FUNCS ( ssse3 )

◆ INPUT_FUNCS() [3/3]

INPUT_FUNCS ( avx )

◆ INPUT_FUNC() [1/6]

INPUT_FUNC ( rgba ,
avx2  )

◆ INPUT_FUNC() [2/6]

INPUT_FUNC ( bgra ,
avx2  )

◆ INPUT_FUNC() [3/6]

INPUT_FUNC ( argb ,
avx2  )

◆ INPUT_FUNC() [4/6]

INPUT_FUNC ( abgr ,
avx2  )

◆ INPUT_FUNC() [5/6]

INPUT_FUNC ( rgb24 ,
avx2  )

◆ INPUT_FUNC() [6/6]

INPUT_FUNC ( bgr24 ,
avx2  )

◆ ff_sws_init_range_convert_x86()

av_cold void ff_sws_init_range_convert_x86 ( SwsInternal * c)

Definition at line 469 of file swscale.c.

Referenced by ff_sws_init_range_convert(), and ff_sws_init_range_convert_x86().

◆ ff_sws_init_swscale_x86()

av_cold void ff_sws_init_swscale_x86 ( SwsInternal * c)

Definition at line 485 of file swscale.c.

Referenced by ff_sws_init_scale().

Variable Documentation

◆ ff_dither4

const uint64_t ff_dither4[2]
Initial value:
= {
0x0103010301030103LL,
0x0200020002000200LL,}

Definition at line 33 of file swscale.c.

Referenced by ff_updateMMXDitherTables().

◆ ff_dither8

const uint64_t ff_dither8[2]
Initial value:
= {
0x0602060206020602LL,
0x0004000400040004LL,}

Definition at line 37 of file swscale.c.

Referenced by ff_updateMMXDitherTables().