Coverage Report

Created: 2026-03-12 07:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libswscale/output.c
Line
Count
Source
1
/*
2
 * Copyright (C) 2001-2012 Michael Niedermayer <michaelni@gmx.at>
3
 *
4
 * This file is part of FFmpeg.
5
 *
6
 * FFmpeg is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with FFmpeg; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
 */
20
21
#include <math.h>
22
#include <stddef.h>
23
#include <stdint.h>
24
#include <string.h>
25
26
#include "libavutil/attributes.h"
27
#include "libavutil/avutil.h"
28
#include "libavutil/avassert.h"
29
#include "libavutil/bswap.h"
30
#include "libavutil/intfloat.h"
31
#include "libavutil/intreadwrite.h"
32
#include "libavutil/mathematics.h"
33
#include "libavutil/mem_internal.h"
34
#include "libavutil/pixdesc.h"
35
#include "config.h"
36
#include "rgb2rgb.h"
37
#include "swscale.h"
38
#include "swscale_internal.h"
39
40
DECLARE_ALIGNED(8, const uint8_t, ff_dither_2x2_4)[][8] = {
41
{  1,   3,   1,   3,   1,   3,   1,   3, },
42
{  2,   0,   2,   0,   2,   0,   2,   0, },
43
{  1,   3,   1,   3,   1,   3,   1,   3, },
44
};
45
46
DECLARE_ALIGNED(8, const uint8_t, ff_dither_2x2_8)[][8] = {
47
{  6,   2,   6,   2,   6,   2,   6,   2, },
48
{  0,   4,   0,   4,   0,   4,   0,   4, },
49
{  6,   2,   6,   2,   6,   2,   6,   2, },
50
};
51
52
DECLARE_ALIGNED(8, const uint8_t, ff_dither_4x4_16)[][8] = {
53
{  8,   4,  11,   7,   8,   4,  11,   7, },
54
{  2,  14,   1,  13,   2,  14,   1,  13, },
55
{ 10,   6,   9,   5,  10,   6,   9,   5, },
56
{  0,  12,   3,  15,   0,  12,   3,  15, },
57
{  8,   4,  11,   7,   8,   4,  11,   7, },
58
};
59
60
DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_32)[][8] = {
61
{ 17,   9,  23,  15,  16,   8,  22,  14, },
62
{  5,  29,   3,  27,   4,  28,   2,  26, },
63
{ 21,  13,  19,  11,  20,  12,  18,  10, },
64
{  0,  24,   6,  30,   1,  25,   7,  31, },
65
{ 16,   8,  22,  14,  17,   9,  23,  15, },
66
{  4,  28,   2,  26,   5,  29,   3,  27, },
67
{ 20,  12,  18,  10,  21,  13,  19,  11, },
68
{  1,  25,   7,  31,   0,  24,   6,  30, },
69
{ 17,   9,  23,  15,  16,   8,  22,  14, },
70
};
71
72
DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_73)[][8] = {
73
{  0,  55,  14,  68,   3,  58,  17,  72, },
74
{ 37,  18,  50,  32,  40,  22,  54,  35, },
75
{  9,  64,   5,  59,  13,  67,   8,  63, },
76
{ 46,  27,  41,  23,  49,  31,  44,  26, },
77
{  2,  57,  16,  71,   1,  56,  15,  70, },
78
{ 39,  21,  52,  34,  38,  19,  51,  33, },
79
{ 11,  66,   7,  62,  10,  65,   6,  60, },
80
{ 48,  30,  43,  25,  47,  29,  42,  24, },
81
{  0,  55,  14,  68,   3,  58,  17,  72, },
82
};
83
84
#if 1
85
DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_220)[][8] = {
86
{117,  62, 158, 103, 113,  58, 155, 100, },
87
{ 34, 199,  21, 186,  31, 196,  17, 182, },
88
{144,  89, 131,  76, 141,  86, 127,  72, },
89
{  0, 165,  41, 206,  10, 175,  52, 217, },
90
{110,  55, 151,  96, 120,  65, 162, 107, },
91
{ 28, 193,  14, 179,  38, 203,  24, 189, },
92
{138,  83, 124,  69, 148,  93, 134,  79, },
93
{  7, 172,  48, 213,   3, 168,  45, 210, },
94
{117,  62, 158, 103, 113,  58, 155, 100, },
95
};
96
#elif 1
97
// tries to correct a gamma of 1.5
98
DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_220)[][8] = {
99
{  0, 143,  18, 200,   2, 156,  25, 215, },
100
{ 78,  28, 125,  64,  89,  36, 138,  74, },
101
{ 10, 180,   3, 161,  16, 195,   8, 175, },
102
{109,  51,  93,  38, 121,  60, 105,  47, },
103
{  1, 152,  23, 210,   0, 147,  20, 205, },
104
{ 85,  33, 134,  71,  81,  30, 130,  67, },
105
{ 14, 190,   6, 171,  12, 185,   5, 166, },
106
{117,  57, 101,  44, 113,  54,  97,  41, },
107
{  0, 143,  18, 200,   2, 156,  25, 215, },
108
};
109
#elif 1
110
// tries to correct a gamma of 2.0
111
DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_220)[][8] = {
112
{  0, 124,   8, 193,   0, 140,  12, 213, },
113
{ 55,  14, 104,  42,  66,  19, 119,  52, },
114
{  3, 168,   1, 145,   6, 187,   3, 162, },
115
{ 86,  31,  70,  21,  99,  39,  82,  28, },
116
{  0, 134,  11, 206,   0, 129,   9, 200, },
117
{ 62,  17, 114,  48,  58,  16, 109,  45, },
118
{  5, 181,   2, 157,   4, 175,   1, 151, },
119
{ 95,  36,  78,  26,  90,  34,  74,  24, },
120
{  0, 124,   8, 193,   0, 140,  12, 213, },
121
};
122
#else
123
// tries to correct a gamma of 2.5
124
DECLARE_ALIGNED(8, const uint8_t, ff_dither_8x8_220)[][8] = {
125
{  0, 107,   3, 187,   0, 125,   6, 212, },
126
{ 39,   7,  86,  28,  49,  11, 102,  36, },
127
{  1, 158,   0, 131,   3, 180,   1, 151, },
128
{ 68,  19,  52,  12,  81,  25,  64,  17, },
129
{  0, 119,   5, 203,   0, 113,   4, 195, },
130
{ 45,   9,  96,  33,  42,   8,  91,  30, },
131
{  2, 172,   1, 144,   2, 165,   0, 137, },
132
{ 77,  23,  60,  15,  72,  21,  56,  14, },
133
{  0, 107,   3, 187,   0, 125,   6, 212, },
134
};
135
#endif
136
137
#define IS_BE_LE 0
138
#define IS_BE_BE 1
139
/* ENDIAN_IDENTIFIER needs to be "BE" or "LE". */
140
#define IS_BE(ENDIAN_IDENTIFIER) IS_BE_ ## ENDIAN_IDENTIFIER
141
142
#define output_pixel(pos, val, bias, signedness) \
143
0
    if (big_endian) { \
144
0
        AV_WB16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
145
0
    } else { \
146
0
        AV_WL16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
147
0
    }
148
149
static av_always_inline void
150
yuv2plane1_16_c_template(const int32_t *src, uint16_t *dest, int dstW,
151
                         int big_endian, int output_bits)
152
0
{
153
0
    int i;
154
0
    int shift = 3;
155
0
    av_assert0(output_bits == 16);
156
157
0
    for (i = 0; i < dstW; i++) {
158
0
        int val = src[i] + (1 << (shift - 1));
159
0
        output_pixel(&dest[i], val, 0, uint);
160
0
    }
161
0
}
162
163
static av_always_inline void
164
yuv2planeX_16_c_template(const int16_t *filter, int filterSize,
165
                         const int32_t **src, uint16_t *dest, int dstW,
166
                         int big_endian, int output_bits)
167
0
{
168
0
    int i;
169
0
    int shift = 15;
170
0
    av_assert0(output_bits == 16);
171
172
0
    for (i = 0; i < dstW; i++) {
173
0
        int val = 1 << (shift - 1);
174
0
        int j;
175
176
        /* range of val is [0,0x7FFFFFFF], so 31 bits, but with lanczos/spline
177
         * filters (or anything with negative coeffs, the range can be slightly
178
         * wider in both directions. To account for this overflow, we subtract
179
         * a constant so it always fits in the signed range (assuming a
180
         * reasonable filterSize), and re-add that at the end. */
181
0
        val -= 0x40000000;
182
0
        for (j = 0; j < filterSize; j++)
183
0
            val += src[j][i] * (unsigned)filter[j];
184
185
0
        output_pixel(&dest[i], val, 0x8000, int);
186
0
    }
187
0
}
188
189
static av_always_inline void
190
yuv2nv12cX_16_c_template(int big_endian, const uint8_t *chrDither,
191
                         const int16_t *chrFilter, int chrFilterSize,
192
                         const int16_t **chrUSrc, const int16_t **chrVSrc,
193
                         uint8_t *dest8, int chrDstW, int output_bits)
194
0
{
195
0
    uint16_t *dest = (uint16_t*)dest8;
196
0
    const int32_t **uSrc = (const int32_t **)chrUSrc;
197
0
    const int32_t **vSrc = (const int32_t **)chrVSrc;
198
0
    int shift = 15;
199
0
    int i, j;
200
0
    av_assert0(output_bits == 16);
201
202
0
    for (i = 0; i < chrDstW; i++) {
203
0
        int u = 1 << (shift - 1);
204
0
        int v = 1 << (shift - 1);
205
206
        /* See yuv2planeX_16_c_template for details. */
207
0
        u -= 0x40000000;
208
0
        v -= 0x40000000;
209
0
        for (j = 0; j < chrFilterSize; j++) {
210
0
            u += uSrc[j][i] * (unsigned)chrFilter[j];
211
0
            v += vSrc[j][i] * (unsigned)chrFilter[j];
212
0
        }
213
214
0
        output_pixel(&dest[2*i]  , u, 0x8000, int);
215
0
        output_pixel(&dest[2*i+1], v, 0x8000, int);
216
0
    }
217
0
}
218
219
static av_always_inline void
220
yuv2plane1_float_c_template(const int32_t *src, float *dest, int dstW)
221
0
{
222
0
    static const int big_endian = HAVE_BIGENDIAN;
223
0
    static const int shift = 3;
224
0
    static const float float_mult = 1.0f / 65535.0f;
225
0
    int i, val;
226
0
    uint16_t val_uint;
227
228
0
    for (i = 0; i < dstW; ++i){
229
0
        val = src[i] + (1 << (shift - 1));
230
0
        output_pixel(&val_uint, val, 0, uint);
231
0
        dest[i] = float_mult * (float)val_uint;
232
0
    }
233
0
}
234
235
static av_always_inline void
236
yuv2plane1_float_bswap_c_template(const int32_t *src, uint32_t *dest, int dstW)
237
0
{
238
0
    static const int big_endian = HAVE_BIGENDIAN;
239
0
    static const int shift = 3;
240
0
    static const float float_mult = 1.0f / 65535.0f;
241
0
    int i, val;
242
0
    uint16_t val_uint;
243
244
0
    for (i = 0; i < dstW; ++i){
245
0
        val = src[i] + (1 << (shift - 1));
246
0
        output_pixel(&val_uint, val, 0, uint);
247
0
        dest[i] = av_bswap32(av_float2int(float_mult * (float)val_uint));
248
0
    }
249
0
}
250
251
static av_always_inline void
252
yuv2planeX_float_c_template(const int16_t *filter, int filterSize, const int32_t **src,
253
                            float *dest, int dstW)
254
0
{
255
0
    static const int big_endian = HAVE_BIGENDIAN;
256
0
    static const int shift = 15;
257
0
    static const float float_mult = 1.0f / 65535.0f;
258
0
    int i, j, val;
259
0
    uint16_t val_uint;
260
261
0
    for (i = 0; i < dstW; ++i){
262
0
        val = (1 << (shift - 1)) - 0x40000000;
263
0
        for (j = 0; j < filterSize; ++j){
264
0
            val += src[j][i] * (unsigned)filter[j];
265
0
        }
266
0
        output_pixel(&val_uint, val, 0x8000, int);
267
0
        dest[i] = float_mult * (float)val_uint;
268
0
    }
269
0
}
270
271
static av_always_inline void
272
yuv2planeX_float_bswap_c_template(const int16_t *filter, int filterSize, const int32_t **src,
273
                            uint32_t *dest, int dstW)
274
0
{
275
0
    static const int big_endian = HAVE_BIGENDIAN;
276
0
    static const int shift = 15;
277
0
    static const float float_mult = 1.0f / 65535.0f;
278
0
    int i, j, val;
279
0
    uint16_t val_uint;
280
281
0
    for (i = 0; i < dstW; ++i){
282
0
        val = (1 << (shift - 1)) - 0x40000000;
283
0
        for (j = 0; j < filterSize; ++j){
284
0
            val += src[j][i] * (unsigned)filter[j];
285
0
        }
286
0
        output_pixel(&val_uint, val, 0x8000, int);
287
0
        dest[i] = av_bswap32(av_float2int(float_mult * (float)val_uint));
288
0
    }
289
0
}
290
291
#define yuv2plane1_float(template, dest_type, BE_LE) \
292
static void yuv2plane1_float ## BE_LE ## _c(const int16_t *src, uint8_t *dest, int dstW, \
293
0
                                            const uint8_t *dither, int offset) \
294
0
{ \
295
0
    template((const int32_t *)src, (dest_type *)dest, dstW); \
296
0
}
Unexecuted instantiation: output.c:yuv2plane1_floatBE_c
Unexecuted instantiation: output.c:yuv2plane1_floatLE_c
297
298
#define yuv2planeX_float(template, dest_type, BE_LE) \
299
static void yuv2planeX_float ## BE_LE ## _c(const int16_t *filter, int filterSize, \
300
                                            const int16_t **src, uint8_t *dest, int dstW, \
301
0
                                            const uint8_t *dither, int offset) \
302
0
{ \
303
0
    template(filter, filterSize, (const int32_t **)src, (dest_type *)dest, dstW); \
304
0
}
Unexecuted instantiation: output.c:yuv2planeX_floatBE_c
Unexecuted instantiation: output.c:yuv2planeX_floatLE_c
305
306
#if HAVE_BIGENDIAN
307
yuv2plane1_float(yuv2plane1_float_c_template,       float,    BE)
308
yuv2plane1_float(yuv2plane1_float_bswap_c_template, uint32_t, LE)
309
yuv2planeX_float(yuv2planeX_float_c_template,       float,    BE)
310
yuv2planeX_float(yuv2planeX_float_bswap_c_template, uint32_t, LE)
311
#else
312
yuv2plane1_float(yuv2plane1_float_c_template,       float,    LE)
313
yuv2plane1_float(yuv2plane1_float_bswap_c_template, uint32_t, BE)
314
yuv2planeX_float(yuv2planeX_float_c_template,       float,    LE)
315
yuv2planeX_float(yuv2planeX_float_bswap_c_template, uint32_t, BE)
316
#endif
317
318
#undef output_pixel
319
320
#define output_pixel(pos, val) \
321
0
    if (big_endian) { \
322
0
        AV_WB16(pos, av_clip_uintp2(val >> shift, output_bits)); \
323
0
    } else { \
324
0
        AV_WL16(pos, av_clip_uintp2(val >> shift, output_bits)); \
325
0
    }
326
327
static av_always_inline void
328
yuv2plane1_10_c_template(const int16_t *src, uint16_t *dest, int dstW,
329
                         int big_endian, int output_bits)
330
0
{
331
0
    int i;
332
0
    int shift = 15 - output_bits;
333
334
0
    for (i = 0; i < dstW; i++) {
335
0
        int val = src[i] + (1 << (shift - 1));
336
0
        output_pixel(&dest[i], val);
337
0
    }
338
0
}
339
340
static av_always_inline void
341
yuv2planeX_10_c_template(const int16_t *filter, int filterSize,
342
                         const int16_t **src, uint16_t *dest, int dstW,
343
                         int big_endian, int output_bits)
344
0
{
345
0
    int i;
346
0
    int shift = 11 + 16 - output_bits;
347
348
0
    for (i = 0; i < dstW; i++) {
349
0
        int val = 1 << (shift - 1);
350
0
        int j;
351
352
0
        for (j = 0; j < filterSize; j++)
353
0
            val += src[j][i] * filter[j];
354
355
0
        output_pixel(&dest[i], val);
356
0
    }
357
0
}
358
359
#undef output_pixel
360
361
#define yuv2NBPS(bits, BE_LE, is_be, template_size, typeX_t) \
362
static void yuv2plane1_ ## bits ## BE_LE ## _c(const int16_t *src, \
363
                              uint8_t *dest, int dstW, \
364
0
                              const uint8_t *dither, int offset)\
365
0
{ \
366
0
    yuv2plane1_ ## template_size ## _c_template((const typeX_t *) src, \
367
0
                         (uint16_t *) dest, dstW, is_be, bits); \
368
0
}\
Unexecuted instantiation: output.c:yuv2plane1_16BE_c
Unexecuted instantiation: output.c:yuv2plane1_16LE_c
Unexecuted instantiation: output.c:yuv2plane1_9BE_c
Unexecuted instantiation: output.c:yuv2plane1_9LE_c
Unexecuted instantiation: output.c:yuv2plane1_10BE_c
Unexecuted instantiation: output.c:yuv2plane1_10LE_c
Unexecuted instantiation: output.c:yuv2plane1_12BE_c
Unexecuted instantiation: output.c:yuv2plane1_12LE_c
Unexecuted instantiation: output.c:yuv2plane1_14BE_c
Unexecuted instantiation: output.c:yuv2plane1_14LE_c
369
static void yuv2planeX_ ## bits ## BE_LE ## _c(const int16_t *filter, int filterSize, \
370
                              const int16_t **src, uint8_t *dest, int dstW, \
371
0
                              const uint8_t *dither, int offset)\
372
0
{ \
373
0
    yuv2planeX_## template_size ## _c_template(filter, \
374
0
                         filterSize, (const typeX_t **) src, \
375
0
                         (uint16_t *) dest, dstW, is_be, bits); \
376
0
}
Unexecuted instantiation: output.c:yuv2planeX_16BE_c
Unexecuted instantiation: output.c:yuv2planeX_16LE_c
Unexecuted instantiation: output.c:yuv2planeX_9BE_c
Unexecuted instantiation: output.c:yuv2planeX_9LE_c
Unexecuted instantiation: output.c:yuv2planeX_10BE_c
Unexecuted instantiation: output.c:yuv2planeX_10LE_c
Unexecuted instantiation: output.c:yuv2planeX_12BE_c
Unexecuted instantiation: output.c:yuv2planeX_12LE_c
Unexecuted instantiation: output.c:yuv2planeX_14BE_c
Unexecuted instantiation: output.c:yuv2planeX_14LE_c
377
378
yuv2NBPS( 9, BE, 1, 10, int16_t)
379
yuv2NBPS( 9, LE, 0, 10, int16_t)
380
yuv2NBPS(10, BE, 1, 10, int16_t)
381
yuv2NBPS(10, LE, 0, 10, int16_t)
382
yuv2NBPS(12, BE, 1, 10, int16_t)
383
yuv2NBPS(12, LE, 0, 10, int16_t)
384
yuv2NBPS(14, BE, 1, 10, int16_t)
385
yuv2NBPS(14, LE, 0, 10, int16_t)
386
yuv2NBPS(16, BE, 1, 16, int32_t)
387
yuv2NBPS(16, LE, 0, 16, int32_t)
388
389
#define output_pixel(pos, val) \
390
0
    if (big_endian) { \
391
0
        AV_WB16(pos, av_clip_uintp2(val >> shift, output_bits) << (16 - output_bits)); \
392
0
    } else { \
393
0
        AV_WL16(pos, av_clip_uintp2(val >> shift, output_bits) << (16 - output_bits)); \
394
0
    }
395
396
static av_always_inline void
397
yuv2msbplane1_10_c_template(const int16_t *src, uint16_t *dest, int dstW,
398
                            int big_endian, int output_bits)
399
0
{
400
0
    int i;
401
0
    int shift = 15 - output_bits;
402
403
0
    for (i = 0; i < dstW; i++) {
404
0
        int val = src[i] + (1 << (shift - 1));
405
0
        output_pixel(&dest[i], val);
406
0
    }
407
0
}
408
409
static av_always_inline void
410
yuv2msbplaneX_10_c_template(const int16_t *filter, int filterSize,
411
                            const int16_t **src, uint16_t *dest, int dstW,
412
                            int big_endian, int output_bits)
413
0
{
414
0
    int i;
415
0
    int shift = 11 + 16 - output_bits;
416
417
0
    for (i = 0; i < dstW; i++) {
418
0
        int val = 1 << (shift - 1);
419
0
        int j;
420
421
0
        for (j = 0; j < filterSize; j++)
422
0
            val += src[j][i] * filter[j];
423
424
0
        output_pixel(&dest[i], val);
425
0
    }
426
0
}
427
428
#define yuv2MSBNBPS(bits, BE_LE, is_be, template_size, typeX_t) \
429
static void yuv2msbplane1_ ## bits ## BE_LE ## _c(const int16_t *src, \
430
                              uint8_t *dest, int dstW, \
431
0
                              const uint8_t *dither, int offset)\
432
0
{ \
433
0
    yuv2msbplane1_ ## template_size ## _c_template((const typeX_t *) src, \
434
0
                         (uint16_t *) dest, dstW, is_be, bits); \
435
0
}\
Unexecuted instantiation: output.c:yuv2msbplane1_10BE_c
Unexecuted instantiation: output.c:yuv2msbplane1_10LE_c
Unexecuted instantiation: output.c:yuv2msbplane1_12BE_c
Unexecuted instantiation: output.c:yuv2msbplane1_12LE_c
436
static void yuv2msbplaneX_ ## bits ## BE_LE ## _c(const int16_t *filter, int filterSize, \
437
                              const int16_t **src, uint8_t *dest, int dstW, \
438
0
                              const uint8_t *dither, int offset)\
439
0
{ \
440
0
    yuv2msbplaneX_## template_size ## _c_template(filter, \
441
0
                         filterSize, (const typeX_t **) src, \
442
0
                         (uint16_t *) dest, dstW, is_be, bits); \
443
0
}
Unexecuted instantiation: output.c:yuv2msbplaneX_10BE_c
Unexecuted instantiation: output.c:yuv2msbplaneX_10LE_c
Unexecuted instantiation: output.c:yuv2msbplaneX_12BE_c
Unexecuted instantiation: output.c:yuv2msbplaneX_12LE_c
444
445
yuv2MSBNBPS(10, BE, 1, 10, int16_t)
446
yuv2MSBNBPS(10, LE, 0, 10, int16_t)
447
yuv2MSBNBPS(12, BE, 1, 10, int16_t)
448
yuv2MSBNBPS(12, LE, 0, 10, int16_t)
449
450
#undef output_pixel
451
452
static void yuv2nv12cX_16LE_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither,
453
                              const int16_t *chrFilter, int chrFilterSize,
454
                              const int16_t **chrUSrc, const int16_t **chrVSrc,
455
                              uint8_t *dest8, int chrDstW)
456
0
{
457
0
    yuv2nv12cX_16_c_template(0, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, dest8, chrDstW, 16);
458
0
}
459
460
static void yuv2nv12cX_16BE_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither,
461
                              const int16_t *chrFilter, int chrFilterSize,
462
                              const int16_t **chrUSrc, const int16_t **chrVSrc,
463
                              uint8_t *dest8, int chrDstW)
464
0
{
465
0
    yuv2nv12cX_16_c_template(1, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, dest8, chrDstW, 16);
466
0
}
467
468
static void yuv2planeX_8_c(const int16_t *filter, int filterSize,
469
                           const int16_t **src, uint8_t *dest, int dstW,
470
                           const uint8_t *dither, int offset)
471
0
{
472
0
    int i;
473
0
    for (i=0; i<dstW; i++) {
474
0
        int val = dither[(i + offset) & 7] << 12;
475
0
        int j;
476
0
        for (j=0; j<filterSize; j++) {
477
0
            val += (unsigned)(src[j][i] * filter[j]);
478
479
0
        }
480
481
0
        dest[i]= av_clip_uint8(val>>19);
482
0
    }
483
0
}
484
485
static void yuv2plane1_8_c(const int16_t *src, uint8_t *dest, int dstW,
486
                           const uint8_t *dither, int offset)
487
0
{
488
0
    int i;
489
0
    for (i=0; i<dstW; i++) {
490
0
        int val = (src[i] + dither[(i + offset) & 7]) >> 7;
491
0
        dest[i]= av_clip_uint8(val);
492
0
    }
493
0
}
494
495
static void yuv2nv12cX_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither,
496
                         const int16_t *chrFilter, int chrFilterSize,
497
                         const int16_t **chrUSrc, const int16_t **chrVSrc,
498
                         uint8_t *dest, int chrDstW)
499
0
{
500
0
    int i;
501
502
0
    if (!isSwappedChroma(dstFormat))
503
0
        for (i=0; i<chrDstW; i++) {
504
0
            int u = chrDither[i & 7] << 12;
505
0
            int v = chrDither[(i + 3) & 7] << 12;
506
0
            int j;
507
0
            for (j=0; j<chrFilterSize; j++) {
508
0
                u += chrUSrc[j][i] * (unsigned)chrFilter[j];
509
0
                v += chrVSrc[j][i] * (unsigned)chrFilter[j];
510
0
            }
511
512
0
            dest[2*i]= av_clip_uint8(u>>19);
513
0
            dest[2*i+1]= av_clip_uint8(v>>19);
514
0
        }
515
0
    else
516
0
        for (i=0; i<chrDstW; i++) {
517
0
            int u = chrDither[i & 7] << 12;
518
0
            int v = chrDither[(i + 3) & 7] << 12;
519
0
            int j;
520
0
            for (j=0; j<chrFilterSize; j++) {
521
0
                u += chrUSrc[j][i] * (unsigned)chrFilter[j];
522
0
                v += chrVSrc[j][i] * (unsigned)chrFilter[j];
523
0
            }
524
525
0
            dest[2*i]= av_clip_uint8(v>>19);
526
0
            dest[2*i+1]= av_clip_uint8(u>>19);
527
0
        }
528
0
}
529
530
531
#define output_pixel(pos, val) \
532
0
    if (big_endian) { \
533
0
        AV_WB16(pos, av_clip_uintp2(val >> shift, output_bits) << output_shift); \
534
0
    } else { \
535
0
        AV_WL16(pos, av_clip_uintp2(val >> shift, output_bits) << output_shift); \
536
0
    }
537
538
static void yuv2p01xl1_c(const int16_t *src,
539
                         uint16_t *dest, int dstW,
540
                         int big_endian, int output_bits, int output_shift)
541
0
{
542
0
    int i;
543
0
    int shift = 15 - output_bits;
544
545
0
    for (i = 0; i < dstW; i++) {
546
0
        int val = src[i] + (1 << (shift - 1));
547
0
        output_pixel(&dest[i], val);
548
0
    }
549
0
}
550
551
static void yuv2p01xlX_c(const int16_t *filter, int filterSize,
552
                         const int16_t **src, uint16_t *dest, int dstW,
553
                         int big_endian, int output_bits, int output_shift)
