Statistics
| Branch: | Revision:

ffmpeg / libswscale / swscale.c @ 22b6a24c

History | View | Annotate | Download (68.1 KB)

1 fe8054c0 Michael Niedermayer
/*
2 d026b45e Diego Biurrun
 * Copyright (C) 2001-2003 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 modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation; either version 2 of the License, or
9
 * (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
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with FFmpeg; if not, write to the Free Software
18 b19bcbaa Diego Biurrun
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 d026b45e Diego Biurrun
 *
20 807e0c66 Luca Abeni
 * the C code (not assembly, mmx, ...) of this file can be used
21
 * under the LGPL license too
22 d026b45e Diego Biurrun
 */
23 783e9cc9 Michael Niedermayer
24 28bf81c9 Michael Niedermayer
/*
25 9990e426 Michael Niedermayer
  supported Input formats: YV12, I420/IYUV, YUY2, UYVY, BGR32, BGR32_1, BGR24, BGR16, BGR15, RGB32, RGB32_1, RGB24, Y8/Y800, YVU9/IF09, PAL8
26 caeaabe7 Alex Beregszaszi
  supported output formats: YV12, I420/IYUV, YUY2, UYVY, {BGR,RGB}{1,4,8,15,16,24,32}, Y8/Y800, YVU9/IF09
27 e09d12f4 Michael Niedermayer
  {BGR,RGB}{1,4,8,15,16} support dithering
28 6a4970ab Diego Biurrun

29 e09d12f4 Michael Niedermayer
  unscaled special converters (YV12=I420=IYUV, Y800=Y8)
30
  YV12 -> {BGR,RGB}{1,4,8,15,16,24,32}
31
  x -> x
32
  YUV9 -> YV12
33
  YUV9/YV12 -> Y800
34
  Y800 -> YUV9/YV12
35 b935781b Michael Niedermayer
  BGR24 -> BGR32 & RGB24 -> RGB32
36
  BGR32 -> BGR24 & RGB32 -> RGB24
37 4bb3fa5e Michael Niedermayer
  BGR15 -> BGR16
38 b935781b Michael Niedermayer
*/
39
40 6a4970ab Diego Biurrun
/*
41 a6f6b237 Diego Biurrun
tested special converters (most are tested actually, but I did not write it down ...)
42 e09d12f4 Michael Niedermayer
 YV12 -> BGR16
43 b935781b Michael Niedermayer
 YV12 -> YV12
44 4bb3fa5e Michael Niedermayer
 BGR15 -> BGR16
45 1e1c4fe9 Michael Niedermayer
 BGR16 -> BGR16
46 e09d12f4 Michael Niedermayer
 YVU9 -> YV12
47 b935781b Michael Niedermayer

48
untested special converters
49 f40c7dbb Diego Biurrun
  YV12/I420 -> BGR15/BGR24/BGR32 (it is the yuv2rgb stuff, so it should be OK)
50 1e1c4fe9 Michael Niedermayer
  YV12/I420 -> YV12/I420
51
  YUY2/BGR15/BGR24/BGR32/RGB24/RGB32 -> same format
52 b935781b Michael Niedermayer
  BGR24 -> BGR32 & RGB24 -> RGB32
53
  BGR32 -> BGR24 & RGB32 -> RGB24
54 ec22603f Michael Niedermayer
  BGR24 -> YV12
55 28bf81c9 Michael Niedermayer
*/
56
57 d3f41512 Michael Niedermayer
#include <inttypes.h>
58 dda87e9f Pierre Lombard
#include <string.h>
59 077ea8a7 Michael Niedermayer
#include <math.h>
60 c1b0bfb4 Michael Niedermayer
#include <stdio.h>
61 b2d374c9 Diego Biurrun
#include "config.h"
62 81b7c056 Michael Niedermayer
#include <assert.h>
63 d604bab9 Michael Niedermayer
#include "swscale.h"
64 5427e242 Michael Niedermayer
#include "swscale_internal.h"
65 37079906 Michael Niedermayer
#include "rgb2rgb.h"
66 52154148 Ramiro Polla
#include "libavutil/intreadwrite.h"
67 83da2c6f Diego Biurrun
#include "libavutil/x86_cpu.h"
68 7248797c Ramiro Polla
#include "libavutil/avutil.h"
69 83da2c6f Diego Biurrun
#include "libavutil/bswap.h"
70 a9af75ae Stefano Sabatini
#include "libavutil/pixdesc.h"
71 0d9f3d85 Arpi
72 541c4eb9 Michael Niedermayer
#undef MOVNTQ
73 7d7f78b5 Michael Niedermayer
#undef PAVGB
74 d3f41512 Michael Niedermayer
75 783e9cc9 Michael Niedermayer
//#undef HAVE_MMX2
76 f4406ec1 Diego Biurrun
//#define HAVE_AMD3DNOW
77 d3f41512 Michael Niedermayer
//#undef HAVE_MMX
78 783e9cc9 Michael Niedermayer
//#undef ARCH_X86
79 d604bab9 Michael Niedermayer
#define DITHER1XBPP
80 d3f41512 Michael Niedermayer
81 f40c7dbb Diego Biurrun
#define FAST_BGR2YV12 // use 7 bit coefficients instead of 15 bit
82 ac6a2e45 Michael Niedermayer
83 28bf81c9 Michael Niedermayer
#ifdef M_PI
84
#define PI M_PI
85
#else
86
#define PI 3.14159265358979323846
87
#endif
88 c1b0bfb4 Michael Niedermayer
89 9d9de37d Ivo van Poorten
#define isPacked(x)         (       \
90
           (x)==PIX_FMT_PAL8        \
91
        || (x)==PIX_FMT_YUYV422     \
92
        || (x)==PIX_FMT_UYVY422     \
93 60222557 Michael Niedermayer
        || isAnyRGB(x)              \
94 9d9de37d Ivo van Poorten
    )
95 f412d5e9 Stefano Sabatini
#define usePal(x) (av_pix_fmt_descriptors[x].flags & PIX_FMT_PAL)
96 6ff0ad6b Michael Niedermayer
97 6b79dbce Michael Niedermayer
#define RGB2YUV_SHIFT 15
98 7b5d7b9e Michael Niedermayer
#define BY ( (int)(0.114*219/255*(1<<RGB2YUV_SHIFT)+0.5))
99
#define BV (-(int)(0.081*224/255*(1<<RGB2YUV_SHIFT)+0.5))
100
#define BU ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5))
101
#define GY ( (int)(0.587*219/255*(1<<RGB2YUV_SHIFT)+0.5))
102
#define GV (-(int)(0.419*224/255*(1<<RGB2YUV_SHIFT)+0.5))
103
#define GU (-(int)(0.331*224/255*(1<<RGB2YUV_SHIFT)+0.5))
104
#define RY ( (int)(0.299*219/255*(1<<RGB2YUV_SHIFT)+0.5))
105
#define RV ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5))
106
#define RU (-(int)(0.169*224/255*(1<<RGB2YUV_SHIFT)+0.5))
107 6c7506de Michael Niedermayer
108 0f5d4aa8 Michael Niedermayer
static const double rgb2yuv_table[8][9]={
109
    {0.7152, 0.0722, 0.2126, -0.386, 0.5, -0.115, -0.454, -0.046, 0.5},
110
    {0.7152, 0.0722, 0.2126, -0.386, 0.5, -0.115, -0.454, -0.046, 0.5},
111
    {0.587 , 0.114 , 0.299 , -0.331, 0.5, -0.169, -0.419, -0.081, 0.5},
112
    {0.587 , 0.114 , 0.299 , -0.331, 0.5, -0.169, -0.419, -0.081, 0.5},
113
    {0.59  , 0.11  , 0.30  , -0.331, 0.5, -0.169, -0.421, -0.079, 0.5}, //FCC
114
    {0.587 , 0.114 , 0.299 , -0.331, 0.5, -0.169, -0.419, -0.081, 0.5},
115
    {0.587 , 0.114 , 0.299 , -0.331, 0.5, -0.169, -0.419, -0.081, 0.5}, //SMPTE 170M
116
    {0.701 , 0.087 , 0.212 , -0.384, 0.5  -0.116, -0.445, -0.055, 0.5}, //SMPTE 240M
117
};
118
119 783e9cc9 Michael Niedermayer
/*
120
NOTES
121 d604bab9 Michael Niedermayer
Special versions: fast Y 1:1 scaling (no interpolation in y direction)
122 31190492 Arpi

123 783e9cc9 Michael Niedermayer
TODO
124 bd7c6fd5 Diego Biurrun
more intelligent misalignment avoidance for the horizontal scaler
125 c1b0bfb4 Michael Niedermayer
write special vertical cubic upscale version
126 f40c7dbb Diego Biurrun
optimize C code (YV12 / minmax)
127
add support for packed pixel YUV input & output
128 6ff0ad6b Michael Niedermayer
add support for Y8 output
129 f40c7dbb Diego Biurrun
optimize BGR24 & BGR32
130 ff7ba856 Michael Niedermayer
add BGR4 output support
131 1e621b18 Michael Niedermayer
write special BGR->BGR scaler
132 783e9cc9 Michael Niedermayer
*/
133 31190492 Arpi
134 b63f641e Aurelien Jacobs
#if ARCH_X86 && CONFIG_GPL
135 d334c7c2 Reimar Döffinger
DECLARE_ASM_CONST(8, uint64_t, bF8)=       0xF8F8F8F8F8F8F8F8LL;
136
DECLARE_ASM_CONST(8, uint64_t, bFC)=       0xFCFCFCFCFCFCFCFCLL;
137
DECLARE_ASM_CONST(8, uint64_t, w10)=       0x0010001000100010LL;
138
DECLARE_ASM_CONST(8, uint64_t, w02)=       0x0002000200020002LL;
139
DECLARE_ASM_CONST(8, uint64_t, bm00001111)=0x00000000FFFFFFFFLL;
140
DECLARE_ASM_CONST(8, uint64_t, bm00000111)=0x0000000000FFFFFFLL;
141
DECLARE_ASM_CONST(8, uint64_t, bm11111000)=0xFFFFFFFFFF000000LL;
142
DECLARE_ASM_CONST(8, uint64_t, bm01010101)=0x00FF00FF00FF00FFLL;
143 d604bab9 Michael Niedermayer
144 4a888526 Måns Rullgård
const DECLARE_ALIGNED(8, uint64_t, ff_dither4)[2] = {
145 221b804f Diego Biurrun
        0x0103010301030103LL,
146
        0x0200020002000200LL,};
147 d8fa3c54 Michael Niedermayer
148 4a888526 Måns Rullgård
const DECLARE_ALIGNED(8, uint64_t, ff_dither8)[2] = {
149 221b804f Diego Biurrun
        0x0602060206020602LL,
150
        0x0004000400040004LL,};
