Go to the documentation of this file.
44 int dstW =
desc->dst->width;
47 int sp =
first -
desc->src->plane[0].sliceY;
48 int dp = sliceY -
desc->dst->plane[0].sliceY;
49 uint8_t **
src =
desc->src->plane[0].line + sp;
50 uint8_t **
dst =
desc->dst->plane[0].line + dp;
59 int sp =
first -
desc->src->plane[3].sliceY;
60 int dp = sliceY -
desc->dst->plane[3].sliceY;
61 uint8_t **
src =
desc->src->plane[3].line + sp;
62 uint8_t **
dst =
desc->dst->plane[3].line + dp;
76 const int chrSkipMask = (1 <<
desc->dst->v_chr_sub_sample) - 1;
77 if (sliceY & chrSkipMask)
82 int chrSliceY = sliceY >>
desc->dst->v_chr_sub_sample;
85 int sp1 =
first -
desc->src->plane[1].sliceY;
86 int sp2 =
first -
desc->src->plane[2].sliceY;
87 int dp1 = chrSliceY -
desc->dst->plane[1].sliceY;
88 int dp2 = chrSliceY -
desc->dst->plane[2].sliceY;
89 uint8_t **
src1 =
desc->src->plane[1].line + sp1;
90 uint8_t **
src2 =
desc->src->plane[2].line + sp2;
91 uint8_t **dst1 =
desc->dst->plane[1].line + dp1;
92 uint8_t **dst2 =
desc->dst->plane[2].line + dp2;
112 int dstW =
desc->dst->width;
113 int chrSliceY = sliceY >>
desc->dst->v_chr_sub_sample;
117 uint16_t *lum_filter = inst[0].
filter[0];
118 uint16_t *chr_filter = inst[1].
filter[0];
120 int firstLum =
FFMAX(1-lum_fsize, inst[0].filter_pos[ sliceY]);
121 int firstChr =
FFMAX(1-chr_fsize, inst[1].filter_pos[chrSliceY]);
123 int sp0 = firstLum -
desc->src->plane[0].sliceY;
124 int sp1 = firstChr -
desc->src->plane[1].sliceY;
125 int sp2 = firstChr -
desc->src->plane[2].sliceY;
126 int sp3 = firstLum -
desc->src->plane[3].sliceY;
127 int dp = sliceY -
desc->dst->plane[0].sliceY;
128 uint8_t **
src0 =
desc->src->plane[0].line + sp0;
129 uint8_t **
src1 =
desc->src->plane[1].line + sp1;
130 uint8_t **
src2 =
desc->src->plane[2].line + sp2;
131 uint8_t **src3 =
desc->alpha ?
desc->src->plane[3].line + sp3 :
NULL;
132 uint8_t **
dst =
desc->dst->plane[0].line + dp;
135 if (
c->yuv2packed1 && lum_fsize == 1 && chr_fsize == 1) {
137 (
const int16_t*)(
desc->alpha ? *src3 :
NULL), *
dst, dstW, 0, sliceY);
138 }
else if (
c->yuv2packed1 && lum_fsize == 1 && chr_fsize == 2 &&
139 chr_filter[2 * chrSliceY + 1] + chr_filter[2 * chrSliceY] == 4096 &&
140 chr_filter[2 * chrSliceY + 1] <= 4096
U) {
141 int chrAlpha = chr_filter[2 * chrSliceY + 1];
143 (
const int16_t*)(
desc->alpha ? *src3 :
NULL), *
dst, dstW, chrAlpha, sliceY);
144 }
else if (
c->yuv2packed2 && lum_fsize == 2 && chr_fsize == 2 &&
145 lum_filter[2 * sliceY + 1] + lum_filter[2 * sliceY] == 4096 &&
146 lum_filter[2 * sliceY + 1] <= 4096
U &&
147 chr_filter[2 * chrSliceY + 1] + chr_filter[2 * chrSliceY] == 4096 &&
148 chr_filter[2 * chrSliceY + 1] <= 4096
U
150 int lumAlpha = lum_filter[2 * sliceY + 1];
151 int chrAlpha = chr_filter[2 * chrSliceY + 1];
153 c->lumMmxFilter[3] = lum_filter[2 * sliceY] * 0x10001;
155 c->chrMmxFilter[3] = chr_filter[2 * chrSliceY] * 0x10001;
157 *
dst, dstW, lumAlpha, chrAlpha, sliceY);
159 if ((
c->yuv2packed1 && lum_fsize == 1 && chr_fsize == 2) ||
160 (
c->yuv2packed2 && lum_fsize == 2 && chr_fsize == 2)) {
161 if (!
c->warned_unuseable_bilinear)
163 c->warned_unuseable_bilinear = 1;
167 (
const int16_t**)
src0, lum_fsize, chr_filter + chrSliceY * chr_fsize,
168 (
const int16_t**)
src1, (
const int16_t**)
src2, chr_fsize, (
const int16_t**)src3, *
dst, dstW, sliceY);
176 int dstW =
desc->dst->width;
177 int chrSliceY = sliceY >>
desc->dst->v_chr_sub_sample;
181 uint16_t *lum_filter = inst[0].
filter[0];
182 uint16_t *chr_filter = inst[1].
filter[0];
184 int firstLum =
FFMAX(1-lum_fsize, inst[0].filter_pos[ sliceY]);
185 int firstChr =
FFMAX(1-chr_fsize, inst[1].filter_pos[chrSliceY]);
187 int sp0 = firstLum -
desc->src->plane[0].sliceY;
188 int sp1 = firstChr -
desc->src->plane[1].sliceY;
189 int sp2 = firstChr -
desc->src->plane[2].sliceY;
190 int sp3 = firstLum -
desc->src->plane[3].sliceY;
191 int dp0 = sliceY -
desc->dst->plane[0].sliceY;
192 int dp1 = chrSliceY -
desc->dst->plane[1].sliceY;
193 int dp2 = chrSliceY -
desc->dst->plane[2].sliceY;
194 int dp3 = sliceY -
desc->dst->plane[3].sliceY;
196 uint8_t **
src0 =
desc->src->plane[0].line + sp0;
197 uint8_t **
src1 =
desc->src->plane[1].line + sp1;
198 uint8_t **
src2 =
desc->src->plane[2].line + sp2;
199 uint8_t **src3 =
desc->alpha ?
desc->src->plane[3].line + sp3 :
NULL;
200 uint8_t *
dst[4] = {
desc->dst->plane[0].line[dp0],
201 desc->dst->plane[1].line[dp1],
202 desc->dst->plane[2].line[dp2],
207 (
const int16_t**)
src0, lum_fsize, chr_filter + sliceY * chr_fsize,
208 (
const int16_t**)
src1, (
const int16_t**)
src2, chr_fsize, (
const int16_t**)src3,
dst, dstW, sliceY);
226 desc[0].instance = lumCtx;
229 desc[0].alpha =
c->needAlpha;
231 if (!
isGray(
c->opts.dst_format)) {
236 desc[1].instance = chrCtx;
247 desc[0].instance = lumCtx;
250 desc[0].alpha =
c->needAlpha;
254 c->yuv2packed1,
c->yuv2packed2,
c->yuv2packedX,
c->yuv2anyX,
c->use_mmx_vfilter);
269 int idx =
c->numDesc - (
c->is_internal_gamma ? 2 : 1);
272 if (!
isGray(
c->opts.dst_format)) {
273 chrCtx =
c->desc[idx].instance;
275 chrCtx->
filter[0] = use_mmx ? (int16_t*)
c->chrMmxFilter :
c->vChrFilter;
278 chrCtx->
isMMX = use_mmx;
286 lumCtx =
c->desc[idx].instance;
288 lumCtx->
filter[0] = use_mmx ? (int16_t*)
c->lumMmxFilter :
c->vLumFilter;
289 lumCtx->
filter[1] = use_mmx ? (int16_t*)
c->alpMmxFilter :
c->vLumFilter;
292 lumCtx->
isMMX = use_mmx;
298 lumCtx =
c->desc[idx].instance;
301 lumCtx->
filter[0] =
c->vLumFilter;
305 chrCtx->
filter[0] =
c->vChrFilter;
309 lumCtx->
isMMX = use_mmx;
310 chrCtx->
isMMX = use_mmx;
313 if (
c->yuv2packed1 &&
c->vLumFilterSize == 1 &&
c->vChrFilterSize <= 2)
315 else if (
c->yuv2packed2 &&
c->vLumFilterSize == 2 &&
c->vChrFilterSize == 2)
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 (...
static int lum_planar_vscale(SwsInternal *c, SwsFilterDescriptor *desc, int sliceY, int sliceH)
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 ff_init_vscale(SwsInternal *c, SwsFilterDescriptor *desc, SwsSlice *src, SwsSlice *dst)
initializes vertical scaling descriptors
static av_always_inline int isGray(enum AVPixelFormat pix_fmt)
Struct which holds all necessary data for processing a slice.
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)
yuv2planar1_fn yuv2planar1
void(* filter)(uint8_t *src, int stride, int qscale)
static int any_vscale(SwsInternal *c, SwsFilterDescriptor *desc, int sliceY, int sliceH)
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But first
void ff_init_vscale_pfn(SwsInternal *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
void(* yuv2packed2_fn)(SwsInternal *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...
#define AV_CEIL_RSHIFT(a, b)
yuv2planarX_fn yuv2planarX
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
void(* yuv2packedX_fn)(SwsInternal *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...
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
yuv2packedX_fn yuv2packedX
union VScalerContext::@463 pfn
yuv2packed2_fn yuv2packed2
#define AV_LOG_INFO
Standard information.
void(* yuv2anyX_fn)(SwsInternal *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...
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
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 ...
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Struct which defines a slice of an image to be scaled or an output for a scaled slice.
void * av_calloc(size_t nmemb, size_t size)
void(* yuv2packed1_fn)(SwsInternal *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...
static int packed_vscale(SwsInternal *c, SwsFilterDescriptor *desc, int sliceY, int sliceH)
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...
static av_always_inline int isPlanarYUV(enum AVPixelFormat pix_fmt)
static int chr_planar_vscale(SwsInternal *c, SwsFilterDescriptor *desc, int sliceY, int sliceH)
yuv2interleavedX_fn yuv2interleavedX
yuv2packed1_fn yuv2packed1
static av_always_inline int isALPHA(enum AVPixelFormat pix_fmt)