554
0
{
555
0
    int i, j;
556
0
    int shift = 11 + 16 - output_bits;
557
558
0
    for (i = 0; i < dstW; i++) {
559
0
        int val = 1 << (shift - 1);
560
561
0
        for (j = 0; j < filterSize; j++)
562
0
            val += src[j][i] * filter[j];
563
564
0
        output_pixel(&dest[i], val);
565
0
    }
566
0
}
567
568
static void yuv2p01xcX_c(int big_endian, const uint8_t *chrDither,
569
                         const int16_t *chrFilter, int chrFilterSize,
570
                         const int16_t **chrUSrc, const int16_t **chrVSrc,
571
                         uint8_t *dest8, int chrDstW, int output_bits, int output_shift)
572
0
{
573
0
    uint16_t *dest = (uint16_t*)dest8;
574
0
    int i, j;
575
0
    int shift = 11 + 16 - output_bits;
576
577
0
    for (i = 0; i < chrDstW; i++) {
578
0
        int u = 1 << (shift - 1);
579
0
        int v = 1 << (shift - 1);
580
581
0
        for (j = 0; j < chrFilterSize; j++) {
582
0
            u += chrUSrc[j][i] * (unsigned)chrFilter[j];
583
0
            v += chrVSrc[j][i] * (unsigned)chrFilter[j];
584
0
        }
585
586
0
        output_pixel(&dest[2*i]  , u);
587
0
        output_pixel(&dest[2*i+1], v);
588
0
    }
589
0
}
590
591
#undef output_pixel
592
593
#define yuv2p01x_wrapper(fmt, bits, shift)                                     \
594
    static void yuv2 ## fmt ## l1_LE_c(const int16_t *src,                     \
595
                                          uint8_t *dest, int dstW,             \
596
                                          const uint8_t *dither, int offset)   \
597
0
    {                                                                          \
598
0
        yuv2p01xl1_c(src, (uint16_t*)dest, dstW, 0, bits, shift);              \
599
0
    }                                                                          \
Unexecuted instantiation: output.c:yuv2p010l1_LE_c
Unexecuted instantiation: output.c:yuv2p012l1_LE_c
Unexecuted instantiation: output.c:yuv2nv20l1_LE_c
600
                                                                               \
601
    static void yuv2 ## fmt ## l1_BE_c(const int16_t *src,                     \
602
                                          uint8_t *dest, int dstW,             \
603
                                          const uint8_t *dither, int offset)   \
604
0
    {                                                                          \
605
0
        yuv2p01xl1_c(src, (uint16_t*)dest, dstW, 1, bits, shift);              \
606
0
    }                                                                          \
Unexecuted instantiation: output.c:yuv2p010l1_BE_c
Unexecuted instantiation: output.c:yuv2p012l1_BE_c
Unexecuted instantiation: output.c:yuv2nv20l1_BE_c
607
                                                                               \
608
    static void yuv2 ## fmt ## lX_LE_c(const int16_t *filter,                  \
609
                                          int filterSize, const int16_t **src, \
610
                                          uint8_t *dest, int dstW,             \
611
                                          const uint8_t *dither, int offset)   \
612
0
    {                                                                          \
613
0
        yuv2p01xlX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 0,        \
614
0
                     bits, shift);                                             \
615
0
    }                                                                          \
Unexecuted instantiation: output.c:yuv2p010lX_LE_c
Unexecuted instantiation: output.c:yuv2p012lX_LE_c
Unexecuted instantiation: output.c:yuv2nv20lX_LE_c
616
                                                                               \
617
    static void yuv2 ## fmt ## lX_BE_c(const int16_t *filter,                  \
618
                                          int filterSize, const int16_t **src, \
619
                                          uint8_t *dest, int dstW,             \
620
                                          const uint8_t *dither, int offset)   \
621
0
    {                                                                          \
622
0
        yuv2p01xlX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 1,        \
623
0
                     bits, shift);                                             \
624
0
    }                                                                          \
Unexecuted instantiation: output.c:yuv2p010lX_BE_c
Unexecuted instantiation: output.c:yuv2p012lX_BE_c
Unexecuted instantiation: output.c:yuv2nv20lX_BE_c
625
                                                                               \
626
    static void yuv2 ## fmt ## cX_LE_c(enum AVPixelFormat dstFormat,           \
627
                                          const uint8_t *chrDither,            \
628
                                          const int16_t *chrFilter,            \
629
                                          int chrFilterSize,                   \
630
                                          const int16_t **chrUSrc,             \
631
                                          const int16_t **chrVSrc,             \
632
                                          uint8_t *dest8, int chrDstW)         \
633
0
    {                                                                          \
634
0
        yuv2p01xcX_c(0, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, \
635
0
                     dest8, chrDstW, bits, shift);                             \
636
0
    }                                                                          \
Unexecuted instantiation: output.c:yuv2p010cX_LE_c
Unexecuted instantiation: output.c:yuv2p012cX_LE_c
Unexecuted instantiation: output.c:yuv2nv20cX_LE_c
637
                                                                               \
638
    static void yuv2 ## fmt ## cX_BE_c(enum AVPixelFormat dstFormat,           \
639
                                          const uint8_t *chrDither,            \
640
                                          const int16_t *chrFilter,            \
641
                                          int chrFilterSize,                   \
642
                                          const int16_t **chrUSrc,             \
643
                                          const int16_t **chrVSrc,             \
644
                                          uint8_t *dest8, int chrDstW)         \
645
0
    {                                                                          \
646
0
        yuv2p01xcX_c(1, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, \
647
0
                     dest8, chrDstW, bits, shift);                             \
648
0
    }
Unexecuted instantiation: output.c:yuv2p010cX_BE_c
Unexecuted instantiation: output.c:yuv2p012cX_BE_c
Unexecuted instantiation: output.c:yuv2nv20cX_BE_c
649
650
yuv2p01x_wrapper(p010, 10, 6)
651
yuv2p01x_wrapper(p012, 12, 4)
652
yuv2p01x_wrapper(nv20, 10, 0)
653
654
#define accumulate_bit(acc, val) \
655
0
    acc <<= 1; \
656
0
    acc |= (val) >= 234
657
#define output_pixel(pos, acc) \
658
0
    if (target == AV_PIX_FMT_MONOBLACK) { \
659
0
        pos = acc; \
660
0
    } else { \
661
0
        pos = ~acc; \
662
0
    }
663
664
static av_always_inline void
665
yuv2mono_X_c_template(SwsInternal *c, const int16_t *lumFilter,
666
                      const int16_t **lumSrc, int lumFilterSize,
667
                      const int16_t *chrFilter, const int16_t **chrUSrc,
668
                      const int16_t **chrVSrc, int chrFilterSize,
669
                      const int16_t **alpSrc, uint8_t *dest, int dstW,
670
                      int y, enum AVPixelFormat target)
671
0
{
672
0
    const uint8_t * const d128 = ff_dither_8x8_220[y&7];
673
0
    int i;
674
0
    unsigned acc = 0;
675
0
    int err = 0;
676
677
0
    for (i = 0; i < dstW; i += 2) {
678
0
        int j;
679
0
        int Y1 = 1 << 18;
680
0
        int Y2 = 1 << 18;
681
682
0
        for (j = 0; j < lumFilterSize; j++) {
683
0
            Y1 += lumSrc[j][i]   * (unsigned)lumFilter[j];
684
0
            Y2 += lumSrc[j][i+1] * (unsigned)lumFilter[j];
685
0
        }
686
0
        Y1 >>= 19;
687
0
        Y2 >>= 19;
688
0
        if ((Y1 | Y2) & 0x100) {
689
0
            Y1 = av_clip_uint8(Y1);
690
0
            Y2 = av_clip_uint8(Y2);
691
0
        }
692
0
        if (c->opts.dither == SWS_DITHER_ED) {
693
0
            Y1 += (7*err + 1*c->dither_error[0][i] + 5*c->dither_error[0][i+1] + 3*c->dither_error[0][i+2] + 8 - 256)>>4;
694
0
            c->dither_error[0][i] = err;
695
0
            acc = 2*acc + (Y1 >= 128);
696
0
            Y1 -= 220*(acc&1);
697
698
0
            err = Y2 + ((7*Y1 + 1*c->dither_error[0][i+1] + 5*c->dither_error[0][i+2] + 3*c->dither_error[0][i+3] + 8 - 256)>>4);
699
0
            c->dither_error[0][i+1] = Y1;
700
0
            acc = 2*acc + (err >= 128);
701
0
            err -= 220*(acc&1);
702
0
        } else {
703
0
            accumulate_bit(acc, Y1 + d128[(i + 0) & 7]);
704
0
            accumulate_bit(acc, Y2 + d128[(i + 1) & 7]);
705
0
        }
706
0
        if ((i & 7) == 6) {
707
0
            output_pixel(*dest++, acc);
708
0
        }
709
0
    }
710
0
    c->dither_error[0][i] = err;
711
712
0
    if (i & 6) {
713
0
        output_pixel(*dest, acc);
714
0
    }
715
0
}
716
717
static av_always_inline void
718
yuv2mono_2_c_template(SwsInternal *c, const int16_t *buf[2],
719
                      const int16_t *ubuf[2], const int16_t *vbuf[2],
720
                      const int16_t *abuf[2], uint8_t *dest, int dstW,
721
                      int yalpha, int uvalpha, int y,
722
                      enum AVPixelFormat target)
723
0
{
724
0
    const int16_t *buf0  = buf[0],  *buf1  = buf[1];
725
0
    const uint8_t * const d128 = ff_dither_8x8_220[y & 7];
726
0
    int  yalpha1 = 4096 - yalpha;
727
0
    int i;
728
0
    av_assert2(yalpha  <= 4096U);
729
730
0
    if (c->opts.dither == SWS_DITHER_ED) {
731
0
        int err = 0;
732
0
        unsigned acc = 0;
733
0
        for (i = 0; i < dstW; i +=2) {
734
0
            int Y;
735
736
0
            Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
737
0
            Y += (7*err + 1*c->dither_error[0][i] + 5*c->dither_error[0][i+1] + 3*c->dither_error[0][i+2] + 8 - 256)>>4;
738
0
            c->dither_error[0][i] = err;
739
0
            acc = 2*acc + (Y >= 128);
740
0
            Y -= 220*(acc&1);
741
742
0
            err = (buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19;
743
0
            err += (7*Y + 1*c->dither_error[0][i+1] + 5*c->dither_error[0][i+2] + 3*c->dither_error[0][i+3] + 8 - 256)>>4;
744
0
            c->dither_error[0][i+1] = Y;
745
0
            acc = 2*acc + (err >= 128);
746
0
            err -= 220*(acc&1);
747
748
0
            if ((i & 7) == 6)
749
0
                output_pixel(*dest++, acc);
750
0
        }
751
0
        c->dither_error[0][i] = err;
752
0
    } else {
753
0
        for (i = 0; i < dstW; i += 8) {
754
0
            int Y;
755
0
            unsigned acc = 0;
756
757
0
            Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
758
0
            accumulate_bit(acc, Y + d128[0]);
759
0
            Y = (buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19;
760
0
            accumulate_bit(acc, Y + d128[1]);
761
0
            Y = (buf0[i + 2] * yalpha1 + buf1[i + 2] * yalpha) >> 19;
762
0
            accumulate_bit(acc, Y + d128[2]);
763
0
            Y = (buf0[i + 3] * yalpha1 + buf1[i + 3] * yalpha) >> 19;
764
0
            accumulate_bit(acc, Y + d128[3]);
765
0
            Y = (buf0[i + 4] * yalpha1 + buf1[i + 4] * yalpha) >> 19;
766
0
            accumulate_bit(acc, Y + d128[4]);
767
0
            Y = (buf0[i + 5] * yalpha1 + buf1[i + 5] * yalpha) >> 19;
768
0
            accumulate_bit(acc, Y + d128[5]);
769
0
            Y = (buf0[i + 6] * yalpha1 + buf1[i + 6] * yalpha) >> 19;
770
0
            accumulate_bit(acc, Y + d128[6]);
771
0
            Y = (buf0[i + 7] * yalpha1 + buf1[i + 7] * yalpha) >> 19;
772
0
            accumulate_bit(acc, Y + d128[7]);
773
774
0
            output_pixel(*dest++, acc);
775
0
        }
776
0
    }
777
0
}
778
779
static av_always_inline void
780
yuv2mono_1_c_template(SwsInternal *c, const int16_t *buf0,
781
                      const int16_t *ubuf[2], const int16_t *vbuf[2],
782
                      const int16_t *abuf0, uint8_t *dest, int dstW,
783
                      int uvalpha, int y, enum AVPixelFormat target)
784
0
{
785
0
    const uint8_t * const d128 = ff_dither_8x8_220[y & 7];
786
0
    int i;
787
788
0
    if (c->opts.dither == SWS_DITHER_ED) {
789
0
        int err = 0;
790
0
        unsigned acc = 0;
791
0
        for (i = 0; i < dstW; i +=2) {
792
0
            int Y;
793
794
0
            Y = ((buf0[i + 0] + 64) >> 7);
795
0
            Y += (7*err + 1*c->dither_error[0][i] + 5*c->dither_error[0][i+1] + 3*c->dither_error[0][i+2] + 8 - 256)>>4;
796
0
            c->dither_error[0][i] = err;
797
0
            acc = 2*acc + (Y >= 128);
798
0
            Y -= 220*(acc&1);
799
800
0
            err = ((buf0[i + 1] + 64) >> 7);
801
0
            err += (7*Y + 1*c->dither_error[0][i+1] + 5*c->dither_error[0][i+2] + 3*c->dither_error[0][i+3] + 8 - 256)>>4;
802
0
            c->dither_error[0][i+1] = Y;
803
0
            acc = 2*acc + (err >= 128);
804
0
            err -= 220*(acc&1);
805
806
0
            if ((i & 7) == 6)
807
0
                output_pixel(*dest++, acc);
808
0
        }
809
0
        c->dither_error[0][i] = err;
810
0
    } else {
811
0
        for (i = 0; i < dstW; i += 8) {
812
0
            unsigned acc = 0;
813
0
            accumulate_bit(acc, ((buf0[i + 0] + 64) >> 7) + d128[0]);
814
0
            accumulate_bit(acc, ((buf0[i + 1] + 64) >> 7) + d128[1]);
815
0
            accumulate_bit(acc, ((buf0[i + 2] + 64) >> 7) + d128[2]);
816
0
            accumulate_bit(acc, ((buf0[i + 3] + 64) >> 7) + d128[3]);
817
0
            accumulate_bit(acc, ((buf0[i + 4] + 64) >> 7) + d128[4]);
818
0
            accumulate_bit(acc, ((buf0[i + 5] + 64) >> 7) + d128[5]);
819
0
            accumulate_bit(acc, ((buf0[i + 6] + 64) >> 7) + d128[6]);
820
0
            accumulate_bit(acc, ((buf0[i + 7] + 64) >> 7) + d128[7]);
821
822
0
            output_pixel(*dest++, acc);
823
0
        }
824
0
    }
825
0
}
826
827
#undef output_pixel
828
#undef accumulate_bit
829
830
#define YUV2PACKEDWRAPPER(name, base, ext, fmt) \
831
static void name ## ext ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
832
                                const int16_t **lumSrc, int lumFilterSize, \
833
                                const int16_t *chrFilter, const int16_t **chrUSrc, \
834
                                const int16_t **chrVSrc, int chrFilterSize, \
835
                                const int16_t **alpSrc, uint8_t *dest, int dstW, \
836
0
                                int y) \
837
0
{ \
838
0
    name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
839
0
                                  chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
840
0
                                  alpSrc, dest, dstW, y, fmt); \
841
0
} \
Unexecuted instantiation: output.c:yuv2monowhite_X_c
Unexecuted instantiation: output.c:yuv2monoblack_X_c
Unexecuted instantiation: output.c:yuv2yuyv422_X_c
Unexecuted instantiation: output.c:yuv2yvyu422_X_c
Unexecuted instantiation: output.c:yuv2uyvy422_X_c
842
 \
843
static void name ## ext ## _2_c(SwsInternal *c, const int16_t *buf[2], \
844
                                const int16_t *ubuf[2], const int16_t *vbuf[2], \
845
                                const int16_t *abuf[2], uint8_t *dest, int dstW, \
846
0
                                int yalpha, int uvalpha, int y) \
847
0
{ \
848
0
    name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
849
0
                                  dest, dstW, yalpha, uvalpha, y, fmt); \
850
0
} \
Unexecuted instantiation: output.c:yuv2monowhite_2_c
Unexecuted instantiation: output.c:yuv2monoblack_2_c
Unexecuted instantiation: output.c:yuv2yuyv422_2_c
Unexecuted instantiation: output.c:yuv2yvyu422_2_c
Unexecuted instantiation: output.c:yuv2uyvy422_2_c
851
 \
852
static void name ## ext ## _1_c(SwsInternal *c, const int16_t *buf0, \
853
                                const int16_t *ubuf[2], const int16_t *vbuf[2], \
854
                                const int16_t *abuf0, uint8_t *dest, int dstW, \
855
0
                                int uvalpha, int y) \
856
0
{ \
857
0
    name ## base ## _1_c_template(c, buf0, ubuf, vbuf, \
858
0
                                  abuf0, dest, dstW, uvalpha, \
859
0
                                  y, fmt); \
860
0
}
Unexecuted instantiation: output.c:yuv2monowhite_1_c
Unexecuted instantiation: output.c:yuv2monoblack_1_c
Unexecuted instantiation: output.c:yuv2yuyv422_1_c
Unexecuted instantiation: output.c:yuv2yvyu422_1_c
Unexecuted instantiation: output.c:yuv2uyvy422_1_c
861
862
YUV2PACKEDWRAPPER(yuv2mono,, white, AV_PIX_FMT_MONOWHITE)
863
YUV2PACKEDWRAPPER(yuv2mono,, black, AV_PIX_FMT_MONOBLACK)
864
865
#define output_pixels(pos, Y1, U, Y2, V) \
866
0
    if (target == AV_PIX_FMT_YUYV422) { \
867
0
        dest[pos + 0] = Y1; \
868
0
        dest[pos + 1] = U;  \
869
0
        dest[pos + 2] = Y2; \
870
0
        dest[pos + 3] = V;  \
871
0
    } else if (target == AV_PIX_FMT_YVYU422) { \
872
0
        dest[pos + 0] = Y1; \
873
0
        dest[pos + 1] = V;  \
874
0
        dest[pos + 2] = Y2; \
875
0
        dest[pos + 3] = U;  \
876
0
    } else { /* AV_PIX_FMT_UYVY422 */ \
877
0
        dest[pos + 0] = U;  \
878
0
        dest[pos + 1] = Y1; \
879
0
        dest[pos + 2] = V;  \
880
0
        dest[pos + 3] = Y2; \
881
0
    }
882
883
static av_always_inline void
884
yuv2422_X_c_template(SwsInternal *c, const int16_t *lumFilter,
885
                     const int16_t **lumSrc, int lumFilterSize,
886
                     const int16_t *chrFilter, const int16_t **chrUSrc,
887
                     const int16_t **chrVSrc, int chrFilterSize,
888
                     const int16_t **alpSrc, uint8_t *dest, int dstW,
889
                     int y, enum AVPixelFormat target)
890
0
{
891
0
    int i;
892
893
0
    for (i = 0; i < ((dstW + 1) >> 1); i++) {
894
0
        int j;
895
0
        int Y1 = 1 << 18;
896
0
        int Y2 = 1 << 18;
897
0
        int U  = 1 << 18;
898
0
        int V  = 1 << 18;
899
900
0
        for (j = 0; j < lumFilterSize; j++) {
901
0
            Y1 += lumSrc[j][i * 2]     * (unsigned)lumFilter[j];
902
0
            Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
903
0
        }
904
0
        for (j = 0; j < chrFilterSize; j++) {
905
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
906
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
907
0
        }
908
0
        Y1 >>= 19;
909
0
        Y2 >>= 19;
910
0
        U  >>= 19;
911
0
        V  >>= 19;
912
0
        if ((Y1 | Y2 | U | V) & 0x100) {
913
0
            Y1 = av_clip_uint8(Y1);
914
0
            Y2 = av_clip_uint8(Y2);
915
0
            U  = av_clip_uint8(U);
916
0
            V  = av_clip_uint8(V);
917
0
        }
918
0
        output_pixels(4*i, Y1, U, Y2, V);
919
0
    }
920
0
}
921
922
static av_always_inline void
923
yuv2422_2_c_template(SwsInternal *c, const int16_t *buf[2],
924
                     const int16_t *ubuf[2], const int16_t *vbuf[2],
925
                     const int16_t *abuf[2], uint8_t *dest, int dstW,
926
                     int yalpha, int uvalpha, int y,
927
                     enum AVPixelFormat target)
928
0
{
929
0
    const int16_t *buf0  = buf[0],  *buf1  = buf[1],
930
0
                  *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
931
0
                  *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
932
0
    int  yalpha1 = 4096 - yalpha;
933
0
    int uvalpha1 = 4096 - uvalpha;
934
0
    int i;
935
0
    av_assert2(yalpha  <= 4096U);
936
0
    av_assert2(uvalpha <= 4096U);
937
938
0
    for (i = 0; i < ((dstW + 1) >> 1); i++) {
939
0
        int Y1 = (buf0[i * 2]     * yalpha1  + buf1[i * 2]     * yalpha)  >> 19;
940
0
        int Y2 = (buf0[i * 2 + 1] * yalpha1  + buf1[i * 2 + 1] * yalpha)  >> 19;
941
0
        int U  = (ubuf0[i]        * uvalpha1 + ubuf1[i]        * uvalpha) >> 19;
942
0
        int V  = (vbuf0[i]        * uvalpha1 + vbuf1[i]        * uvalpha) >> 19;
943
944
0
        if ((Y1 | Y2 | U | V) & 0x100) {
945
0
            Y1 = av_clip_uint8(Y1);
946
0
            Y2 = av_clip_uint8(Y2);
947
0
            U  = av_clip_uint8(U);
948
0
            V  = av_clip_uint8(V);
949
0
        }
950
951
0
        output_pixels(i * 4, Y1, U, Y2, V);
952
0
    }
953
0
}
954
955
static av_always_inline void
956
yuv2422_1_c_template(SwsInternal *c, const int16_t *buf0,
957
                     const int16_t *ubuf[2], const int16_t *vbuf[2],
958
                     const int16_t *abuf0, uint8_t *dest, int dstW,
959
                     int uvalpha, int y, enum AVPixelFormat target)
960
0
{
961
0
    const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
962
0
    int i;
963
964
0
    if (uvalpha < 2048) {
965
0
        for (i = 0; i < ((dstW + 1) >> 1); i++) {
966
0
            int Y1 = (buf0[i * 2    ]+64) >> 7;
967
0
            int Y2 = (buf0[i * 2 + 1]+64) >> 7;
968
0
            int U  = (ubuf0[i]       +64) >> 7;
969
0
            int V  = (vbuf0[i]       +64) >> 7;
970
971
0
            if ((Y1 | Y2 | U | V) & 0x100) {
972
0
                Y1 = av_clip_uint8(Y1);
973
0
                Y2 = av_clip_uint8(Y2);
974
0
                U  = av_clip_uint8(U);
975
0
                V  = av_clip_uint8(V);
976
0
            }
977
978
0
            output_pixels(i * 4, Y1, U, Y2, V);
979
0
        }
980
0
    } else {
981
0
        const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
982
0
        for (i = 0; i < ((dstW + 1) >> 1); i++) {
983
0
            int Y1 = (buf0[i * 2    ]    + 64) >> 7;
984
0
            int Y2 = (buf0[i * 2 + 1]    + 64) >> 7;
985
0
            int U  = (ubuf0[i] + ubuf1[i]+128) >> 8;
986
0
            int V  = (vbuf0[i] + vbuf1[i]+128) >> 8;
987
988
0
            if ((Y1 | Y2 | U | V) & 0x100) {
989
0
                Y1 = av_clip_uint8(Y1);
990
0
                Y2 = av_clip_uint8(Y2);
991
0
                U  = av_clip_uint8(U);
992
0
                V  = av_clip_uint8(V);
993
0
            }
994
995
0
            output_pixels(i * 4, Y1, U, Y2, V);
996
0
        }
997
0
    }
998
0
}
999
1000
#undef output_pixels
1001
1002
YUV2PACKEDWRAPPER(yuv2, 422, yuyv422, AV_PIX_FMT_YUYV422)
1003
YUV2PACKEDWRAPPER(yuv2, 422, yvyu422, AV_PIX_FMT_YVYU422)
1004
YUV2PACKEDWRAPPER(yuv2, 422, uyvy422, AV_PIX_FMT_UYVY422)
1005
1006
#define R_B ((target == AV_PIX_FMT_RGB48LE || target == AV_PIX_FMT_RGB48BE || target == AV_PIX_FMT_RGBA64LE || target == AV_PIX_FMT_RGBA64BE) ? R : B)
1007
#define B_R ((target == AV_PIX_FMT_RGB48LE || target == AV_PIX_FMT_RGB48BE || target == AV_PIX_FMT_RGBA64LE || target == AV_PIX_FMT_RGBA64BE) ? B : R)
1008
#define output_pixel(pos, val) \
1009
0
    if (is_be) { \
1010
0
        AV_WB16(pos, val); \
1011
0
    } else { \
1012
0
        AV_WL16(pos, val); \
1013
0
    }
1014
1015
static av_always_inline void
1016
yuv2ya16_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1017
                        const int32_t **lumSrc, int lumFilterSize,
1018
                        const int16_t *chrFilter, const int32_t **unused_chrUSrc,
1019
                        const int32_t **unused_chrVSrc, int unused_chrFilterSize,
1020
                        const int32_t **alpSrc, uint16_t *dest, int dstW,
1021
                        int y, enum AVPixelFormat target,
1022
                        int unused_hasAlpha, int unused_eightbytes, int is_be)
1023
0
{
1024
0
    int hasAlpha = !!alpSrc;
1025
0
    int i;
1026
1027
0
    for (i = 0; i < dstW; i++) {
1028
0
        int j;
1029
0
        int Y = -0x40000000;
1030
0
        int A = 0xffff;
1031
1032
0
        for (j = 0; j < lumFilterSize; j++)
1033
0
            Y += lumSrc[j][i] * (unsigned)lumFilter[j];
1034
1035
0
        Y >>= 15;
1036
0
        Y += (1<<3) + 0x8000;
1037
0
        Y = av_clip_uint16(Y);
1038
1039
0
        if (hasAlpha) {
1040
0
            A = -0x40000000 + (1<<14);
1041
0
            for (j = 0; j < lumFilterSize; j++)
1042
0
                A += alpSrc[j][i] * (unsigned)lumFilter[j];
1043
1044
0
            A >>= 15;
1045
0
            A += 0x8000;
1046
0
            A = av_clip_uint16(A);
1047
0
        }
1048
1049
0
        output_pixel(&dest[2 * i    ], Y);
1050
0
        output_pixel(&dest[2 * i + 1], A);
1051
0
    }
1052
0
}
1053
1054
static av_always_inline void
1055
yuv2ya16_2_c_template(SwsInternal *c, const int32_t *buf[2],
1056
                        const int32_t *unused_ubuf[2], const int32_t *unused_vbuf[2],
1057
                        const int32_t *abuf[2], uint16_t *dest, int dstW,
1058
                        int yalpha_param, int unused_uvalpha, int y,
1059
                        enum AVPixelFormat target, int unused_hasAlpha,
1060
                        int unused_eightbytes, int is_be)