151 d604bab9 Michael Niedermayer
152 d334c7c2 Reimar Döffinger
DECLARE_ASM_CONST(8, uint64_t, b16Mask)=   0x001F001F001F001FLL;
153
DECLARE_ASM_CONST(8, uint64_t, g16Mask)=   0x07E007E007E007E0LL;
154
DECLARE_ASM_CONST(8, uint64_t, r16Mask)=   0xF800F800F800F800LL;
155
DECLARE_ASM_CONST(8, uint64_t, b15Mask)=   0x001F001F001F001FLL;
156
DECLARE_ASM_CONST(8, uint64_t, g15Mask)=   0x03E003E003E003E0LL;
157
DECLARE_ASM_CONST(8, uint64_t, r15Mask)=   0x7C007C007C007C00LL;
158 d604bab9 Michael Niedermayer
159 5802683a Reimar Döffinger
DECLARE_ALIGNED(8, const uint64_t, ff_M24A)         = 0x00FF0000FF0000FFLL;
160
DECLARE_ALIGNED(8, const uint64_t, ff_M24B)         = 0xFF0000FF0000FF00LL;
161
DECLARE_ALIGNED(8, const uint64_t, ff_M24C)         = 0x0000FF0000FF0000LL;
162 99d2cb72 Michael Niedermayer
163 ac6a2e45 Michael Niedermayer
#ifdef FAST_BGR2YV12
164 5802683a Reimar Döffinger
DECLARE_ALIGNED(8, const uint64_t, ff_bgr2YCoeff)   = 0x000000210041000DULL;
165
DECLARE_ALIGNED(8, const uint64_t, ff_bgr2UCoeff)   = 0x0000FFEEFFDC0038ULL;
166
DECLARE_ALIGNED(8, const uint64_t, ff_bgr2VCoeff)   = 0x00000038FFD2FFF8ULL;
167 ac6a2e45 Michael Niedermayer
#else
168 5802683a Reimar Döffinger
DECLARE_ALIGNED(8, const uint64_t, ff_bgr2YCoeff)   = 0x000020E540830C8BULL;
169
DECLARE_ALIGNED(8, const uint64_t, ff_bgr2UCoeff)   = 0x0000ED0FDAC23831ULL;
170
DECLARE_ALIGNED(8, const uint64_t, ff_bgr2VCoeff)   = 0x00003831D0E6F6EAULL;
171 69796008 Diego Biurrun
#endif /* FAST_BGR2YV12 */
172 5802683a Reimar Döffinger
DECLARE_ALIGNED(8, const uint64_t, ff_bgr2YOffset)  = 0x1010101010101010ULL;
173
DECLARE_ALIGNED(8, const uint64_t, ff_bgr2UVOffset) = 0x8080808080808080ULL;
174
DECLARE_ALIGNED(8, const uint64_t, ff_w1111)        = 0x0001000100010001ULL;
175 dfb09bd1 Michael Niedermayer
176 b5c44b1a Diego Pettenò
DECLARE_ASM_CONST(8, uint64_t, ff_bgr24toY1Coeff) = 0x0C88000040870C88ULL;
177
DECLARE_ASM_CONST(8, uint64_t, ff_bgr24toY2Coeff) = 0x20DE4087000020DEULL;
178
DECLARE_ASM_CONST(8, uint64_t, ff_rgb24toY1Coeff) = 0x20DE0000408720DEULL;
179
DECLARE_ASM_CONST(8, uint64_t, ff_rgb24toY2Coeff) = 0x0C88408700000C88ULL;
180
DECLARE_ASM_CONST(8, uint64_t, ff_bgr24toYOffset) = 0x0008400000084000ULL;
181 dfb09bd1 Michael Niedermayer
182 4a888526 Måns Rullgård
DECLARE_ASM_CONST(8, uint64_t, ff_bgr24toUV)[2][4] = {
183 dfb09bd1 Michael Niedermayer
    {0x38380000DAC83838ULL, 0xECFFDAC80000ECFFULL, 0xF6E40000D0E3F6E4ULL, 0x3838D0E300003838ULL},
184
    {0xECFF0000DAC8ECFFULL, 0x3838DAC800003838ULL, 0x38380000D0E33838ULL, 0xF6E4D0E30000F6E4ULL},
185
};
186
187 b5c44b1a Diego Pettenò
DECLARE_ASM_CONST(8, uint64_t, ff_bgr24toUVOffset)= 0x0040400000404000ULL;
188 dfb09bd1 Michael Niedermayer
189 7a24ec50 Diego Biurrun
#endif /* ARCH_X86 && CONFIG_GPL */
190 783e9cc9 Michael Niedermayer
191 4a888526 Måns Rullgård
DECLARE_ALIGNED(8, static const uint8_t, dither_2x2_4)[2][8]={
192 45e18be8 Michael Niedermayer
{  1,   3,   1,   3,   1,   3,   1,   3, },
193
{  2,   0,   2,   0,   2,   0,   2,   0, },
194
};
195
196 4a888526 Måns Rullgård
DECLARE_ALIGNED(8, static const uint8_t, dither_2x2_8)[2][8]={
197 45e18be8 Michael Niedermayer
{  6,   2,   6,   2,   6,   2,   6,   2, },
198
{  0,   4,   0,   4,   0,   4,   0,   4, },
199
};
200
201 4a888526 Måns Rullgård
DECLARE_ALIGNED(8, const uint8_t, dither_8x8_32)[8][8]={
202 45e18be8 Michael Niedermayer
{ 17,   9,  23,  15,  16,   8,  22,  14, },
203
{  5,  29,   3,  27,   4,  28,   2,  26, },
204
{ 21,  13,  19,  11,  20,  12,  18,  10, },
205
{  0,  24,   6,  30,   1,  25,   7,  31, },
206
{ 16,   8,  22,  14,  17,   9,  23,  15, },
207
{  4,  28,   2,  26,   5,  29,   3,  27, },
208
{ 20,  12,  18,  10,  21,  13,  19,  11, },
209
{  1,  25,   7,  31,   0,  24,   6,  30, },
210
};
211
212 4a888526 Måns Rullgård
DECLARE_ALIGNED(8, const uint8_t, dither_8x8_73)[8][8]={
213 45e18be8 Michael Niedermayer
{  0,  55,  14,  68,   3,  58,  17,  72, },
214
{ 37,  18,  50,  32,  40,  22,  54,  35, },
215
{  9,  64,   5,  59,  13,  67,   8,  63, },
216
{ 46,  27,  41,  23,  49,  31,  44,  26, },
217
{  2,  57,  16,  71,   1,  56,  15,  70, },
218
{ 39,  21,  52,  34,  38,  19,  51,  33, },
219
{ 11,  66,   7,  62,  10,  65,   6,  60, },
220
{ 48,  30,  43,  25,  47,  29,  42,  24, },
221
};
222
223
#if 1
224 4a888526 Måns Rullgård
DECLARE_ALIGNED(8, const uint8_t, dither_8x8_220)[8][8]={
225 45e18be8 Michael Niedermayer
{117,  62, 158, 103, 113,  58, 155, 100, },
226
{ 34, 199,  21, 186,  31, 196,  17, 182, },
227
{144,  89, 131,  76, 141,  86, 127,  72, },
228
{  0, 165,  41, 206,  10, 175,  52, 217, },
229
{110,  55, 151,  96, 120,  65, 162, 107, },
230
{ 28, 193,  14, 179,  38, 203,  24, 189, },
231
{138,  83, 124,  69, 148,  93, 134,  79, },
232
{  7, 172,  48, 213,   3, 168,  45, 210, },
233
};
234
#elif 1
235
// tries to correct a gamma of 1.5
236 4a888526 Måns Rullgård
DECLARE_ALIGNED(8, const uint8_t, dither_8x8_220)[8][8]={
237 45e18be8 Michael Niedermayer
{  0, 143,  18, 200,   2, 156,  25, 215, },
238
{ 78,  28, 125,  64,  89,  36, 138,  74, },
239
{ 10, 180,   3, 161,  16, 195,   8, 175, },
240
{109,  51,  93,  38, 121,  60, 105,  47, },
241
{  1, 152,  23, 210,   0, 147,  20, 205, },
242
{ 85,  33, 134,  71,  81,  30, 130,  67, },
243
{ 14, 190,   6, 171,  12, 185,   5, 166, },
244
{117,  57, 101,  44, 113,  54,  97,  41, },
245
};
246
#elif 1
247
// tries to correct a gamma of 2.0
248 4a888526 Måns Rullgård
DECLARE_ALIGNED(8, const uint8_t, dither_8x8_220)[8][8]={
249 45e18be8 Michael Niedermayer
{  0, 124,   8, 193,   0, 140,  12, 213, },
250
{ 55,  14, 104,  42,  66,  19, 119,  52, },
251
{  3, 168,   1, 145,   6, 187,   3, 162, },
252
{ 86,  31,  70,  21,  99,  39,  82,  28, },
253
{  0, 134,  11, 206,   0, 129,   9, 200, },
254
{ 62,  17, 114,  48,  58,  16, 109,  45, },
255
{  5, 181,   2, 157,   4, 175,   1, 151, },
256
{ 95,  36,  78,  26,  90,  34,  74,  24, },
257
};
258
#else
259
// tries to correct a gamma of 2.5
260 4a888526 Måns Rullgård
DECLARE_ALIGNED(8, const uint8_t, dither_8x8_220)[8][8]={
261 45e18be8 Michael Niedermayer
{  0, 107,   3, 187,   0, 125,   6, 212, },
262
{ 39,   7,  86,  28,  49,  11, 102,  36, },
263
{  1, 158,   0, 131,   3, 180,   1, 151, },
264
{ 68,  19,  52,  12,  81,  25,  64,  17, },
265
{  0, 119,   5, 203,   0, 113,   4, 195, },
266
{ 45,   9,  96,  33,  42,   8,  91,  30, },
267
{  2, 172,   1, 144,   2, 165,   0, 137, },
268
{ 77,  23,  60,  15,  72,  21,  56,  14, },
269
};
270
#endif
271 5cebb24b Michael Niedermayer
272 52154148 Ramiro Polla
static av_always_inline void yuv2yuvX16inC_template(const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize,
273
                                                    const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize,
274
                                                    const int16_t **alpSrc, uint16_t *dest, uint16_t *uDest, uint16_t *vDest, uint16_t *aDest,
275
                                                    int dstW, int chrDstW, int big_endian)
276
{
277
    //FIXME Optimize (just quickly written not optimized..)
278
    int i;
279
280
    for (i = 0; i < dstW; i++) {
281
        int val = 1 << 10;
282
        int j;
283
284
        for (j = 0; j < lumFilterSize; j++)
285
            val += lumSrc[j][i] * lumFilter[j];
286
287
        if (big_endian) {
288
            AV_WB16(&dest[i], av_clip_uint16(val >> 11));
289
        } else {
290
            AV_WL16(&dest[i], av_clip_uint16(val >> 11));
291
        }
292
    }
293
294
    if (uDest) {
295
        for (i = 0; i < chrDstW; i++) {
296
            int u = 1 << 10;
297
            int v = 1 << 10;
298
            int j;
299
300
            for (j = 0; j < chrFilterSize; j++) {
301
                u += chrSrc[j][i       ] * chrFilter[j];
302
                v += chrSrc[j][i + VOFW] * chrFilter[j];
303
            }
304
305
            if (big_endian) {
306
                AV_WB16(&uDest[i], av_clip_uint16(u >> 11));
307
                AV_WB16(&vDest[i], av_clip_uint16(v >> 11));
308
            } else {
309
                AV_WL16(&uDest[i], av_clip_uint16(u >> 11));
310
                AV_WL16(&vDest[i], av_clip_uint16(v >> 11));
311
            }
312
        }
313
    }
314
315
    if (CONFIG_SWSCALE_ALPHA && aDest) {
316
        for (i = 0; i < dstW; i++) {
317
            int val = 1 << 10;
318
            int j;
319
320
            for (j = 0; j < lumFilterSize; j++)
321
                val += alpSrc[j][i] * lumFilter[j];
322
323
            if (big_endian) {
324
                AV_WB16(&aDest[i], av_clip_uint16(val >> 11));
325
            } else {
326
                AV_WL16(&aDest[i], av_clip_uint16(val >> 11));
327
            }
328
        }
329
    }
330
}
331
332
static inline void yuv2yuvX16inC(const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize,
333
                                 const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize,
334
                                 const int16_t **alpSrc, uint16_t *dest, uint16_t *uDest, uint16_t *vDest, uint16_t *aDest, int dstW, int chrDstW,
335
                                 enum PixelFormat dstFormat)
336
{
337
    if (isBE(dstFormat)) {
338
        yuv2yuvX16inC_template(lumFilter, lumSrc, lumFilterSize,
339
                               chrFilter, chrSrc, chrFilterSize,
340
                               alpSrc,
341
                               dest, uDest, vDest, aDest,
342
                               dstW, chrDstW, 1);
343
    } else {
344
        yuv2yuvX16inC_template(lumFilter, lumSrc, lumFilterSize,
345
                               chrFilter, chrSrc, chrFilterSize,
346
                               alpSrc,
347
                               dest, uDest, vDest, aDest,
348
                               dstW, chrDstW, 0);
349
    }
350
}
351
352 7ac40327 Ramiro Polla
static inline void yuv2yuvXinC(const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize,
353
                               const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize,
354
                               const int16_t **alpSrc, uint8_t *dest, uint8_t *uDest, uint8_t *vDest, uint8_t *aDest, int dstW, int chrDstW)
355 e3d2500f Michael Niedermayer
{
356 f40c7dbb Diego Biurrun
    //FIXME Optimize (just quickly written not optimized..)
357 221b804f Diego Biurrun
    int i;
358 dd68318c Ramiro Polla
    for (i=0; i<dstW; i++) {
359 221b804f Diego Biurrun
        int val=1<<18;
360
        int j;
361
        for (j=0; j<lumFilterSize; j++)
362
            val += lumSrc[j][i] * lumFilter[j];
363
364
        dest[i]= av_clip_uint8(val>>19);
365
    }
366
367 1b0a4572 Benoit Fouet
    if (uDest)
368 dd68318c Ramiro Polla
        for (i=0; i<chrDstW; i++) {
369 221b804f Diego Biurrun
            int u=1<<18;
370
            int v=1<<18;
371
            int j;
372 dd68318c Ramiro Polla
            for (j=0; j<chrFilterSize; j++) {
373 221b804f Diego Biurrun
                u += chrSrc[j][i] * chrFilter[j];
374 8b2fce0d Michael Niedermayer
                v += chrSrc[j][i + VOFW] * chrFilter[j];
375 221b804f Diego Biurrun
            }
376
377
            uDest[i]= av_clip_uint8(u>>19);
378
            vDest[i]= av_clip_uint8(v>>19);
379
        }
380 6858492e Cédric Schieli
381
    if (CONFIG_SWSCALE_ALPHA && aDest)
382 dd68318c Ramiro Polla
        for (i=0; i<dstW; i++) {
383 6858492e Cédric Schieli
            int val=1<<18;
384
            int j;
385
            for (j=0; j<lumFilterSize; j++)
386
                val += alpSrc[j][i] * lumFilter[j];
387
388
            aDest[i]= av_clip_uint8(val>>19);
389
        }
390
391 e3d2500f Michael Niedermayer
}
392
393 7ac40327 Ramiro Polla
static inline void yuv2nv12XinC(const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize,
394
                                const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize,
395 221b804f Diego Biurrun
                                uint8_t *dest, uint8_t *uDest, int dstW, int chrDstW, int dstFormat)
