24 int srcStride[],
int srcSliceY,
int srcSliceH,
25 uint8_t *dst[],
int dstStride[])
28 int nb_components =
desc->nb_components;
30 int plane_count =
isGray(
c->srcFormat) ? 1 : 3;
31 int sixteen_bits =
desc->comp[0].depth >= 9;
32 unsigned off = 1<<(
desc->comp[0].depth - 1);
35 int target_table[2][3];
37 for (plane = 0; plane < plane_count; plane++) {
40 a = (1<<(
desc->comp[0].depth - 1))/2;
41 b = 3*(1<<(
desc->comp[0].depth-1))/2;
49 for (plane = 0; plane < plane_count; plane++) {
50 int w = plane ?
c->chrSrcW :
c->srcW;
51 int x_subsample = plane ?
desc->log2_chroma_w: 0;
52 int y_subsample = plane ?
desc->log2_chroma_h: 0;
54 if (x_subsample || y_subsample) {
58 ptrdiff_t alpha_step = srcStride[plane_count] >> 1;
59 const uint16_t *
s = (
const uint16_t *)(
src[plane ] + srcStride[plane ] * y);
60 const uint16_t *
a = (
const uint16_t *)(
src[plane_count] + (srcStride[plane_count] * y << y_subsample));
61 uint16_t *d = ( uint16_t *)(dst[plane ] + dstStride[plane ] * y);
63 for (x = 0; x <
w; x++) {
65 alpha = (
a[2*x] +
a[2*x + 1] + 2 +
66 a[2*x + alpha_step] +
a[2*x + alpha_step + 1]) >> 2;
68 alpha = (
a[2*x] +
a[2*x + 1]) >> 1;
73 for (x = 0; x <
w; x++) {
84 ptrdiff_t alpha_step = srcStride[plane_count];
85 const uint8_t *
s =
src[plane ] + srcStride[plane] * y;
86 const uint8_t *
a =
src[plane_count] + (srcStride[plane_count] * y << y_subsample);
87 uint8_t *d = dst[plane ] + dstStride[plane] * y;
88 for (x = 0; x <
w; x++) {
90 alpha = (
a[2*x] +
a[2*x + 1] + 2 +
91 a[2*x + alpha_step] +
a[2*x + alpha_step + 1]) >> 2;
93 alpha = (
a[2*x] +
a[2*x + 1]) >> 1;
94 u =
s[x]*
alpha + target_table[((x^y)>>5)&1][plane]*(255-
alpha) + 128;
100 const uint16_t *
s = (
const uint16_t *)(
src[plane ] + srcStride[plane ] * y);
101 const uint16_t *
a = (
const uint16_t *)(
src[plane_count] + srcStride[plane_count] * y);
102 uint16_t *d = ( uint16_t *)(dst[plane ] + dstStride[plane ] * y);
104 for (x = 0; x <
w; x++) {
105 unsigned u =
s[x]*
a[x] + target_table[((x^y)>>5)&1][plane]*(
max-
a[x]) + off;
109 for (x = 0; x <
w; x++) {
111 unsigned u =
av_bswap16(
s[x])*aswap + target_table[((x^y)>>5)&1][plane]*(
max-aswap) + off;
116 const uint8_t *
s =
src[plane ] + srcStride[plane] * y;
117 const uint8_t *
a =
src[plane_count] + srcStride[plane_count] * y;
118 uint8_t *d = dst[plane ] + dstStride[plane] * y;
119 for (x = 0; x <
w; x++) {
120 unsigned u =
s[x]*
a[x] + target_table[((x^y)>>5)&1][plane]*(255-
a[x]) + 128;
121 d[x] = (257*
u) >> 16;
128 int alpha_pos =
desc->comp[plane_count].offset;
130 for (y = srcSliceY; y <
srcSliceH; y++) {
132 const uint16_t *
s = (
const uint16_t *)(
src[0] + srcStride[0] * y + 2*!alpha_pos);
133 const uint16_t *
a = (
const uint16_t *)(
src[0] + srcStride[0] * y + alpha_pos);
134 uint16_t *d = ( uint16_t *)(dst[0] + dstStride[0] * y);
136 for (x = 0; x <
w; x++) {
137 for (plane = 0; plane < plane_count; plane++) {
138 int x_index = (plane_count + 1) * x;
139 unsigned u =
s[x_index + plane]*
a[x_index] + target_table[((x^y)>>5)&1][plane]*(
max-
a[x_index]) + off;
144 for (x = 0; x <
w; x++) {
145 for (plane = 0; plane < plane_count; plane++) {
146 int x_index = (plane_count + 1) * x;
148 unsigned u =
av_bswap16(
s[x_index + plane])*aswap + target_table[((x^y)>>5)&1][plane]*(
max-aswap) + off;
154 const uint8_t *
s =
src[0] + srcStride[0] * y + !alpha_pos;
155 const uint8_t *
a =
src[0] + srcStride[0] * y + alpha_pos;
156 uint8_t *d = dst[0] + dstStride[0] * y;
157 for (x = 0; x <
w; x++) {
158 for (plane = 0; plane < plane_count; plane++) {
159 int x_index = (plane_count + 1) * x;
160 unsigned u =
s[x_index + plane]*
a[x_index] + target_table[((x^y)>>5)&1][plane]*(255-
a[x_index]) + 128;
161 d[plane_count*x + plane] = (257*
u) >> 16;
int ff_sws_alphablendaway(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t *dst[], int dstStride[])
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define u(width, name, range_min, range_max)
#define AV_CEIL_RSHIFT(a, b)
static const int16_t alpha[]
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
#define AV_PIX_FMT_FLAG_PLANAR
At least one pixel component is not in the first data plane.
static int shift(int a, int b)
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
@ SWS_ALPHA_BLEND_CHECKERBOARD
static av_always_inline int isBE(enum AVPixelFormat pix_fmt)