1061
0
{
1062
0
    unsigned  yalpha =  yalpha_param;
1063
0
    int hasAlpha = abuf && abuf[0] && abuf[1];
1064
0
    const int32_t *buf0  = buf[0],  *buf1  = buf[1],
1065
0
    *abuf0 = hasAlpha ? abuf[0] : NULL,
1066
0
    *abuf1 = hasAlpha ? abuf[1] : NULL;
1067
0
    unsigned  yalpha1 = 4096 - yalpha;
1068
0
    int i;
1069
1070
0
    av_assert2(yalpha  <= 4096U);
1071
1072
0
    for (i = 0; i < dstW; i++) {
1073
0
        int Y = (int)(buf0[i] * yalpha1 + buf1[i] * yalpha) >> 15;
1074
0
        int A;
1075
1076
0
        Y = av_clip_uint16(Y);
1077
1078
0
        if (hasAlpha) {
1079
0
            A = (int)(abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 15;
1080
0
            A = av_clip_uint16(A);
1081
0
        }
1082
1083
0
        output_pixel(&dest[2 * i    ], Y);
1084
0
        output_pixel(&dest[2 * i + 1], hasAlpha ? A : 65535);
1085
0
    }
1086
0
}
1087
1088
static av_always_inline void
1089
yuv2ya16_1_c_template(SwsInternal *c, const int32_t *buf0,
1090
                        const int32_t *unused_ubuf[2], const int32_t *unused_vbuf[2],
1091
                        const int32_t *abuf0, uint16_t *dest, int dstW,
1092
                        int unused_uvalpha, int y, enum AVPixelFormat target,
1093
                        int unused_hasAlpha, int unused_eightbytes, int is_be)
1094
0
{
1095
0
    int hasAlpha = !!abuf0;
1096
0
    int i;
1097
1098
0
    for (i = 0; i < dstW; i++) {
1099
0
        int Y = buf0[i] >> 3;/* 19 - 16 */
1100
0
        int A;
1101
1102
0
        Y = av_clip_uint16(Y);
1103
1104
0
        if (hasAlpha) {
1105
0
            A = abuf0[i] >> 3;
1106
0
            if (A & 0x100)
1107
0
                A = av_clip_uint16(A);
1108
0
        }
1109
1110
0
        output_pixel(&dest[2 * i    ], Y);
1111
0
        output_pixel(&dest[2 * i + 1], hasAlpha ? A : 65535);
1112
0
    }
1113
0
}
1114
1115
static av_always_inline void
1116
yuv2rgba64_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1117
                       const int32_t **lumSrc, int lumFilterSize,
1118
                       const int16_t *chrFilter, const int32_t **chrUSrc,
1119
                       const int32_t **chrVSrc, int chrFilterSize,
1120
                       const int32_t **alpSrc, uint16_t *dest, int dstW,
1121
                       int y, enum AVPixelFormat target, int hasAlpha, int eightbytes,
1122
                       int is_be)
1123
0
{
1124
0
    int i;
1125
0
    int A1 = 0xffff<<14, A2 = 0xffff<<14;
1126
1127
0
    for (i = 0; i < ((dstW + 1) >> 1); i++) {
1128
0
        int j;
1129
0
        unsigned Y1 = -0x40000000;
1130
0
        unsigned Y2 = -0x40000000;
1131
0
        int U  = -(128 << 23); // 19
1132
0
        int V  = -(128 << 23);
1133
0
        int R, G, B;
1134
1135
0
        for (j = 0; j < lumFilterSize; j++) {
1136
0
            Y1 += lumSrc[j][i * 2]     * (unsigned)lumFilter[j];
1137
0
            Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
1138
0
        }
1139
0
        for (j = 0; j < chrFilterSize; j++) {;
1140
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
1141
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
1142
0
        }
1143
1144
0
        if (hasAlpha) {
1145
0
            A1 = -0x40000000;
1146
0
            A2 = -0x40000000;
1147
0
            for (j = 0; j < lumFilterSize; j++) {
1148
0
                A1 += alpSrc[j][i * 2]     * (unsigned)lumFilter[j];
1149
0
                A2 += alpSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
1150
0
            }
1151
0
            A1 >>= 1;
1152
0
            A1 += 0x20002000;
1153
0
            A2 >>= 1;
1154
0
            A2 += 0x20002000;
1155
0
        }
1156
1157
        // 8 bits: 12+15=27; 16 bits: 12+19=31
1158
0
        Y1 = (int)Y1 >> 14; // 10
1159
0
        Y1 += 0x10000;
1160
0
        Y2 = (int)Y2 >> 14;
1161
0
        Y2 += 0x10000;
1162
0
        U  >>= 14;
1163
0
        V  >>= 14;
1164
1165
        // 8 bits: 27 -> 17 bits, 16 bits: 31 - 14 = 17 bits
1166
0
        Y1 -= c->yuv2rgb_y_offset;
1167
0
        Y2 -= c->yuv2rgb_y_offset;
1168
0
        Y1 *= c->yuv2rgb_y_coeff;
1169
0
        Y2 *= c->yuv2rgb_y_coeff;
1170
0
        Y1 += (1 << 13) - (1 << 29); // 21
1171
0
        Y2 += (1 << 13) - (1 << 29);
1172
        // 8 bits: 17 + 13 bits = 30 bits, 16 bits: 17 + 13 bits = 30 bits
1173
1174
0
        R = V * c->yuv2rgb_v2r_coeff;
1175
0
        G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1176
0
        B =                            U * c->yuv2rgb_u2b_coeff;
1177
1178
        // 8 bits: 30 - 22 = 8 bits, 16 bits: 30 bits - 14 = 16 bits
1179
0
        output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y1) >> 14) + (1<<15), 16));
1180
0
        output_pixel(&dest[1], av_clip_uintp2(((int)(  G + Y1) >> 14) + (1<<15), 16));
1181
0
        output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y1) >> 14) + (1<<15), 16));
1182
0
        if (eightbytes) {
1183
0
            output_pixel(&dest[3], av_clip_uintp2(A1      , 30) >> 14);
1184
0
            output_pixel(&dest[4], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1185
0
            output_pixel(&dest[5], av_clip_uintp2(((int)(  G + Y2) >> 14) + (1<<15), 16));
1186
0
            output_pixel(&dest[6], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1187
0
            output_pixel(&dest[7], av_clip_uintp2(A2      , 30) >> 14);
1188
0
            dest += 8;
1189
0
        } else {
1190
0
            output_pixel(&dest[3], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1191
0
            output_pixel(&dest[4], av_clip_uintp2(((int)(  G + Y2) >> 14) + (1<<15), 16));
1192
0
            output_pixel(&dest[5], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1193
0
            dest += 6;
1194
0
        }
1195
0
    }
1196
0
}
1197
1198
static av_always_inline void
1199
yuv2rgba64_2_c_template(SwsInternal *c, const int32_t *buf[2],
1200
                       const int32_t *ubuf[2], const int32_t *vbuf[2],
1201
                       const int32_t *abuf[2], uint16_t *dest, int dstW,
1202
                       int yalpha_param, int uvalpha_param, int y,
1203
                       enum AVPixelFormat target, int hasAlpha, int eightbytes,
1204
                       int is_be)
1205
0
{
1206
0
    unsigned  yalpha =  yalpha_param;
1207
0
    unsigned uvalpha = uvalpha_param;
1208
0
    const int32_t *buf0  = buf[0],  *buf1  = buf[1],
1209
0
                  *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1210
0
                  *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1211
0
                  *abuf0 = hasAlpha ? abuf[0] : NULL,
1212
0
                  *abuf1 = hasAlpha ? abuf[1] : NULL;
1213
0
    unsigned  yalpha1 = 4096 - yalpha;
1214
0
    unsigned uvalpha1 = 4096 - uvalpha;
1215
0
    int i;
1216
0
    int A1 = 0xffff<<14, A2 = 0xffff<<14;
1217
1218
0
    av_assert2(yalpha  <= 4096U);
1219
0
    av_assert2(uvalpha <= 4096U);
1220
1221
0
    for (i = 0; i < ((dstW + 1) >> 1); i++) {
1222
0
        unsigned Y1 = (int)(buf0[i * 2]     * yalpha1  + buf1[i * 2]     * yalpha) >> 14;
1223
0
        unsigned Y2 = (int)(buf0[i * 2 + 1] * yalpha1  + buf1[i * 2 + 1] * yalpha) >> 14;
1224
0
        int U  = (int)(ubuf0[i]        * uvalpha1 + ubuf1[i]        * uvalpha - (128 << 23)) >> 14;
1225
0
        int V  = (int)(vbuf0[i]        * uvalpha1 + vbuf1[i]        * uvalpha - (128 << 23)) >> 14;
1226
0
        int R, G, B;
1227
1228
0
        Y1 -= c->yuv2rgb_y_offset;
1229
0
        Y2 -= c->yuv2rgb_y_offset;
1230
0
        Y1 *= c->yuv2rgb_y_coeff;
1231
0
        Y2 *= c->yuv2rgb_y_coeff;
1232
0
        Y1 += (1 << 13) - (1 << 29);
1233
0
        Y2 += (1 << 13) - (1 << 29);
1234
1235
0
        R = V * c->yuv2rgb_v2r_coeff;
1236
0
        G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1237
0
        B =                            U * c->yuv2rgb_u2b_coeff;
1238
1239
0
        if (hasAlpha) {
1240
0
            A1 = (int)(abuf0[i * 2    ] * yalpha1 + abuf1[i * 2    ] * yalpha) >> 1;
1241
0
            A2 = (int)(abuf0[i * 2 + 1] * yalpha1 + abuf1[i * 2 + 1] * yalpha) >> 1;
1242
1243
0
            A1 += 1 << 13;
1244
0
            A2 += 1 << 13;
1245
0
        }
1246
1247
0
        output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y1) >> 14) + (1<<15), 16));
1248
0
        output_pixel(&dest[1], av_clip_uintp2(((int)(  G + Y1) >> 14) + (1<<15), 16));
1249
0
        output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y1) >> 14) + (1<<15), 16));
1250
0
        if (eightbytes) {
1251
0
            output_pixel(&dest[3], av_clip_uintp2(A1      , 30) >> 14);
1252
0
            output_pixel(&dest[4], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1253
0
            output_pixel(&dest[5], av_clip_uintp2(((int)(  G + Y2) >> 14) + (1<<15), 16));
1254
0
            output_pixel(&dest[6], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1255
0
            output_pixel(&dest[7], av_clip_uintp2(A2      , 30) >> 14);
1256
0
            dest += 8;
1257
0
        } else {
1258
0
            output_pixel(&dest[3], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1259
0
            output_pixel(&dest[4], av_clip_uintp2(((int)(  G + Y2) >> 14) + (1<<15), 16));
1260
0
            output_pixel(&dest[5], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1261
0
            dest += 6;
1262
0
        }
1263
0
    }
1264
0
}
1265
1266
static av_always_inline void
1267
yuv2rgba64_1_c_template(SwsInternal *c, const int32_t *buf0,
1268
                       const int32_t *ubuf[2], const int32_t *vbuf[2],
1269
                       const int32_t *abuf0, uint16_t *dest, int dstW,
1270
                       int uvalpha, int y, enum AVPixelFormat target,
1271
                       int hasAlpha, int eightbytes, int is_be)
1272
0
{
1273
0
    const int32_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
1274
0
    int i;
1275
0
    SUINT A1 = 0xffff<<14, A2= 0xffff<<14;
1276
1277
0
    if (uvalpha == 0) {
1278
0
        for (i = 0; i < ((dstW + 1) >> 1); i++) {
1279
0
            SUINT Y1 = (buf0[i * 2]    ) >> 2;
1280
0
            SUINT Y2 = (buf0[i * 2 + 1]) >> 2;
1281
0
            SUINT U  = (ubuf0[i] - (128 << 11)) >> 2;
1282
0
            SUINT V  = (vbuf0[i] - (128 << 11)) >> 2;
1283
0
            int R, G, B;
1284
1285
0
            Y1 -= c->yuv2rgb_y_offset;
1286
0
            Y2 -= c->yuv2rgb_y_offset;
1287
0
            Y1 *= c->yuv2rgb_y_coeff;
1288
0
            Y2 *= c->yuv2rgb_y_coeff;
1289
0
            Y1 += (1 << 13) - (1 << 29);
1290
0
            Y2 += (1 << 13) - (1 << 29);
1291
1292
0
            if (hasAlpha) {
1293
0
                A1 = abuf0[i * 2    ] * (SUINT)(1 << 11);
1294
0
                A2 = abuf0[i * 2 + 1] * (SUINT)(1 << 11);
1295
1296
0
                A1 += 1 << 13;
1297
0
                A2 += 1 << 13;
1298
0
            }
1299
1300
0
            R = V * c->yuv2rgb_v2r_coeff;
1301
0
            G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1302
0
            B =                            U * c->yuv2rgb_u2b_coeff;
1303
1304
0
            output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y1) >> 14) + (1<<15), 16));
1305
0
            output_pixel(&dest[1], av_clip_uintp2(((int)(  G + Y1) >> 14) + (1<<15), 16));
1306
0
            output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y1) >> 14) + (1<<15), 16));
1307
0
            if (eightbytes) {
1308
0
                output_pixel(&dest[3], av_clip_uintp2(A1      , 30) >> 14);
1309
0
                output_pixel(&dest[4], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1310
0
                output_pixel(&dest[5], av_clip_uintp2(((int)(  G + Y2) >> 14) + (1<<15), 16));
1311
0
                output_pixel(&dest[6], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1312
0
                output_pixel(&dest[7], av_clip_uintp2(A2      , 30) >> 14);
1313
0
                dest += 8;
1314
0
            } else {
1315
0
                output_pixel(&dest[3], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1316
0
                output_pixel(&dest[4], av_clip_uintp2(((int)(  G + Y2) >> 14) + (1<<15), 16));
1317
0
                output_pixel(&dest[5], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1318
0
                dest += 6;
1319
0
            }
1320
0
        }
1321
0
    } else {
1322
0
        const int32_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
1323
0
        int A1 = 0xffff<<14, A2 = 0xffff<<14;
1324
0
        unsigned uvalpha1 = 4096 - uvalpha;
1325
0
        av_assert2(uvalpha <= 4096U);
1326
1327
0
        for (i = 0; i < ((dstW + 1) >> 1); i++) {
1328
0
            SUINT Y1 = (buf0[i * 2]    ) >> 2;
1329
0
            SUINT Y2 = (buf0[i * 2 + 1]) >> 2;
1330
0
            SUINT U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1331
0
            SUINT V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1332
0
            int R, G, B;
1333
1334
0
            Y1 -= c->yuv2rgb_y_offset;
1335
0
            Y2 -= c->yuv2rgb_y_offset;
1336
0
            Y1 *= c->yuv2rgb_y_coeff;
1337
0
            Y2 *= c->yuv2rgb_y_coeff;
1338
0
            Y1 += (1 << 13) - (1 << 29);
1339
0
            Y2 += (1 << 13) - (1 << 29);
1340
1341
0
            if (hasAlpha) {
1342
0
                A1 = abuf0[i * 2    ] * (1 << 11);
1343
0
                A2 = abuf0[i * 2 + 1] * (1 << 11);
1344
1345
0
                A1 += 1 << 13;
1346
0
                A2 += 1 << 13;
1347
0
            }
1348
1349
0
            R = V * c->yuv2rgb_v2r_coeff;
1350
0
            G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1351
0
            B =                            U * c->yuv2rgb_u2b_coeff;
1352
1353
0
            output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y1) >> 14) + (1<<15), 16));
1354
0
            output_pixel(&dest[1], av_clip_uintp2(((int)(  G + Y1) >> 14) + (1<<15), 16));
1355
0
            output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y1) >> 14) + (1<<15), 16));
1356
0
            if (eightbytes) {
1357
0
                output_pixel(&dest[3], av_clip_uintp2(A1      , 30) >> 14);
1358
0
                output_pixel(&dest[4], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1359
0
                output_pixel(&dest[5], av_clip_uintp2(((int)(  G + Y2) >> 14) + (1<<15), 16));
1360
0
                output_pixel(&dest[6], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1361
0
                output_pixel(&dest[7], av_clip_uintp2(A2      , 30) >> 14);
1362
0
                dest += 8;
1363
0
            } else {
1364
0
                output_pixel(&dest[3], av_clip_uintp2(((int)(R_B + Y2) >> 14) + (1<<15), 16));
1365
0
                output_pixel(&dest[4], av_clip_uintp2(((int)(  G + Y2) >> 14) + (1<<15), 16));
1366
0
                output_pixel(&dest[5], av_clip_uintp2(((int)(B_R + Y2) >> 14) + (1<<15), 16));
1367
0
                dest += 6;
1368
0
            }
1369
0
        }
1370
0
    }
1371
0
}
1372
1373
static av_always_inline void
1374
yuv2rgba64_full_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1375
                       const int32_t **lumSrc, int lumFilterSize,
1376
                       const int16_t *chrFilter, const int32_t **chrUSrc,
1377
                       const int32_t **chrVSrc, int chrFilterSize,
1378
                       const int32_t **alpSrc, uint16_t *dest, int dstW,
1379
                       int y, enum AVPixelFormat target, int hasAlpha,
1380
                       int eightbytes, int is_be)
1381
0
{
1382
0
    int i;
1383
0
    int A = 0xffff<<14;
1384
1385
0
    for (i = 0; i < dstW; i++) {
1386
0
        int j;
1387
0
        int Y  = -0x40000000;
1388
0
        int U  = -(128 << 23); // 19
1389
0
        int V  = -(128 << 23);
1390
0
        int R, G, B;
1391
1392
0
        for (j = 0; j < lumFilterSize; j++) {
1393
0
            Y += lumSrc[j][i]  * (unsigned)lumFilter[j];
1394
0
        }
1395
0
        for (j = 0; j < chrFilterSize; j++) {;
1396
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
1397
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
1398
0
        }
1399
1400
0
        if (hasAlpha) {
1401
0
            A = -0x40000000;
1402
0
            for (j = 0; j < lumFilterSize; j++) {
1403
0
                A += alpSrc[j][i] * (unsigned)lumFilter[j];
1404
0
            }
1405
0
            A >>= 1;
1406
0
            A += 0x20002000;
1407
0
        }
1408
1409
        // 8bit: 12+15=27; 16-bit: 12+19=31
1410
0
        Y  >>= 14; // 10
1411
0
        Y += 0x10000;
1412
0
        U  >>= 14;
1413
0
        V  >>= 14;
1414
1415
        // 8bit: 27 -> 17bit, 16bit: 31 - 14 = 17bit
1416
0
        Y -= c->yuv2rgb_y_offset;
1417
0
        Y *= c->yuv2rgb_y_coeff;
1418
0
        Y += (1 << 13) - (1<<29); // 21
1419
        // 8bit: 17 + 13bit = 30bit, 16bit: 17 + 13bit = 30bit
1420
1421
0
        R = (unsigned)V * c->yuv2rgb_v2r_coeff;
1422
0
        G = (unsigned)V * c->yuv2rgb_v2g_coeff + (unsigned)U * c->yuv2rgb_u2g_coeff;
1423
0
        B =                                      (unsigned)U * c->yuv2rgb_u2b_coeff;
1424
1425
        // 8bit: 30 - 22 = 8bit, 16bit: 30bit - 14 = 16bit
1426
0
        output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + (unsigned)Y)>>14) + (1<<15), 16));
1427
0
        output_pixel(&dest[1], av_clip_uintp2(((int)(  G + (unsigned)Y)>>14) + (1<<15), 16));
1428
0
        output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + (unsigned)Y)>>14) + (1<<15), 16));
1429
0
        if (eightbytes) {
1430
0
            output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1431
0
            dest += 4;
1432
0
        } else {
1433
0
            dest += 3;
1434
0
        }
1435
0
    }
1436
0
}
1437
1438
static av_always_inline void
1439
yuv2rgba64_full_2_c_template(SwsInternal *c, const int32_t *buf[2],
1440
                       const int32_t *ubuf[2], const int32_t *vbuf[2],
1441
                       const int32_t *abuf[2], uint16_t *dest, int dstW,
1442
                       int yalpha_param, int uvalpha_param, int y,
1443
                       enum AVPixelFormat target, int hasAlpha, int eightbytes,
1444
                       int is_be)
1445
0
{
1446
0
    unsigned  yalpha =  yalpha_param;
1447
0
    unsigned uvalpha = uvalpha_param;
1448
0
    const int32_t *buf0  = buf[0],  *buf1  = buf[1],
1449
0
                  *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1450
0
                  *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1451
0
                  *abuf0 = hasAlpha ? abuf[0] : NULL,
1452
0
                  *abuf1 = hasAlpha ? abuf[1] : NULL;
1453
0
    unsigned  yalpha1 = 4096 - yalpha;
1454
0
    unsigned uvalpha1 = 4096 - uvalpha;
1455
0
    int i;
1456
0
    int A = 0xffff<<14;
1457
1458
0
    av_assert2(yalpha  <= 4096U);
1459
0
    av_assert2(uvalpha <= 4096U);
1460
1461
0
    for (i = 0; i < dstW; i++) {
1462
0
        unsigned Y  = (int)(buf0[i]     * yalpha1  + buf1[i]     * yalpha) >> 14;
1463
0
        unsigned U  = (int)(ubuf0[i]   * uvalpha1 + ubuf1[i]     * uvalpha - (128 << 23)) >> 14;
1464
0
        unsigned V  = (int)(vbuf0[i]   * uvalpha1 + vbuf1[i]     * uvalpha - (128 << 23)) >> 14;
1465
0
        int R, G, B;
1466
1467
0
        Y -= c->yuv2rgb_y_offset;
1468
0
        Y *= c->yuv2rgb_y_coeff;
1469
0
        Y += (1 << 13) - (1 << 29);
1470
1471
0
        R = V * c->yuv2rgb_v2r_coeff;
1472
0
        G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1473
0
        B =                            U * c->yuv2rgb_u2b_coeff;
1474
1475
0
        if (hasAlpha) {
1476
0
            A = (int)(abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 1;
1477
1478
0
            A += 1 << 13;
1479
0
        }
1480
1481
0
        output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y) >> 14) + (1<<15), 16));
1482
0
        output_pixel(&dest[1], av_clip_uintp2(((int)(  G + Y) >> 14) + (1<<15), 16));
1483
0
        output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y) >> 14) + (1<<15), 16));
1484
0
        if (eightbytes) {
1485
0
            output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1486
0
            dest += 4;
1487
0
        } else {
1488
0
            dest += 3;
1489
0
        }
1490
0
    }
1491
0
}
1492
1493
static av_always_inline void
1494
yuv2rgba64_full_1_c_template(SwsInternal *c, const int32_t *buf0,
1495
                       const int32_t *ubuf[2], const int32_t *vbuf[2],
1496
                       const int32_t *abuf0, uint16_t *dest, int dstW,
1497
                       int uvalpha, int y, enum AVPixelFormat target,
1498
                       int hasAlpha, int eightbytes, int is_be)
1499
0
{
1500
0
    const int32_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
1501
0
    int i;
1502
0
    int A = 0xffff<<14;
1503
1504
0
    if (uvalpha == 0) {
1505
0
        for (i = 0; i < dstW; i++) {
1506
0
            SUINT Y  = (buf0[i]) >> 2;
1507
0
            SUINT U  = (ubuf0[i] - (128 << 11)) >> 2;
1508
0
            SUINT V  = (vbuf0[i] - (128 << 11)) >> 2;
1509
0
            int R, G, B;
1510
1511
0
            Y -= c->yuv2rgb_y_offset;
1512
0
            Y *= c->yuv2rgb_y_coeff;
1513
0
            Y += (1 << 13) - (1 << 29);
1514
1515
0
            if (hasAlpha) {
1516
0
                A = abuf0[i] * (1 << 11);
1517
1518
0
                A += 1 << 13;
1519
0
            }
1520
1521
0
            R = V * c->yuv2rgb_v2r_coeff;
1522
0
            G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1523
0
            B =                            U * c->yuv2rgb_u2b_coeff;
1524
1525
0
            output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y) >> 14) + (1<<15), 16));
1526
0
            output_pixel(&dest[1], av_clip_uintp2(((int)(  G + Y) >> 14) + (1<<15), 16));
1527
0
            output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y) >> 14) + (1<<15), 16));
1528
0
            if (eightbytes) {
1529
0
                output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1530
0
                dest += 4;
1531
0
            } else {
1532
0
                dest += 3;
1533
0
            }
1534
0
        }
1535
0
    } else {
1536
0
        const int32_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
1537
0
        unsigned uvalpha1 = 4096 - uvalpha;
1538
0
        int A = 0xffff<<14;
1539
0
        av_assert2(uvalpha <= 4096U);
1540
1541
0
        for (i = 0; i < dstW; i++) {
1542
0
            SUINT Y  = (buf0[i]    ) >> 2;
1543
0
            SUINT U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 23)) >> 14;
1544
0
            SUINT V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 23)) >> 14;
1545
0
            int R, G, B;
1546
1547
0
            Y -= c->yuv2rgb_y_offset;
1548
0
            Y *= c->yuv2rgb_y_coeff;
1549
0
            Y += (1 << 13) - (1 << 29);
1550
1551
0
            if (hasAlpha) {
1552
0
                A = abuf0[i] * (1 << 11);
1553
1554
0
                A += 1 << 13;
1555
0
            }
1556
1557
0
            R = V * c->yuv2rgb_v2r_coeff;
1558
0
            G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
1559
0
            B =                            U * c->yuv2rgb_u2b_coeff;
1560
1561
0
            output_pixel(&dest[0], av_clip_uintp2(((int)(R_B + Y) >> 14) + (1<<15), 16));
1562
0
            output_pixel(&dest[1], av_clip_uintp2(((int)(  G + Y) >> 14) + (1<<15), 16));
1563
0
            output_pixel(&dest[2], av_clip_uintp2(((int)(B_R + Y) >> 14) + (1<<15), 16));
1564
0
            if (eightbytes) {
1565
0
                output_pixel(&dest[3], av_clip_uintp2(A, 30) >> 14);
1566
0
                dest += 4;
1567
0
            } else {
1568
0
                dest += 3;
1569
0
            }
1570
0
        }
1571
0
    }
1572
0
}
1573
1574
#undef output_pixel
1575
#undef r_b
1576
#undef b_r
1577
1578
#define YUV2PACKED16WRAPPER_EXT(name, base, ext, fmt, is_be, hasAlpha, eightbytes) \
1579
static void name ## ext ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
1580
                        const int16_t **_lumSrc, int lumFilterSize, \
1581
                        const int16_t *chrFilter, const int16_t **_chrUSrc, \
1582
                        const int16_t **_chrVSrc, int chrFilterSize, \
1583
                        const int16_t **_alpSrc, uint8_t *_dest, int dstW, \
1584
0
                        int y) \
1585
0
{ \
1586
0
    const int32_t **lumSrc  = (const int32_t **) _lumSrc, \
1587
0
                  **chrUSrc = (const int32_t **) _chrUSrc, \
1588
0
                  **chrVSrc = (const int32_t **) _chrVSrc, \
1589
0
                  **alpSrc  = (const int32_t **) _alpSrc; \
1590
0
    uint16_t *dest = (uint16_t *) _dest; \
1591
0
    name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
1592
0
                          chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
1593
0
                          alpSrc, dest, dstW, y, fmt, hasAlpha, eightbytes, is_be); \