396 6118e52e Ville Syrjälä
{
397 f40c7dbb Diego Biurrun
    //FIXME Optimize (just quickly written not optimized..)
398 221b804f Diego Biurrun
    int i;
399 dd68318c Ramiro Polla
    for (i=0; i<dstW; i++) {
400 221b804f Diego Biurrun
        int val=1<<18;
401
        int j;
402
        for (j=0; j<lumFilterSize; j++)
403
            val += lumSrc[j][i] * lumFilter[j];
404
405
        dest[i]= av_clip_uint8(val>>19);
406
    }
407
408 1b0a4572 Benoit Fouet
    if (!uDest)
409 221b804f Diego Biurrun
        return;
410
411
    if (dstFormat == PIX_FMT_NV12)
412 dd68318c Ramiro Polla
        for (i=0; i<chrDstW; i++) {
413 221b804f Diego Biurrun
            int u=1<<18;
414
            int v=1<<18;
415
            int j;
416 dd68318c Ramiro Polla
            for (j=0; j<chrFilterSize; j++) {
417 221b804f Diego Biurrun
                u += chrSrc[j][i] * chrFilter[j];
418 8b2fce0d Michael Niedermayer
                v += chrSrc[j][i + VOFW] * chrFilter[j];
419 221b804f Diego Biurrun
            }
420
421
            uDest[2*i]= av_clip_uint8(u>>19);
422
            uDest[2*i+1]= av_clip_uint8(v>>19);
423
        }
424
    else
425 dd68318c Ramiro Polla
        for (i=0; i<chrDstW; i++) {
426 221b804f Diego Biurrun
            int u=1<<18;
427
            int v=1<<18;
428
            int j;
429 dd68318c Ramiro Polla
            for (j=0; j<chrFilterSize; j++) {
430 221b804f Diego Biurrun
                u += chrSrc[j][i] * chrFilter[j];
431 8b2fce0d Michael Niedermayer
                v += chrSrc[j][i + VOFW] * chrFilter[j];
432 221b804f Diego Biurrun
            }
433
434
            uDest[2*i]= av_clip_uint8(v>>19);
435
            uDest[2*i+1]= av_clip_uint8(u>>19);
436
        }
437 6118e52e Ville Syrjälä
}
438 46de8b73 Michael Niedermayer
439 6858492e Cédric Schieli
#define YSCALE_YUV_2_PACKEDX_NOCLIP_C(type,alpha) \
440 dd68318c Ramiro Polla
    for (i=0; i<(dstW>>1); i++) {\
441 221b804f Diego Biurrun
        int j;\
442
        int Y1 = 1<<18;\
443
        int Y2 = 1<<18;\
444
        int U  = 1<<18;\
445
        int V  = 1<<18;\
446 6858492e Cédric Schieli
        int av_unused A1, A2;\
447 2db27aad Carl Eugen Hoyos
        type av_unused *r, *b, *g;\
448 221b804f Diego Biurrun
        const int i2= 2*i;\
449
        \
450 dd68318c Ramiro Polla
        for (j=0; j<lumFilterSize; j++) {\
451 221b804f Diego Biurrun
            Y1 += lumSrc[j][i2] * lumFilter[j];\
452
            Y2 += lumSrc[j][i2+1] * lumFilter[j];\
453
        }\
454 dd68318c Ramiro Polla
        for (j=0; j<chrFilterSize; j++) {\
455 221b804f Diego Biurrun
            U += chrSrc[j][i] * chrFilter[j];\
456 8b2fce0d Michael Niedermayer
            V += chrSrc[j][i+VOFW] * chrFilter[j];\
457 221b804f Diego Biurrun
        }\
458
        Y1>>=19;\
459
        Y2>>=19;\
460
        U >>=19;\
461
        V >>=19;\
462 dd68318c Ramiro Polla
        if (alpha) {\
463 6858492e Cédric Schieli
            A1 = 1<<18;\
464
            A2 = 1<<18;\
465 dd68318c Ramiro Polla
            for (j=0; j<lumFilterSize; j++) {\
466 6858492e Cédric Schieli
                A1 += alpSrc[j][i2  ] * lumFilter[j];\
467
                A2 += alpSrc[j][i2+1] * lumFilter[j];\
468
            }\
469
            A1>>=19;\
470
            A2>>=19;\
471 c36a4294 Stefano Sabatini
        }
472 bdf397ba Michael Niedermayer
473 6858492e Cédric Schieli
#define YSCALE_YUV_2_PACKEDX_C(type,alpha) \
474
        YSCALE_YUV_2_PACKEDX_NOCLIP_C(type,alpha)\
475 dd68318c Ramiro Polla
        if ((Y1|Y2|U|V)&256) {\
476 221b804f Diego Biurrun
            if (Y1>255)   Y1=255; \
477
            else if (Y1<0)Y1=0;   \
478
            if (Y2>255)   Y2=255; \
479
            else if (Y2<0)Y2=0;   \
480
            if (U>255)    U=255;  \
481
            else if (U<0) U=0;    \
482
            if (V>255)    V=255;  \
483
            else if (V<0) V=0;    \
484 6858492e Cédric Schieli
        }\
485 dd68318c Ramiro Polla
        if (alpha && ((A1|A2)&256)) {\
486 6858492e Cédric Schieli
            A1=av_clip_uint8(A1);\
487
            A2=av_clip_uint8(A2);\
488 221b804f Diego Biurrun
        }
489 6a4970ab Diego Biurrun
490 6858492e Cédric Schieli
#define YSCALE_YUV_2_PACKEDX_FULL_C(rnd,alpha) \
491 dd68318c Ramiro Polla
    for (i=0; i<dstW; i++) {\
492 f0faee4c Michael Niedermayer
        int j;\
493
        int Y = 0;\
494
        int U = -128<<19;\
495
        int V = -128<<19;\
496 6858492e Cédric Schieli
        int av_unused A;\
497 f0faee4c Michael Niedermayer
        int R,G,B;\
498
        \
499 dd68318c Ramiro Polla
        for (j=0; j<lumFilterSize; j++) {\
500 f0faee4c Michael Niedermayer
            Y += lumSrc[j][i     ] * lumFilter[j];\
501
        }\
502 dd68318c Ramiro Polla
        for (j=0; j<chrFilterSize; j++) {\
503 f0faee4c Michael Niedermayer
            U += chrSrc[j][i     ] * chrFilter[j];\
504
            V += chrSrc[j][i+VOFW] * chrFilter[j];\
505
        }\
506
        Y >>=10;\
507
        U >>=10;\
508
        V >>=10;\
509 dd68318c Ramiro Polla
        if (alpha) {\
510 6858492e Cédric Schieli
            A = rnd;\
511
            for (j=0; j<lumFilterSize; j++)\
512
                A += alpSrc[j][i     ] * lumFilter[j];\
513
            A >>=19;\
514
            if (A&256)\
515
                A = av_clip_uint8(A);\
516 c36a4294 Stefano Sabatini
        }
517 f0faee4c Michael Niedermayer
518 6858492e Cédric Schieli
#define YSCALE_YUV_2_RGBX_FULL_C(rnd,alpha) \
519
    YSCALE_YUV_2_PACKEDX_FULL_C(rnd>>3,alpha)\
520 43c16478 Michael Niedermayer
        Y-= c->yuv2rgb_y_offset;\
521
        Y*= c->yuv2rgb_y_coeff;\
522 f0faee4c Michael Niedermayer
        Y+= rnd;\
523 43c16478 Michael Niedermayer
        R= Y + V*c->yuv2rgb_v2r_coeff;\
524
        G= Y + V*c->yuv2rgb_v2g_coeff + U*c->yuv2rgb_u2g_coeff;\
525
        B= Y +                          U*c->yuv2rgb_u2b_coeff;\
526 dd68318c Ramiro Polla
        if ((R|G|B)&(0xC0000000)) {\
527 f0faee4c Michael Niedermayer
            if (R>=(256<<22))   R=(256<<22)-1; \
528
            else if (R<0)R=0;   \
529
            if (G>=(256<<22))   G=(256<<22)-1; \
530
            else if (G<0)G=0;   \
531
            if (B>=(256<<22))   B=(256<<22)-1; \
532
            else if (B<0)B=0;   \
533 c36a4294 Stefano Sabatini
        }
534 f0faee4c Michael Niedermayer
535 e69bd294 Michael Niedermayer
#define YSCALE_YUV_2_GRAY16_C \
536 dd68318c Ramiro Polla
    for (i=0; i<(dstW>>1); i++) {\
537 b0880d5d Michael Niedermayer
        int j;\
538
        int Y1 = 1<<18;\
539
        int Y2 = 1<<18;\
540
        int U  = 1<<18;\
541
        int V  = 1<<18;\
542 e69bd294 Michael Niedermayer
        \
543 b0880d5d Michael Niedermayer
        const int i2= 2*i;\
544
        \
545 dd68318c Ramiro Polla
        for (j=0; j<lumFilterSize; j++) {\
546 b0880d5d Michael Niedermayer
            Y1 += lumSrc[j][i2] * lumFilter[j];\
547
            Y2 += lumSrc[j][i2+1] * lumFilter[j];\
548
        }\
549
        Y1>>=11;\
550
        Y2>>=11;\
551 dd68318c Ramiro Polla
        if ((Y1|Y2|U|V)&65536) {\
552 b0880d5d Michael Niedermayer
            if (Y1>65535)   Y1=65535; \
553
            else if (Y1<0)Y1=0;   \
554
            if (Y2>65535)   Y2=65535; \
555
            else if (Y2<0)Y2=0;   \
556
        }
557
558 6858492e Cédric Schieli
#define YSCALE_YUV_2_RGBX_C(type,alpha) \
559
    YSCALE_YUV_2_PACKEDX_C(type,alpha)  /* FIXME fix tables so that clipping is not needed and then use _NOCLIP*/\
560 221b804f Diego Biurrun
    r = (type *)c->table_rV[V];   \
561
    g = (type *)(c->table_gU[U] + c->table_gV[V]); \
562 c36a4294 Stefano Sabatini
    b = (type *)c->table_bU[U];
563 221b804f Diego Biurrun
564 6858492e Cédric Schieli
#define YSCALE_YUV_2_PACKED2_C(type,alpha)   \
565 dd68318c Ramiro Polla
    for (i=0; i<(dstW>>1); i++) { \
566 221b804f Diego Biurrun
        const int i2= 2*i;       \
567
        int Y1= (buf0[i2  ]*yalpha1+buf1[i2  ]*yalpha)>>19;           \
568
        int Y2= (buf0[i2+1]*yalpha1+buf1[i2+1]*yalpha)>>19;           \
569
        int U= (uvbuf0[i     ]*uvalpha1+uvbuf1[i     ]*uvalpha)>>19;  \
570 8b2fce0d Michael Niedermayer
        int V= (uvbuf0[i+VOFW]*uvalpha1+uvbuf1[i+VOFW]*uvalpha)>>19;  \
571 6858492e Cédric Schieli
        type av_unused *r, *b, *g;                                    \
572
        int av_unused A1, A2;                                         \
573 dd68318c Ramiro Polla
        if (alpha) {\
574 6858492e Cédric Schieli
            A1= (abuf0[i2  ]*yalpha1+abuf1[i2  ]*yalpha)>>19;         \
575
            A2= (abuf0[i2+1]*yalpha1+abuf1[i2+1]*yalpha)>>19;         \
576 c36a4294 Stefano Sabatini
        }
577 46de8b73 Michael Niedermayer
578 b0880d5d Michael Niedermayer
#define YSCALE_YUV_2_GRAY16_2_C   \
579 dd68318c Ramiro Polla
    for (i=0; i<(dstW>>1); i++) { \
580 b0880d5d Michael Niedermayer
        const int i2= 2*i;       \
581
        int Y1= (buf0[i2  ]*yalpha1+buf1[i2  ]*yalpha)>>11;           \
582 c36a4294 Stefano Sabatini
        int Y2= (buf0[i2+1]*yalpha1+buf1[i2+1]*yalpha)>>11;
583 b0880d5d Michael Niedermayer
584 6858492e Cédric Schieli
#define YSCALE_YUV_2_RGB2_C(type,alpha) \
585
    YSCALE_YUV_2_PACKED2_C(type,alpha)\
586 221b804f Diego Biurrun
    r = (type *)c->table_rV[V];\
587
    g = (type *)(c->table_gU[U] + c->table_gV[V]);\
588 c36a4294 Stefano Sabatini
    b = (type *)c->table_bU[U];
589 cf7d1c1a Michael Niedermayer
590 6858492e Cédric Schieli
#define YSCALE_YUV_2_PACKED1_C(type,alpha) \
591 dd68318c Ramiro Polla
    for (i=0; i<(dstW>>1); i++) {\
592 221b804f Diego Biurrun
        const int i2= 2*i;\
593
        int Y1= buf0[i2  ]>>7;\
594
        int Y2= buf0[i2+1]>>7;\
595
        int U= (uvbuf1[i     ])>>7;\
596 8b2fce0d Michael Niedermayer
        int V= (uvbuf1[i+VOFW])>>7;\
597 6858492e Cédric Schieli
        type av_unused *r, *b, *g;\
598
        int av_unused A1, A2;\
599 dd68318c Ramiro Polla
        if (alpha) {\
600 6858492e Cédric Schieli
            A1= abuf0[i2  ]>>7;\
601
            A2= abuf0[i2+1]>>7;\
602 c36a4294 Stefano Sabatini
        }
603 46de8b73 Michael Niedermayer
604 b0880d5d Michael Niedermayer
#define YSCALE_YUV_2_GRAY16_1_C \
605 dd68318c Ramiro Polla
    for (i=0; i<(dstW>>1); i++) {\
606 b0880d5d Michael Niedermayer
        const int i2= 2*i;\
607
        int Y1= buf0[i2  ]<<1;\
608 c36a4294 Stefano Sabatini
        int Y2= buf0[i2+1]<<1;
609 b0880d5d Michael Niedermayer
610 6858492e Cédric Schieli
#define YSCALE_YUV_2_RGB1_C(type,alpha) \
611
    YSCALE_YUV_2_PACKED1_C(type,alpha)\
612 221b804f Diego Biurrun
    r = (type *)c->table_rV[V];\
613
    g = (type *)(c->table_gU[U] + c->table_gV[V]);\
614 c36a4294 Stefano Sabatini
    b = (type *)c->table_bU[U];
615 cf7d1c1a Michael Niedermayer
616 6858492e Cédric Schieli
#define YSCALE_YUV_2_PACKED1B_C(type,alpha) \
617 dd68318c Ramiro Polla
    for (i=0; i<(dstW>>1); i++) {\
618 221b804f Diego Biurrun
        const int i2= 2*i;\
619
        int Y1= buf0[i2  ]>>7;\
620
        int Y2= buf0[i2+1]>>7;\
621
        int U= (uvbuf0[i     ] + uvbuf1[i     ])>>8;\
622 8b2fce0d Michael Niedermayer
        int V= (uvbuf0[i+VOFW] + uvbuf1[i+VOFW])>>8;\
623 6858492e Cédric Schieli
        type av_unused *r, *b, *g;\
624
        int av_unused A1, A2;\
625 dd68318c Ramiro Polla
        if (alpha) {\
626 6858492e Cédric Schieli
            A1= abuf0[i2  ]>>7;\
627
            A2= abuf0[i2+1]>>7;\
628 c36a4294 Stefano Sabatini
        }
629 46de8b73 Michael Niedermayer
630 6858492e Cédric Schieli
#define YSCALE_YUV_2_RGB1B_C(type,alpha) \
631
    YSCALE_YUV_2_PACKED1B_C(type,alpha)\
632 221b804f Diego Biurrun
    r = (type *)c->table_rV[V];\
633
    g = (type *)(c->table_gU[U] + c->table_gV[V]);\
634 c36a4294 Stefano Sabatini
    b = (type *)c->table_bU[U];
635 cf7d1c1a Michael Niedermayer
636 ec1bca2a Michael Niedermayer
#define YSCALE_YUV_2_MONO2_C \
637 e69bd294 Michael Niedermayer
    const uint8_t * const d128=dither_8x8_220[y&7];\
638
    uint8_t *g= c->table_gU[128] + c->table_gV[128];\
639 dd68318c Ramiro Polla
    for (i=0; i<dstW-7; i+=8) {\
640 e69bd294 Michael Niedermayer
        int acc;\
641
        acc =       g[((buf0[i  ]*yalpha1+buf1[i  ]*yalpha)>>19) + d128[0]];\
642
        acc+= acc + g[((buf0[i+1]*yalpha1+buf1[i+1]*yalpha)>>19) + d128[1]];\
643
        acc+= acc + g[((buf0[i+2]*yalpha1+buf1[i+2]*yalpha)>>19) + d128[2]];\
644
        acc+= acc + g[((buf0[i+3]*yalpha1+buf1[i+3]*yalpha)>>19) + d128[3]];\
645
        acc+= acc + g[((buf0[i+4]*yalpha1+buf1[i+4]*yalpha)>>19) + d128[4]];\
646
        acc+= acc + g[((buf0[i+5]*yalpha1+buf1[i+5]*yalpha)>>19) + d128[5]];\
647
        acc+= acc + g[((buf0[i+6]*yalpha1+buf1[i+6]*yalpha)>>19) + d128[6]];\
648
        acc+= acc + g[((buf0[i+7]*yalpha1+buf1[i+7]*yalpha)>>19) + d128[7]];\
649 ec1bca2a Michael Niedermayer
        ((uint8_t*)dest)[0]= c->dstFormat == PIX_FMT_MONOBLACK ? acc : ~acc;\
650 e69bd294 Michael Niedermayer
        dest++;\
651 c36a4294 Stefano Sabatini
    }
652 e69bd294 Michael Niedermayer
653 ec1bca2a Michael Niedermayer
#define YSCALE_YUV_2_MONOX_C \
654 e69bd294 Michael Niedermayer
    const uint8_t * const d128=dither_8x8_220[y&7];\
655
    uint8_t *g= c->table_gU[128] + c->table_gV[128];\
656
    int acc=0;\
657 dd68318c Ramiro Polla
    for (i=0; i<dstW-1; i+=2) {\
658 e69bd294 Michael Niedermayer
        int j;\
659
        int Y1=1<<18;\
660
        int Y2=1<<18;\
661
\
662 dd68318c Ramiro Polla
        for (j=0; j<lumFilterSize; j++) {\
663 e69bd294 Michael Niedermayer
            Y1 += lumSrc[j][i] * lumFilter[j];\
664
            Y2 += lumSrc[j][i+1] * lumFilter[j];\
665
        }\
666
        Y1>>=19;\
667
        Y2>>=19;\
668 dd68318c Ramiro Polla
        if ((Y1|Y2)&256) {\
669 e69bd294 Michael Niedermayer
            if (Y1>255)   Y1=255;\
670
            else if (Y1<0)Y1=0;\
671
            if (Y2>255)   Y2=255;\
672
            else if (Y2<0)Y2=0;\
673
        }\
674
        acc+= acc + g[Y1+d128[(i+0)&7]];\
675
        acc+= acc + g[Y2+d128[(i+1)&7]];\
676 dd68318c Ramiro Polla
        if ((i&7)==6) {\
677 ec1bca2a Michael Niedermayer
            ((uint8_t*)dest)[0]= c->dstFormat == PIX_FMT_MONOBLACK ? acc : ~acc;\
678 e69bd294 Michael Niedermayer
            dest++;\
679
        }\
680
    }
681
682
#define YSCALE_YUV_2_ANYRGB_C(func, func2, func_g16, func_monoblack)\
683 dd68318c Ramiro Polla
    switch(c->dstFormat) {\
684 68e7f482 Kostya Shishkov
    case PIX_FMT_RGB48BE:\
685
    case PIX_FMT_RGB48LE:\
686
        func(uint8_t,0)\
687
            ((uint8_t*)dest)[ 0]= r[Y1];\
688
            ((uint8_t*)dest)[ 1]= r[Y1];\
689
            ((uint8_t*)dest)[ 2]= g[Y1];\
690
            ((uint8_t*)dest)[ 3]= g[Y1];\
691
            ((uint8_t*)dest)[ 4]= b[Y1];\
692
            ((uint8_t*)dest)[ 5]= b[Y1];\
693
            ((uint8_t*)dest)[ 6]= r[Y2];\
694
            ((uint8_t*)dest)[ 7]= r[Y2];\
695
            ((uint8_t*)dest)[ 8]= g[Y2];\
696
            ((uint8_t*)dest)[ 9]= g[Y2];\
697
            ((uint8_t*)dest)[10]= b[Y2];\
698
            ((uint8_t*)dest)[11]= b[Y2];\
699
            dest+=12;\
700
        }\
701
        break;\
702 6858492e Cédric Schieli
    case PIX_FMT_RGBA:\
703
    case PIX_FMT_BGRA:\
704 dd68318c Ramiro Polla
        if (CONFIG_SMALL) {\
705 6858492e Cédric Schieli
            int needAlpha = CONFIG_SWSCALE_ALPHA && c->alpPixBuf;\
706
            func(uint32_t,needAlpha)\
707
                ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + (needAlpha ? (A1<<24) : 0);\
708
                ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + (needAlpha ? (A2<<24) : 0);\
709
            }\
710 dd68318c Ramiro Polla
        } else {\
711
            if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {\
712 6858492e Cédric Schieli
                func(uint32_t,1)\
713
                    ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + (A1<<24);\
714
                    ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + (A2<<24);\
715
                }\
716 dd68318c Ramiro Polla
            } else {\
717 6858492e Cédric Schieli
                func(uint32_t,0)\
718
                    ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1];\
719
                    ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2];\
720
                }\
721
            }\
722
        }\
723
        break;\
724
    case PIX_FMT_ARGB:\
725
    case PIX_FMT_ABGR:\
726 dd68318c Ramiro Polla
        if (CONFIG_SMALL) {\
727 6858492e Cédric Schieli
            int needAlpha = CONFIG_SWSCALE_ALPHA && c->alpPixBuf;\
728
            func(uint32_t,needAlpha)\
729
                ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + (needAlpha ? A1 : 0);\
730
                ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + (needAlpha ? A2 : 0);\
731
            }\
732 dd68318c Ramiro Polla
        } else {\
733
            if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {\
734 6858492e Cédric Schieli
                func(uint32_t,1)\
735
                    ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + A1;\
736
                    ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + A2;\
737
                }\
738 dd68318c Ramiro Polla
            } else {\
739 6858492e Cédric Schieli
                func(uint32_t,0)\
740
                    ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1];\
741
                    ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2];\
742
                }\