1594
0
} \
Unexecuted instantiation: output.c:yuv2rgba64le_full_X_c
Unexecuted instantiation: output.c:yuv2rgbx64le_full_X_c
Unexecuted instantiation: output.c:yuv2rgba64be_full_X_c
Unexecuted instantiation: output.c:yuv2rgbx64be_full_X_c
Unexecuted instantiation: output.c:yuv2bgra64le_full_X_c
Unexecuted instantiation: output.c:yuv2bgrx64le_full_X_c
Unexecuted instantiation: output.c:yuv2bgra64be_full_X_c
Unexecuted instantiation: output.c:yuv2bgrx64be_full_X_c
Unexecuted instantiation: output.c:yuv2rgb48le_full_X_c
Unexecuted instantiation: output.c:yuv2bgr48le_full_X_c
Unexecuted instantiation: output.c:yuv2rgb48be_full_X_c
Unexecuted instantiation: output.c:yuv2bgr48be_full_X_c
Unexecuted instantiation: output.c:yuv2rgba64le_X_c
Unexecuted instantiation: output.c:yuv2rgbx64le_X_c
Unexecuted instantiation: output.c:yuv2rgba64be_X_c
Unexecuted instantiation: output.c:yuv2rgbx64be_X_c
Unexecuted instantiation: output.c:yuv2bgra64le_X_c
Unexecuted instantiation: output.c:yuv2bgrx64le_X_c
Unexecuted instantiation: output.c:yuv2bgra64be_X_c
Unexecuted instantiation: output.c:yuv2bgrx64be_X_c
Unexecuted instantiation: output.c:yuv2rgb48le_X_c
Unexecuted instantiation: output.c:yuv2rgb48be_X_c
Unexecuted instantiation: output.c:yuv2bgr48le_X_c
Unexecuted instantiation: output.c:yuv2bgr48be_X_c
Unexecuted instantiation: output.c:yuv2ya16le_X_c
Unexecuted instantiation: output.c:yuv2ya16be_X_c
1595
 \
1596
static void name ## ext ## _2_c(SwsInternal *c, const int16_t *_buf[2], \
1597
                        const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
1598
                        const int16_t *_abuf[2], uint8_t *_dest, int dstW, \
1599
0
                        int yalpha, int uvalpha, int y) \
1600
0
{ \
1601
0
    const int32_t **buf  = (const int32_t **) _buf, \
1602
0
                  **ubuf = (const int32_t **) _ubuf, \
1603
0
                  **vbuf = (const int32_t **) _vbuf, \
1604
0
                  **abuf = (const int32_t **) _abuf; \
1605
0
    uint16_t *dest = (uint16_t *) _dest; \
1606
0
    name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
1607
0
                          dest, dstW, yalpha, uvalpha, y, fmt, hasAlpha, eightbytes, is_be); \
1608
0
} \
Unexecuted instantiation: output.c:yuv2rgba64le_full_2_c
Unexecuted instantiation: output.c:yuv2rgbx64le_full_2_c
Unexecuted instantiation: output.c:yuv2rgba64be_full_2_c
Unexecuted instantiation: output.c:yuv2rgbx64be_full_2_c
Unexecuted instantiation: output.c:yuv2bgra64le_full_2_c
Unexecuted instantiation: output.c:yuv2bgrx64le_full_2_c
Unexecuted instantiation: output.c:yuv2bgra64be_full_2_c
Unexecuted instantiation: output.c:yuv2bgrx64be_full_2_c
Unexecuted instantiation: output.c:yuv2rgb48le_full_2_c
Unexecuted instantiation: output.c:yuv2bgr48le_full_2_c
Unexecuted instantiation: output.c:yuv2rgb48be_full_2_c
Unexecuted instantiation: output.c:yuv2bgr48be_full_2_c
Unexecuted instantiation: output.c:yuv2rgba64le_2_c
Unexecuted instantiation: output.c:yuv2rgbx64le_2_c
Unexecuted instantiation: output.c:yuv2rgba64be_2_c
Unexecuted instantiation: output.c:yuv2rgbx64be_2_c
Unexecuted instantiation: output.c:yuv2bgra64le_2_c
Unexecuted instantiation: output.c:yuv2bgrx64le_2_c
Unexecuted instantiation: output.c:yuv2bgra64be_2_c
Unexecuted instantiation: output.c:yuv2bgrx64be_2_c
Unexecuted instantiation: output.c:yuv2rgb48le_2_c
Unexecuted instantiation: output.c:yuv2rgb48be_2_c
Unexecuted instantiation: output.c:yuv2bgr48le_2_c
Unexecuted instantiation: output.c:yuv2bgr48be_2_c
Unexecuted instantiation: output.c:yuv2ya16le_2_c
Unexecuted instantiation: output.c:yuv2ya16be_2_c
1609
 \
1610
static void name ## ext ## _1_c(SwsInternal *c, const int16_t *_buf0, \
1611
                        const int16_t *_ubuf[2], const int16_t *_vbuf[2], \
1612
                        const int16_t *_abuf0, uint8_t *_dest, int dstW, \
1613
0
                        int uvalpha, int y) \
1614
0
{ \
1615
0
    const int32_t *buf0  = (const int32_t *)  _buf0, \
1616
0
                 **ubuf  = (const int32_t **) _ubuf, \
1617
0
                 **vbuf  = (const int32_t **) _vbuf, \
1618
0
                  *abuf0 = (const int32_t *)  _abuf0; \
1619
0
    uint16_t *dest = (uint16_t *) _dest; \
1620
0
    name ## base ## _1_c_template(c, buf0, ubuf, vbuf, abuf0, dest, \
1621
0
                                  dstW, uvalpha, y, fmt, hasAlpha, eightbytes, is_be); \
1622
0
}
Unexecuted instantiation: output.c:yuv2rgba64le_full_1_c
Unexecuted instantiation: output.c:yuv2rgbx64le_full_1_c
Unexecuted instantiation: output.c:yuv2rgba64be_full_1_c
Unexecuted instantiation: output.c:yuv2rgbx64be_full_1_c
Unexecuted instantiation: output.c:yuv2bgra64le_full_1_c
Unexecuted instantiation: output.c:yuv2bgrx64le_full_1_c
Unexecuted instantiation: output.c:yuv2bgra64be_full_1_c
Unexecuted instantiation: output.c:yuv2bgrx64be_full_1_c
Unexecuted instantiation: output.c:yuv2rgb48le_full_1_c
Unexecuted instantiation: output.c:yuv2bgr48le_full_1_c
Unexecuted instantiation: output.c:yuv2rgb48be_full_1_c
Unexecuted instantiation: output.c:yuv2bgr48be_full_1_c
Unexecuted instantiation: output.c:yuv2rgba64le_1_c
Unexecuted instantiation: output.c:yuv2rgbx64le_1_c
Unexecuted instantiation: output.c:yuv2rgba64be_1_c
Unexecuted instantiation: output.c:yuv2rgbx64be_1_c
Unexecuted instantiation: output.c:yuv2bgra64le_1_c
Unexecuted instantiation: output.c:yuv2bgrx64le_1_c
Unexecuted instantiation: output.c:yuv2bgra64be_1_c
Unexecuted instantiation: output.c:yuv2bgrx64be_1_c
Unexecuted instantiation: output.c:yuv2rgb48le_1_c
Unexecuted instantiation: output.c:yuv2rgb48be_1_c
Unexecuted instantiation: output.c:yuv2bgr48le_1_c
Unexecuted instantiation: output.c:yuv2bgr48be_1_c
Unexecuted instantiation: output.c:yuv2ya16le_1_c
Unexecuted instantiation: output.c:yuv2ya16be_1_c
1623
#define YUV2PACKED16WRAPPER(name, base, ext, base_fmt, endianness, hasAlpha, eightbytes) \
1624
    YUV2PACKED16WRAPPER_EXT(name, base, ext, base_fmt ## endianness, IS_BE(endianness), hasAlpha, eightbytes)
1625
1626
YUV2PACKED16WRAPPER(yuv2, rgba64, rgb48be, AV_PIX_FMT_RGB48, BE, 0, 0)
1627
YUV2PACKED16WRAPPER(yuv2, rgba64, rgb48le, AV_PIX_FMT_RGB48, LE, 0, 0)
1628
YUV2PACKED16WRAPPER(yuv2, rgba64, bgr48be, AV_PIX_FMT_BGR48, BE, 0, 0)
1629
YUV2PACKED16WRAPPER(yuv2, rgba64, bgr48le, AV_PIX_FMT_BGR48, LE, 0, 0)
1630
YUV2PACKED16WRAPPER(yuv2, rgba64, rgba64be, AV_PIX_FMT_RGBA64, BE, 1, 1)
1631
YUV2PACKED16WRAPPER(yuv2, rgba64, rgba64le, AV_PIX_FMT_RGBA64, LE, 1, 1)
1632
YUV2PACKED16WRAPPER(yuv2, rgba64, rgbx64be, AV_PIX_FMT_RGBA64, BE, 0, 1)
1633
YUV2PACKED16WRAPPER(yuv2, rgba64, rgbx64le, AV_PIX_FMT_RGBA64, LE, 0, 1)
1634
YUV2PACKED16WRAPPER(yuv2, rgba64, bgra64be, AV_PIX_FMT_BGRA64, BE, 1, 1)
1635
YUV2PACKED16WRAPPER(yuv2, rgba64, bgra64le, AV_PIX_FMT_BGRA64, LE, 1, 1)
1636
YUV2PACKED16WRAPPER(yuv2, rgba64, bgrx64be, AV_PIX_FMT_BGRA64, BE, 0, 1)
1637
YUV2PACKED16WRAPPER(yuv2, rgba64, bgrx64le, AV_PIX_FMT_BGRA64, LE, 0, 1)
1638
YUV2PACKED16WRAPPER(yuv2, ya16, ya16be, AV_PIX_FMT_YA16, BE, 1, 0)
1639
YUV2PACKED16WRAPPER(yuv2, ya16, ya16le, AV_PIX_FMT_YA16, LE, 1, 0)
1640
1641
YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgb48be_full, AV_PIX_FMT_RGB48, BE, 0, 0)
1642
YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgb48le_full, AV_PIX_FMT_RGB48, LE, 0, 0)
1643
YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgr48be_full, AV_PIX_FMT_BGR48, BE, 0, 0)
1644
YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgr48le_full, AV_PIX_FMT_BGR48, LE, 0, 0)
1645
YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgba64be_full, AV_PIX_FMT_RGBA64, BE, 1, 1)
1646
YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgba64le_full, AV_PIX_FMT_RGBA64, LE, 1, 1)
1647
YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgbx64be_full, AV_PIX_FMT_RGBA64, BE, 0, 1)
1648
YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgbx64le_full, AV_PIX_FMT_RGBA64, LE, 0, 1)
1649
YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgra64be_full, AV_PIX_FMT_BGRA64, BE, 1, 1)
1650
YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgra64le_full, AV_PIX_FMT_BGRA64, LE, 1, 1)
1651
YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgrx64be_full, AV_PIX_FMT_BGRA64, BE, 0, 1)
1652
YUV2PACKED16WRAPPER(yuv2, rgba64_full, bgrx64le_full, AV_PIX_FMT_BGRA64, LE, 0, 1)
1653
1654
/*
1655
 * Write out 2 RGB pixels in the target pixel format. This function takes a
1656
 * R/G/B LUT as generated by ff_yuv2rgb_c_init_tables(), which takes care of
1657
 * things like endianness conversion and shifting. The caller takes care of
1658
 * setting the correct offset in these tables from the chroma (U/V) values.
1659
 * This function then uses the luminance (Y1/Y2) values to write out the
1660
 * correct RGB values into the destination buffer.
1661
 */
1662
static av_always_inline void
1663
yuv2rgb_write(uint8_t *_dest, int i, int Y1, int Y2,
1664
              unsigned A1, unsigned A2,
1665
              const void *_r, const void *_g, const void *_b, int y,
1666
              enum AVPixelFormat target, int hasAlpha)
1667
0
{
1668
0
    if (target == AV_PIX_FMT_ARGB || target == AV_PIX_FMT_RGBA ||
1669
0
        target == AV_PIX_FMT_ABGR || target == AV_PIX_FMT_BGRA) {
1670
0
        uint32_t *dest = (uint32_t *) _dest;
1671
0
        const uint32_t *r = (const uint32_t *) _r;
1672
0
        const uint32_t *g = (const uint32_t *) _g;
1673
0
        const uint32_t *b = (const uint32_t *) _b;
1674
1675
#if CONFIG_SMALL
1676
        int sh = hasAlpha ? ((target == AV_PIX_FMT_RGB32_1 || target == AV_PIX_FMT_BGR32_1) ? 0 : 24) : 0;
1677
1678
        dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (hasAlpha ? A1 << sh : 0);
1679
        dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (hasAlpha ? A2 << sh : 0);
1680
#else
1681
0
        if (hasAlpha) {
1682
0
            int sh = (target == AV_PIX_FMT_RGB32_1 || target == AV_PIX_FMT_BGR32_1) ? 0 : 24;
1683
1684
0
            av_assert2((((r[Y1] + g[Y1] + b[Y1]) >> sh) & 0xFF) == 0);
1685
0
            dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (A1 << sh);
1686
0
            dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (A2 << sh);
1687
0
        } else {
1688
#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1
1689
            int sh = (target == AV_PIX_FMT_RGB32_1 || target == AV_PIX_FMT_BGR32_1) ? 0 : 24;
1690
1691
            av_assert2((((r[Y1] + g[Y1] + b[Y1]) >> sh) & 0xFF) == 0xFF);
1692
#endif
1693
0
            dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1];
1694
0
            dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2];
1695
0
        }
1696
0
#endif
1697
0
    } else if (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) {
1698
0
        uint8_t *dest = (uint8_t *) _dest;
1699
0
        const uint8_t *r = (const uint8_t *) _r;
1700
0
        const uint8_t *g = (const uint8_t *) _g;
1701
0
        const uint8_t *b = (const uint8_t *) _b;
1702
1703
0
#define r_b ((target == AV_PIX_FMT_RGB24) ? r : b)
1704
0
#define b_r ((target == AV_PIX_FMT_RGB24) ? b : r)
1705
1706
0
        dest[i * 6 + 0] = r_b[Y1];
1707
0
        dest[i * 6 + 1] =   g[Y1];
1708
0
        dest[i * 6 + 2] = b_r[Y1];
1709
0
        dest[i * 6 + 3] = r_b[Y2];
1710
0
        dest[i * 6 + 4] =   g[Y2];
1711
0
        dest[i * 6 + 5] = b_r[Y2];
1712
0
#undef r_b
1713
0
#undef b_r
1714
0
    } else if (target == AV_PIX_FMT_RGB565 || target == AV_PIX_FMT_BGR565 ||
1715
0
               target == AV_PIX_FMT_RGB555 || target == AV_PIX_FMT_BGR555 ||
1716
0
               target == AV_PIX_FMT_RGB444 || target == AV_PIX_FMT_BGR444) {
1717
0
        uint16_t *dest = (uint16_t *) _dest;
1718
0
        const uint16_t *r = (const uint16_t *) _r;
1719
0
        const uint16_t *g = (const uint16_t *) _g;
1720
0
        const uint16_t *b = (const uint16_t *) _b;
1721
0
        int dr1, dg1, db1, dr2, dg2, db2;
1722
1723
0
        if (target == AV_PIX_FMT_RGB565 || target == AV_PIX_FMT_BGR565) {
1724
0
            dr1 = ff_dither_2x2_8[ y & 1     ][0];
1725
0
            dg1 = ff_dither_2x2_4[ y & 1     ][0];
1726
0
            db1 = ff_dither_2x2_8[(y & 1) ^ 1][0];
1727
0
            dr2 = ff_dither_2x2_8[ y & 1     ][1];
1728
0
            dg2 = ff_dither_2x2_4[ y & 1     ][1];
1729
0
            db2 = ff_dither_2x2_8[(y & 1) ^ 1][1];
1730
0
        } else if (target == AV_PIX_FMT_RGB555 || target == AV_PIX_FMT_BGR555) {
1731
0
            dr1 = ff_dither_2x2_8[ y & 1     ][0];
1732
0
            dg1 = ff_dither_2x2_8[ y & 1     ][1];
1733
0
            db1 = ff_dither_2x2_8[(y & 1) ^ 1][0];
1734
0
            dr2 = ff_dither_2x2_8[ y & 1     ][1];
1735
0
            dg2 = ff_dither_2x2_8[ y & 1     ][0];
1736
0
            db2 = ff_dither_2x2_8[(y & 1) ^ 1][1];
1737
0
        } else {
1738
0
            dr1 = ff_dither_4x4_16[ y & 3     ][0];
1739
0
            dg1 = ff_dither_4x4_16[ y & 3     ][1];
1740
0
            db1 = ff_dither_4x4_16[(y & 3) ^ 3][0];
1741
0
            dr2 = ff_dither_4x4_16[ y & 3     ][1];
1742
0
            dg2 = ff_dither_4x4_16[ y & 3     ][0];
1743
0
            db2 = ff_dither_4x4_16[(y & 3) ^ 3][1];
1744
0
        }
1745
1746
0
        dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
1747
0
        dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
1748
0
    } else if (target == AV_PIX_FMT_X2RGB10 || target == AV_PIX_FMT_X2BGR10) {
1749
0
        uint32_t *dest = (uint32_t *) _dest;
1750
0
        const uint32_t *r = (const uint32_t *) _r;
1751
0
        const uint32_t *g = (const uint32_t *) _g;
1752
0
        const uint32_t *b = (const uint32_t *) _b;
1753
0
        dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1];
1754
0
        dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2];
1755
0
    } else /* 8/4 bits */ {
1756
0
        uint8_t *dest = (uint8_t *) _dest;
1757
0
        const uint8_t *r = (const uint8_t *) _r;
1758
0
        const uint8_t *g = (const uint8_t *) _g;
1759
0
        const uint8_t *b = (const uint8_t *) _b;
1760
0
        int dr1, dg1, db1, dr2, dg2, db2;
1761
1762
0
        if (target == AV_PIX_FMT_RGB8 || target == AV_PIX_FMT_BGR8) {
1763
0
            const uint8_t * const d64 = ff_dither_8x8_73[y & 7];
1764
0
            const uint8_t * const d32 = ff_dither_8x8_32[y & 7];
1765
0
            dr1 = dg1 = d32[(i * 2 + 0) & 7];
1766
0
            db1 =       d64[(i * 2 + 0) & 7];
1767
0
            dr2 = dg2 = d32[(i * 2 + 1) & 7];
1768
0
            db2 =       d64[(i * 2 + 1) & 7];
1769
0
        } else {
1770
0
            const uint8_t * const d64  = ff_dither_8x8_73 [y & 7];
1771
0
            const uint8_t * const d128 = ff_dither_8x8_220[y & 7];
1772
0
            dr1 = db1 = d128[(i * 2 + 0) & 7];
1773
0
            dg1 =        d64[(i * 2 + 0) & 7];
1774
0
            dr2 = db2 = d128[(i * 2 + 1) & 7];
1775
0
            dg2 =        d64[(i * 2 + 1) & 7];
1776
0
        }
1777
1778
0
        if (target == AV_PIX_FMT_RGB4 || target == AV_PIX_FMT_BGR4) {
1779
0
            dest[i] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1] +
1780
0
                    ((r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2]) << 4);
1781
0
        } else {
1782
0
            dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
1783
0
            dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
1784
0
        }
1785
0
    }
1786
0
}
1787
1788
static av_always_inline void
1789
yuv2rgb_X_c_template(SwsInternal *c, const int16_t *lumFilter,
1790
                     const int16_t **lumSrc, int lumFilterSize,
1791
                     const int16_t *chrFilter, const int16_t **chrUSrc,
1792
                     const int16_t **chrVSrc, int chrFilterSize,
1793
                     const int16_t **alpSrc, uint8_t *dest, int dstW,
1794
                     int y, enum AVPixelFormat target, int hasAlpha)
1795
0
{
1796
0
    int i;
1797
1798
0
    for (i = 0; i < ((dstW + 1) >> 1); i++) {
1799
0
        int j, A1, A2;
1800
0
        int Y1 = 1 << 18;
1801
0
        int Y2 = 1 << 18;
1802
0
        int U  = 1 << 18;
1803
0
        int V  = 1 << 18;
1804
0
        const void *r, *g, *b;
1805
1806
0
        for (j = 0; j < lumFilterSize; j++) {
1807
0
            Y1 += lumSrc[j][i * 2]     * (unsigned)lumFilter[j];
1808
0
            Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
1809
0
        }
1810
0
        for (j = 0; j < chrFilterSize; j++) {
1811
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
1812
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
1813
0
        }
1814
0
        Y1 >>= 19;
1815
0
        Y2 >>= 19;
1816
0
        U  >>= 19;
1817
0
        V  >>= 19;
1818
0
        if (hasAlpha) {
1819
0
            A1 = 1 << 18;
1820
0
            A2 = 1 << 18;
1821
0
            for (j = 0; j < lumFilterSize; j++) {
1822
0
                A1 += alpSrc[j][i * 2    ] * (unsigned)lumFilter[j];
1823
0
                A2 += alpSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
1824
0
            }
1825
0
            A1 >>= 19;
1826
0
            A2 >>= 19;
1827
0
            if ((A1 | A2) & 0x100) {
1828
0
                A1 = av_clip_uint8(A1);
1829
0
                A2 = av_clip_uint8(A2);
1830
0
            }
1831
0
        }
1832
1833
0
        r =  c->table_rV[V + YUVRGB_TABLE_HEADROOM];
1834
0
        g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]);
1835
0
        b =  c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1836
1837
0
        yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1838
0
                      r, g, b, y, target, hasAlpha);
1839
0
    }
1840
0
}
1841
1842
static av_always_inline void
1843
yuv2rgb_2_c_template(SwsInternal *c, const int16_t *buf[2],
1844
                     const int16_t *ubuf[2], const int16_t *vbuf[2],
1845
                     const int16_t *abuf[2], uint8_t *dest, int dstW,
1846
                     int yalpha, int uvalpha, int y,
1847
                     enum AVPixelFormat target, int hasAlpha)
1848
0
{
1849
0
    const int16_t *buf0  = buf[0],  *buf1  = buf[1],
1850
0
                  *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
1851
0
                  *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
1852
0
                  *abuf0 = hasAlpha ? abuf[0] : NULL,
1853
0
                  *abuf1 = hasAlpha ? abuf[1] : NULL;
1854
0
    int  yalpha1 = 4096 - yalpha;
1855
0
    int uvalpha1 = 4096 - uvalpha;
1856
0
    int i;
1857
0
    av_assert2(yalpha  <= 4096U);
1858
0
    av_assert2(uvalpha <= 4096U);
1859
1860
0
    for (i = 0; i < ((dstW + 1) >> 1); i++) {
1861
0
        int Y1 = (buf0[i * 2]     * yalpha1  + buf1[i * 2]     * yalpha)  >> 19;
1862
0
        int Y2 = (buf0[i * 2 + 1] * yalpha1  + buf1[i * 2 + 1] * yalpha)  >> 19;
1863
0
        int U  = (ubuf0[i]        * uvalpha1 + ubuf1[i]        * uvalpha) >> 19;
1864
0
        int V  = (vbuf0[i]        * uvalpha1 + vbuf1[i]        * uvalpha) >> 19;
1865
0
        int A1, A2;
1866
0
        const void *r =  c->table_rV[V + YUVRGB_TABLE_HEADROOM],
1867
0
                   *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
1868
0
                   *b =  c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1869
1870
0
        if (hasAlpha) {
1871
0
            A1 = (abuf0[i * 2    ] * yalpha1 + abuf1[i * 2    ] * yalpha) >> 19;
1872
0
            A2 = (abuf0[i * 2 + 1] * yalpha1 + abuf1[i * 2 + 1] * yalpha) >> 19;
1873
0
            A1 = av_clip_uint8(A1);
1874
0
            A2 = av_clip_uint8(A2);
1875
0
        }
1876
1877
0
        yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1878
0
                      r, g, b, y, target, hasAlpha);
1879
0
    }
1880
0
}
1881
1882
static av_always_inline void
1883
yuv2rgb_1_c_template(SwsInternal *c, const int16_t *buf0,
1884
                     const int16_t *ubuf[2], const int16_t *vbuf[2],
1885
                     const int16_t *abuf0, uint8_t *dest, int dstW,
1886
                     int uvalpha, int y, enum AVPixelFormat target,
1887
                     int hasAlpha)
1888
0
{
1889
0
    const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
1890
0
    int i;
1891
1892
0
    if (uvalpha == 0) {
1893
0
        for (i = 0; i < ((dstW + 1) >> 1); i++) {
1894
0
            int Y1 = (buf0[i * 2    ] + 64) >> 7;
1895
0
            int Y2 = (buf0[i * 2 + 1] + 64) >> 7;
1896
0
            int U  = (ubuf0[i]        + 64) >> 7;
1897
0
            int V  = (vbuf0[i]        + 64) >> 7;
1898
0
            int A1, A2;
1899
0
            const void *r =  c->table_rV[V + YUVRGB_TABLE_HEADROOM],
1900
0
                       *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
1901
0
                       *b =  c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1902
1903
0
            if (hasAlpha) {
1904
0
                A1 = abuf0[i * 2    ] * 255 + 16384 >> 15;
1905
0
                A2 = abuf0[i * 2 + 1] * 255 + 16384 >> 15;
1906
0
                A1 = av_clip_uint8(A1);
1907
0
                A2 = av_clip_uint8(A2);
1908
0
            }
1909
1910
0
            yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1911
0
                          r, g, b, y, target, hasAlpha);
1912
0
        }
1913
0
    } else {
1914
0
        const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
1915
0
        int uvalpha1 = 4096 - uvalpha;
1916
0
        av_assert2(uvalpha <= 4096U);
1917
1918
0
        for (i = 0; i < ((dstW + 1) >> 1); i++) {
1919
0
            int Y1 = (buf0[i * 2    ]     +  64) >> 7;
1920
0
            int Y2 = (buf0[i * 2 + 1]     +  64) >> 7;
1921
0
            int U  = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha + (128 << 11)) >> 19;
1922
0
            int V  = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha + (128 << 11)) >> 19;
1923
0
            int A1, A2;
1924
0
            const void *r =  c->table_rV[V + YUVRGB_TABLE_HEADROOM],
1925
0
                       *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
1926
0
                       *b =  c->table_bU[U + YUVRGB_TABLE_HEADROOM];
1927
1928
0
            if (hasAlpha) {
1929
0
                A1 = (abuf0[i * 2    ] + 64) >> 7;
1930
0
                A2 = (abuf0[i * 2 + 1] + 64) >> 7;
1931
0
                A1 = av_clip_uint8(A1);
1932
0
                A2 = av_clip_uint8(A2);
1933
0
            }
1934
1935
0
            yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
1936
0
                          r, g, b, y, target, hasAlpha);
1937
0
        }
1938
0
    }
1939
0
}
1940
1941
#define YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha) \
1942
static void name ## ext ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
1943
                                const int16_t **lumSrc, int lumFilterSize, \
1944
                                const int16_t *chrFilter, const int16_t **chrUSrc, \
1945
                                const int16_t **chrVSrc, int chrFilterSize, \
1946
                                const int16_t **alpSrc, uint8_t *dest, int dstW, \
1947
0
                                int y) \
1948
0
{ \
1949
0
    name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
1950
0
                                  chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
1951
0
                                  alpSrc, dest, dstW, y, fmt, hasAlpha); \
1952
0
}
Unexecuted instantiation: output.c:yuv2rgba32_full_X_c
Unexecuted instantiation: output.c:yuv2rgbx32_full_X_c
Unexecuted instantiation: output.c:yuv2argb32_full_X_c
Unexecuted instantiation: output.c:yuv2xrgb32_full_X_c
Unexecuted instantiation: output.c:yuv2bgra32_full_X_c
Unexecuted instantiation: output.c:yuv2bgrx32_full_X_c
Unexecuted instantiation: output.c:yuv2abgr32_full_X_c
Unexecuted instantiation: output.c:yuv2xbgr32_full_X_c
Unexecuted instantiation: output.c:yuv2rgb24_full_X_c
Unexecuted instantiation: output.c:yuv2bgr24_full_X_c
Unexecuted instantiation: output.c:yuv2bgr4_byte_full_X_c
Unexecuted instantiation: output.c:yuv2rgb4_byte_full_X_c
Unexecuted instantiation: output.c:yuv2bgr8_full_X_c
Unexecuted instantiation: output.c:yuv2rgb8_full_X_c
Unexecuted instantiation: output.c:yuv2x2rgb10_full_X_c
Unexecuted instantiation: output.c:yuv2x2bgr10_full_X_c
Unexecuted instantiation: output.c:yuv2rgba32_X_c
Unexecuted instantiation: output.c:yuv2rgbx32_X_c
Unexecuted instantiation: output.c:yuv2rgba32_1_X_c
Unexecuted instantiation: output.c:yuv2rgbx32_1_X_c
Unexecuted instantiation: output.c:yuv2rgb24_X_c
Unexecuted instantiation: output.c:yuv2bgr24_X_c
Unexecuted instantiation: output.c:yuv2rgb16_X_c
Unexecuted instantiation: output.c:yuv2rgb15_X_c
Unexecuted instantiation: output.c:yuv2rgb12_X_c
Unexecuted instantiation: output.c:yuv2rgb8_X_c
Unexecuted instantiation: output.c:yuv2rgb4_X_c
Unexecuted instantiation: output.c:yuv2rgb4b_X_c
Unexecuted instantiation: output.c:yuv2x2rgb10_X_c
Unexecuted instantiation: output.c:yuv2x2bgr10_X_c
1953
1954
#define YUV2RGBWRAPPERX2(name, base, ext, fmt, hasAlpha) \
1955
YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha) \
1956
static void name ## ext ## _2_c(SwsInternal *c, const int16_t *buf[2], \
1957
                                const int16_t *ubuf[2], const int16_t *vbuf[2], \
1958
                                const int16_t *abuf[2], uint8_t *dest, int dstW, \
1959
0
                                int yalpha, int uvalpha, int y) \
1960
0
{ \
1961
0
    name ## base ## _2_c_template(c, buf, ubuf, vbuf, abuf, \
1962
0
                                  dest, dstW, yalpha, uvalpha, y, fmt, hasAlpha); \
1963
0
}
Unexecuted instantiation: output.c:yuv2rgba32_full_2_c
Unexecuted instantiation: output.c:yuv2rgbx32_full_2_c
Unexecuted instantiation: output.c:yuv2argb32_full_2_c
Unexecuted instantiation: output.c:yuv2xrgb32_full_2_c
Unexecuted instantiation: output.c:yuv2bgra32_full_2_c
Unexecuted instantiation: output.c:yuv2bgrx32_full_2_c
Unexecuted instantiation: output.c:yuv2abgr32_full_2_c
Unexecuted instantiation: output.c:yuv2xbgr32_full_2_c
Unexecuted instantiation: output.c:yuv2rgb24_full_2_c
Unexecuted instantiation: output.c:yuv2bgr24_full_2_c
Unexecuted instantiation: output.c:yuv2bgr4_byte_full_2_c
Unexecuted instantiation: output.c:yuv2rgb4_byte_full_2_c
Unexecuted instantiation: output.c:yuv2bgr8_full_2_c
Unexecuted instantiation: output.c:yuv2rgb8_full_2_c
Unexecuted instantiation: output.c:yuv2x2rgb10_full_2_c
Unexecuted instantiation: output.c:yuv2x2bgr10_full_2_c
Unexecuted instantiation: output.c:yuv2rgba32_2_c
Unexecuted instantiation: output.c:yuv2rgbx32_2_c
Unexecuted instantiation: output.c:yuv2rgba32_1_2_c
Unexecuted instantiation: output.c:yuv2rgbx32_1_2_c
Unexecuted instantiation: output.c:yuv2rgb24_2_c
Unexecuted instantiation: output.c:yuv2bgr24_2_c
Unexecuted instantiation: output.c:yuv2rgb16_2_c
Unexecuted instantiation: output.c:yuv2rgb15_2_c
Unexecuted instantiation: output.c:yuv2rgb12_2_c
Unexecuted instantiation: output.c:yuv2rgb8_2_c
Unexecuted instantiation: output.c:yuv2rgb4_2_c
Unexecuted instantiation: output.c:yuv2rgb4b_2_c
Unexecuted instantiation: output.c:yuv2x2rgb10_2_c
Unexecuted instantiation: output.c:yuv2x2bgr10_2_c
1964
1965
#define YUV2RGBWRAPPER(name, base, ext, fmt, hasAlpha) \
1966
YUV2RGBWRAPPERX2(name, base, ext, fmt, hasAlpha) \
1967
static void name ## ext ## _1_c(SwsInternal *c, const int16_t *buf0, \
1968
                                const int16_t *ubuf[2], const int16_t *vbuf[2], \
1969
                                const int16_t *abuf0, uint8_t *dest, int dstW, \
1970
0
                                int uvalpha, int y) \
1971
0
{ \
1972
0
    name ## base ## _1_c_template(c, buf0, ubuf, vbuf, abuf0, dest, \
1973
0
                                  dstW, uvalpha, y, fmt, hasAlpha); \
1974
0
}
Unexecuted instantiation: output.c:yuv2rgba32_full_1_c
Unexecuted instantiation: output.c:yuv2rgbx32_full_1_c
Unexecuted instantiation: output.c:yuv2argb32_full_1_c
Unexecuted instantiation: output.c:yuv2xrgb32_full_1_c
Unexecuted instantiation: output.c:yuv2bgra32_full_1_c
Unexecuted instantiation: output.c:yuv2bgrx32_full_1_c
Unexecuted instantiation: output.c:yuv2abgr32_full_1_c
Unexecuted instantiation: output.c:yuv2xbgr32_full_1_c
Unexecuted instantiation: output.c:yuv2rgb24_full_1_c
Unexecuted instantiation: output.c:yuv2bgr24_full_1_c
Unexecuted instantiation: output.c:yuv2bgr4_byte_full_1_c
Unexecuted instantiation: output.c:yuv2rgb4_byte_full_1_c
Unexecuted instantiation: output.c:yuv2bgr8_full_1_c
Unexecuted instantiation: output.c:yuv2rgb8_full_1_c
Unexecuted instantiation: output.c:yuv2x2rgb10_full_1_c
Unexecuted instantiation: output.c:yuv2x2bgr10_full_1_c
Unexecuted instantiation: output.c:yuv2rgba32_1_c
Unexecuted instantiation: output.c:yuv2rgbx32_1_c
Unexecuted instantiation: output.c:yuv2rgba32_1_1_c
Unexecuted instantiation: output.c:yuv2rgbx32_1_1_c
Unexecuted instantiation: output.c:yuv2rgb24_1_c
Unexecuted instantiation: output.c:yuv2bgr24_1_c
Unexecuted instantiation: output.c:yuv2rgb16_1_c
Unexecuted instantiation: output.c:yuv2rgb15_1_c
Unexecuted instantiation: output.c:yuv2rgb12_1_c
Unexecuted instantiation: output.c:yuv2rgb8_1_c
Unexecuted instantiation: output.c:yuv2rgb4_1_c
Unexecuted instantiation: output.c:yuv2rgb4b_1_c
Unexecuted instantiation: output.c:yuv2x2rgb10_1_c
Unexecuted instantiation: output.c:yuv2x2bgr10_1_c
1975
1976
#if CONFIG_SMALL
1977
YUV2RGBWRAPPER(yuv2rgb,,  32_1,  AV_PIX_FMT_RGB32_1,   CONFIG_SWSCALE_ALPHA && c->needAlpha)
1978
YUV2RGBWRAPPER(yuv2rgb,,  32,    AV_PIX_FMT_RGB32,     CONFIG_SWSCALE_ALPHA && c->needAlpha)
1979
#else
1980
#if CONFIG_SWSCALE_ALPHA
1981
YUV2RGBWRAPPER(yuv2rgb,, a32_1,  AV_PIX_FMT_RGB32_1,   1)
1982
YUV2RGBWRAPPER(yuv2rgb,, a32,    AV_PIX_FMT_RGB32,     1)
1983
#endif
1984
YUV2RGBWRAPPER(yuv2rgb,, x32_1,  AV_PIX_FMT_RGB32_1,   0)
1985
YUV2RGBWRAPPER(yuv2rgb,, x32,    AV_PIX_FMT_RGB32,     0)
1986
#endif
1987
YUV2RGBWRAPPER(yuv2, rgb, rgb24, AV_PIX_FMT_RGB24,   0)
1988
YUV2RGBWRAPPER(yuv2, rgb, bgr24, AV_PIX_FMT_BGR24,   0)
1989
YUV2RGBWRAPPER(yuv2rgb,,  16,    AV_PIX_FMT_RGB565,    0)
1990
YUV2RGBWRAPPER(yuv2rgb,,  15,    AV_PIX_FMT_RGB555,    0)
1991
YUV2RGBWRAPPER(yuv2rgb,,  12,    AV_PIX_FMT_RGB444,    0)
1992
YUV2RGBWRAPPER(yuv2rgb,,   8,    AV_PIX_FMT_RGB8,      0)
1993
YUV2RGBWRAPPER(yuv2rgb,,   4,    AV_PIX_FMT_RGB4,      0)
1994
YUV2RGBWRAPPER(yuv2rgb,,   4b,   AV_PIX_FMT_RGB4_BYTE, 0)
1995
YUV2RGBWRAPPER(yuv2, rgb, x2rgb10, AV_PIX_FMT_X2RGB10, 0)
1996
YUV2RGBWRAPPER(yuv2, rgb, x2bgr10, AV_PIX_FMT_X2BGR10, 0)
1997
1998
static av_always_inline void yuv2rgb_write_full(SwsInternal *c,
1999
    uint8_t *dest, int i, int Y, int A, int U, int V,
2000
    int y, enum AVPixelFormat target, int hasAlpha, int err[4])
2001
0
{
2002
0
    int R, G, B;
2003
0
    int isrgb8 = target == AV_PIX_FMT_BGR8 || target == AV_PIX_FMT_RGB8;
2004
2005
0
    Y -= c->yuv2rgb_y_offset;
2006
0
    Y *= c->yuv2rgb_y_coeff;
2007
0
    Y += 1 << 21;
2008
0
    R = (unsigned)Y + V*(unsigned)c->yuv2rgb_v2r_coeff;
2009
0
    G = (unsigned)Y + V*(unsigned)c->yuv2rgb_v2g_coeff + U*(unsigned)c->yuv2rgb_u2g_coeff;
2010
0
    B = (unsigned)Y +                                    U*(unsigned)c->yuv2rgb_u2b_coeff;
2011
0
    if ((R | G | B) & 0xC0000000) {
2012
0
        R = av_clip_uintp2(R, 30);
2013
0
        G = av_clip_uintp2(G, 30);
2014
0
        B = av_clip_uintp2(B, 30);
2015
0
    }
2016
2017
0
    switch(target) {
2018
0
    case AV_PIX_FMT_ARGB:
2019
0
        dest[0] = hasAlpha ? A : 255;
2020
0
        dest[1] = R >> 22;
2021
0
        dest[2] = G >> 22;
2022
0
        dest[3] = B >> 22;
2023
0
        break;
2024
0
    case AV_PIX_FMT_RGB24:
2025
0
        dest[0] = R >> 22;
2026
0
        dest[1] = G >> 22;
2027
0
        dest[2] = B >> 22;
2028
0
        break;
2029
0
    case AV_PIX_FMT_RGBA:
2030
0
        dest[0] = R >> 22;
2031
0
        dest[1] = G >> 22;
2032
0
        dest[2] = B >> 22;
2033
0
        dest[3] = hasAlpha ? A : 255;
2034
0
        break;
2035
0
    case AV_PIX_FMT_ABGR:
2036
0
        dest[0] = hasAlpha ? A : 255;
2037
0
        dest[1] = B >> 22;
2038
0
        dest[2] = G >> 22;
2039
0
        dest[3] = R >> 22;
2040
0
        break;
2041
0
    case AV_PIX_FMT_BGR24:
2042
0
        dest[0] = B >> 22;
2043
0
        dest[1] = G >> 22;
2044
0
        dest[2] = R >> 22;
2045
0
        break;
2046
0
    case AV_PIX_FMT_BGRA:
2047
0
        dest[0] = B >> 22;
2048
0
        dest[1] = G >> 22;
2049
0
        dest[2] = R >> 22;
2050
0
        dest[3] = hasAlpha ? A : 255;
2051
0
        break;
2052
0
    case AV_PIX_FMT_X2RGB10LE:
2053
0
        R >>= 20;
2054
0
        G >>= 20;
2055
0
        B >>= 20;
2056
0
        AV_WL32(dest, (3U << 30) + (R << 20) + (G << 10) + B);
2057
0
        break;
2058
0
    case AV_PIX_FMT_X2BGR10LE:
2059
0
        R >>= 20;
2060
0
        G >>= 20;
2061
0
        B >>= 20;
2062
0
        AV_WL32(dest, (3U << 30) + (B << 20) + (G << 10) + R);
2063
0
        break;
2064
0
    case AV_PIX_FMT_BGR4_BYTE:
2065
0
    case AV_PIX_FMT_RGB4_BYTE:
2066
0
    case AV_PIX_FMT_BGR8:
2067
0
    case AV_PIX_FMT_RGB8:
2068
0
    {
2069
0
        int r,g,b;
2070
2071
0
        switch (c->opts.dither) {
2072
0
        case SWS_DITHER_NONE:
2073
0
            if (isrgb8) {
2074
0
                r = av_clip_uintp2(R >> 27, 3);
2075
0
                g = av_clip_uintp2(G >> 27, 3);
2076
0
                b = av_clip_uintp2(B >> 28, 2);
2077
0
            } else {
2078
0
                r = av_clip_uintp2(R >> 29, 1);
2079
0
                g = av_clip_uintp2(G >> 28, 2);
2080
0
                b = av_clip_uintp2(B >> 29, 1);
2081
0
            }
2082
0
            break;
2083
0
        default:
2084
0
        case SWS_DITHER_AUTO:
2085
0
        case SWS_DITHER_ED:
2086
0
            R >>= 22;
2087
0
            G >>= 22;
2088
0
            B >>= 22;
2089
0
            R += (7*err[0] + 1*c->dither_error[0][i] + 5*c->dither_error[0][i+1] + 3*c->dither_error[0][i+2])>>4;
2090
0
            G += (7*err[1] + 1*c->dither_error[1][i] + 5*c->dither_error[1][i+1] + 3*c->dither_error[1][i+2])>>4;
2091
0
            B += (7*err[2] + 1*c->dither_error[2][i] + 5*c->dither_error[2][i+1] + 3*c->dither_error[2][i+2])>>4;
2092
0
            c->dither_error[0][i] = err[0];
2093
0
            c->dither_error[1][i] = err[1];
2094
0
            c->dither_error[2][i] = err[2];
2095
0
            r = R >> (isrgb8 ? 5 : 7);
2096
0
            g = G >> (isrgb8 ? 5 : 6);
2097
0
            b = B >> (isrgb8 ? 6 : 7);
2098
0
            r = av_clip(r, 0, isrgb8 ? 7 : 1);
2099
0
            g = av_clip(g, 0, isrgb8 ? 7 : 3);
2100
0
            b = av_clip(b, 0, isrgb8 ? 3 : 1);
2101
0
            err[0] = R - r*(isrgb8 ? 36 : 255);
2102
0
            err[1] = G - g*(isrgb8 ? 36 : 85);
2103
0
            err[2] = B - b*(isrgb8 ? 85 : 255);
2104
0
            break;
2105
0
        case SWS_DITHER_A_DITHER:
2106
0
            if (isrgb8) {
2107
  /* see http://pippin.gimp.org/a_dither/ for details/origin */
2108
0
#define A_DITHER(u,v)   (((((u)+((v)*236))*119)&0xff))
2109
0
                r = (((R >> 19) + A_DITHER(i,y)  -96)>>8);
2110
0
                g = (((G >> 19) + A_DITHER(i + 17,y) - 96)>>8);
2111
0
                b = (((B >> 20) + A_DITHER(i + 17*2,y) -96)>>8);
2112
0
                r = av_clip_uintp2(r, 3);
2113
0
                g = av_clip_uintp2(g, 3);
2114
0
                b = av_clip_uintp2(b, 2);
2115
0
            } else {
2116
0
                r = (((R >> 21) + A_DITHER(i,y)-256)>>8);
2117
0
                g = (((G >> 19) + A_DITHER(i + 17,y)-256)>>8);
2118
0
                b = (((B >> 21) + A_DITHER(i + 17*2,y)-256)>>8);
2119
0
                r = av_clip_uintp2(r, 1);
2120
0
                g = av_clip_uintp2(g, 2);
2121
0
                b = av_clip_uintp2(b, 1);
2122
0
            }
2123
0
            break;
2124
0
        case SWS_DITHER_X_DITHER:
2125
0
            if (isrgb8) {
2126
  /* see http://pippin.gimp.org/a_dither/ for details/origin */
2127
0
#define X_DITHER(u,v)   (((((u)^((v)*237))*181)&0x1ff)/2)
2128
0
                r = (((R >> 19) + X_DITHER(i,y) - 96)>>8);
2129
0
                g = (((G >> 19) + X_DITHER(i + 17,y) - 96)>>8);
2130
0
                b = (((B >> 20) + X_DITHER(i + 17*2,y) - 96)>>8);
2131
0
                r = av_clip_uintp2(r, 3);
2132
0
                g = av_clip_uintp2(g, 3);
2133
0
                b = av_clip_uintp2(b, 2);
2134
0
            } else {
2135
0
                r = (((R >> 21) + X_DITHER(i,y)-256)>>8);
2136
0
                g = (((G >> 19) + X_DITHER(i + 17,y)-256)>>8);
2137
0
                b = (((B >> 21) + X_DITHER(i + 17*2,y)-256)>>8);
2138
0
                r = av_clip_uintp2(r, 1);
2139
0
                g = av_clip_uintp2(g, 2);
2140
0
                b = av_clip_uintp2(b, 1);
2141
0
            }
2142
2143
0
            break;
2144
0
        }
2145
2146
0
        if(target == AV_PIX_FMT_BGR4_BYTE) {
2147
0
            dest[0] = r + 2*g + 8*b;
2148
0
        } else if(target == AV_PIX_FMT_RGB4_BYTE) {
2149
0
            dest[0] = b + 2*g + 8*r;
2150
0
        } else if(target == AV_PIX_FMT_BGR8) {
2151
0
            dest[0] = r + 8*g + 64*b;
2152
0
        } else if(target == AV_PIX_FMT_RGB8) {
2153
0
            dest[0] = b + 4*g + 32*r;
2154
0
        } else
2155
0
            av_assert2(0);
2156
0
        break;}
2157
0
    }
2158
0
}
2159
2160
static av_always_inline void
2161
yuv2rgb_full_X_c_template(SwsInternal *c, const int16_t *lumFilter,
2162
                          const int16_t **lumSrc, int lumFilterSize,
2163
                          const int16_t *chrFilter, const int16_t **chrUSrc,
2164
                          const int16_t **chrVSrc, int chrFilterSize,
2165
                          const int16_t **alpSrc, uint8_t *dest,
2166
                          int dstW, int y, enum AVPixelFormat target, int hasAlpha)
2167
0
{
2168
0
    int i;
2169
0
    int step = (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) ? 3 : 4;
2170
0
    int err[4] = {0};
2171
0
    int A = 0; //init to silence warning
2172
2173
0
    if(   target == AV_PIX_FMT_BGR4_BYTE || target == AV_PIX_FMT_RGB4_BYTE
2174
0
       || target == AV_PIX_FMT_BGR8      || target == AV_PIX_FMT_RGB8)
2175
0
        step = 1;
2176
2177
0
    for (i = 0; i < dstW; i++) {
2178
0
        int j;
2179
0
        int Y = 1<<9;
2180
0
        int U = (1<<9)-(128 << 19);
2181
0
        int V = (1<<9)-(128 << 19);
2182
2183
0
        for (j = 0; j < lumFilterSize; j++) {
2184
0
            Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2185
0
        }
2186
0
        for (j = 0; j < chrFilterSize; j++) {
2187
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2188
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2189
0
        }
2190
0
        Y >>= 10;
2191
0
        U >>= 10;
2192
0
        V >>= 10;
2193
0
        if (hasAlpha) {
2194
0
            A = 1 << 18;
2195
0
            for (j = 0; j < lumFilterSize; j++) {
2196
0
                A += alpSrc[j][i] * (unsigned)lumFilter[j];
2197
0
            }
2198
0
            A >>= 19;
2199
0
            if (A & 0x100)
2200
0
                A = av_clip_uint8(A);
2201
0
        }
2202
0
        yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2203
0
        dest += step;
2204
0
    }
2205
0
    c->dither_error[0][i] = err[0];
2206
0
    c->dither_error[1][i] = err[1];
2207
0
    c->dither_error[2][i] = err[2];
2208
0
}
2209
2210
static av_always_inline void
2211
yuv2rgb_full_2_c_template(SwsInternal *c, const int16_t *buf[2],
2212
                     const int16_t *ubuf[2], const int16_t *vbuf[2],
2213
                     const int16_t *abuf[2], uint8_t *dest, int dstW,
2214
                     int yalpha, int uvalpha, int y,
2215
                     enum AVPixelFormat target, int hasAlpha)
2216
0
{
2217
0
    const int16_t *buf0  = buf[0],  *buf1  = buf[1],
2218
0
                  *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
2219
0
                  *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
2220
0
                  *abuf0 = hasAlpha ? abuf[0] : NULL,
2221
0
                  *abuf1 = hasAlpha ? abuf[1] : NULL;
2222
0
    int  yalpha1 = 4096 - yalpha;
2223
0
    int uvalpha1 = 4096 - uvalpha;
2224
0
    int i;
2225
0
    int step = (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) ? 3 : 4;
2226
0
    int err[4] = {0};
2227
0
    int A = 0; // init to silcene warning
2228
2229
0
    av_assert2(yalpha  <= 4096U);
2230
0
    av_assert2(uvalpha <= 4096U);
2231
2232
0
    if(   target == AV_PIX_FMT_BGR4_BYTE || target == AV_PIX_FMT_RGB4_BYTE
2233
0
       || target == AV_PIX_FMT_BGR8      || target == AV_PIX_FMT_RGB8)
2234
0
        step = 1;
2235
2236
0
    for (i = 0; i < dstW; i++) {
2237
0
        int Y = ( buf0[i] * yalpha1  +  buf1[i] * yalpha             ) >> 10; //FIXME rounding
2238
0
        int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha-(128 << 19)) >> 10;
2239
0
        int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha-(128 << 19)) >> 10;
2240
2241
0
        if (hasAlpha) {
2242
0
            A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha + (1<<18)) >> 19;
2243
0
            if (A & 0x100)
2244
0
                A = av_clip_uint8(A);
2245
0
        }
2246
2247
0
        yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2248
0
        dest += step;
2249
0
    }
2250
0
    c->dither_error[0][i] = err[0];
2251
0
    c->dither_error[1][i] = err[1];
2252
0
    c->dither_error[2][i] = err[2];
2253
0
}
2254
2255
static av_always_inline void
2256
yuv2rgb_full_1_c_template(SwsInternal *c, const int16_t *buf0,
2257
                     const int16_t *ubuf[2], const int16_t *vbuf[2],
2258
                     const int16_t *abuf0, uint8_t *dest, int dstW,
2259
                     int uvalpha, int y, enum AVPixelFormat target,
2260
                     int hasAlpha)
2261
0
{
2262
0
    const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
2263
0
    int i;
2264
0
    int step = (target == AV_PIX_FMT_RGB24 || target == AV_PIX_FMT_BGR24) ? 3 : 4;
2265
0
    int err[4] = {0};
2266
2267
0
    if(   target == AV_PIX_FMT_BGR4_BYTE || target == AV_PIX_FMT_RGB4_BYTE
2268
0
       || target == AV_PIX_FMT_BGR8      || target == AV_PIX_FMT_RGB8)
2269
0
        step = 1;
2270
2271
0
    if (uvalpha == 0) {
2272
0
        int A = 0; //init to silence warning
2273
0
        for (i = 0; i < dstW; i++) {
2274
0
            int Y = buf0[i] * 4;
2275
0
            int U = (ubuf0[i] - (128<<7)) * 4;
2276
0
            int V = (vbuf0[i] - (128<<7)) * 4;
2277
2278
0
            if (hasAlpha) {
2279
0
                A = (abuf0[i] + 64) >> 7;
2280
0
                if (A & 0x100)
2281
0
                    A = av_clip_uint8(A);
2282
0
            }
2283
2284
0
            yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2285
0
            dest += step;
2286
0
        }
2287
0
    } else {
2288
0
        const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
2289
0
        int A = 0; //init to silence warning
2290
0
        int uvalpha1 = 4096 - uvalpha;
2291
0
        av_assert2(uvalpha <= 4096U);
2292
2293
0
        for (i = 0; i < dstW; i++) {
2294
0
            int Y = buf0[i] * 4;
2295
0
            int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha - (128 << 19)) >> 10;
2296
0
            int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha - (128 << 19)) >> 10;
2297
2298
0
            if (hasAlpha) {
2299
0
                A = (abuf0[i] + 64) >> 7;
2300
0
                if (A & 0x100)
2301
0
                    A = av_clip_uint8(A);
2302
0
            }
2303
2304
0
            yuv2rgb_write_full(c, dest, i, Y, A, U, V, y, target, hasAlpha, err);
2305
0
            dest += step;
2306
0
        }
2307
0
    }
2308
2309
0
    c->dither_error[0][i] = err[0];
2310
0
    c->dither_error[1][i] = err[1];
2311
0
    c->dither_error[2][i] = err[2];