743
            }\
744 221b804f Diego Biurrun
        }                \
745
        break;\
746
    case PIX_FMT_RGB24:\
747 6858492e Cédric Schieli
        func(uint8_t,0)\
748 221b804f Diego Biurrun
            ((uint8_t*)dest)[0]= r[Y1];\
749
            ((uint8_t*)dest)[1]= g[Y1];\
750
            ((uint8_t*)dest)[2]= b[Y1];\
751
            ((uint8_t*)dest)[3]= r[Y2];\
752
            ((uint8_t*)dest)[4]= g[Y2];\
753
            ((uint8_t*)dest)[5]= b[Y2];\
754
            dest+=6;\
755
        }\
756
        break;\
757
    case PIX_FMT_BGR24:\
758 6858492e Cédric Schieli
        func(uint8_t,0)\
759 221b804f Diego Biurrun
            ((uint8_t*)dest)[0]= b[Y1];\
760
            ((uint8_t*)dest)[1]= g[Y1];\
761
            ((uint8_t*)dest)[2]= r[Y1];\
762
            ((uint8_t*)dest)[3]= b[Y2];\
763
            ((uint8_t*)dest)[4]= g[Y2];\
764
            ((uint8_t*)dest)[5]= r[Y2];\
765
            dest+=6;\
766
        }\
767
        break;\
768
    case PIX_FMT_RGB565:\
769
    case PIX_FMT_BGR565:\
770
        {\
771
            const int dr1= dither_2x2_8[y&1    ][0];\
772
            const int dg1= dither_2x2_4[y&1    ][0];\
773
            const int db1= dither_2x2_8[(y&1)^1][0];\
774
            const int dr2= dither_2x2_8[y&1    ][1];\
775
            const int dg2= dither_2x2_4[y&1    ][1];\
776
            const int db2= dither_2x2_8[(y&1)^1][1];\
777 6858492e Cédric Schieli
            func(uint16_t,0)\
778 221b804f Diego Biurrun
                ((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\
779
                ((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\
780
            }\
781
        }\
782
        break;\
783
    case PIX_FMT_RGB555:\
784
    case PIX_FMT_BGR555:\
785
        {\
786
            const int dr1= dither_2x2_8[y&1    ][0];\
787
            const int dg1= dither_2x2_8[y&1    ][1];\
788
            const int db1= dither_2x2_8[(y&1)^1][0];\
789
            const int dr2= dither_2x2_8[y&1    ][1];\
790
            const int dg2= dither_2x2_8[y&1    ][0];\
791
            const int db2= dither_2x2_8[(y&1)^1][1];\
792 6858492e Cédric Schieli
            func(uint16_t,0)\
793 221b804f Diego Biurrun
                ((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\
794
                ((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\
795
            }\
796
        }\
797
        break;\
798
    case PIX_FMT_RGB8:\
799
    case PIX_FMT_BGR8:\
800
        {\
801
            const uint8_t * const d64= dither_8x8_73[y&7];\
802
            const uint8_t * const d32= dither_8x8_32[y&7];\
803 6858492e Cédric Schieli
            func(uint8_t,0)\
804 221b804f Diego Biurrun
                ((uint8_t*)dest)[i2+0]= r[Y1+d32[(i2+0)&7]] + g[Y1+d32[(i2+0)&7]] + b[Y1+d64[(i2+0)&7]];\
805
                ((uint8_t*)dest)[i2+1]= r[Y2+d32[(i2+1)&7]] + g[Y2+d32[(i2+1)&7]] + b[Y2+d64[(i2+1)&7]];\
806
            }\
807
        }\
808
        break;\
809
    case PIX_FMT_RGB4:\
810
    case PIX_FMT_BGR4:\
811
        {\
812
            const uint8_t * const d64= dither_8x8_73 [y&7];\
813
            const uint8_t * const d128=dither_8x8_220[y&7];\
814 6858492e Cédric Schieli
            func(uint8_t,0)\
815 221b804f Diego Biurrun
                ((uint8_t*)dest)[i]= r[Y1+d128[(i2+0)&7]] + g[Y1+d64[(i2+0)&7]] + b[Y1+d128[(i2+0)&7]]\
816
                                 + ((r[Y2+d128[(i2+1)&7]] + g[Y2+d64[(i2+1)&7]] + b[Y2+d128[(i2+1)&7]])<<4);\
817
            }\
818
        }\
819
        break;\
820
    case PIX_FMT_RGB4_BYTE:\
821
    case PIX_FMT_BGR4_BYTE:\
822
        {\
823
            const uint8_t * const d64= dither_8x8_73 [y&7];\
824
            const uint8_t * const d128=dither_8x8_220[y&7];\
825 6858492e Cédric Schieli
            func(uint8_t,0)\
826 221b804f Diego Biurrun
                ((uint8_t*)dest)[i2+0]= r[Y1+d128[(i2+0)&7]] + g[Y1+d64[(i2+0)&7]] + b[Y1+d128[(i2+0)&7]];\
827
                ((uint8_t*)dest)[i2+1]= r[Y2+d128[(i2+1)&7]] + g[Y2+d64[(i2+1)&7]] + b[Y2+d128[(i2+1)&7]];\
828
            }\
829
        }\
830
        break;\
831
    case PIX_FMT_MONOBLACK:\
832 ec1bca2a Michael Niedermayer
    case PIX_FMT_MONOWHITE:\
833 221b804f Diego Biurrun
        {\
834 e69bd294 Michael Niedermayer
            func_monoblack\
835 221b804f Diego Biurrun
        }\
836
        break;\
837
    case PIX_FMT_YUYV422:\
838
        func2\
839
            ((uint8_t*)dest)[2*i2+0]= Y1;\
840
            ((uint8_t*)dest)[2*i2+1]= U;\
841
            ((uint8_t*)dest)[2*i2+2]= Y2;\
842
            ((uint8_t*)dest)[2*i2+3]= V;\
843
        }                \
844
        break;\
845
    case PIX_FMT_UYVY422:\
846
        func2\
847
            ((uint8_t*)dest)[2*i2+0]= U;\
848
            ((uint8_t*)dest)[2*i2+1]= Y1;\
849
            ((uint8_t*)dest)[2*i2+2]= V;\
850
            ((uint8_t*)dest)[2*i2+3]= Y2;\
851
        }                \
852
        break;\
853 b0880d5d Michael Niedermayer
    case PIX_FMT_GRAY16BE:\
854
        func_g16\
855
            ((uint8_t*)dest)[2*i2+0]= Y1>>8;\
856
            ((uint8_t*)dest)[2*i2+1]= Y1;\
857
            ((uint8_t*)dest)[2*i2+2]= Y2>>8;\
858
            ((uint8_t*)dest)[2*i2+3]= Y2;\
859
        }                \
860
        break;\
861
    case PIX_FMT_GRAY16LE:\
862
        func_g16\
863
            ((uint8_t*)dest)[2*i2+0]= Y1;\
864
            ((uint8_t*)dest)[2*i2+1]= Y1>>8;\
865
            ((uint8_t*)dest)[2*i2+2]= Y2;\
866
            ((uint8_t*)dest)[2*i2+3]= Y2>>8;\
867
        }                \
868
        break;\
869 c36a4294 Stefano Sabatini
    }
870 cf7d1c1a Michael Niedermayer
871 7ac40327 Ramiro Polla
static inline void yuv2packedXinC(SwsContext *c, const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize,
872
                                  const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize,
873
                                  const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
874 e3d2500f Michael Niedermayer
{
875 221b804f Diego Biurrun
    int i;
876 6858492e Cédric Schieli
    YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGBX_C, YSCALE_YUV_2_PACKEDX_C(void,0), YSCALE_YUV_2_GRAY16_C, YSCALE_YUV_2_MONOX_C)
877 e3d2500f Michael Niedermayer
}
878
879 7ac40327 Ramiro Polla
static inline void yuv2rgbXinC_full(SwsContext *c, const int16_t *lumFilter, const int16_t **lumSrc, int lumFilterSize,
880
                                    const int16_t *chrFilter, const int16_t **chrSrc, int chrFilterSize,
881
                                    const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
882 f0faee4c Michael Niedermayer
{
883
    int i;
884 30b61475 Stefano Sabatini
    int step= c->dstFormatBpp/8;
885 d616c8ae Michael Niedermayer
    int aidx= 3;
886 f0faee4c Michael Niedermayer
887 dd68318c Ramiro Polla
    switch(c->dstFormat) {
888 f0faee4c Michael Niedermayer
    case PIX_FMT_ARGB:
889
        dest++;
890 a3398feb Cédric Schieli
        aidx= 0;
891 f0faee4c Michael Niedermayer
    case PIX_FMT_RGB24:
892 d616c8ae Michael Niedermayer
        aidx--;
893 f0faee4c Michael Niedermayer
    case PIX_FMT_RGBA:
894 dd68318c Ramiro Polla
        if (CONFIG_SMALL) {
895 6858492e Cédric Schieli
            int needAlpha = CONFIG_SWSCALE_ALPHA && c->alpPixBuf;
896
            YSCALE_YUV_2_RGBX_FULL_C(1<<21, needAlpha)
897
                dest[aidx]= needAlpha ? A : 255;
898
                dest[0]= R>>22;
899
                dest[1]= G>>22;
900
                dest[2]= B>>22;
901
                dest+= step;
902
            }
903 dd68318c Ramiro Polla
        } else {
904
            if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {
905 6858492e Cédric Schieli
                YSCALE_YUV_2_RGBX_FULL_C(1<<21, 1)
906
                    dest[aidx]= A;
907
                    dest[0]= R>>22;
908
                    dest[1]= G>>22;
909
                    dest[2]= B>>22;
910
                    dest+= step;
911
                }
912 dd68318c Ramiro Polla
            } else {
913 6858492e Cédric Schieli
                YSCALE_YUV_2_RGBX_FULL_C(1<<21, 0)
914
                    dest[aidx]= 255;
915
                    dest[0]= R>>22;
916
                    dest[1]= G>>22;
917
                    dest[2]= B>>22;
918
                    dest+= step;
919
                }
920
            }
921 f0faee4c Michael Niedermayer
        }
922
        break;
923
    case PIX_FMT_ABGR:
924
        dest++;
925 a3398feb Cédric Schieli
        aidx= 0;
926 f0faee4c Michael Niedermayer
    case PIX_FMT_BGR24:
927 d616c8ae Michael Niedermayer
        aidx--;
928 f0faee4c Michael Niedermayer
    case PIX_FMT_BGRA:
929 dd68318c Ramiro Polla
        if (CONFIG_SMALL) {
930 6858492e Cédric Schieli
            int needAlpha = CONFIG_SWSCALE_ALPHA && c->alpPixBuf;
931
            YSCALE_YUV_2_RGBX_FULL_C(1<<21, needAlpha)
932
                dest[aidx]= needAlpha ? A : 255;
933
                dest[0]= B>>22;
934
                dest[1]= G>>22;
935
                dest[2]= R>>22;
936
                dest+= step;
937
            }
938 dd68318c Ramiro Polla
        } else {
939
            if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {
940 6858492e Cédric Schieli
                YSCALE_YUV_2_RGBX_FULL_C(1<<21, 1)
941
                    dest[aidx]= A;
942
                    dest[0]= B>>22;
943
                    dest[1]= G>>22;
944
                    dest[2]= R>>22;
945
                    dest+= step;
946
                }
947 dd68318c Ramiro Polla
            } else {
948 6858492e Cédric Schieli
                YSCALE_YUV_2_RGBX_FULL_C(1<<21, 0)
949
                    dest[aidx]= 255;
950
                    dest[0]= B>>22;
951
                    dest[1]= G>>22;
952
                    dest[2]= R>>22;
953
                    dest+= step;
954
                }
955
            }
956 f0faee4c Michael Niedermayer
        }
957
        break;
958
    default:
959
        assert(0);
960
    }
961
}
962 e3d2500f Michael Niedermayer
963 dd68318c Ramiro Polla
static void fillPlane(uint8_t* plane, int stride, int width, int height, int y, uint8_t val)
964
{
965 d4da3e47 Cédric Schieli
    int i;
966
    uint8_t *ptr = plane + stride*y;
967 dd68318c Ramiro Polla
    for (i=0; i<height; i++) {
968 d4da3e47 Cédric Schieli
        memset(ptr, val, width);
969
        ptr += stride;
970
    }
971
}
972
973 a3e35e28 Ramiro Polla
static inline void rgb48ToY(uint8_t *dst, const uint8_t *src, int width,
974
                            uint32_t *unused)