2312
0
}
2313
2314
#if CONFIG_SMALL
2315
YUV2RGBWRAPPER(yuv2, rgb_full, bgra32_full, AV_PIX_FMT_BGRA,  CONFIG_SWSCALE_ALPHA && c->needAlpha)
2316
YUV2RGBWRAPPER(yuv2, rgb_full, abgr32_full, AV_PIX_FMT_ABGR,  CONFIG_SWSCALE_ALPHA && c->needAlpha)
2317
YUV2RGBWRAPPER(yuv2, rgb_full, rgba32_full, AV_PIX_FMT_RGBA,  CONFIG_SWSCALE_ALPHA && c->needAlpha)
2318
YUV2RGBWRAPPER(yuv2, rgb_full, argb32_full, AV_PIX_FMT_ARGB,  CONFIG_SWSCALE_ALPHA && c->needAlpha)
2319
#else
2320
#if CONFIG_SWSCALE_ALPHA
2321
YUV2RGBWRAPPER(yuv2, rgb_full, bgra32_full, AV_PIX_FMT_BGRA,  1)
2322
YUV2RGBWRAPPER(yuv2, rgb_full, abgr32_full, AV_PIX_FMT_ABGR,  1)
2323
YUV2RGBWRAPPER(yuv2, rgb_full, rgba32_full, AV_PIX_FMT_RGBA,  1)
2324
YUV2RGBWRAPPER(yuv2, rgb_full, argb32_full, AV_PIX_FMT_ARGB,  1)
2325
#endif
2326
YUV2RGBWRAPPER(yuv2, rgb_full, bgrx32_full, AV_PIX_FMT_BGRA,  0)
2327
YUV2RGBWRAPPER(yuv2, rgb_full, xbgr32_full, AV_PIX_FMT_ABGR,  0)
2328
YUV2RGBWRAPPER(yuv2, rgb_full, rgbx32_full, AV_PIX_FMT_RGBA,  0)
2329
YUV2RGBWRAPPER(yuv2, rgb_full, xrgb32_full, AV_PIX_FMT_ARGB,  0)
2330
#endif
2331
YUV2RGBWRAPPER(yuv2, rgb_full, bgr24_full,  AV_PIX_FMT_BGR24, 0)
2332
YUV2RGBWRAPPER(yuv2, rgb_full, rgb24_full,  AV_PIX_FMT_RGB24, 0)
2333
2334
YUV2RGBWRAPPER(yuv2, rgb_full, bgr4_byte_full,  AV_PIX_FMT_BGR4_BYTE, 0)
2335
YUV2RGBWRAPPER(yuv2, rgb_full, rgb4_byte_full,  AV_PIX_FMT_RGB4_BYTE, 0)
2336
YUV2RGBWRAPPER(yuv2, rgb_full, bgr8_full,   AV_PIX_FMT_BGR8,  0)
2337
YUV2RGBWRAPPER(yuv2, rgb_full, rgb8_full,   AV_PIX_FMT_RGB8,  0)
2338
2339
YUV2RGBWRAPPER(yuv2, rgb_full, x2rgb10_full, AV_PIX_FMT_X2RGB10LE,  0)
2340
YUV2RGBWRAPPER(yuv2, rgb_full, x2bgr10_full, AV_PIX_FMT_X2BGR10LE,  0)
2341
2342
static void
2343
yuv2gbrp_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2344
                  const int16_t **lumSrc, int lumFilterSize,
2345
                  const int16_t *chrFilter, const int16_t **chrUSrc,
2346
                  const int16_t **chrVSrc, int chrFilterSize,
2347
                  const int16_t **alpSrc, uint8_t **dest,
2348
                  int dstW, int y)
2349
0
{
2350
0
    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2351
0
    int i;
2352
0
    int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrc;
2353
0
    uint16_t **dest16 = (uint16_t**)dest;
2354
0
    int SH = 22 + 8 - desc->comp[0].depth;
2355
0
    int A = 0; // init to silence warning
2356
2357
0
    for (i = 0; i < dstW; i++) {
2358
0
        int j;
2359
0
        int Y = 1 << 9;
2360
0
        int U = (1 << 9) - (128 << 19);
2361
0
        int V = (1 << 9) - (128 << 19);
2362
0
        int R, G, B;
2363
2364
0
        for (j = 0; j < lumFilterSize; j++)
2365
0
            Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2366
2367
0
        for (j = 0; j < chrFilterSize; j++) {
2368
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2369
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2370
0
        }
2371
2372
0
        Y >>= 10;
2373
0
        U >>= 10;
2374
0
        V >>= 10;
2375
2376
0
        if (hasAlpha) {
2377
0
            A = 1 << 18;
2378
2379
0
            for (j = 0; j < lumFilterSize; j++)
2380
0
                A += alpSrc[j][i] * (unsigned)lumFilter[j];
2381
2382
0
            if (A & 0xF8000000)
2383
0
                A =  av_clip_uintp2(A, 27);
2384
0
        }
2385
2386
0
        Y -= c->yuv2rgb_y_offset;
2387
0
        Y *= c->yuv2rgb_y_coeff;
2388
0
        Y += 1 << (SH-1);
2389
0
        R = Y + V * (unsigned)c->yuv2rgb_v2r_coeff;
2390
0
        G = Y + V * (unsigned)c->yuv2rgb_v2g_coeff + U * (unsigned)c->yuv2rgb_u2g_coeff;
2391
0
        B = Y +                                      U * (unsigned)c->yuv2rgb_u2b_coeff;
2392
2393
0
        if ((R | G | B) & 0xC0000000) {
2394
0
            R = av_clip_uintp2(R, 30);
2395
0
            G = av_clip_uintp2(G, 30);
2396
0
            B = av_clip_uintp2(B, 30);
2397
0
        }
2398
2399
0
        if (SH != 22) {
2400
0
            dest16[0][i] = G >> SH;
2401
0
            dest16[1][i] = B >> SH;
2402
0
            dest16[2][i] = R >> SH;
2403
0
            if (hasAlpha)
2404
0
                dest16[3][i] = A >> (SH - 3);
2405
0
        } else {
2406
0
            dest[0][i] = G >> 22;
2407
0
            dest[1][i] = B >> 22;
2408
0
            dest[2][i] = R >> 22;
2409
0
            if (hasAlpha)
2410
0
                dest[3][i] = A >> 19;
2411
0
        }
2412
0
    }
2413
0
    if (SH != 22 && (!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2414
0
        for (i = 0; i < dstW; i++) {
2415
0
            dest16[0][i] = av_bswap16(dest16[0][i]);
2416
0
            dest16[1][i] = av_bswap16(dest16[1][i]);
2417
0
            dest16[2][i] = av_bswap16(dest16[2][i]);
2418
0
            if (hasAlpha)
2419
0
                dest16[3][i] = av_bswap16(dest16[3][i]);
2420
0
        }
2421
0
    }
2422
0
}
2423
2424
static void
2425
yuv2gbrpmsb_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2426
                     const int16_t **lumSrc, int lumFilterSize,
2427
                     const int16_t *chrFilter, const int16_t **chrUSrc,
2428
                     const int16_t **chrVSrc, int chrFilterSize,
2429
                     const int16_t **alpSrc, uint8_t **dest,
2430
                     int dstW, int y)
2431
0
{
2432
0
    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2433
0
    int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrc;
2434
0
    uint16_t **dest16 = (uint16_t**)dest;
2435
0
    int shift = 16 - desc->comp[0].depth;
2436
0
    int i;
2437
2438
0
    yuv2gbrp_full_X_c(c, lumFilter, lumSrc, lumFilterSize,
2439
0
                      chrFilter, chrUSrc, chrVSrc, chrFilterSize,
2440
0
                      alpSrc, dest, dstW, y);
2441
2442
0
    if (desc->comp[0].depth <= 8)
2443
0
        return;
2444
2445
0
    if ((!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2446
0
        for (i = 0; i < dstW; i++) {
2447
0
            dest16[0][i] = av_bswap16(av_bswap16(dest16[0][i]) << shift);
2448
0
            dest16[1][i] = av_bswap16(av_bswap16(dest16[1][i]) << shift);
2449
0
            dest16[2][i] = av_bswap16(av_bswap16(dest16[2][i]) << shift);
2450
0
            if (hasAlpha)
2451
0
                dest16[3][i] = av_bswap16(av_bswap16(dest16[3][i]) << shift);
2452
0
        }
2453
0
    } else {
2454
0
        for (i = 0; i < dstW; i++) {
2455
0
            dest16[0][i] = dest16[0][i] << shift;
2456
0
            dest16[1][i] = dest16[1][i] << shift;
2457
0
            dest16[2][i] = dest16[2][i] << shift;
2458
0
            if (hasAlpha)
2459
0
                dest16[3][i] = dest16[3][i] << shift;
2460
0
        }
2461
0
    }
2462
0
}
2463
2464
static void
2465
yuv2gbrp16_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2466
                    const int16_t **lumSrcx, int lumFilterSize,
2467
                    const int16_t *chrFilter, const int16_t **chrUSrcx,
2468
                    const int16_t **chrVSrcx, int chrFilterSize,
2469
                    const int16_t **alpSrcx, uint8_t **dest,
2470
                    int dstW, int y)
2471
0
{
2472
0
    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2473
0
    int i;
2474
0
    int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrcx;
2475
0
    uint16_t **dest16 = (uint16_t**)dest;
2476
0
    const int32_t **lumSrc  = (const int32_t**)lumSrcx;
2477
0
    const int32_t **chrUSrc = (const int32_t**)chrUSrcx;
2478
0
    const int32_t **chrVSrc = (const int32_t**)chrVSrcx;
2479
0
    const int32_t **alpSrc  = (const int32_t**)alpSrcx;
2480
2481
0
    for (i = 0; i < dstW; i++) {
2482
0
        int j;
2483
0
        int Y = -0x40000000;
2484
0
        int U = -(128 << 23);
2485
0
        int V = -(128 << 23);
2486
0
        int R, G, B, A;
2487
2488
0
        for (j = 0; j < lumFilterSize; j++)
2489
0
            Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2490
2491
0
        for (j = 0; j < chrFilterSize; j++) {
2492
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2493
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2494
0
        }
2495
2496
0
        Y >>= 14;
2497
0
        Y += 0x10000;
2498
0
        U >>= 14;
2499
0
        V >>= 14;
2500
2501
0
        if (hasAlpha) {
2502
0
            A = -0x40000000;
2503
2504
0
            for (j = 0; j < lumFilterSize; j++)
2505
0
                A += alpSrc[j][i] * (unsigned)lumFilter[j];
2506
2507
0
            A >>= 1;
2508
0
            A += 0x20002000;
2509
0
        }
2510
2511
0
        Y -= c->yuv2rgb_y_offset;
2512
0
        Y *= c->yuv2rgb_y_coeff;
2513
0
        Y += (1 << 13) - (1 << 29);
2514
0
        R = V * c->yuv2rgb_v2r_coeff;
2515
0
        G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
2516
0
        B =                            U * c->yuv2rgb_u2b_coeff;
2517
2518
0
        dest16[2][i] = av_clip_uintp2(((Y + (int64_t)R) >> 14) + (1<<15), 16);
2519
0
        dest16[0][i] = av_clip_uintp2(((Y + (int64_t)G) >> 14) + (1<<15), 16);
2520
0
        dest16[1][i] = av_clip_uintp2(((Y + (int64_t)B) >> 14) + (1<<15), 16);
2521
2522
0
        if (hasAlpha)
2523
0
            dest16[3][i] = av_clip_uintp2(A, 30) >> 14;
2524
0
    }
2525
0
    if ((!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2526
0
        for (i = 0; i < dstW; i++) {
2527
0
            dest16[0][i] = av_bswap16(dest16[0][i]);
2528
0
            dest16[1][i] = av_bswap16(dest16[1][i]);
2529
0
            dest16[2][i] = av_bswap16(dest16[2][i]);
2530
0
            if (hasAlpha)
2531
0
                dest16[3][i] = av_bswap16(dest16[3][i]);
2532
0
        }
2533
0
    }
2534
0
}
2535
2536
static void
2537
yuv2gbrpf32_full_X_c(SwsInternal *c, const int16_t *lumFilter,
2538
                    const int16_t **lumSrcx, int lumFilterSize,
2539
                    const int16_t *chrFilter, const int16_t **chrUSrcx,
2540
                    const int16_t **chrVSrcx, int chrFilterSize,
2541
                    const int16_t **alpSrcx, uint8_t **dest,
2542
                    int dstW, int y)
2543
0
{
2544
0
    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->opts.dst_format);
2545
0
    int i;
2546
0
    int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrcx;
2547
0
    uint32_t **dest32 = (uint32_t**)dest;
2548
0
    const int32_t **lumSrc  = (const int32_t**)lumSrcx;
2549
0
    const int32_t **chrUSrc = (const int32_t**)chrUSrcx;
2550
0
    const int32_t **chrVSrc = (const int32_t**)chrVSrcx;
2551
0
    const int32_t **alpSrc  = (const int32_t**)alpSrcx;
2552
0
    static const float float_mult = 1.0f / 65535.0f;
2553
2554
0
    for (i = 0; i < dstW; i++) {
2555
0
        int j;
2556
0
        int Y = -0x40000000;
2557
0
        int U = -(128 << 23);
2558
0
        int V = -(128 << 23);
2559
0
        int R, G, B, A;
2560
2561
0
        for (j = 0; j < lumFilterSize; j++)
2562
0
            Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2563
2564
0
        for (j = 0; j < chrFilterSize; j++) {
2565
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2566
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2567
0
        }
2568
2569
0
        Y >>= 14;
2570
0
        Y += 0x10000;
2571
0
        U >>= 14;
2572
0
        V >>= 14;
2573
2574
0
        if (hasAlpha) {
2575
0
            A = -0x40000000;
2576
2577
0
            for (j = 0; j < lumFilterSize; j++)
2578
0
                A += alpSrc[j][i] * (unsigned)lumFilter[j];
2579
2580
0
            A >>= 1;
2581
0
            A += 0x20002000;
2582
0
        }
2583
2584
0
        Y -= c->yuv2rgb_y_offset;
2585
0
        Y *= c->yuv2rgb_y_coeff;
2586
0
        Y += (1 << 13) - (1 << 29);
2587
0
        R = V * c->yuv2rgb_v2r_coeff;
2588
0
        G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
2589
0
        B =                            U * c->yuv2rgb_u2b_coeff;
2590
2591
0
        R = av_clip_uintp2(((Y + R) >> 14) + (1<<15), 16);
2592
0
        G = av_clip_uintp2(((Y + G) >> 14) + (1<<15), 16);
2593
0
        B = av_clip_uintp2(((Y + B) >> 14) + (1<<15), 16);
2594
2595
0
        dest32[0][i] = av_float2int(float_mult * (float)G);
2596
0
        dest32[1][i] = av_float2int(float_mult * (float)B);
2597
0
        dest32[2][i] = av_float2int(float_mult * (float)R);
2598
0
        if (hasAlpha)
2599
0
            dest32[3][i] = av_float2int(float_mult * (float)(av_clip_uintp2(A, 30) >> 14));
2600
0
    }
2601
0
    if ((!isBE(c->opts.dst_format)) != (!HAVE_BIGENDIAN)) {
2602
0
        for (i = 0; i < dstW; i++) {
2603
0
            dest32[0][i] = av_bswap32(dest32[0][i]);
2604
0
            dest32[1][i] = av_bswap32(dest32[1][i]);
2605
0
            dest32[2][i] = av_bswap32(dest32[2][i]);
2606
0
            if (hasAlpha)
2607
0
                dest32[3][i] = av_bswap32(dest32[3][i]);
2608
0
        }
2609
0
    }
2610
0
}
2611
2612
static void
2613
yuv2ya8_1_c(SwsInternal *c, const int16_t *buf0,
2614
            const int16_t *ubuf[2], const int16_t *vbuf[2],
2615
            const int16_t *abuf0, uint8_t *dest, int dstW,
2616
            int uvalpha, int y)
2617
0
{
2618
0
    int hasAlpha = !!abuf0;
2619
0
    int i;
2620
2621
0
    for (i = 0; i < dstW; i++) {
2622
0
        int Y = (buf0[i] + 64) >> 7;
2623
0
        int A;
2624
2625
0
        Y = av_clip_uint8(Y);
2626
2627
0
        if (hasAlpha) {
2628
0
            A = (abuf0[i] + 64) >> 7;
2629
0
            if (A & 0x100)
2630
0
                A = av_clip_uint8(A);
2631
0
        }
2632
2633
0
        dest[i * 2    ] = Y;
2634
0
        dest[i * 2 + 1] = hasAlpha ? A : 255;
2635
0
    }
2636
0
}
2637
2638
static void
2639
yuv2ya8_2_c(SwsInternal *c, const int16_t *buf[2],
2640
            const int16_t *ubuf[2], const int16_t *vbuf[2],
2641
            const int16_t *abuf[2], uint8_t *dest, int dstW,
2642
            int yalpha, int uvalpha, int y)
2643
0
{
2644
0
    int hasAlpha = abuf && abuf[0] && abuf[1];
2645
0
    const int16_t *buf0  = buf[0],  *buf1  = buf[1],
2646
0
                  *abuf0 = hasAlpha ? abuf[0] : NULL,
2647
0
                  *abuf1 = hasAlpha ? abuf[1] : NULL;
2648
0
    int  yalpha1 = 4096 - yalpha;
2649
0
    int i;
2650
2651
0
    av_assert2(yalpha  <= 4096U);
2652
2653
0
    for (i = 0; i < dstW; i++) {
2654
0
        int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 19;
2655
0
        int A;
2656
2657
0
        Y = av_clip_uint8(Y);
2658
2659
0
        if (hasAlpha) {
2660
0
            A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 19;
2661
0
            A = av_clip_uint8(A);
2662
0
        }
2663
2664
0
        dest[i * 2    ] = Y;
2665
0
        dest[i * 2 + 1] = hasAlpha ? A : 255;
2666
0
    }
2667
0
}
2668
2669
static void
2670
yuv2ya8_X_c(SwsInternal *c, const int16_t *lumFilter,
2671
            const int16_t **lumSrc, int lumFilterSize,
2672
            const int16_t *chrFilter, const int16_t **chrUSrc,
2673
            const int16_t **chrVSrc, int chrFilterSize,
2674
            const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
2675
0
{
2676
0
    int hasAlpha = !!alpSrc;
2677
0
    int i;
2678
2679
0
    for (i = 0; i < dstW; i++) {
2680
0
        int j;
2681
0
        int Y = 1 << 18, A = 1 << 18;
2682
2683
0
        for (j = 0; j < lumFilterSize; j++)
2684
0
            Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2685
2686
0
        Y >>= 19;
2687
0
        if (Y  & 0x100)
2688
0
            Y = av_clip_uint8(Y);
2689
2690
0
        if (hasAlpha) {
2691
0
            for (j = 0; j < lumFilterSize; j++)
2692
0
                A += alpSrc[j][i] * (unsigned)lumFilter[j];
2693
2694
0
            A >>= 19;
2695
2696
0
            if (A & 0x100)
2697
0
                A = av_clip_uint8(A);
2698
0
        }
2699
2700
0
        dest[2 * i    ] = Y;
2701
0
        dest[2 * i + 1] = hasAlpha ? A : 255;
2702
0
    }
2703
0
}
2704
2705
#define output_pixels(pos, val) \
2706
0
    if (is_be) { \
2707
0
        AV_WB16(pos, val); \
2708
0
    } else { \
2709
0
        AV_WL16(pos, val); \
2710
0
    }
2711
2712
static av_always_inline void
2713
yuv2ayuv64_X_c(SwsInternal *c, const int16_t *lumFilter,
2714
               const int16_t **_lumSrc, int lumFilterSize,
2715
               const int16_t *chrFilter, const int16_t **_chrUSrc,
2716
               const int16_t **_chrVSrc, int chrFilterSize,
2717
               const int16_t **_alpSrc, uint8_t *dest, int dstW, int y,
2718
               int A_offset, int Y_offset, int U_offset, int V_offset, int is_be)
2719
0
{
2720
0
    const int32_t **lumSrc  = (const int32_t **) _lumSrc,
2721
0
                  **chrUSrc = (const int32_t **) _chrUSrc,
2722
0
                  **chrVSrc = (const int32_t **) _chrVSrc,
2723
0
                  **alpSrc  = (const int32_t **) _alpSrc;
2724
0
    int hasAlpha = !!alpSrc;
2725
0
    int i;
2726
2727
0
    for (i = 0; i < dstW; i++) {
2728
0
        int Y = 1 << 14, U = 1 << 14;
2729
0
        int V = 1 << 14, A = 1 << 14;
2730
0
        int j;
2731
2732
0
        Y -= 0x40000000;
2733
0
        U -= 0x40000000;
2734
0
        V -= 0x40000000;
2735
0
        A -= 0x40000000;
2736
2737
0
        for (j = 0; j < lumFilterSize; j++)
2738
0
            Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2739
2740
0
        for (j = 0; j < chrFilterSize; j++)
2741
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2742
2743
0
        for (j = 0; j < chrFilterSize; j++)
2744
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2745
2746
0
        if (hasAlpha)
2747
0
            for (j = 0; j < lumFilterSize; j++)
2748
0
                A += alpSrc[j][i] * (unsigned)lumFilter[j];
2749
2750
0
        Y = 0x8000 + av_clip_int16(Y >> 15);
2751
0
        U = 0x8000 + av_clip_int16(U >> 15);
2752
0
        V = 0x8000 + av_clip_int16(V >> 15);
2753
0
        if (hasAlpha)
2754
0
            A = 0x8000 + av_clip_int16(A >> 15);
2755
2756
0
        output_pixels(dest + 8 * i + A_offset, hasAlpha ? A : 65535);
2757
0
        output_pixels(dest + 8 * i + Y_offset, Y);
2758
0
        output_pixels(dest + 8 * i + U_offset, U);
2759
0
        output_pixels(dest + 8 * i + V_offset, V);
2760
0
    }
2761
0
}
2762
2763
#define YUV2AYUV64(pixfmt, BE_LE, A, Y, U, V, is_be) \
2764
static void \
2765
yuv2 ## pixfmt ## BE_LE ##_X_c(SwsInternal *c, const int16_t *lumFilter, \
2766
               const int16_t **lumSrc, int lumFilterSize, \
2767
               const int16_t *chrFilter, const int16_t **chrUSrc, \
2768
               const int16_t **chrVSrc, int chrFilterSize, \
2769
0
               const int16_t **alpSrc, uint8_t *dest, int dstW, int y) \
2770
0
{ \
2771
0
    yuv2ayuv64_X_c(c, lumFilter, lumSrc, lumFilterSize, \
2772
0
                   chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
2773
0
                   alpSrc, dest, dstW, y, A, Y, U, V, is_be); \
2774
0
}
Unexecuted instantiation: output.c:yuv2ayuv64le_X_c
Unexecuted instantiation: output.c:yuv2ayuv64be_X_c
Unexecuted instantiation: output.c:yuv2xv48le_X_c
Unexecuted instantiation: output.c:yuv2xv48be_X_c
2775
2776
YUV2AYUV64(ayuv64, le, 0, 2, 4, 6, 0)
2777
YUV2AYUV64(ayuv64, be, 0, 2, 4, 6, 1)
2778
2779
YUV2AYUV64(xv48, le, 6, 2, 0, 4, 0)
2780
YUV2AYUV64(xv48, be, 6, 2, 0, 4, 1)
2781
2782
#undef output_pixels
2783
2784
static av_always_inline void
2785
yuv2v30_X_c_template(SwsInternal *c, const int16_t *lumFilter,
2786
                     const int16_t **lumSrc, int lumFilterSize,
2787
                     const int16_t *chrFilter, const int16_t **chrUSrc,
2788
                     const int16_t **chrVSrc, int chrFilterSize,
2789
                     const int16_t **alpSrc, uint8_t *dest, int dstW, int y,
2790
                     int shift)
2791
0
{
2792
0
    int i;
2793
0
    for (i = 0; i < dstW; i++) {
2794
0
        int Y = 1 << 16, U = 1 << 16, V = 1 << 16, A = 0x3;
2795
0
        int j;
2796
2797
0
        for (j = 0; j < lumFilterSize; j++)
2798
0
            Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2799
2800
0
        for (j = 0; j < chrFilterSize; j++) {
2801
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2802
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2803
0
        }
2804
2805
0
        Y = av_clip_uintp2(Y >> 17, 10);
2806
0
        U = av_clip_uintp2(U >> 17, 10);
2807
0
        V = av_clip_uintp2(V >> 17, 10);
2808
2809
0
        AV_WL32(dest + 4 * i, U << (shift +  0)  |
2810
0
                              Y << (shift + 10)  |
2811
0
                    (unsigned)V << (shift + 20)  |
2812
0
                    (unsigned)A << (shift ? 0 : 30 /* xv30le = 30, v30xle = 0 */));
2813
0
    }
2814
0
}
2815
2816
#define V30LE_WRAPPER(name, shift) \
2817
static void yuv2 ## name ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
2818
                                 const int16_t **lumSrc, int lumFilterSize, \
2819
                                 const int16_t *chrFilter, const int16_t **chrUSrc, \
2820
                                 const int16_t **chrVSrc, int chrFilterSize, \
2821
                                 const int16_t **alpSrc, uint8_t *dest, int dstW, \
2822
0
                                 int y) \
2823
0
{ \
2824
0
    yuv2v30_X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
2825
0
                         chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
2826
0
                         alpSrc, dest, dstW, y, shift); \
2827
0
}
Unexecuted instantiation: output.c:yuv2v30xle_X_c
Unexecuted instantiation: output.c:yuv2xv30le_X_c
2828
2829
V30LE_WRAPPER(xv30le, 0)
2830
V30LE_WRAPPER(v30xle, 2)
2831
2832
#define output_pixels(pos, val, shift, bits, output_shift) \
2833
0
    if (is_be) { \
2834
0
        AV_WB16(pos, av_clip_uintp2(val >> shift, bits) << output_shift); \
2835
0
    } else { \
2836
0
        AV_WL16(pos, av_clip_uintp2(val >> shift, bits) << output_shift); \
2837
0
    }
2838
2839
static void
2840
yuv2xv36_X_c(SwsInternal *c, const int16_t *lumFilter,
2841
             const int16_t **lumSrc, int lumFilterSize,
2842
             const int16_t *chrFilter, const int16_t **chrUSrc,
2843
             const int16_t **chrVSrc, int chrFilterSize,
2844
             const int16_t **alpSrc, uint8_t *dest, int dstW, int y, int is_be)
2845
0
{
2846
0
    int i;
2847
0
    for (i = 0; i < dstW; i++) {
2848
0
        int Y = 1 << 14, U = 1 << 14, V = 1 << 14, A = 65535;
2849
0
        int j;
2850
2851
0
        for (j = 0; j < lumFilterSize; j++)
2852
0
            Y += lumSrc[j][i] * (unsigned)lumFilter[j];
2853
2854
0
        for (j = 0; j < chrFilterSize; j++) {
2855
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
2856
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
2857
0
        }
2858
2859
0
        output_pixels(dest + 8 * i + 2, Y, 15, 12, 4)
2860
0
        output_pixels(dest + 8 * i + 0, U, 15, 12, 4)
2861
0
        output_pixels(dest + 8 * i + 4, V, 15, 12, 4)
2862
0
        output_pixels(dest + 8 * i + 6, A,  0, 12, 4);
2863
0
    }
2864
0
}
2865
2866
#undef output_pixels
2867
2868
#define YUV2XV36(BE_LE, is_be) \
2869
static void \
2870
yuv2xv36 ## BE_LE ##_X_c(SwsInternal *c, const int16_t *lumFilter, \
2871
                         const int16_t **lumSrc, int lumFilterSize, \
2872
                         const int16_t *chrFilter, const int16_t **chrUSrc, \
2873
                         const int16_t **chrVSrc, int chrFilterSize, \
2874
0
                         const int16_t **alpSrc, uint8_t *dest, int dstW, int y) \
2875
0
{ \
2876
0
    yuv2xv36_X_c(c, lumFilter, lumSrc, lumFilterSize, \
2877
0
                 chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
2878
0
                 alpSrc, dest, dstW, y, is_be); \
2879
0
}
Unexecuted instantiation: output.c:yuv2xv36le_X_c
Unexecuted instantiation: output.c:yuv2xv36be_X_c
2880
2881
YUV2XV36(le, 0)
2882
YUV2XV36(be, 1)
2883
2884
#define output_pixels(pos, A, Y, U, V) \
2885
0
    if (target == AV_PIX_FMT_AYUV) { \
2886
0
        dest[pos + 0] = A; \
2887
0
        dest[pos + 1] = Y;  \
2888
0
        dest[pos + 2] = U; \
2889
0
        dest[pos + 3] = V;  \
2890
0
    } else if (target == AV_PIX_FMT_UYVA) { \
2891
0
        dest[pos + 0] = U; \
2892
0
        dest[pos + 1] = Y;  \
2893
0
        dest[pos + 2] = V; \
2894
0
        dest[pos + 3] = A;  \
2895
0
    } else { /* AV_PIX_FMT_VUYA || AV_PIX_FMT_VUYX */ \
2896
0
        dest[pos + 0] = V;  \
2897
0
        dest[pos + 1] = U; \
2898
0
        dest[pos + 2] = Y;  \
2899
0
        dest[pos + 3] = A; \
2900
0
    }
2901
2902
static av_always_inline void
2903
yuv2ayuv_1_c_template(SwsInternal *c, const int16_t *buf0,
2904
                      const int16_t *ubuf[2], const int16_t *vbuf[2],
2905
                      const int16_t *abuf0, uint8_t *dest, int dstW,
2906
                      int uvalpha, int y, enum AVPixelFormat target)
2907
0
{
2908
0
    int hasAlpha = !!abuf0;
2909
0
    int i;
2910
2911
0
    if (uvalpha < 2048) {
2912
0
        for (i = 0; i < dstW; i++) {
2913
0
            int Y = (buf0[i] + 64) >> 7;
2914
0
            int U = (ubuf[0][i] + 64) >> 7;
2915
0
            int V = (vbuf[0][i] + 64) >> 7;
2916
0
            int A = 255;
2917
2918
0
            if (Y & 0x100)
2919
0
                Y = av_clip_uint8(Y);
2920
0
            if (U & 0x100)
2921
0
                U = av_clip_uint8(U);
2922
0
            if (V & 0x100)
2923
0
                V = av_clip_uint8(V);
2924
2925
0
            if (hasAlpha) {
2926
0
                A = (abuf0[i] + 64) >> 7;
2927
0
                if (A & 0x100)
2928
0
                    A = av_clip_uint8(A);
2929
0
            }
2930
2931
0
            output_pixels(i * 4, A, Y, U, V)
2932
0
        }
2933
0
    } else {
2934
0
        for (i = 0; i < dstW; i++) {
2935
0
            int Y = (buf0[i] + 64) >> 7;
2936
0
            int U = (ubuf[0][i] + ubuf[1][i] + 128) >> 8;
2937
0
            int V = (vbuf[0][i] + vbuf[1][i] + 128) >> 8;
2938
0
            int A = 255;
2939
2940
0
            if (Y & 0x100)
2941
0
                Y = av_clip_uint8(Y);
2942
0
            if (U & 0x100)
2943
0
                U = av_clip_uint8(U);
2944
0
            if (V & 0x100)
2945
0
                V = av_clip_uint8(V);
2946
2947
0
            if (hasAlpha) {
2948
0
                A = (abuf0[i] + 64) >> 7;
2949
0
                if (A & 0x100)
2950
0
                    A = av_clip_uint8(A);
2951
0
            }
2952
2953
0
            output_pixels(i * 4, A, Y, U, V)
2954
0
        }
2955
0
    }
2956
0
}
2957
2958
static av_always_inline void
2959
yuv2ayuv_2_c_template(SwsInternal *c, const int16_t *buf[2],
2960
                      const int16_t *ubuf[2], const int16_t *vbuf[2],
2961
                      const int16_t *abuf[2], uint8_t *dest, int dstW,
2962
                      int yalpha, int uvalpha, int y,
2963
                      enum AVPixelFormat target)
2964
0
{
2965
0
    int hasAlpha = abuf && abuf[0] && abuf[1];
2966
0
    const int16_t *buf0  = buf[0],  *buf1  = buf[1],
2967
0
                  *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
2968
0
                  *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
2969
0
                  *abuf0 = hasAlpha ? abuf[0] : NULL,
2970
0
                  *abuf1 = hasAlpha ? abuf[1] : NULL;
2971
0
    int yalpha1  = 4096 - yalpha;
2972
0
    int uvalpha1 = 4096 - uvalpha;
2973
0
    int i;
2974
2975
0
    av_assert2(yalpha  <= 4096U);
2976
0
    av_assert2(uvalpha <= 4096U);
2977
2978
0
    for (i = 0; i < dstW; i++) {
2979
0
        int Y = (buf0[i]  * yalpha1  + buf1[i]  * yalpha)  >> 19;
2980
0
        int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
2981
0
        int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
2982
0
        int A = 255;
2983
2984
0
        if (Y & 0x100)
2985
0
            Y = av_clip_uint8(Y);
2986
0
        if (U & 0x100)
2987
0
            U = av_clip_uint8(U);
2988
0
        if (V & 0x100)
2989
0
            V = av_clip_uint8(V);
2990
2991
0
        if (hasAlpha) {
2992
0
            A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 19;
2993
0
            A = av_clip_uint8(A);
2994
0
        }
2995
2996
0
        output_pixels(i * 4, A, Y, U, V)
2997
0
    }
2998
0
}
2999
3000
static av_always_inline void
3001
yuv2ayuv_X_c_template(SwsInternal *c, const int16_t *lumFilter,
3002
                      const int16_t **lumSrc, int lumFilterSize,
3003
                      const int16_t *chrFilter, const int16_t **chrUSrc,
3004
                      const int16_t **chrVSrc, int chrFilterSize,
3005
                      const int16_t **alpSrc, uint8_t *dest, int dstW,
3006
                      int y, enum AVPixelFormat target)
3007
0
{
3008
0
    int i;
3009
3010
0
    for (i = 0; i < dstW; i++) {
3011
0
        int j;
3012
0
        int Y = 1 << 18, U = 1 << 18;
3013
0
        int V = 1 << 18, A = 255;
3014
3015
0
        for (j = 0; j < lumFilterSize; j++)
3016
0
            Y += lumSrc[j][i] * (unsigned)lumFilter[j];
3017
3018
0
        for (j = 0; j < chrFilterSize; j++)
3019
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
3020
3021
0
        for (j = 0; j < chrFilterSize; j++)
3022
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
3023
3024
0
        Y >>= 19;
3025
0
        U >>= 19;
3026
0
        V >>= 19;
3027
3028
0
        if (Y  & 0x100)
3029
0
            Y = av_clip_uint8(Y);
3030
0
        if (U  & 0x100)
3031
0
            U = av_clip_uint8(U);
3032
0
        if (V  & 0x100)
3033
0
            V = av_clip_uint8(V);
3034
3035
0
        if (alpSrc) {
3036
0
            A = 1 << 18;
3037
3038
0
            for (j = 0; j < lumFilterSize; j++)
3039
0
                A += alpSrc[j][i] * (unsigned)lumFilter[j];
3040
3041
0
            A >>= 19;
3042
3043
0
            if (A & 0x100)
3044
0
                A = av_clip_uint8(A);
3045
0
        }
3046
3047
0
        output_pixels(i * 4, A, Y, U, V)
3048
0
    }
3049
0
}
3050
3051
#undef output_pixels
3052
3053
#define AYUVPACKEDWRAPPER(name, fmt) \
3054
static void yuv2 ## name ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
3055
                                 const int16_t **lumSrc, int lumFilterSize, \
3056
                                 const int16_t *chrFilter, const int16_t **chrUSrc, \
3057
                                 const int16_t **chrVSrc, int chrFilterSize, \
3058
                                 const int16_t **alpSrc, uint8_t *dest, int dstW, \
3059
0
                                 int y) \
3060
0
{ \
3061
0
    yuv2ayuv_X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
3062
0
                          chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
3063
0
                          alpSrc, dest, dstW, y, fmt); \
3064
0
} \
Unexecuted instantiation: output.c:yuv2ayuv_X_c
Unexecuted instantiation: output.c:yuv2vuyX_X_c
Unexecuted instantiation: output.c:yuv2uyva_X_c
3065
 \
3066
static void yuv2 ## name ## _2_c(SwsInternal *c, const int16_t *buf[2], \
3067
                                 const int16_t *ubuf[2], const int16_t *vbuf[2], \
3068
                                 const int16_t *abuf[2], uint8_t *dest, int dstW, \
3069
0
                                 int yalpha, int uvalpha, int y) \
3070
0
{ \
3071
0
    yuv2ayuv_2_c_template(c, buf, ubuf, vbuf, abuf, \
3072
0
                          dest, dstW, yalpha, uvalpha, y, fmt); \
3073
0
} \
Unexecuted instantiation: output.c:yuv2ayuv_2_c
Unexecuted instantiation: output.c:yuv2vuyX_2_c
Unexecuted instantiation: output.c:yuv2uyva_2_c
3074
 \
3075
static void yuv2 ## name ## _1_c(SwsInternal *c, const int16_t *buf0, \
3076
                                 const int16_t *ubuf[2], const int16_t *vbuf[2], \
3077
                                 const int16_t *abuf0, uint8_t *dest, int dstW, \
3078
0
                                 int uvalpha, int y) \
3079
0
{ \
3080
0
    yuv2ayuv_1_c_template(c, buf0, ubuf, vbuf, \
3081
0
                          abuf0, dest, dstW, uvalpha, \
3082
0
                          y, fmt); \
3083
0
}
Unexecuted instantiation: output.c:yuv2ayuv_1_c
Unexecuted instantiation: output.c:yuv2vuyX_1_c
Unexecuted instantiation: output.c:yuv2uyva_1_c
3084
3085
AYUVPACKEDWRAPPER(vuyX, AV_PIX_FMT_VUYX)
3086
AYUVPACKEDWRAPPER(ayuv, AV_PIX_FMT_AYUV)
3087
AYUVPACKEDWRAPPER(uyva, AV_PIX_FMT_UYVA)
3088
3089
#define output_pixel(pos, val, bits) \
3090
0
    AV_WL16(pos, av_clip_uintp2(val >> shift, bits) << output_shift);
3091
3092
#define yuv2y2xx_wrapper(bits)                                          \
3093
    static void                                                         \
3094
    yuv2y2 ## bits ## le_X_c(SwsInternal *c, const int16_t *lumFilter,  \
3095
                            const int16_t **lumSrc, int lumFilterSize,  \
3096
                            const int16_t *chrFilter,                   \
3097
                            const int16_t **chrUSrc,                    \
3098
                            const int16_t **chrVSrc, int chrFilterSize, \
3099
                            const int16_t **alpSrc,                     \
3100
                            uint8_t *dest, int dstW, int y)             \
3101
0
    {                                                                   \
3102
0
        int i, j;                                                       \
3103
0
        int shift = 11 + 16 - bits;                                     \
3104
0
        int output_shift = 16 - bits;                                   \
3105
0
        for (i = 0; i < ((dstW + 1) >> 1); i++) {                       \
3106
0
            int Y1 = 1 << (shift - 1), Y2 = 1 << (shift - 1);           \
3107
0
            int U  = 1 << (shift - 1), V  = 1 << (shift - 1);           \
3108
0
                                                                        \
3109
0
            for (j = 0; j < lumFilterSize; j++) {                       \
3110
0
                Y1 += lumSrc[j][i * 2]     * (unsigned)lumFilter[j];    \
3111
0
                Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];    \
3112
0
            }                                                           \
3113
0
                                                                        \
3114
0
            for (j = 0; j < chrFilterSize; j++) {                       \
3115
0
                U += chrUSrc[j][i] * (unsigned)chrFilter[j];            \
3116
0
                V += chrVSrc[j][i] * (unsigned)chrFilter[j];            \
3117
0
            }                                                           \
3118
0
                                                                        \
3119
0
            output_pixel(dest + 8 * i + 0, Y1, bits);                   \
3120
0
            output_pixel(dest + 8 * i + 2,  U, bits);                   \
3121
0
            output_pixel(dest + 8 * i + 4, Y2, bits);                   \
3122
0
            output_pixel(dest + 8 * i + 6,  V, bits);                   \
3123
0
        }                                                               \
3124
0
    }
Unexecuted instantiation: output.c:yuv2y210le_X_c
Unexecuted instantiation: output.c:yuv2y212le_X_c
3125
3126
yuv2y2xx_wrapper(10)
3127
yuv2y2xx_wrapper(12)
3128
3129
static void
3130
yuv2y216le_X_c(SwsInternal *c, const int16_t *lumFilter,
3131
               const int16_t **_lumSrc, int lumFilterSize,
3132
               const int16_t *chrFilter,
3133
               const int16_t **_chrUSrc,
3134
               const int16_t **_chrVSrc, int chrFilterSize,
3135
               const int16_t **_alpSrc,
3136
               uint8_t *dest, int dstW, int y)
3137
0
{
3138
0
    const int32_t **lumSrc  = (const int32_t **)_lumSrc;
3139
0
    const int32_t **chrUSrc = (const int32_t **)_chrUSrc;
3140
0
    const int32_t **chrVSrc = (const int32_t **)_chrVSrc;
3141
0
    int shift = 15;
3142
3143
0
    for (int i = 0; i < ((dstW + 1) >> 1); i++) {
3144
0
        int Y1 = 1 << (shift - 1), Y2 = 1 << (shift - 1);
3145
0
        int U  = 1 << (shift - 1), V  = 1 << (shift - 1);
3146
3147
        /* See yuv2planeX_16_c_template for details. */
3148
0
        Y1 -= 0x40000000;
3149
0
        U  -= 0x40000000;
3150
0
        Y2 -= 0x40000000;
3151
0
        V  -= 0x40000000;
3152
3153
0
        for (int j = 0; j < lumFilterSize; j++) {
3154
0
            Y1 += lumSrc[j][i * 2]     * (unsigned)lumFilter[j];
3155
0
            Y2 += lumSrc[j][i * 2 + 1] * (unsigned)lumFilter[j];
3156
0
        }
3157
3158
0
        for (int j = 0; j < chrFilterSize; j++) {
3159
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
3160
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
3161
0
        }
3162
3163
0
        AV_WL16(dest + 8 * i + 0, 0x8000 + av_clip_int16(Y1 >> shift));
3164
0
        AV_WL16(dest + 8 * i + 2, 0x8000 + av_clip_int16(U  >> shift));
3165
0
        AV_WL16(dest + 8 * i + 4, 0x8000 + av_clip_int16(Y2 >> shift));
3166
0
        AV_WL16(dest + 8 * i + 6, 0x8000 + av_clip_int16(V  >> shift));
3167
0
    }
3168
0
}
3169
3170
static void
3171
yuv2vyu444_1_c(SwsInternal *c, const int16_t *buf0,
3172
               const int16_t *ubuf[2], const int16_t *vbuf[2],
3173
               const int16_t *abuf0, uint8_t *dest, int dstW,
3174
               int uvalpha, int y)
3175
0
{
3176
0
    int i;
3177
3178
0
    if (uvalpha < 2048) {
3179
0
        for (i = 0; i < dstW; i++) {
3180
0
            int Y = (buf0[i] + 64) >> 7;
3181
0
            int U = (ubuf[0][i] + 64) >> 7;
3182
0
            int V = (vbuf[0][i] + 64) >> 7;
3183
3184
0
            if (Y & 0x100)
3185
0
                Y = av_clip_uint8(Y);
3186
0
            if (U & 0x100)
3187
0
                U = av_clip_uint8(U);
3188
0
            if (V & 0x100)
3189
0
                V = av_clip_uint8(V);
3190
3191
0
            dest[3 * i    ] = V;
3192
0
            dest[3 * i + 1] = Y;
3193
0
            dest[3 * i + 2] = U;
3194
0
        }
3195
0
    } else {
3196
0
        for (i = 0; i < dstW; i++) {
3197
0
            int Y = (buf0[i] + 64) >> 7;
3198
0
            int U = (ubuf[0][i] + ubuf[1][i] + 128) >> 8;
3199
0
            int V = (vbuf[0][i] + vbuf[1][i] + 128) >> 8;
3200
3201
0
            if (Y & 0x100)
3202
0
                Y = av_clip_uint8(Y);
3203
0
            if (U & 0x100)
3204
0
                U = av_clip_uint8(U);
3205
0
            if (V & 0x100)
3206
0
                V = av_clip_uint8(V);
3207
3208
0
            dest[3 * i    ] = V;
3209
0
            dest[3 * i + 1] = Y;
3210
0
            dest[3 * i + 2] = U;
3211
0
        }
3212
0
    }
3213
0
}
3214
3215
static void
3216
yuv2vyu444_2_c(SwsInternal *c, const int16_t *buf[2],
3217
               const int16_t *ubuf[2], const int16_t *vbuf[2],
3218
               const int16_t *abuf[2], uint8_t *dest, int dstW,
3219
               int yalpha, int uvalpha, int y)