975 e8417235 Kostya Shishkov
{
976
    int i;
977
    for (i = 0; i < width; i++) {
978
        int r = src[i*6+0];
979
        int g = src[i*6+2];
980
        int b = src[i*6+4];
981
982
        dst[i] = (RY*r + GY*g + BY*b + (33<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
983
    }
984
}
985
986
static inline void rgb48ToUV(uint8_t *dstU, uint8_t *dstV,
987 efc034cc Ramiro Polla
                             const uint8_t *src1, const uint8_t *src2,
988
                             int width, uint32_t *unused)
989 e8417235 Kostya Shishkov
{
990
    int i;
991
    assert(src1==src2);
992
    for (i = 0; i < width; i++) {
993
        int r = src1[6*i + 0];
994
        int g = src1[6*i + 2];
995
        int b = src1[6*i + 4];
996
997
        dstU[i] = (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
998
        dstV[i] = (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
999
    }
1000
}
1001
1002
static inline void rgb48ToUV_half(uint8_t *dstU, uint8_t *dstV,
1003 efc034cc Ramiro Polla
                                  const uint8_t *src1, const uint8_t *src2,
1004
                                  int width, uint32_t *unused)
1005 e8417235 Kostya Shishkov
{
1006
    int i;
1007
    assert(src1==src2);
1008
    for (i = 0; i < width; i++) {
1009
        int r= src1[12*i + 0] + src1[12*i + 6];
1010
        int g= src1[12*i + 2] + src1[12*i + 8];
1011
        int b= src1[12*i + 4] + src1[12*i + 10];
1012
1013
        dstU[i]= (RU*r + GU*g + BU*b + (257<<RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT+1);
1014
        dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT+1);
1015
    }
1016
}
1017
1018 80704c47 Kostya Shishkov
#define BGR2Y(type, name, shr, shg, shb, maskr, maskg, maskb, RY, GY, BY, S)\
1019
static inline void name(uint8_t *dst, const uint8_t *src, long width, uint32_t *unused)\
1020
{\
1021
    int i;\
1022 dd68318c Ramiro Polla
    for (i=0; i<width; i++) {\
1023 80704c47 Kostya Shishkov
        int b= (((const type*)src)[i]>>shb)&maskb;\
1024
        int g= (((const type*)src)[i]>>shg)&maskg;\
1025
        int r= (((const type*)src)[i]>>shr)&maskr;\
1026
\
1027
        dst[i]= (((RY)*r + (GY)*g + (BY)*b + (33<<((S)-1)))>>(S));\
1028
    }\
1029
}
1030
1031
BGR2Y(uint32_t, bgr32ToY,16, 0, 0, 0x00FF, 0xFF00, 0x00FF, RY<< 8, GY   , BY<< 8, RGB2YUV_SHIFT+8)
1032
BGR2Y(uint32_t, rgb32ToY, 0, 0,16, 0x00FF, 0xFF00, 0x00FF, RY<< 8, GY   , BY<< 8, RGB2YUV_SHIFT+8)
1033
BGR2Y(uint16_t, bgr16ToY, 0, 0, 0, 0x001F, 0x07E0, 0xF800, RY<<11, GY<<5, BY    , RGB2YUV_SHIFT+8)
1034
BGR2Y(uint16_t, bgr15ToY, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, RY<<10, GY<<5, BY    , RGB2YUV_SHIFT+7)
1035
BGR2Y(uint16_t, rgb16ToY, 0, 0, 0, 0xF800, 0x07E0, 0x001F, RY    , GY<<5, BY<<11, RGB2YUV_SHIFT+8)
1036
BGR2Y(uint16_t, rgb15ToY, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, RY    , GY<<5, BY<<10, RGB2YUV_SHIFT+7)
1037
1038 dd68318c Ramiro Polla
static inline void abgrToA(uint8_t *dst, const uint8_t *src, long width, uint32_t *unused)
1039
{
1040 80704c47 Kostya Shishkov
    int i;
1041 dd68318c Ramiro Polla
    for (i=0; i<width; i++) {
1042 80704c47 Kostya Shishkov
        dst[i]= src[4*i];
1043
    }
1044
}
1045
1046
#define BGR2UV(type, name, shr, shg, shb, maska, maskr, maskg, maskb, RU, GU, BU, RV, GV, BV, S)\
1047
static inline void name(uint8_t *dstU, uint8_t *dstV, const uint8_t *src, const uint8_t *dummy, long width, uint32_t *unused)\
1048
{\
1049
    int i;\
1050 dd68318c Ramiro Polla
    for (i=0; i<width; i++) {\
1051 80704c47 Kostya Shishkov
        int b= (((const type*)src)[i]&maskb)>>shb;\
1052
        int g= (((const type*)src)[i]&maskg)>>shg;\
1053
        int r= (((const type*)src)[i]&maskr)>>shr;\
1054
\
1055
        dstU[i]= ((RU)*r + (GU)*g + (BU)*b + (257<<((S)-1)))>>(S);\
1056
        dstV[i]= ((RV)*r + (GV)*g + (BV)*b + (257<<((S)-1)))>>(S);\
1057
    }\
1058
}\
1059
static inline void name ## _half(uint8_t *dstU, uint8_t *dstV, const uint8_t *src, const uint8_t *dummy, long width, uint32_t *unused)\
1060
{\
1061
    int i;\
1062 dd68318c Ramiro Polla
    for (i=0; i<width; i++) {\
1063 80704c47 Kostya Shishkov
        int pix0= ((const type*)src)[2*i+0];\
1064
        int pix1= ((const type*)src)[2*i+1];\
1065
        int g= (pix0&~(maskr|maskb))+(pix1&~(maskr|maskb));\
1066
        int b= ((pix0+pix1-g)&(maskb|(2*maskb)))>>shb;\
1067
        int r= ((pix0+pix1-g)&(maskr|(2*maskr)))>>shr;\
1068
        g&= maskg|(2*maskg);\
1069
\
1070
        g>>=shg;\
1071
\
1072
        dstU[i]= ((RU)*r + (GU)*g + (BU)*b + (257<<(S)))>>((S)+1);\
1073
        dstV[i]= ((RV)*r + (GV)*g + (BV)*b + (257<<(S)))>>((S)+1);\
1074
    }\
1075
}
1076
1077
BGR2UV(uint32_t, bgr32ToUV,16, 0, 0, 0xFF000000, 0xFF0000, 0xFF00,   0x00FF, RU<< 8, GU   , BU<< 8, RV<< 8, GV   , BV<< 8, RGB2YUV_SHIFT+8)
1078
BGR2UV(uint32_t, rgb32ToUV, 0, 0,16, 0xFF000000,   0x00FF, 0xFF00, 0xFF0000, RU<< 8, GU   , BU<< 8, RV<< 8, GV   , BV<< 8, RGB2YUV_SHIFT+8)
1079
BGR2UV(uint16_t, bgr16ToUV, 0, 0, 0,          0,   0x001F, 0x07E0,   0xF800, RU<<11, GU<<5, BU    , RV<<11, GV<<5, BV    , RGB2YUV_SHIFT+8)
1080
BGR2UV(uint16_t, bgr15ToUV, 0, 0, 0,          0,   0x001F, 0x03E0,   0x7C00, RU<<10, GU<<5, BU    , RV<<10, GV<<5, BV    , RGB2YUV_SHIFT+7)
1081
BGR2UV(uint16_t, rgb16ToUV, 0, 0, 0,          0,   0xF800, 0x07E0,   0x001F, RU    , GU<<5, BU<<11, RV    , GV<<5, BV<<11, RGB2YUV_SHIFT+8)
1082
BGR2UV(uint16_t, rgb15ToUV, 0, 0, 0,          0,   0x7C00, 0x03E0,   0x001F, RU    , GU<<5, BU<<10, RV    , GV<<5, BV<<10, RGB2YUV_SHIFT+7)
1083
1084
static inline void palToY(uint8_t *dst, const uint8_t *src, long width, uint32_t *pal)
1085
{
1086
    int i;
1087 dd68318c Ramiro Polla
    for (i=0; i<width; i++) {
1088 80704c47 Kostya Shishkov
        int d= src[i];
1089
1090
        dst[i]= pal[d] & 0xFF;
1091
    }
1092
}
1093
1094
static inline void palToUV(uint8_t *dstU, uint8_t *dstV,
1095
                           const uint8_t *src1, const uint8_t *src2,
1096
                           long width, uint32_t *pal)
1097
{
1098
    int i;
1099
    assert(src1 == src2);
1100 dd68318c Ramiro Polla
    for (i=0; i<width; i++) {
1101 80704c47 Kostya Shishkov
        int p= pal[src1[i]];
1102
1103
        dstU[i]= p>>8;
1104
        dstV[i]= p>>16;
1105
    }
1106
}
1107
1108
static inline void monowhite2Y(uint8_t *dst, const uint8_t *src, long width, uint32_t *unused)
1109
{
1110
    int i, j;
1111 dd68318c Ramiro Polla
    for (i=0; i<width/8; i++) {
1112 80704c47 Kostya Shishkov
        int d= ~src[i];
1113
        for(j=0; j<8; j++)
1114
            dst[8*i+j]= ((d>>(7-j))&1)*255;
1115
    }
1116
}
1117
1118
static inline void monoblack2Y(uint8_t *dst, const uint8_t *src, long width, uint32_t *unused)
1119
{
1120
    int i, j;
1121 dd68318c Ramiro Polla
    for (i=0; i<width/8; i++) {
1122 80704c47 Kostya Shishkov
        int d= src[i];
1123
        for(j=0; j<8; j++)
1124
            dst[8*i+j]= ((d>>(7-j))&1)*255;
1125
    }
1126
}
1127
1128 dd409025 Ramiro Polla
//Note: we have C, MMX, MMX2, 3DNOW versions, there is no 3DNOW+MMX2 one
1129 7630f2e0 Michael Niedermayer
//Plain C versions
1130 8b1a6441 Diego Biurrun
#if ((!HAVE_MMX || !CONFIG_GPL) && !HAVE_ALTIVEC) || CONFIG_RUNTIME_CPUDETECT
1131 726a959a Michael Niedermayer
#define COMPILE_C
1132
#endif
1133
1134 b63f641e Aurelien Jacobs
#if ARCH_PPC
1135 57f6d52a Diego Biurrun
#if HAVE_ALTIVEC || CONFIG_RUNTIME_CPUDETECT
1136 a2faa401 Romain Dolbeau
#define COMPILE_ALTIVEC
1137 7a24ec50 Diego Biurrun
#endif
1138 cb82a073 Diego Biurrun
#endif //ARCH_PPC
1139 a2faa401 Romain Dolbeau
1140 b63f641e Aurelien Jacobs
#if ARCH_X86
1141 726a959a Michael Niedermayer
1142 10a7d216 Ramiro Polla
#if ((HAVE_MMX && !HAVE_AMD3DNOW && !HAVE_MMX2) || CONFIG_RUNTIME_CPUDETECT) && CONFIG_GPL
1143 726a959a Michael Niedermayer
#define COMPILE_MMX
1144
#endif
1145
1146 10a7d216 Ramiro Polla
#if (HAVE_MMX2 || CONFIG_RUNTIME_CPUDETECT) && CONFIG_GPL
1147 726a959a Michael Niedermayer
#define COMPILE_MMX2
1148
#endif
1149
1150 10a7d216 Ramiro Polla
#if ((HAVE_AMD3DNOW && !HAVE_MMX2) || CONFIG_RUNTIME_CPUDETECT) && CONFIG_GPL
1151 726a959a Michael Niedermayer
#define COMPILE_3DNOW
1152
#endif
1153 7a24ec50 Diego Biurrun
#endif //ARCH_X86
1154 726a959a Michael Niedermayer
1155 94daf2e9 Ramiro Polla
#define COMPILE_TEMPLATE_MMX 0
1156
#define COMPILE_TEMPLATE_MMX2 0
1157
#define COMPILE_TEMPLATE_AMD3DNOW 0
1158
#define COMPILE_TEMPLATE_ALTIVEC 0
1159 726a959a Michael Niedermayer
1160
#ifdef COMPILE_C
1161 7630f2e0 Michael Niedermayer
#define RENAME(a) a ## _C
1162
#include "swscale_template.c"
1163 726a959a Michael Niedermayer
#endif
1164 397c035e Michael Niedermayer
1165 a2faa401 Romain Dolbeau
#ifdef COMPILE_ALTIVEC
1166
#undef RENAME
1167 94daf2e9 Ramiro Polla
#undef COMPILE_TEMPLATE_ALTIVEC
1168
#define COMPILE_TEMPLATE_ALTIVEC 1
1169 a2faa401 Romain Dolbeau
#define RENAME(a) a ## _altivec
1170
#include "swscale_template.c"
1171
#endif
1172
1173 b63f641e Aurelien Jacobs
#if ARCH_X86
1174 397c035e Michael Niedermayer
1175 7630f2e0 Michael Niedermayer
//MMX versions
1176 726a959a Michael Niedermayer
#ifdef COMPILE_MMX
1177 7630f2e0 Michael Niedermayer
#undef RENAME
1178 94daf2e9 Ramiro Polla
#undef COMPILE_TEMPLATE_MMX
1179
#undef COMPILE_TEMPLATE_MMX2
1180
#undef COMPILE_TEMPLATE_AMD3DNOW
1181
#define COMPILE_TEMPLATE_MMX 1
1182
#define COMPILE_TEMPLATE_MMX2 0
1183
#define COMPILE_TEMPLATE_AMD3DNOW 0
1184 7630f2e0 Michael Niedermayer
#define RENAME(a) a ## _MMX
1185
#include "swscale_template.c"
1186 726a959a Michael Niedermayer
#endif
1187 7630f2e0 Michael Niedermayer
1188
//MMX2 versions
1189 726a959a Michael Niedermayer
#ifdef COMPILE_MMX2
1190 7630f2e0 Michael Niedermayer
#undef RENAME
1191 94daf2e9 Ramiro Polla
#undef COMPILE_TEMPLATE_MMX
1192
#undef COMPILE_TEMPLATE_MMX2
1193
#undef COMPILE_TEMPLATE_AMD3DNOW
1194
#define COMPILE_TEMPLATE_MMX 1
1195
#define COMPILE_TEMPLATE_MMX2 1
1196
#define COMPILE_TEMPLATE_AMD3DNOW 0
1197 7630f2e0 Michael Niedermayer
#define RENAME(a) a ## _MMX2
1198
#include "swscale_template.c"
1199 726a959a Michael Niedermayer
#endif
1200 7630f2e0 Michael Niedermayer
1201
//3DNOW versions
1202 726a959a Michael Niedermayer
#ifdef COMPILE_3DNOW
1203 7630f2e0 Michael Niedermayer
#undef RENAME
1204 94daf2e9 Ramiro Polla
#undef COMPILE_TEMPLATE_MMX
1205
#undef COMPILE_TEMPLATE_MMX2
1206
#undef COMPILE_TEMPLATE_AMD3DNOW
1207
#define COMPILE_TEMPLATE_MMX 1
1208
#define COMPILE_TEMPLATE_MMX2 0
1209
#define COMPILE_TEMPLATE_AMD3DNOW 1
1210 7630f2e0 Michael Niedermayer
#define RENAME(a) a ## _3DNow
1211
#include "swscale_template.c"
1212 726a959a Michael Niedermayer
#endif
1213 7630f2e0 Michael Niedermayer
1214 7a24ec50 Diego Biurrun
#endif //ARCH_X86
1215 7630f2e0 Michael Niedermayer
1216 a4388ebd Ramiro Polla
SwsFunc ff_getSwsFunc(SwsContext *c)
1217 14d5c18c Ramiro Polla
{
1218 8b1a6441 Diego Biurrun
#if CONFIG_RUNTIME_CPUDETECT
1219 40fa5140 Ramiro Polla
    int flags = c->flags;
1220 6a4970ab Diego Biurrun
1221 8b1a6441 Diego Biurrun
#if ARCH_X86 && CONFIG_GPL
1222 c14731d8 Reimar Döffinger
    // ordered per speed fastest first
1223 14d5c18c Ramiro Polla
    if (flags & SWS_CPU_CAPS_MMX2) {
1224 40fa5140 Ramiro Polla
        sws_init_swScale_MMX2(c);
1225 221b804f Diego Biurrun
        return swScale_MMX2;
1226 14d5c18c Ramiro Polla
    } else if (flags & SWS_CPU_CAPS_3DNOW) {
1227 40fa5140 Ramiro Polla
        sws_init_swScale_3DNow(c);
1228 221b804f Diego Biurrun
        return swScale_3DNow;
1229 14d5c18c Ramiro Polla
    } else if (flags & SWS_CPU_CAPS_MMX) {
1230 40fa5140 Ramiro Polla
        sws_init_swScale_MMX(c);
1231 221b804f Diego Biurrun
        return swScale_MMX;
1232 730cb9da Stefano Sabatini
    } else {
1233
        sws_init_swScale_C(c);
1234
        return swScale_C;
1235 14d5c18c Ramiro Polla
    }
1236 730cb9da Stefano Sabatini
1237 28bf81c9 Michael Niedermayer
#else
1238 b63f641e Aurelien Jacobs
#if ARCH_PPC
1239 14d5c18c Ramiro Polla
    if (flags & SWS_CPU_CAPS_ALTIVEC) {
1240 40fa5140 Ramiro Polla
        sws_init_swScale_altivec(c);
1241 221b804f Diego Biurrun
        return swScale_altivec;
1242 730cb9da Stefano Sabatini
    } else {
1243
        sws_init_swScale_C(c);
1244
        return swScale_C;
1245 14d5c18c Ramiro Polla
    }
1246 a2faa401 Romain Dolbeau
#endif
1247 730cb9da Stefano Sabatini
    sws_init_swScale_C(c);
1248
    return swScale_C;
1249 8b1a6441 Diego Biurrun
#endif /* ARCH_X86 && CONFIG_GPL */
1250 10a7d216 Ramiro Polla
#else //CONFIG_RUNTIME_CPUDETECT
1251 94daf2e9 Ramiro Polla
#if   COMPILE_TEMPLATE_MMX2
1252 40fa5140 Ramiro Polla
    sws_init_swScale_MMX2(c);
1253 221b804f Diego Biurrun
    return swScale_MMX2;
1254 94daf2e9 Ramiro Polla
#elif COMPILE_TEMPLATE_AMD3DNOW
1255 40fa5140 Ramiro Polla
    sws_init_swScale_3DNow(c);
1256 221b804f Diego Biurrun
    return swScale_3DNow;
1257 94daf2e9 Ramiro Polla
#elif COMPILE_TEMPLATE_MMX
1258 40fa5140 Ramiro Polla
    sws_init_swScale_MMX(c);
1259 221b804f Diego Biurrun
    return swScale_MMX;
1260 94daf2e9 Ramiro Polla
#elif COMPILE_TEMPLATE_ALTIVEC
1261 40fa5140 Ramiro Polla
    sws_init_swScale_altivec(c);
1262 221b804f Diego Biurrun
    return swScale_altivec;
1263 730cb9da Stefano Sabatini
#else
1264 80853cfc Stefano Sabatini
    sws_init_swScale_C(c);
1265
    return swScale_C;
1266 730cb9da Stefano Sabatini
#endif
1267
#endif //!CONFIG_RUNTIME_CPUDETECT
1268 31190492 Arpi
}
1269 7630f2e0 Michael Niedermayer
1270 3ece3e52 Stefano Sabatini
static int planarToNv12Wrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1271 dd68318c Ramiro Polla
                               int srcSliceH, uint8_t* dstParam[], int dstStride[])
1272
{
1273 221b804f Diego Biurrun
    uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY;
1274
    /* Copy Y plane */
1275
    if (dstStride[0]==srcStride[0] && srcStride[0] > 0)
1276
        memcpy(dst, src[0], srcSliceH*dstStride[0]);
1277 dd68318c Ramiro Polla
    else {
1278 221b804f Diego Biurrun
        int i;
1279 7ac40327 Ramiro Polla
        const uint8_t *srcPtr= src[0];
1280 221b804f Diego Biurrun
        uint8_t *dstPtr= dst;
1281 dd68318c Ramiro Polla
        for (i=0; i<srcSliceH; i++) {
1282 221b804f Diego Biurrun
            memcpy(dstPtr, srcPtr, c->srcW);
1283
            srcPtr+= srcStride[0];
1284
            dstPtr+= dstStride[0];
1285
        }
1286
    }
1287
    dst = dstParam[1] + dstStride[1]*srcSliceY/2;
1288
    if (c->dstFormat == PIX_FMT_NV12)
1289 30c48a0a Benoit Fouet
        interleaveBytes(src[1], src[2], dst, c->srcW/2, srcSliceH/2, srcStride[1], srcStride[2], dstStride[0]);
1290 221b804f Diego Biurrun
    else
1291 30c48a0a Benoit Fouet
        interleaveBytes(src[2], src[1], dst, c->srcW/2, srcSliceH/2, srcStride[2], srcStride[1], dstStride[0]);
1292 221b804f Diego Biurrun
1293
    return srcSliceH;
1294 0d9f3d85 Arpi
}
1295
1296 3ece3e52 Stefano Sabatini
static int planarToYuy2Wrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1297 dd68318c Ramiro Polla
                               int srcSliceH, uint8_t* dstParam[], int dstStride[])
1298
{
1299 221b804f Diego Biurrun
    uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY;
1300 0d9f3d85 Arpi
1301 30c48a0a Benoit Fouet
    yv12toyuy2(src[0], src[1], src[2], dst, c->srcW, srcSliceH, srcStride[0], srcStride[1], dstStride[0]);
1302 fccb9b2b Michael Niedermayer
1303 221b804f Diego Biurrun
    return srcSliceH;
1304 0d9f3d85 Arpi
}
1305
1306 3ece3e52 Stefano Sabatini
static int planarToUyvyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1307 dd68318c Ramiro Polla
                               int srcSliceH, uint8_t* dstParam[], int dstStride[])
1308
{
1309 221b804f Diego Biurrun
    uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY;
1310 caeaabe7 Alex Beregszaszi
1311 30c48a0a Benoit Fouet
    yv12touyvy(src[0], src[1], src[2], dst, c->srcW, srcSliceH, srcStride[0], srcStride[1], dstStride[0]);
1312 caeaabe7 Alex Beregszaszi
1313 221b804f Diego Biurrun
    return srcSliceH;
1314 caeaabe7 Alex Beregszaszi
}
1315
1316 3ece3e52 Stefano Sabatini
static int yuv422pToYuy2Wrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1317 dd68318c Ramiro Polla
                                int srcSliceH, uint8_t* dstParam[], int dstStride[])
1318
{
1319 a6100f39 Baptiste Coudurier
    uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY;
1320
1321
    yuv422ptoyuy2(src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStride[1],dstStride[0]);
1322
1323
    return srcSliceH;
1324
}
1325
1326 3ece3e52 Stefano Sabatini
static int yuv422pToUyvyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1327 dd68318c Ramiro Polla
                                int srcSliceH, uint8_t* dstParam[], int dstStride[])
1328
{
1329 a6100f39 Baptiste Coudurier
    uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY;
1330
1331
    yuv422ptouyvy(src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStride[1],dstStride[0]);
1332
1333
    return srcSliceH;
1334
}
1335
1336 3ece3e52 Stefano Sabatini
static int yuyvToYuv420Wrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1337 dd68318c Ramiro Polla
                               int srcSliceH, uint8_t* dstParam[], int dstStride[])
1338
{
1339 0411072e Michael Niedermayer
    uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY;
1340
    uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY/2;
1341
    uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY/2;
1342
1343
    yuyvtoyuv420(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dstStride[1], srcStride[0]);
1344
1345 4626ee1a Cédric Schieli
    if (dstParam[3])
1346
        fillPlane(dstParam[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255);
1347
1348 0411072e Michael Niedermayer
    return srcSliceH;
1349
}
1350
1351 3ece3e52 Stefano Sabatini
static int yuyvToYuv422Wrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1352 dd68318c Ramiro Polla
                               int srcSliceH, uint8_t* dstParam[], int dstStride[])
1353
{
1354 0411072e Michael Niedermayer
    uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY;
1355 72ef3dd7 Michael Niedermayer
    uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY;
1356
    uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY;
1357 0411072e Michael Niedermayer
1358
    yuyvtoyuv422(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dstStride[1], srcStride[0]);
1359
1360
    return srcSliceH;
1361
}
1362
1363 3ece3e52 Stefano Sabatini
static int uyvyToYuv420Wrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1364 dd68318c Ramiro Polla
                               int srcSliceH, uint8_t* dstParam[], int dstStride[])
1365
{
1366 0411072e Michael Niedermayer
    uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY;
1367
    uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY/2;
1368
    uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY/2;
1369
1370
    uyvytoyuv420(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dstStride[1], srcStride[0]);
1371
1372 4626ee1a Cédric Schieli
    if (dstParam[3])
1373
        fillPlane(dstParam[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255);
1374
1375 0411072e Michael Niedermayer
    return srcSliceH;
1376
}
1377
1378 3ece3e52 Stefano Sabatini
static int uyvyToYuv422Wrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1379 dd68318c Ramiro Polla
                               int srcSliceH, uint8_t* dstParam[], int dstStride[])
1380
{
1381 0411072e Michael Niedermayer
    uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY;
1382 72ef3dd7 Michael Niedermayer
    uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY;
1383
    uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY;
1384 0411072e Michael Niedermayer
1385
    uyvytoyuv422(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dstStride[1], srcStride[0]);
1386
1387
    return srcSliceH;
1388
}
1389
1390 3ece3e52 Stefano Sabatini
static int palToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1391 909f6594 Stefano Sabatini
                           int srcSliceH, uint8_t* dst[], int dstStride[])
1392 dd68318c Ramiro Polla
{
1393 f5a2c981 Carl Eugen Hoyos
    const enum PixelFormat srcFormat= c->srcFormat;
1394
    const enum PixelFormat dstFormat= c->dstFormat;
1395 49004617 Vitor Sessak
    void (*conv)(const uint8_t *src, uint8_t *dst, long num_pixels,
1396
                 const uint8_t *palette)=NULL;
1397
    int i;
1398
    uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY;
1399 a959e247 Zuxy Meng
    const uint8_t *srcPtr= src[0];
1400 49004617 Vitor Sessak
1401 398c193d Stefano Sabatini
    if (usePal(srcFormat)) {
1402 e36a545d Stefano Sabatini
        switch (dstFormat) {
1403
        case PIX_FMT_RGB32  : conv = palette8topacked32; break;
1404
        case PIX_FMT_BGR32  : conv = palette8topacked32; break;
1405
        case PIX_FMT_BGR32_1: conv = palette8topacked32; break;
1406
        case PIX_FMT_RGB32_1: conv = palette8topacked32; break;
1407
        case PIX_FMT_RGB24  : conv = palette8topacked24; break;
1408
        case PIX_FMT_BGR24  : conv = palette8topacked24; break;
1409
        }
1410 c0d1dc1c Stefano Sabatini
    }
1411 49004617 Vitor Sessak
1412 398c193d Stefano Sabatini
    if (!conv)
1413
        av_log(c, AV_LOG_ERROR, "internal error %s -> %s converter\n",
1414
               sws_format_name(srcFormat), sws_format_name(dstFormat));
1415
    else {
1416 e36a545d Stefano Sabatini
        for (i=0; i<srcSliceH; i++) {
1417
            conv(srcPtr, dstPtr, c->srcW, (uint8_t *) c->pal_rgb);
1418
            srcPtr+= srcStride[0];
1419
            dstPtr+= dstStride[0];
1420
        }
1421 398c193d Stefano Sabatini
    }
1422 49004617 Vitor Sessak
1423
    return srcSliceH;
1424
}
1425
1426 82e5f86b Stefano Sabatini
#define isRGBA32(x) (            \
1427
           (x) == PIX_FMT_ARGB   \
1428
        || (x) == PIX_FMT_RGBA   \
1429
        || (x) == PIX_FMT_BGRA   \
1430
        || (x) == PIX_FMT_ABGR   \
1431
        )
1432
1433 9990e426 Michael Niedermayer
/* {RGB,BGR}{15,16,24,32,32_1} -> {RGB,BGR}{15,16,24,32} */
1434 3ece3e52 Stefano Sabatini
static int rgbToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1435 909f6594 Stefano Sabatini
                           int srcSliceH, uint8_t* dst[], int dstStride[])
1436 dd68318c Ramiro Polla
{
1437 58e4b706 Carl Eugen Hoyos
    const enum PixelFormat srcFormat= c->srcFormat;
1438
    const enum PixelFormat dstFormat= c->dstFormat;
1439 30b61475 Stefano Sabatini
    const int srcBpp= (c->srcFormatBpp + 7) >> 3;
1440
    const int dstBpp= (c->dstFormatBpp + 7) >> 3;
1441
    const int srcId= c->srcFormatBpp >> 2; /* 1:0, 4:1, 8:2, 15:3, 16:4, 24:6, 32:8 */
1442
    const int dstId= c->dstFormatBpp >> 2;
1443 221b804f Diego Biurrun
    void (*conv)(const uint8_t *src, uint8_t *dst, long src_size)=NULL;
1444
1445 82e5f86b Stefano Sabatini
#define CONV_IS(src, dst) (srcFormat == PIX_FMT_##src && dstFormat == PIX_FMT_##dst)
1446
1447
    if (isRGBA32(srcFormat) && isRGBA32(dstFormat)) {
1448
        if (     CONV_IS(ABGR, RGBA)
1449
              || CONV_IS(ARGB, BGRA)
1450
              || CONV_IS(BGRA, ARGB)
1451
              || CONV_IS(RGBA, ABGR)) conv = shuffle_bytes_3210;
1452
        else if (CONV_IS(ABGR, ARGB)
1453
              || CONV_IS(ARGB, ABGR)) conv = shuffle_bytes_0321;
1454
        else if (CONV_IS(ABGR, BGRA)
1455
              || CONV_IS(ARGB, RGBA)) conv = shuffle_bytes_1230;
1456
        else if (CONV_IS(BGRA, RGBA)
1457
              || CONV_IS(RGBA, BGRA)) conv = shuffle_bytes_2103;
1458
        else if (CONV_IS(BGRA, ABGR)
1459
              || CONV_IS(RGBA, ARGB)) conv = shuffle_bytes_3012;
1460
    } else
1461 221b804f Diego Biurrun
    /* BGR -> BGR */
1462 3b1ee703 Michael Niedermayer
    if (  (isBGRinInt(srcFormat) && isBGRinInt(dstFormat))
1463
       || (isRGBinInt(srcFormat) && isRGBinInt(dstFormat))) {
1464 dd68318c Ramiro Polla
        switch(srcId | (dstId<<4)) {
1465 221b804f Diego Biurrun
        case 0x34: conv= rgb16to15; break;
1466
        case 0x36: conv= rgb24to15; break;
1467
        case 0x38: conv= rgb32to15; break;
1468
        case 0x43: conv= rgb15to16; break;
1469
        case 0x46: conv= rgb24to16; break;
1470
        case 0x48: conv= rgb32to16; break;
1471
        case 0x63: conv= rgb15to24; break;
1472
        case 0x64: conv= rgb16to24; break;
1473
        case 0x68: conv= rgb32to24; break;
1474
        case 0x83: conv= rgb15to32; break;
1475
        case 0x84: conv= rgb16to32; break;
1476
        case 0x86: conv= rgb24to32; break;
1477
        }
1478 3b1ee703 Michael Niedermayer
    } else if (  (isBGRinInt(srcFormat) && isRGBinInt(dstFormat))
1479
             || (isRGBinInt(srcFormat) && isBGRinInt(dstFormat))) {
1480 dd68318c Ramiro Polla
        switch(srcId | (dstId<<4)) {
1481 221b804f Diego Biurrun
        case 0x33: conv= rgb15tobgr15; break;
1482
        case 0x34: conv= rgb16tobgr15; break;
1483
        case 0x36: conv= rgb24tobgr15; break;
1484
        case 0x38: conv= rgb32tobgr15; break;
1485
        case 0x43: conv= rgb15tobgr16; break;
1486
        case 0x44: conv= rgb16tobgr16; break;
1487
        case 0x46: conv= rgb24tobgr16; break;
1488
        case 0x48: conv= rgb32tobgr16; break;
1489
        case 0x63: conv= rgb15tobgr24; break;
1490
        case 0x64: conv= rgb16tobgr24; break;
1491
        case 0x66: conv= rgb24tobgr24; break;
1492
        case 0x68: conv= rgb32tobgr24; break;
1493
        case 0x83: conv= rgb15tobgr32; break;
1494
        case 0x84: conv= rgb16tobgr32; break;
1495
        case 0x86: conv= rgb24tobgr32; break;
1496
        }
1497
    }
1498
1499 9a180390 Stefano Sabatini
    if (!conv) {
1500
        av_log(c, AV_LOG_ERROR, "internal error %s -> %s converter\n",
1501
               sws_format_name(srcFormat), sws_format_name(dstFormat));
1502
    } else {
1503 a959e247 Zuxy Meng
        const uint8_t *srcPtr= src[0];
1504 82e5f86b Stefano Sabatini
              uint8_t *dstPtr= dst[0];
1505
        if ((srcFormat == PIX_FMT_RGB32_1 || srcFormat == PIX_FMT_BGR32_1) && !isRGBA32(dstFormat))
1506 9990e426 Michael Niedermayer
            srcPtr += ALT32_CORR;
1507
1508 82e5f86b Stefano Sabatini
        if ((dstFormat == PIX_FMT_RGB32_1 || dstFormat == PIX_FMT_BGR32_1) && !isRGBA32(srcFormat))
1509
            dstPtr += ALT32_CORR;
1510
1511 5efaf000 Peter Schlaile
        if (dstStride[0]*srcBpp == srcStride[0]*dstBpp && srcStride[0] > 0)
1512 82e5f86b Stefano Sabatini
            conv(srcPtr, dstPtr + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]);
1513 dd68318c Ramiro Polla
        else {
1514 c4ca31d0 Benoit Fouet
            int i;
1515 82e5f86b Stefano Sabatini
            dstPtr += dstStride[0]*srcSliceY;
1516 c4ca31d0 Benoit Fouet
1517 dd68318c Ramiro Polla
            for (i=0; i<srcSliceH; i++) {
1518 c4ca31d0 Benoit Fouet
                conv(srcPtr, dstPtr, c->srcW*srcBpp);
1519
                srcPtr+= srcStride[0];
1520
                dstPtr+= dstStride[0];
1521
            }
1522 221b804f Diego Biurrun
        }
1523
    }