3220
0
{
3221
0
    const int16_t *buf0  = buf[0],  *buf1  = buf[1],
3222
0
                  *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
3223
0
                  *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
3224
0
    int yalpha1  = 4096 - yalpha;
3225
0
    int uvalpha1 = 4096 - uvalpha;
3226
0
    int i;
3227
3228
0
    av_assert2(yalpha  <= 4096U);
3229
0
    av_assert2(uvalpha <= 4096U);
3230
3231
0
    for (i = 0; i < dstW; i++) {
3232
0
        int Y = (buf0[i]  * yalpha1  + buf1[i]  * yalpha)  >> 19;
3233
0
        int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
3234
0
        int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
3235
3236
0
        if (Y & 0x100)
3237
0
            Y = av_clip_uint8(Y);
3238
0
        if (U & 0x100)
3239
0
            U = av_clip_uint8(U);
3240
0
        if (V & 0x100)
3241
0
            V = av_clip_uint8(V);
3242
3243
0
        dest[3 * i    ] = V;
3244
0
        dest[3 * i + 1] = Y;
3245
0
        dest[3 * i + 2] = U;
3246
0
    }
3247
0
}
3248
3249
static void
3250
yuv2vyu444_X_c(SwsInternal *c, const int16_t *lumFilter,
3251
               const int16_t **lumSrc, int lumFilterSize,
3252
               const int16_t *chrFilter, const int16_t **chrUSrc,
3253
               const int16_t **chrVSrc, int chrFilterSize,
3254
               const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
3255
0
{
3256
0
    int i;
3257
3258
0
    for (i = 0; i < dstW; i++) {
3259
0
        int j;
3260
0
        int Y = 1 << 18, U = 1 << 18;
3261
0
        int V = 1 << 18;
3262
3263
0
        for (j = 0; j < lumFilterSize; j++)
3264
0
            Y += lumSrc[j][i] * (unsigned)lumFilter[j];
3265
3266
0
        for (j = 0; j < chrFilterSize; j++)
3267
0
            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
3268
3269
0
        for (j = 0; j < chrFilterSize; j++)
3270
0
            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
3271
3272
0
        Y >>= 19;
3273
0
        U >>= 19;
3274
0
        V >>= 19;
3275
3276
0
        if (Y  & 0x100)
3277
0
            Y = av_clip_uint8(Y);
3278
0
        if (U  & 0x100)
3279
0
            U = av_clip_uint8(U);
3280
0
        if (V  & 0x100)
3281
0
            V = av_clip_uint8(V);
3282
3283
0
        dest[3 * i    ] = V;
3284
0
        dest[3 * i + 1] = Y;
3285
0
        dest[3 * i + 2] = U;
3286
0
    }
3287
0
}
3288
3289
#undef output_pixel
3290
3291
av_cold void ff_sws_init_output_funcs(SwsInternal *c,
3292
                                      yuv2planar1_fn *yuv2plane1,
3293
                                      yuv2planarX_fn *yuv2planeX,
3294
                                      yuv2interleavedX_fn *yuv2nv12cX,
3295
                                      yuv2packed1_fn *yuv2packed1,
3296
                                      yuv2packed2_fn *yuv2packed2,
3297
                                      yuv2packedX_fn *yuv2packedX,
3298
                                      yuv2anyX_fn *yuv2anyX)
3299
0
{
3300
0
    enum AVPixelFormat dstFormat = c->opts.dst_format;
3301
0
    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(dstFormat);
3302
3303
0
    if (isSemiPlanarYUV(dstFormat) && isDataInHighBits(dstFormat)) {
3304
0
        if (desc->comp[0].depth == 10) {
3305
0
            *yuv2plane1 = isBE(dstFormat) ? yuv2p010l1_BE_c : yuv2p010l1_LE_c;
3306
0
            *yuv2planeX = isBE(dstFormat) ? yuv2p010lX_BE_c : yuv2p010lX_LE_c;
3307
0
            *yuv2nv12cX = isBE(dstFormat) ? yuv2p010cX_BE_c : yuv2p010cX_LE_c;
3308
0
        } else if (desc->comp[0].depth == 12) {
3309
0
            *yuv2plane1 = isBE(dstFormat) ? yuv2p012l1_BE_c : yuv2p012l1_LE_c;
3310
0
            *yuv2planeX = isBE(dstFormat) ? yuv2p012lX_BE_c : yuv2p012lX_LE_c;
3311
0
            *yuv2nv12cX = isBE(dstFormat) ? yuv2p012cX_BE_c : yuv2p012cX_LE_c;
3312
0
        } else
3313
0
            av_assert0(0);
3314
0
    } else if (isSemiPlanarYUV(dstFormat) && isNBPS(dstFormat)) {
3315
0
        if (desc->comp[0].depth == 10) {
3316
0
            *yuv2plane1 = isBE(dstFormat) ? yuv2nv20l1_BE_c : yuv2nv20l1_LE_c;
3317
0
            *yuv2planeX = isBE(dstFormat) ? yuv2nv20lX_BE_c : yuv2nv20lX_LE_c;
3318
0
            *yuv2nv12cX = isBE(dstFormat) ? yuv2nv20cX_BE_c : yuv2nv20cX_LE_c;
3319
0
        } else
3320
0
            av_assert0(0);
3321
0
    } else if (is16BPS(dstFormat)) {
3322
0
        *yuv2planeX = isBE(dstFormat) ? yuv2planeX_16BE_c  : yuv2planeX_16LE_c;
3323
0
        *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_16BE_c  : yuv2plane1_16LE_c;
3324
0
        if (isSemiPlanarYUV(dstFormat)) {
3325
0
          *yuv2nv12cX = isBE(dstFormat) ? yuv2nv12cX_16BE_c : yuv2nv12cX_16LE_c;
3326
0
        }
3327
0
    } else if (isDataInHighBits(dstFormat) && isNBPS(dstFormat)) {
3328
0
        if (desc->comp[0].depth == 10) {
3329
0
            *yuv2planeX = isBE(dstFormat) ? yuv2msbplaneX_10BE_c  : yuv2msbplaneX_10LE_c;
3330
0
            *yuv2plane1 = isBE(dstFormat) ? yuv2msbplane1_10BE_c  : yuv2msbplane1_10LE_c;
3331
0
        } else if (desc->comp[0].depth == 12) {
3332
0
            *yuv2planeX = isBE(dstFormat) ? yuv2msbplaneX_12BE_c  : yuv2msbplaneX_12LE_c;
3333
0
            *yuv2plane1 = isBE(dstFormat) ? yuv2msbplane1_12BE_c  : yuv2msbplane1_12LE_c;
3334
0
        } else
3335
0
            av_assert0(0);
3336
0
    } else if (isNBPS(dstFormat)) {
3337
0
        if (desc->comp[0].depth == 9) {
3338
0
            *yuv2planeX = isBE(dstFormat) ? yuv2planeX_9BE_c  : yuv2planeX_9LE_c;
3339
0
            *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_9BE_c  : yuv2plane1_9LE_c;
3340
0
        } else if (desc->comp[0].depth == 10) {
3341
0
            *yuv2planeX = isBE(dstFormat) ? yuv2planeX_10BE_c  : yuv2planeX_10LE_c;
3342
0
            *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_10BE_c  : yuv2plane1_10LE_c;
3343
0
        } else if (desc->comp[0].depth == 12) {
3344
0
            *yuv2planeX = isBE(dstFormat) ? yuv2planeX_12BE_c  : yuv2planeX_12LE_c;
3345
0
            *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_12BE_c  : yuv2plane1_12LE_c;
3346
0
        } else if (desc->comp[0].depth == 14) {
3347
0
            *yuv2planeX = isBE(dstFormat) ? yuv2planeX_14BE_c  : yuv2planeX_14LE_c;
3348
0
            *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_14BE_c  : yuv2plane1_14LE_c;
3349
0
        } else
3350
0
            av_assert0(0);
3351
0
    } else if (dstFormat == AV_PIX_FMT_GRAYF32BE) {
3352
0
        *yuv2planeX = yuv2planeX_floatBE_c;
3353
0
        *yuv2plane1 = yuv2plane1_floatBE_c;
3354
0
    } else if (dstFormat == AV_PIX_FMT_GRAYF32LE) {
3355
0
        *yuv2planeX = yuv2planeX_floatLE_c;
3356
0
        *yuv2plane1 = yuv2plane1_floatLE_c;
3357
0
    } else {
3358
0
        *yuv2plane1 = yuv2plane1_8_c;
3359
0
        *yuv2planeX = yuv2planeX_8_c;
3360
0
        if (isSemiPlanarYUV(dstFormat))
3361
0
            *yuv2nv12cX = yuv2nv12cX_c;
3362
0
    }
3363
3364
0
    if(c->opts.flags & SWS_FULL_CHR_H_INT) {
3365
0
        switch (dstFormat) {
3366
0
            case AV_PIX_FMT_RGBA:
3367
#if CONFIG_SMALL
3368
                *yuv2packedX = yuv2rgba32_full_X_c;
3369
                *yuv2packed2 = yuv2rgba32_full_2_c;
3370
                *yuv2packed1 = yuv2rgba32_full_1_c;
3371
#else
3372
0
#if CONFIG_SWSCALE_ALPHA
3373
0
                if (c->needAlpha) {
3374
0
                    *yuv2packedX = yuv2rgba32_full_X_c;
3375
0
                    *yuv2packed2 = yuv2rgba32_full_2_c;
3376
0
                    *yuv2packed1 = yuv2rgba32_full_1_c;
3377
0
                } else
3378
0
#endif /* CONFIG_SWSCALE_ALPHA */
3379
0
                {
3380
0
                    *yuv2packedX = yuv2rgbx32_full_X_c;
3381
0
                    *yuv2packed2 = yuv2rgbx32_full_2_c;
3382
0
                    *yuv2packed1 = yuv2rgbx32_full_1_c;
3383
0
                }
3384
0
#endif /* !CONFIG_SMALL */
3385
0
                break;
3386
0
            case AV_PIX_FMT_ARGB:
3387
#if CONFIG_SMALL
3388
                *yuv2packedX = yuv2argb32_full_X_c;
3389
                *yuv2packed2 = yuv2argb32_full_2_c;
3390
                *yuv2packed1 = yuv2argb32_full_1_c;
3391
#else
3392
0
#if CONFIG_SWSCALE_ALPHA
3393
0
                if (c->needAlpha) {
3394
0
                    *yuv2packedX = yuv2argb32_full_X_c;
3395
0
                    *yuv2packed2 = yuv2argb32_full_2_c;
3396
0
                    *yuv2packed1 = yuv2argb32_full_1_c;
3397
0
                } else
3398
0
#endif /* CONFIG_SWSCALE_ALPHA */
3399
0
                {
3400
0
                    *yuv2packedX = yuv2xrgb32_full_X_c;
3401
0
                    *yuv2packed2 = yuv2xrgb32_full_2_c;
3402
0
                    *yuv2packed1 = yuv2xrgb32_full_1_c;
3403
0
                }
3404
0
#endif /* !CONFIG_SMALL */
3405
0
                break;
3406
0
            case AV_PIX_FMT_BGRA:
3407
#if CONFIG_SMALL
3408
                *yuv2packedX = yuv2bgra32_full_X_c;
3409
                *yuv2packed2 = yuv2bgra32_full_2_c;
3410
                *yuv2packed1 = yuv2bgra32_full_1_c;
3411
#else
3412
0
#if CONFIG_SWSCALE_ALPHA
3413
0
                if (c->needAlpha) {
3414
0
                    *yuv2packedX = yuv2bgra32_full_X_c;
3415
0
                    *yuv2packed2 = yuv2bgra32_full_2_c;
3416
0
                    *yuv2packed1 = yuv2bgra32_full_1_c;
3417
0
                } else
3418
0
#endif /* CONFIG_SWSCALE_ALPHA */
3419
0
                {
3420
0
                    *yuv2packedX = yuv2bgrx32_full_X_c;
3421
0
                    *yuv2packed2 = yuv2bgrx32_full_2_c;
3422
0
                    *yuv2packed1 = yuv2bgrx32_full_1_c;
3423
0
                }
3424
0
#endif /* !CONFIG_SMALL */
3425
0
                break;
3426
0
            case AV_PIX_FMT_ABGR:
3427
#if CONFIG_SMALL
3428
                *yuv2packedX = yuv2abgr32_full_X_c;
3429
                *yuv2packed2 = yuv2abgr32_full_2_c;
3430
                *yuv2packed1 = yuv2abgr32_full_1_c;
3431
#else
3432
0
#if CONFIG_SWSCALE_ALPHA
3433
0
                if (c->needAlpha) {
3434
0
                    *yuv2packedX = yuv2abgr32_full_X_c;
3435
0
                    *yuv2packed2 = yuv2abgr32_full_2_c;
3436
0
                    *yuv2packed1 = yuv2abgr32_full_1_c;
3437
0
                } else
3438
0
#endif /* CONFIG_SWSCALE_ALPHA */
3439
0
                {
3440
0
                    *yuv2packedX = yuv2xbgr32_full_X_c;
3441
0
                    *yuv2packed2 = yuv2xbgr32_full_2_c;
3442
0
                    *yuv2packed1 = yuv2xbgr32_full_1_c;
3443
0
                }
3444
0
#endif /* !CONFIG_SMALL */
3445
0
                break;
3446
0
        case AV_PIX_FMT_RGBA64LE:
3447
0
#if CONFIG_SWSCALE_ALPHA
3448
0
            if (c->needAlpha) {
3449
0
                *yuv2packedX = yuv2rgba64le_full_X_c;
3450
0
                *yuv2packed2 = yuv2rgba64le_full_2_c;
3451
0
                *yuv2packed1 = yuv2rgba64le_full_1_c;
3452
0
            } else
3453
0
#endif /* CONFIG_SWSCALE_ALPHA */
3454
0
            {
3455
0
                *yuv2packedX = yuv2rgbx64le_full_X_c;
3456
0
                *yuv2packed2 = yuv2rgbx64le_full_2_c;
3457
0
                *yuv2packed1 = yuv2rgbx64le_full_1_c;
3458
0
            }
3459
0
            break;
3460
0
        case AV_PIX_FMT_RGBA64BE:
3461
0
#if CONFIG_SWSCALE_ALPHA
3462
0
            if (c->needAlpha) {
3463
0
                *yuv2packedX = yuv2rgba64be_full_X_c;
3464
0
                *yuv2packed2 = yuv2rgba64be_full_2_c;
3465
0
                *yuv2packed1 = yuv2rgba64be_full_1_c;
3466
0
            } else
3467
0
#endif /* CONFIG_SWSCALE_ALPHA */
3468
0
            {
3469
0
                *yuv2packedX = yuv2rgbx64be_full_X_c;
3470
0
                *yuv2packed2 = yuv2rgbx64be_full_2_c;
3471
0
                *yuv2packed1 = yuv2rgbx64be_full_1_c;
3472
0
            }
3473
0
            break;
3474
0
        case AV_PIX_FMT_BGRA64LE:
3475
0
#if CONFIG_SWSCALE_ALPHA
3476
0
            if (c->needAlpha) {
3477
0
                *yuv2packedX = yuv2bgra64le_full_X_c;
3478
0
                *yuv2packed2 = yuv2bgra64le_full_2_c;
3479
0
                *yuv2packed1 = yuv2bgra64le_full_1_c;
3480
0
            } else
3481
0
#endif /* CONFIG_SWSCALE_ALPHA */
3482
0
            {
3483
0
                *yuv2packedX = yuv2bgrx64le_full_X_c;
3484
0
                *yuv2packed2 = yuv2bgrx64le_full_2_c;
3485
0
                *yuv2packed1 = yuv2bgrx64le_full_1_c;
3486
0
            }
3487
0
            break;
3488
0
        case AV_PIX_FMT_BGRA64BE:
3489
0
#if CONFIG_SWSCALE_ALPHA
3490
0
            if (c->needAlpha) {
3491
0
                *yuv2packedX = yuv2bgra64be_full_X_c;
3492
0
                *yuv2packed2 = yuv2bgra64be_full_2_c;
3493
0
                *yuv2packed1 = yuv2bgra64be_full_1_c;
3494
0
            } else
3495
0
#endif /* CONFIG_SWSCALE_ALPHA */
3496
0
            {
3497
0
                *yuv2packedX = yuv2bgrx64be_full_X_c;
3498
0
                *yuv2packed2 = yuv2bgrx64be_full_2_c;
3499
0
                *yuv2packed1 = yuv2bgrx64be_full_1_c;
3500
0
            }
3501
0
            break;
3502
3503
0
        case AV_PIX_FMT_RGB24:
3504
0
            *yuv2packedX = yuv2rgb24_full_X_c;
3505
0
            *yuv2packed2 = yuv2rgb24_full_2_c;
3506
0
            *yuv2packed1 = yuv2rgb24_full_1_c;
3507
0
            break;
3508
0
        case AV_PIX_FMT_BGR24:
3509
0
            *yuv2packedX = yuv2bgr24_full_X_c;
3510
0
            *yuv2packed2 = yuv2bgr24_full_2_c;
3511
0
            *yuv2packed1 = yuv2bgr24_full_1_c;
3512
0
            break;
3513
0
        case AV_PIX_FMT_RGB48LE:
3514
0
            *yuv2packedX = yuv2rgb48le_full_X_c;
3515
0
            *yuv2packed2 = yuv2rgb48le_full_2_c;
3516
0
            *yuv2packed1 = yuv2rgb48le_full_1_c;
3517
0
            break;
3518
0
        case AV_PIX_FMT_BGR48LE:
3519
0
            *yuv2packedX = yuv2bgr48le_full_X_c;
3520
0
            *yuv2packed2 = yuv2bgr48le_full_2_c;
3521
0
            *yuv2packed1 = yuv2bgr48le_full_1_c;
3522
0
            break;
3523
0
        case AV_PIX_FMT_RGB48BE:
3524
0
            *yuv2packedX = yuv2rgb48be_full_X_c;
3525
0
            *yuv2packed2 = yuv2rgb48be_full_2_c;
3526
0
            *yuv2packed1 = yuv2rgb48be_full_1_c;
3527
0
            break;
3528
0
        case AV_PIX_FMT_BGR48BE:
3529
0
            *yuv2packedX = yuv2bgr48be_full_X_c;
3530
0
            *yuv2packed2 = yuv2bgr48be_full_2_c;
3531
0
            *yuv2packed1 = yuv2bgr48be_full_1_c;
3532
0
            break;
3533
0
        case AV_PIX_FMT_BGR4_BYTE:
3534
0
            *yuv2packedX = yuv2bgr4_byte_full_X_c;
3535
0
            *yuv2packed2 = yuv2bgr4_byte_full_2_c;
3536
0
            *yuv2packed1 = yuv2bgr4_byte_full_1_c;
3537
0
            break;
3538
0
        case AV_PIX_FMT_RGB4_BYTE:
3539
0
            *yuv2packedX = yuv2rgb4_byte_full_X_c;
3540
0
            *yuv2packed2 = yuv2rgb4_byte_full_2_c;
3541
0
            *yuv2packed1 = yuv2rgb4_byte_full_1_c;
3542
0
            break;
3543
0
        case AV_PIX_FMT_BGR8:
3544
0
            *yuv2packedX = yuv2bgr8_full_X_c;
3545
0
            *yuv2packed2 = yuv2bgr8_full_2_c;
3546
0
            *yuv2packed1 = yuv2bgr8_full_1_c;
3547
0
            break;
3548
0
        case AV_PIX_FMT_RGB8:
3549
0
            *yuv2packedX = yuv2rgb8_full_X_c;
3550
0
            *yuv2packed2 = yuv2rgb8_full_2_c;
3551
0
            *yuv2packed1 = yuv2rgb8_full_1_c;
3552
0
            break;
3553
0
        case AV_PIX_FMT_X2RGB10LE:
3554
0
            *yuv2packedX = yuv2x2rgb10_full_X_c;
3555
0
            *yuv2packed2 = yuv2x2rgb10_full_2_c;
3556
0
            *yuv2packed1 = yuv2x2rgb10_full_1_c;
3557
0
            break;
3558
0
        case AV_PIX_FMT_X2BGR10LE:
3559
0
            *yuv2packedX = yuv2x2bgr10_full_X_c;
3560
0
            *yuv2packed2 = yuv2x2bgr10_full_2_c;
3561
0
            *yuv2packed1 = yuv2x2bgr10_full_1_c;
3562
0
            break;
3563
0
        case AV_PIX_FMT_GBRP:
3564
0
        case AV_PIX_FMT_GBRP9BE:
3565
0
        case AV_PIX_FMT_GBRP9LE:
3566
0
        case AV_PIX_FMT_GBRP10BE:
3567
0
        case AV_PIX_FMT_GBRP10LE:
3568
0
        case AV_PIX_FMT_GBRP12BE:
3569
0
        case AV_PIX_FMT_GBRP12LE:
3570
0
        case AV_PIX_FMT_GBRP14BE:
3571
0
        case AV_PIX_FMT_GBRP14LE:
3572
0
        case AV_PIX_FMT_GBRAP:
3573
0
        case AV_PIX_FMT_GBRAP10BE:
3574
0
        case AV_PIX_FMT_GBRAP10LE:
3575
0
        case AV_PIX_FMT_GBRAP12BE:
3576
0
        case AV_PIX_FMT_GBRAP12LE:
3577
0
        case AV_PIX_FMT_GBRAP14BE:
3578
0
        case AV_PIX_FMT_GBRAP14LE:
3579
0
            *yuv2anyX = yuv2gbrp_full_X_c;
3580
0
            break;
3581
0
        case AV_PIX_FMT_GBRP10MSBBE:
3582
0
        case AV_PIX_FMT_GBRP10MSBLE:
3583
0
        case AV_PIX_FMT_GBRP12MSBBE:
3584
0
        case AV_PIX_FMT_GBRP12MSBLE:
3585
0
            *yuv2anyX = yuv2gbrpmsb_full_X_c;
3586
0
            break;
3587
0
        case AV_PIX_FMT_GBRP16BE:
3588
0
        case AV_PIX_FMT_GBRP16LE:
3589
0
        case AV_PIX_FMT_GBRAP16BE:
3590
0
        case AV_PIX_FMT_GBRAP16LE:
3591
0
            *yuv2anyX = yuv2gbrp16_full_X_c;
3592
0
            break;
3593
0
        case AV_PIX_FMT_GBRPF32BE:
3594
0
        case AV_PIX_FMT_GBRPF32LE:
3595
0
        case AV_PIX_FMT_GBRAPF32BE:
3596
0
        case AV_PIX_FMT_GBRAPF32LE:
3597
0
            *yuv2anyX = yuv2gbrpf32_full_X_c;
3598
0
            break;
3599
0
        }
3600
0
        if (!*yuv2packedX && !*yuv2anyX)
3601
0
            goto YUV_PACKED;
3602
0
    } else {
3603
0
        YUV_PACKED:
3604
0
        switch (dstFormat) {
3605
0
        case AV_PIX_FMT_RGBA64LE:
3606
0
#if CONFIG_SWSCALE_ALPHA
3607
0
            if (c->needAlpha) {
3608
0
                *yuv2packed1 = yuv2rgba64le_1_c;
3609
0
                *yuv2packed2 = yuv2rgba64le_2_c;
3610
0
                *yuv2packedX = yuv2rgba64le_X_c;
3611
0
            } else
3612
0
#endif /* CONFIG_SWSCALE_ALPHA */
3613
0
            {
3614
0
                *yuv2packed1 = yuv2rgbx64le_1_c;
3615
0
                *yuv2packed2 = yuv2rgbx64le_2_c;
3616
0
                *yuv2packedX = yuv2rgbx64le_X_c;
3617
0
            }
3618
0
            break;
3619
0
        case AV_PIX_FMT_RGBA64BE:
3620
0
#if CONFIG_SWSCALE_ALPHA
3621
0
            if (c->needAlpha) {
3622
0
                *yuv2packed1 = yuv2rgba64be_1_c;
3623
0
                *yuv2packed2 = yuv2rgba64be_2_c;
3624
0
                *yuv2packedX = yuv2rgba64be_X_c;
3625
0
            } else
3626
0
#endif /* CONFIG_SWSCALE_ALPHA */
3627
0
            {
3628
0
                *yuv2packed1 = yuv2rgbx64be_1_c;
3629
0
                *yuv2packed2 = yuv2rgbx64be_2_c;
3630
0
                *yuv2packedX = yuv2rgbx64be_X_c;
3631
0
            }
3632
0
            break;
3633
0
        case AV_PIX_FMT_BGRA64LE:
3634
0
#if CONFIG_SWSCALE_ALPHA
3635
0
            if (c->needAlpha) {
3636
0
                *yuv2packed1 = yuv2bgra64le_1_c;
3637
0
                *yuv2packed2 = yuv2bgra64le_2_c;
3638
0
                *yuv2packedX = yuv2bgra64le_X_c;
3639
0
            } else
3640
0
#endif /* CONFIG_SWSCALE_ALPHA */
3641
0
            {
3642
0
                *yuv2packed1 = yuv2bgrx64le_1_c;
3643
0
                *yuv2packed2 = yuv2bgrx64le_2_c;
3644
0
                *yuv2packedX = yuv2bgrx64le_X_c;
3645
0
            }
3646
0
            break;
3647
0
        case AV_PIX_FMT_BGRA64BE:
3648
0
#if CONFIG_SWSCALE_ALPHA
3649
0
            if (c->needAlpha) {
3650
0
                *yuv2packed1 = yuv2bgra64be_1_c;
3651
0
                *yuv2packed2 = yuv2bgra64be_2_c;
3652
0
                *yuv2packedX = yuv2bgra64be_X_c;
3653
0
            } else
3654
0
#endif /* CONFIG_SWSCALE_ALPHA */
3655
0
            {
3656
0
                *yuv2packed1 = yuv2bgrx64be_1_c;
3657
0
                *yuv2packed2 = yuv2bgrx64be_2_c;
3658
0
                *yuv2packedX = yuv2bgrx64be_X_c;
3659
0
            }
3660
0
            break;
3661
0
        case AV_PIX_FMT_RGB48LE:
3662
0
            *yuv2packed1 = yuv2rgb48le_1_c;
3663
0
            *yuv2packed2 = yuv2rgb48le_2_c;
3664
0
            *yuv2packedX = yuv2rgb48le_X_c;
3665
0
            break;
3666
0
        case AV_PIX_FMT_RGB48BE:
3667
0
            *yuv2packed1 = yuv2rgb48be_1_c;
3668
0
            *yuv2packed2 = yuv2rgb48be_2_c;
3669
0
            *yuv2packedX = yuv2rgb48be_X_c;
3670
0
            break;
3671
0
        case AV_PIX_FMT_BGR48LE:
3672
0
            *yuv2packed1 = yuv2bgr48le_1_c;
3673
0
            *yuv2packed2 = yuv2bgr48le_2_c;
3674
0
            *yuv2packedX = yuv2bgr48le_X_c;
3675
0
            break;
3676
0
        case AV_PIX_FMT_BGR48BE:
3677
0
            *yuv2packed1 = yuv2bgr48be_1_c;
3678
0
            *yuv2packed2 = yuv2bgr48be_2_c;
3679
0
            *yuv2packedX = yuv2bgr48be_X_c;
3680
0
            break;
3681
0
        case AV_PIX_FMT_RGB32:
3682
0
        case AV_PIX_FMT_BGR32:
3683
#if CONFIG_SMALL
3684
            *yuv2packed1 = yuv2rgb32_1_c;
3685
            *yuv2packed2 = yuv2rgb32_2_c;
3686
            *yuv2packedX = yuv2rgb32_X_c;
3687
#else
3688
0
#if CONFIG_SWSCALE_ALPHA
3689
0
                if (c->needAlpha) {
3690
0
                    *yuv2packed1 = yuv2rgba32_1_c;
3691
0
                    *yuv2packed2 = yuv2rgba32_2_c;
3692
0
                    *yuv2packedX = yuv2rgba32_X_c;
3693
0
                } else
3694
0
#endif /* CONFIG_SWSCALE_ALPHA */
3695
0
                {
3696
0
                    *yuv2packed1 = yuv2rgbx32_1_c;
3697
0
                    *yuv2packed2 = yuv2rgbx32_2_c;
3698
0
                    *yuv2packedX = yuv2rgbx32_X_c;
3699
0
                }
3700
0
#endif /* !CONFIG_SMALL */
3701
0
            break;
3702
0
        case AV_PIX_FMT_RGB32_1:
3703
0
        case AV_PIX_FMT_BGR32_1:
3704
#if CONFIG_SMALL
3705
                *yuv2packed1 = yuv2rgb32_1_1_c;
3706
                *yuv2packed2 = yuv2rgb32_1_2_c;
3707
                *yuv2packedX = yuv2rgb32_1_X_c;
3708
#else
3709
0
#if CONFIG_SWSCALE_ALPHA
3710
0
                if (c->needAlpha) {
3711
0
                    *yuv2packed1 = yuv2rgba32_1_1_c;
3712
0
                    *yuv2packed2 = yuv2rgba32_1_2_c;
3713
0
                    *yuv2packedX = yuv2rgba32_1_X_c;
3714
0
                } else
3715
0
#endif /* CONFIG_SWSCALE_ALPHA */
3716
0
                {
3717
0
                    *yuv2packed1 = yuv2rgbx32_1_1_c;
3718
0
                    *yuv2packed2 = yuv2rgbx32_1_2_c;
3719
0
                    *yuv2packedX = yuv2rgbx32_1_X_c;
3720
0
                }
3721
0
#endif /* !CONFIG_SMALL */
3722
0
                break;
3723
0
        case AV_PIX_FMT_RGB24:
3724
0
            *yuv2packed1 = yuv2rgb24_1_c;
3725
0
            *yuv2packed2 = yuv2rgb24_2_c;
3726
0
            *yuv2packedX = yuv2rgb24_X_c;
3727
0
            break;
3728
0
        case AV_PIX_FMT_BGR24:
3729
0
            *yuv2packed1 = yuv2bgr24_1_c;
3730
0
            *yuv2packed2 = yuv2bgr24_2_c;
3731
0
            *yuv2packedX = yuv2bgr24_X_c;
3732
0
            break;
3733
0
        case AV_PIX_FMT_RGB565LE:
3734
0
        case AV_PIX_FMT_RGB565BE:
3735
0
        case AV_PIX_FMT_BGR565LE:
3736
0
        case AV_PIX_FMT_BGR565BE:
3737
0
            *yuv2packed1 = yuv2rgb16_1_c;
3738
0
            *yuv2packed2 = yuv2rgb16_2_c;
3739
0
            *yuv2packedX = yuv2rgb16_X_c;
3740
0
            break;
3741
0
        case AV_PIX_FMT_RGB555LE:
3742
0
        case AV_PIX_FMT_RGB555BE:
3743
0
        case AV_PIX_FMT_BGR555LE:
3744
0
        case AV_PIX_FMT_BGR555BE:
3745
0
            *yuv2packed1 = yuv2rgb15_1_c;
3746
0
            *yuv2packed2 = yuv2rgb15_2_c;
3747
0
            *yuv2packedX = yuv2rgb15_X_c;
3748
0
            break;
3749
0
        case AV_PIX_FMT_RGB444LE:
3750
0
        case AV_PIX_FMT_RGB444BE:
3751
0
        case AV_PIX_FMT_BGR444LE:
3752
0
        case AV_PIX_FMT_BGR444BE:
3753
0
            *yuv2packed1 = yuv2rgb12_1_c;
3754
0
            *yuv2packed2 = yuv2rgb12_2_c;
3755
0
            *yuv2packedX = yuv2rgb12_X_c;
3756
0
            break;
3757
0
        case AV_PIX_FMT_RGB8:
3758
0
        case AV_PIX_FMT_BGR8:
3759
0
            *yuv2packed1 = yuv2rgb8_1_c;
3760
0
            *yuv2packed2 = yuv2rgb8_2_c;
3761
0
            *yuv2packedX = yuv2rgb8_X_c;
3762
0
            break;
3763
0
        case AV_PIX_FMT_RGB4:
3764
0
        case AV_PIX_FMT_BGR4:
3765
0
            *yuv2packed1 = yuv2rgb4_1_c;
3766
0
            *yuv2packed2 = yuv2rgb4_2_c;
3767
0
            *yuv2packedX = yuv2rgb4_X_c;
3768
0
            break;
3769
0
        case AV_PIX_FMT_RGB4_BYTE:
3770
0
        case AV_PIX_FMT_BGR4_BYTE:
3771
0
            *yuv2packed1 = yuv2rgb4b_1_c;
3772
0
            *yuv2packed2 = yuv2rgb4b_2_c;
3773
0
            *yuv2packedX = yuv2rgb4b_X_c;
3774
0
            break;
3775
0
        case AV_PIX_FMT_X2RGB10LE:
3776
0
        case AV_PIX_FMT_X2RGB10BE:
3777
0
            *yuv2packed1 = yuv2x2rgb10_1_c;
3778
0
            *yuv2packed2 = yuv2x2rgb10_2_c;
3779
0
            *yuv2packedX = yuv2x2rgb10_X_c;
3780
0
            break;
3781
0
        case AV_PIX_FMT_X2BGR10LE:
3782
0
        case AV_PIX_FMT_X2BGR10BE:
3783
0
            *yuv2packed1 = yuv2x2bgr10_1_c;
3784
0
            *yuv2packed2 = yuv2x2bgr10_2_c;
3785
0
            *yuv2packedX = yuv2x2bgr10_X_c;
3786
0
            break;
3787
0
        }
3788
0
    }
3789
0
    switch (dstFormat) {
3790
0
    case AV_PIX_FMT_MONOWHITE:
3791
0
        *yuv2packed1 = yuv2monowhite_1_c;
3792
0
        *yuv2packed2 = yuv2monowhite_2_c;
3793
0
        *yuv2packedX = yuv2monowhite_X_c;
3794
0
        break;
3795
0
    case AV_PIX_FMT_MONOBLACK:
3796
0
        *yuv2packed1 = yuv2monoblack_1_c;
3797
0
        *yuv2packed2 = yuv2monoblack_2_c;
3798
0
        *yuv2packedX = yuv2monoblack_X_c;
3799
0
        break;
3800
0
    case AV_PIX_FMT_YUYV422:
3801
0
        *yuv2packed1 = yuv2yuyv422_1_c;
3802
0
        *yuv2packed2 = yuv2yuyv422_2_c;
3803
0
        *yuv2packedX = yuv2yuyv422_X_c;
3804
0
        break;
3805
0
    case AV_PIX_FMT_YVYU422:
3806
0
        *yuv2packed1 = yuv2yvyu422_1_c;
3807
0
        *yuv2packed2 = yuv2yvyu422_2_c;
3808
0
        *yuv2packedX = yuv2yvyu422_X_c;
3809
0
        break;
3810
0
    case AV_PIX_FMT_UYVY422:
3811
0
        *yuv2packed1 = yuv2uyvy422_1_c;
3812
0
        *yuv2packed2 = yuv2uyvy422_2_c;
3813
0
        *yuv2packedX = yuv2uyvy422_X_c;
3814
0
        break;
3815
0
    case AV_PIX_FMT_VYU444:
3816
0
        *yuv2packed1 = yuv2vyu444_1_c;
3817
0
        *yuv2packed2 = yuv2vyu444_2_c;
3818
0
        *yuv2packedX = yuv2vyu444_X_c;
3819
0
        break;
3820
0
    case AV_PIX_FMT_YA8:
3821
0
        *yuv2packed1 = yuv2ya8_1_c;
3822
0
        *yuv2packed2 = yuv2ya8_2_c;
3823
0
        *yuv2packedX = yuv2ya8_X_c;
3824
0
        break;
3825
0
    case AV_PIX_FMT_YA16LE:
3826
0
        *yuv2packed1 = yuv2ya16le_1_c;
3827
0
        *yuv2packed2 = yuv2ya16le_2_c;
3828
0
        *yuv2packedX = yuv2ya16le_X_c;
3829
0
        break;
3830
0
    case AV_PIX_FMT_YA16BE:
3831
0
        *yuv2packed1 = yuv2ya16be_1_c;
3832
0
        *yuv2packed2 = yuv2ya16be_2_c;
3833
0
        *yuv2packedX = yuv2ya16be_X_c;
3834
0
        break;
3835
0
    case AV_PIX_FMT_V30XLE:
3836
0
        *yuv2packedX = yuv2v30xle_X_c;
3837
0
        break;
3838
0
    case AV_PIX_FMT_AYUV64LE:
3839
0
        *yuv2packedX = yuv2ayuv64le_X_c;
3840
0
        break;
3841
0
    case AV_PIX_FMT_AYUV64BE:
3842
0
        *yuv2packedX = yuv2ayuv64be_X_c;
3843
0
        break;
3844
0
    case AV_PIX_FMT_AYUV:
3845
0
        *yuv2packed1 = yuv2ayuv_1_c;
3846
0
        *yuv2packed2 = yuv2ayuv_2_c;
3847
0
        *yuv2packedX = yuv2ayuv_X_c;
3848
0
        break;
3849
0
    case AV_PIX_FMT_VUYA:
3850
0
    case AV_PIX_FMT_VUYX:
3851
0
        *yuv2packed1 = yuv2vuyX_1_c;
3852
0
        *yuv2packed2 = yuv2vuyX_2_c;
3853
0
        *yuv2packedX = yuv2vuyX_X_c;
3854
0
        break;
3855
0
    case AV_PIX_FMT_UYVA:
3856
0
        *yuv2packed1 = yuv2uyva_1_c;
3857
0
        *yuv2packed2 = yuv2uyva_2_c;
3858
0
        *yuv2packedX = yuv2uyva_X_c;
3859
0
        break;
3860
0
    case AV_PIX_FMT_XV30LE:
3861
0
        *yuv2packedX = yuv2xv30le_X_c;
3862
0
        break;
3863
0
    case AV_PIX_FMT_XV36LE:
3864
0
        *yuv2packedX = yuv2xv36le_X_c;
3865
0
        break;
3866
0
    case AV_PIX_FMT_XV36BE:
3867
0
        *yuv2packedX = yuv2xv36be_X_c;
3868
0
        break;
3869
0
    case AV_PIX_FMT_XV48LE:
3870
0
        *yuv2packedX = yuv2xv48le_X_c;
3871
0
        break;
3872
0
    case AV_PIX_FMT_XV48BE:
3873
0
        *yuv2packedX = yuv2xv48be_X_c;
3874
0
        break;
3875
0
    case AV_PIX_FMT_Y210LE:
3876
0
        *yuv2packedX = yuv2y210le_X_c;
3877
0
        break;
3878
0
    case AV_PIX_FMT_Y212LE:
3879
0
        *yuv2packedX = yuv2y212le_X_c;
3880
0
        break;
3881
0
    case AV_PIX_FMT_Y216LE:
3882
0
        *yuv2packedX = yuv2y216le_X_c;
3883
0
        break;
3884
0
    }
3885
0
}