1524
    return srcSliceH;
1525 0d9f3d85 Arpi
}
1526
1527 3ece3e52 Stefano Sabatini
static int bgr24ToYv12Wrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1528 dd68318c Ramiro Polla
                              int srcSliceH, uint8_t* dst[], int dstStride[])
1529
{
1530 221b804f Diego Biurrun
    rgb24toyv12(
1531
        src[0],
1532
        dst[0]+ srcSliceY    *dstStride[0],
1533
        dst[1]+(srcSliceY>>1)*dstStride[1],
1534
        dst[2]+(srcSliceY>>1)*dstStride[2],
1535
        c->srcW, srcSliceH,
1536
        dstStride[0], dstStride[1], srcStride[0]);
1537 08218e6d Cédric Schieli
    if (dst[3])
1538
        fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255);
1539 221b804f Diego Biurrun
    return srcSliceH;
1540 ec22603f Michael Niedermayer
}
1541
1542 3ece3e52 Stefano Sabatini
static int yvu9ToYv12Wrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1543 dd68318c Ramiro Polla
                             int srcSliceH, uint8_t* dst[], int dstStride[])
1544
{
1545 221b804f Diego Biurrun
    int i;
1546
1547
    /* copy Y */
1548
    if (srcStride[0]==dstStride[0] && srcStride[0] > 0)
1549
        memcpy(dst[0]+ srcSliceY*dstStride[0], src[0], srcStride[0]*srcSliceH);
1550 dd68318c Ramiro Polla
    else {
1551 a959e247 Zuxy Meng
        const uint8_t *srcPtr= src[0];
1552 221b804f Diego Biurrun
        uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY;
1553
1554 dd68318c Ramiro Polla
        for (i=0; i<srcSliceH; i++) {
1555 221b804f Diego Biurrun
            memcpy(dstPtr, srcPtr, c->srcW);
1556
            srcPtr+= srcStride[0];
1557
            dstPtr+= dstStride[0];
1558
        }
1559
    }
1560
1561 dd68318c Ramiro Polla
    if (c->dstFormat==PIX_FMT_YUV420P || c->dstFormat==PIX_FMT_YUVA420P) {
1562 5f9ae198 Vitor Sessak
        planar2x(src[1], dst[1] + dstStride[1]*(srcSliceY >> 1), c->chrSrcW,
1563
                 srcSliceH >> 2, srcStride[1], dstStride[1]);
1564
        planar2x(src[2], dst[2] + dstStride[2]*(srcSliceY >> 1), c->chrSrcW,
1565
                 srcSliceH >> 2, srcStride[2], dstStride[2]);
1566 dd68318c Ramiro Polla
    } else {
1567 5f9ae198 Vitor Sessak
        planar2x(src[1], dst[2] + dstStride[2]*(srcSliceY >> 1), c->chrSrcW,
1568
                 srcSliceH >> 2, srcStride[1], dstStride[2]);
1569
        planar2x(src[2], dst[1] + dstStride[1]*(srcSliceY >> 1), c->chrSrcW,
1570
                 srcSliceH >> 2, srcStride[2], dstStride[1]);
1571 221b804f Diego Biurrun
    }
1572 08218e6d Cédric Schieli
    if (dst[3])
1573
        fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255);
1574 221b804f Diego Biurrun
    return srcSliceH;
1575 b241cbf2 Michael Niedermayer
}
1576
1577 b6654a54 Michael Niedermayer
/* unscaled copy like stuff (assumes nearly identical formats) */
1578 3ece3e52 Stefano Sabatini
static int packedCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1579 909f6594 Stefano Sabatini
                             int srcSliceH, uint8_t* dst[], int dstStride[])
1580 bc5a0444 Luca Barbato
{
1581
    if (dstStride[0]==srcStride[0] && srcStride[0] > 0)
1582
        memcpy(dst[0] + dstStride[0]*srcSliceY, src[0], srcSliceH*dstStride[0]);
1583 dd68318c Ramiro Polla
    else {
1584 bc5a0444 Luca Barbato
        int i;
1585 a959e247 Zuxy Meng
        const uint8_t *srcPtr= src[0];
1586 bc5a0444 Luca Barbato
        uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY;
1587
        int length=0;
1588 221b804f Diego Biurrun
1589 bc5a0444 Luca Barbato
        /* universal length finder */
1590
        while(length+c->srcW <= FFABS(dstStride[0])
1591
           && length+c->srcW <= FFABS(srcStride[0])) length+= c->srcW;
1592 fcc402b1 Luca Barbato
        assert(length!=0);
1593 2d35ae56 Luca Barbato
1594 dd68318c Ramiro Polla
        for (i=0; i<srcSliceH; i++) {
1595 bc5a0444 Luca Barbato
            memcpy(dstPtr, srcPtr, length);
1596
            srcPtr+= srcStride[0];
1597
            dstPtr+= dstStride[0];
1598 221b804f Diego Biurrun
        }
1599 bc5a0444 Luca Barbato
    }
1600 2d35ae56 Luca Barbato
    return srcSliceH;
1601
}
1602 bc5a0444 Luca Barbato
1603 3ece3e52 Stefano Sabatini
static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
1604 909f6594 Stefano Sabatini
                             int srcSliceH, uint8_t* dst[], int dstStride[])
1605 2d35ae56 Luca Barbato
{
1606 61a3f379 Michael Niedermayer
    int plane, i, j;
1607 dd68318c Ramiro Polla
    for (plane=0; plane<4; plane++) {
1608 6268f55b Cédric Schieli
        int length= (plane==0 || plane==3) ? c->srcW  : -((-c->srcW  )>>c->chrDstHSubSample);
1609
        int y=      (plane==0 || plane==3) ? srcSliceY: -((-srcSliceY)>>c->chrDstVSubSample);
1610
        int height= (plane==0 || plane==3) ? srcSliceH: -((-srcSliceH)>>c->chrDstVSubSample);
1611 a959e247 Zuxy Meng
        const uint8_t *srcPtr= src[plane];
1612 61a3f379 Michael Niedermayer
        uint8_t *dstPtr= dst[plane] + dstStride[plane]*y;
1613 2d35ae56 Luca Barbato
1614 20ddf5a8 Reimar Döffinger
        if (!dst[plane]) continue;
1615 6f348086 Reimar Döffinger
        // ignore palette for GRAY8
1616
        if (plane == 1 && !dst[2]) continue;
1617 dd68318c Ramiro Polla
        if (!src[plane] || (plane == 1 && !src[2])) {
1618 61a3f379 Michael Niedermayer
            if(is16BPS(c->dstFormat))
1619
                length*=2;
1620 6268f55b Cédric Schieli
            fillPlane(dst[plane], dstStride[plane], length, height, y, (plane==3) ? 255 : 128);
1621 dd68318c Ramiro Polla
        } else {
1622
            if(is16BPS(c->srcFormat) && !is16BPS(c->dstFormat)) {
1623 61a3f379 Michael Niedermayer
                if (!isBE(c->srcFormat)) srcPtr++;
1624 dd68318c Ramiro Polla
                for (i=0; i<height; i++) {
1625 61a3f379 Michael Niedermayer
                    for (j=0; j<length; j++) dstPtr[j] = srcPtr[j<<1];
1626
                    srcPtr+= srcStride[plane];
1627
                    dstPtr+= dstStride[plane];
1628
                }
1629 dd68318c Ramiro Polla
            } else if(!is16BPS(c->srcFormat) && is16BPS(c->dstFormat)) {
1630
                for (i=0; i<height; i++) {
1631
                    for (j=0; j<length; j++) {
1632 61a3f379 Michael Niedermayer
                        dstPtr[ j<<1   ] = srcPtr[j];
1633
                        dstPtr[(j<<1)+1] = srcPtr[j];
1634
                    }
1635
                    srcPtr+= srcStride[plane];
1636
                    dstPtr+= dstStride[plane];
1637
                }
1638 dd68318c Ramiro Polla
            } else if(is16BPS(c->srcFormat) && is16BPS(c->dstFormat)
1639
                  && isBE(c->srcFormat) != isBE(c->dstFormat)) {
1640 61a3f379 Michael Niedermayer
1641 dd68318c Ramiro Polla
                for (i=0; i<height; i++) {
1642 61a3f379 Michael Niedermayer
                    for (j=0; j<length; j++)
1643 5090d8e1 Stefano Sabatini
                        ((uint16_t*)dstPtr)[j] = bswap_16(((const uint16_t*)srcPtr)[j]);
1644 61a3f379 Michael Niedermayer
                    srcPtr+= srcStride[plane];
1645
                    dstPtr+= dstStride[plane];
1646
                }
1647
            } else if (dstStride[plane]==srcStride[plane] && srcStride[plane] > 0)
1648 bc5a0444 Luca Barbato
                memcpy(dst[plane] + dstStride[plane]*y, src[plane], height*dstStride[plane]);
1649 dd68318c Ramiro Polla
            else {
1650 61a3f379 Michael Niedermayer
                if(is16BPS(c->srcFormat) && is16BPS(c->dstFormat))
1651
                    length*=2;
1652 dd68318c Ramiro Polla
                for (i=0; i<height; i++) {
1653 bc5a0444 Luca Barbato
                    memcpy(dstPtr, srcPtr, length);
1654
                    srcPtr+= srcStride[plane];
1655
                    dstPtr+= dstStride[plane];
1656 221b804f Diego Biurrun
                }
1657
            }
1658
        }
1659 bc5a0444 Luca Barbato
    }
1660 221b804f Diego Biurrun
    return srcSliceH;
1661 37079906 Michael Niedermayer
}
1662 28bf81c9 Michael Niedermayer
1663 a4388ebd Ramiro Polla
int ff_hardcodedcpuflags(void)
1664 dd68318c Ramiro Polla
{
1665 a4388ebd Ramiro Polla
    int flags = 0;
1666 94daf2e9 Ramiro Polla
#if   COMPILE_TEMPLATE_MMX2
1667 221b804f Diego Biurrun
    flags |= SWS_CPU_CAPS_MMX|SWS_CPU_CAPS_MMX2;
1668 94daf2e9 Ramiro Polla
#elif COMPILE_TEMPLATE_AMD3DNOW
1669 221b804f Diego Biurrun
    flags |= SWS_CPU_CAPS_MMX|SWS_CPU_CAPS_3DNOW;
1670 94daf2e9 Ramiro Polla
#elif COMPILE_TEMPLATE_MMX
1671 221b804f Diego Biurrun
    flags |= SWS_CPU_CAPS_MMX;
1672 94daf2e9 Ramiro Polla
#elif COMPILE_TEMPLATE_ALTIVEC
1673 221b804f Diego Biurrun
    flags |= SWS_CPU_CAPS_ALTIVEC;
1674 b63f641e Aurelien Jacobs
#elif ARCH_BFIN
1675 d3f3eea9 Marc Hoffman
    flags |= SWS_CPU_CAPS_BFIN;
1676 516b1f82 Michael Niedermayer
#endif
1677 a4388ebd Ramiro Polla
    return flags;
1678
}
1679
1680
void ff_get_unscaled_swscale(SwsContext *c)
1681
{
1682
    const enum PixelFormat srcFormat = c->srcFormat;
1683
    const enum PixelFormat dstFormat = c->dstFormat;
1684
    const int flags = c->flags;
1685
    const int dstH = c->dstH;
1686
    int needsDither;
1687 221b804f Diego Biurrun
1688 60222557 Michael Niedermayer
    needsDither= isAnyRGB(dstFormat)
1689 aa2ead82 Stefano Sabatini
        &&  c->dstFormatBpp < 24
1690 60222557 Michael Niedermayer
        && (c->dstFormatBpp < c->srcFormatBpp || (!isAnyRGB(srcFormat)));
1691 221b804f Diego Biurrun
1692 59398ea9 Ramiro Polla
    /* yv12_to_nv12 */
1693
    if ((srcFormat == PIX_FMT_YUV420P || srcFormat == PIX_FMT_YUVA420P) && (dstFormat == PIX_FMT_NV12 || dstFormat == PIX_FMT_NV21)) {
1694 3ece3e52 Stefano Sabatini
        c->swScale= planarToNv12Wrapper;
1695 59398ea9 Ramiro Polla
    }
1696
    /* yuv2bgr */
1697 60222557 Michael Niedermayer
    if ((srcFormat==PIX_FMT_YUV420P || srcFormat==PIX_FMT_YUV422P || srcFormat==PIX_FMT_YUVA420P) && isAnyRGB(dstFormat)
1698 59398ea9 Ramiro Polla
        && !(flags & SWS_ACCURATE_RND) && !(dstH&1)) {
1699
        c->swScale= ff_yuv2rgb_get_func_ptr(c);
1700
    }
1701 6a4970ab Diego Biurrun
1702 59398ea9 Ramiro Polla
    if (srcFormat==PIX_FMT_YUV410P && (dstFormat==PIX_FMT_YUV420P || dstFormat==PIX_FMT_YUVA420P) && !(flags & SWS_BITEXACT)) {
1703 3ece3e52 Stefano Sabatini
        c->swScale= yvu9ToYv12Wrapper;
1704 59398ea9 Ramiro Polla
    }
1705
1706
    /* bgr24toYV12 */
1707
    if (srcFormat==PIX_FMT_BGR24 && (dstFormat==PIX_FMT_YUV420P || dstFormat==PIX_FMT_YUVA420P) && !(flags & SWS_ACCURATE_RND))
1708 3ece3e52 Stefano Sabatini
        c->swScale= bgr24ToYv12Wrapper;
1709 59398ea9 Ramiro Polla
1710
    /* RGB/BGR -> RGB/BGR (no dither needed forms) */
1711 60222557 Michael Niedermayer
    if (   isAnyRGB(srcFormat)
1712
        && isAnyRGB(dstFormat)
1713 59398ea9 Ramiro Polla
        && srcFormat != PIX_FMT_BGR8      && dstFormat != PIX_FMT_BGR8
1714
        && srcFormat != PIX_FMT_RGB8      && dstFormat != PIX_FMT_RGB8
1715
        && srcFormat != PIX_FMT_BGR4      && dstFormat != PIX_FMT_BGR4
1716
        && srcFormat != PIX_FMT_RGB4      && dstFormat != PIX_FMT_RGB4
1717
        && srcFormat != PIX_FMT_BGR4_BYTE && dstFormat != PIX_FMT_BGR4_BYTE
1718
        && srcFormat != PIX_FMT_RGB4_BYTE && dstFormat != PIX_FMT_RGB4_BYTE
1719
        && srcFormat != PIX_FMT_MONOBLACK && dstFormat != PIX_FMT_MONOBLACK
1720
        && srcFormat != PIX_FMT_MONOWHITE && dstFormat != PIX_FMT_MONOWHITE
1721
        && srcFormat != PIX_FMT_RGB48LE   && dstFormat != PIX_FMT_RGB48LE
1722
        && srcFormat != PIX_FMT_RGB48BE   && dstFormat != PIX_FMT_RGB48BE
1723
        && (!needsDither || (c->flags&(SWS_FAST_BILINEAR|SWS_POINT))))
1724 3ece3e52 Stefano Sabatini
        c->swScale= rgbToRgbWrapper;
1725 59398ea9 Ramiro Polla
1726
    if ((usePal(srcFormat) && (
1727
        dstFormat == PIX_FMT_RGB32   ||
1728
        dstFormat == PIX_FMT_RGB32_1 ||
1729
        dstFormat == PIX_FMT_RGB24   ||
1730
        dstFormat == PIX_FMT_BGR32   ||
1731
        dstFormat == PIX_FMT_BGR32_1 ||
1732
        dstFormat == PIX_FMT_BGR24)))
1733 3ece3e52 Stefano Sabatini
        c->swScale= palToRgbWrapper;
1734 59398ea9 Ramiro Polla
1735
    if (srcFormat == PIX_FMT_YUV422P) {
1736
        if (dstFormat == PIX_FMT_YUYV422)
1737 3ece3e52 Stefano Sabatini
            c->swScale= yuv422pToYuy2Wrapper;
1738 59398ea9 Ramiro Polla
        else if (dstFormat == PIX_FMT_UYVY422)
1739 3ece3e52 Stefano Sabatini
            c->swScale= yuv422pToUyvyWrapper;
1740 59398ea9 Ramiro Polla
    }
1741 221b804f Diego Biurrun
1742 59398ea9 Ramiro Polla
    /* LQ converters if -sws 0 or -sws 4*/
1743
    if (c->flags&(SWS_FAST_BILINEAR|SWS_POINT)) {
1744
        /* yv12_to_yuy2 */
1745
        if (srcFormat == PIX_FMT_YUV420P || srcFormat == PIX_FMT_YUVA420P) {
1746 a6100f39 Baptiste Coudurier
            if (dstFormat == PIX_FMT_YUYV422)
1747 3ece3e52 Stefano Sabatini
                c->swScale= planarToYuy2Wrapper;
1748 a6100f39 Baptiste Coudurier
            else if (dstFormat == PIX_FMT_UYVY422)
1749 3ece3e52 Stefano Sabatini
                c->swScale= planarToUyvyWrapper;
1750 a6100f39 Baptiste Coudurier
        }
1751 59398ea9 Ramiro Polla
    }
1752
    if(srcFormat == PIX_FMT_YUYV422 && (dstFormat == PIX_FMT_YUV420P || dstFormat == PIX_FMT_YUVA420P))
1753 3ece3e52 Stefano Sabatini
        c->swScale= yuyvToYuv420Wrapper;
1754 59398ea9 Ramiro Polla
    if(srcFormat == PIX_FMT_UYVY422 && (dstFormat == PIX_FMT_YUV420P || dstFormat == PIX_FMT_YUVA420P))
1755 3ece3e52 Stefano Sabatini
        c->swScale= uyvyToYuv420Wrapper;
1756 59398ea9 Ramiro Polla
    if(srcFormat == PIX_FMT_YUYV422 && dstFormat == PIX_FMT_YUV422P)
1757 3ece3e52 Stefano Sabatini
        c->swScale= yuyvToYuv422Wrapper;
1758 59398ea9 Ramiro Polla
    if(srcFormat == PIX_FMT_UYVY422 && dstFormat == PIX_FMT_YUV422P)
1759 3ece3e52 Stefano Sabatini
        c->swScale= uyvyToYuv422Wrapper;
1760 ec22603f Michael Niedermayer
1761 6634d0ef Nicolas Plourde
#ifdef COMPILE_ALTIVEC
1762 59398ea9 Ramiro Polla
    if ((c->flags & SWS_CPU_CAPS_ALTIVEC) &&
1763
        !(c->flags & SWS_BITEXACT) &&
1764
        srcFormat == PIX_FMT_YUV420P) {
1765
        // unscaled YV12 -> packed YUV, we want speed
1766
        if (dstFormat == PIX_FMT_YUYV422)
1767
            c->swScale= yv12toyuy2_unscaled_altivec;
1768
        else if (dstFormat == PIX_FMT_UYVY422)
1769
            c->swScale= yv12touyvy_unscaled_altivec;
1770
    }
1771 b71cf33c Romain Dolbeau
#endif
1772
1773 59398ea9 Ramiro Polla
    /* simple copy */
1774
    if (  srcFormat == dstFormat
1775
        || (srcFormat == PIX_FMT_YUVA420P && dstFormat == PIX_FMT_YUV420P)
1776
        || (srcFormat == PIX_FMT_YUV420P && dstFormat == PIX_FMT_YUVA420P)
1777
        || (isPlanarYUV(srcFormat) && isGray(dstFormat))
1778
        || (isPlanarYUV(dstFormat) && isGray(srcFormat))
1779
        || (isGray(dstFormat) && isGray(srcFormat))
1780
        || (isPlanarYUV(srcFormat) && isPlanarYUV(dstFormat)
1781
            && c->chrDstHSubSample == c->chrSrcHSubSample
1782
            && c->chrDstVSubSample == c->chrSrcVSubSample
1783
            && dstFormat != PIX_FMT_NV12 && dstFormat != PIX_FMT_NV21
1784
            && srcFormat != PIX_FMT_NV12 && srcFormat != PIX_FMT_NV21))
1785
    {
1786
        if (isPacked(c->srcFormat))
1787 3ece3e52 Stefano Sabatini
            c->swScale= packedCopyWrapper;
1788 59398ea9 Ramiro Polla
        else /* Planar YUV or gray */
1789 3ece3e52 Stefano Sabatini
            c->swScale= planarCopyWrapper;
1790 59398ea9 Ramiro Polla
    }
1791 b63f641e Aurelien Jacobs
#if ARCH_BFIN
1792 59398ea9 Ramiro Polla
    if (flags & SWS_CPU_CAPS_BFIN)
1793
        ff_bfin_get_unscaled_swscale (c);
1794 1ebbfe15 Marc Hoffman
#endif
1795 28bf81c9 Michael Niedermayer
}
1796
1797 a959e247 Zuxy Meng
static void reset_ptr(const uint8_t* src[], int format)
1798 dd68318c Ramiro Polla
{
1799 b87fae9f Michael Niedermayer
    if(!isALPHA(format))
1800
        src[3]=NULL;
1801 dd68318c Ramiro Polla
    if(!isPlanarYUV(format)) {
1802 b87fae9f Michael Niedermayer
        src[3]=src[2]=NULL;
1803 3e906f4c Stefano Sabatini
1804
        if (!usePal(format))
1805 b87fae9f Michael Niedermayer
            src[1]= NULL;
1806
    }
1807
}
1808
1809 28bf81c9 Michael Niedermayer
/**
1810 56b69633 Diego Biurrun
 * swscale wrapper, so we don't need to export the SwsContext.
1811 f40c7dbb Diego Biurrun
 * Assumes planar YUV to be in YUV order instead of YVU.
1812 fccb9b2b Michael Niedermayer
 */
1813 01cc47dc David Conrad
int sws_scale(SwsContext *c, const uint8_t* const src[], const int srcStride[], int srcSliceY,
1814
              int srcSliceH, uint8_t* const dst[], const int dstStride[])
1815 dd68318c Ramiro Polla
{
1816 221b804f Diego Biurrun
    int i;
1817 a959e247 Zuxy Meng
    const uint8_t* src2[4]= {src[0], src[1], src[2], src[3]};
1818 b87fae9f Michael Niedermayer
    uint8_t* dst2[4]= {dst[0], dst[1], dst[2], dst[3]};
1819 14623020 Michael Niedermayer
1820 1b168a42 Reimar Döffinger
    // do not mess up sliceDir if we have a "trailing" 0-size slice
1821
    if (srcSliceH == 0)
1822
        return 0;
1823
1824 221b804f Diego Biurrun
    if (c->sliceDir == 0 && srcSliceY != 0 && srcSliceY + srcSliceH != c->srcH) {
1825 3f0bc115 Diego Biurrun
        av_log(c, AV_LOG_ERROR, "Slices start in the middle!\n");
1826 221b804f Diego Biurrun
        return 0;
1827
    }
1828
    if (c->sliceDir == 0) {
1829
        if (srcSliceY == 0) c->sliceDir = 1; else c->sliceDir = -1;
1830
    }
1831
1832 dd68318c Ramiro Polla
    if (usePal(c->srcFormat)) {
1833
        for (i=0; i<256; i++) {
1834 14623020 Michael Niedermayer
            int p, r, g, b,y,u,v;
1835 dd68318c Ramiro Polla
            if(c->srcFormat == PIX_FMT_PAL8) {
1836 e922e34c Stefano Sabatini
                p=((const uint32_t*)(src[1]))[i];
1837 14623020 Michael Niedermayer
                r= (p>>16)&0xFF;
1838
                g= (p>> 8)&0xFF;
1839
                b=  p     &0xFF;
1840 dd68318c Ramiro Polla
            } else if(c->srcFormat == PIX_FMT_RGB8) {
1841 14623020 Michael Niedermayer
                r= (i>>5    )*36;
1842
                g= ((i>>2)&7)*36;
1843
                b= (i&3     )*85;
1844 dd68318c Ramiro Polla
            } else if(c->srcFormat == PIX_FMT_BGR8) {
1845 14623020 Michael Niedermayer
                b= (i>>6    )*85;
1846
                g= ((i>>3)&7)*36;
1847
                r= (i&7     )*36;
1848 dd68318c Ramiro Polla
            } else if(c->srcFormat == PIX_FMT_RGB4_BYTE) {
1849 14623020 Michael Niedermayer
                r= (i>>3    )*255;
1850
                g= ((i>>1)&3)*85;
1851
                b= (i&1     )*255;
1852 dd68318c Ramiro Polla
            } else {
1853 75add6fb Vitor Sessak
                assert(c->srcFormat == PIX_FMT_BGR4_BYTE);
1854 14623020 Michael Niedermayer
                b= (i>>3    )*255;
1855
                g= ((i>>1)&3)*85;
1856
                r= (i&1     )*255;
1857
            }
1858 cbcb408f Michael Niedermayer
            y= av_clip_uint8((RY*r + GY*g + BY*b + ( 33<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT);
1859
            u= av_clip_uint8((RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT);
1860
            v= av_clip_uint8((RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT);
1861 49004617 Vitor Sessak
            c->pal_yuv[i]= y + (u<<8) + (v<<16);
1862 522ce957 Vitor Sessak
1863
            switch(c->dstFormat) {
1864
            case PIX_FMT_BGR32:
1865 a898cdc9 Måns Rullgård
#if !HAVE_BIGENDIAN
1866 522ce957 Vitor Sessak
            case PIX_FMT_RGB24:
1867
#endif
1868
                c->pal_rgb[i]=  r + (g<<8) + (b<<16);
1869
                break;
1870
            case PIX_FMT_BGR32_1:
1871 a898cdc9 Måns Rullgård
#if HAVE_BIGENDIAN
1872 522ce957 Vitor Sessak
            case PIX_FMT_BGR24:
1873
#endif
1874
                c->pal_rgb[i]= (r + (g<<8) + (b<<16)) << 8;
1875
                break;
1876
            case PIX_FMT_RGB32_1:
1877 a898cdc9 Måns Rullgård
#if HAVE_BIGENDIAN
1878 522ce957 Vitor Sessak
            case PIX_FMT_RGB24:
1879
#endif
1880
                c->pal_rgb[i]= (b + (g<<8) + (r<<16)) << 8;
1881
                break;
1882
            case PIX_FMT_RGB32:
1883 a898cdc9 Måns Rullgård
#if !HAVE_BIGENDIAN
1884 522ce957 Vitor Sessak
            case PIX_FMT_BGR24:
1885
#endif
1886
            default:
1887
                c->pal_rgb[i]=  b + (g<<8) + (r<<16);
1888
            }
1889 21c08a3f Michael Niedermayer
        }
1890 221b804f Diego Biurrun
    }
1891 21c08a3f Michael Niedermayer
1892 221b804f Diego Biurrun
    // copy strides, so they can safely be modified
1893
    if (c->sliceDir == 1) {
1894
        // slices go from top to bottom
1895 6208d676 Cédric Schieli
        int srcStride2[4]= {srcStride[0], srcStride[1], srcStride[2], srcStride[3]};
1896
        int dstStride2[4]= {dstStride[0], dstStride[1], dstStride[2], dstStride[3]};
1897 b87fae9f Michael Niedermayer
1898
        reset_ptr(src2, c->srcFormat);
1899 a959e247 Zuxy Meng
        reset_ptr((const uint8_t**)dst2, c->dstFormat);
1900 b87fae9f Michael Niedermayer
1901 749fac31 Ramiro Polla
        /* reset slice direction at end of frame */
1902
        if (srcSliceY + srcSliceH == c->srcH)
1903
            c->sliceDir = 0;
1904
1905 b87fae9f Michael Niedermayer
        return c->swScale(c, src2, srcStride2, srcSliceY, srcSliceH, dst2, dstStride2);
1906 221b804f Diego Biurrun
    } else {
1907
        // slices go from bottom to top => we flip the image internally
1908 6208d676 Cédric Schieli
        int srcStride2[4]= {-srcStride[0], -srcStride[1], -srcStride[2], -srcStride[3]};
1909
        int dstStride2[4]= {-dstStride[0], -dstStride[1], -dstStride[2], -dstStride[3]};
1910 221b804f Diego Biurrun
1911
        src2[0] += (srcSliceH-1)*srcStride[0];
1912 49004617 Vitor Sessak
        if (!usePal(c->srcFormat))
1913 221b804f Diego Biurrun
            src2[1] += ((srcSliceH>>c->chrSrcVSubSample)-1)*srcStride[1];
1914
        src2[2] += ((srcSliceH>>c->chrSrcVSubSample)-1)*srcStride[2];
1915 6208d676 Cédric Schieli
        src2[3] += (srcSliceH-1)*srcStride[3];
1916 b87fae9f Michael Niedermayer
        dst2[0] += ( c->dstH                      -1)*dstStride[0];
1917
        dst2[1] += ((c->dstH>>c->chrDstVSubSample)-1)*dstStride[1];
1918
        dst2[2] += ((c->dstH>>c->chrDstVSubSample)-1)*dstStride[2];
1919
        dst2[3] += ( c->dstH                      -1)*dstStride[3];
1920
1921
        reset_ptr(src2, c->srcFormat);
1922 a959e247 Zuxy Meng
        reset_ptr((const uint8_t**)dst2, c->dstFormat);
1923 221b804f Diego Biurrun
1924 749fac31 Ramiro Polla
        /* reset slice direction at end of frame */
1925
        if (!srcSliceY)
1926
            c->sliceDir = 0;
1927
1928 221b804f Diego Biurrun
        return c->swScale(c, src2, srcStride2, c->srcH-srcSliceY-srcSliceH, srcSliceH, dst2, dstStride2);
1929
    }
1930 fccb9b2b Michael Niedermayer
}
1931
1932 c099766f Stefano Sabatini
#if LIBSWSCALE_VERSION_MAJOR < 1
1933 f28cc577 Alexis Ballier
int sws_scale_ordered(SwsContext *c, const uint8_t* const src[], int srcStride[], int srcSliceY,
1934 dd68318c Ramiro Polla
                      int srcSliceH, uint8_t* dst[], int dstStride[])
1935
{
1936 221b804f Diego Biurrun
    return sws_scale(c, src, srcStride, srcSliceY, srcSliceH, dst, dstStride);
1937 d4e24275 Michael Niedermayer
}
1938 c099766f Stefano Sabatini
#endif