OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2001-2003 Michael Niedermayer <michaelni@gmx.at> | 2 * Copyright (C) 2001-2003 Michael Niedermayer <michaelni@gmx.at> |
3 * | 3 * |
4 * This file is part of FFmpeg. | 4 * This file is part of FFmpeg. |
5 * | 5 * |
6 * FFmpeg is free software; you can redistribute it and/or modify | 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 | 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 | 8 * the Free Software Foundation; either version 2 of the License, or |
9 * (at your option) any later version. | 9 * (at your option) any later version. |
10 * | 10 * |
11 * FFmpeg is distributed in the hope that it will be useful, | 11 * FFmpeg is distributed in the hope that it will be useful, |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 * GNU General Public License for more details. | 14 * GNU General Public License for more details. |
15 * | 15 * |
16 * You should have received a copy of the GNU General Public License | 16 * You should have received a copy of the GNU General Public License |
17 * along with FFmpeg; if not, write to the Free Software | 17 * along with FFmpeg; if not, write to the Free Software |
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 * | 19 * |
20 * the C code (not assembly, mmx, ...) of this file can be used | 20 * the C code (not assembly, mmx, ...) of this file can be used |
21 * under the LGPL license too | 21 * under the LGPL license too |
22 */ | 22 */ |
23 | 23 |
24 /* | 24 /* |
25 supported Input formats: YV12, I420/IYUV, YUY2, UYVY, BGR32, BGR32_1, BGR24, B
GR16, BGR15, RGB32, RGB32_1, RGB24, Y8/Y800, YVU9/IF09, PAL8 | 25 supported Input formats: YV12, I420/IYUV, YUY2, UYVY, BGR32, BGR32_1, BGR24, B
GR16, BGR15, RGB32, RGB32_1, RGB24, Y8/Y800, YVU9/IF09, PAL8 |
26 supported output formats: YV12, I420/IYUV, YUY2, UYVY, {BGR,RGB}{1,4,8,15,16,2
4,32}, Y8/Y800, YVU9/IF09 | 26 supported output formats: YV12, I420/IYUV, YUY2, UYVY, {BGR,RGB}{1,4,8,15,16,2
4,32}, Y8/Y800, YVU9/IF09 |
27 {BGR,RGB}{1,4,8,15,16} support dithering | 27 {BGR,RGB}{1,4,8,15,16} support dithering |
28 | 28 |
29 unscaled special converters (YV12=I420=IYUV, Y800=Y8) | 29 unscaled special converters (YV12=I420=IYUV, Y800=Y8) |
30 YV12 -> {BGR,RGB}{1,4,8,15,16,24,32} | 30 YV12 -> {BGR,RGB}{1,4,8,12,15,16,24,32} |
31 x -> x | 31 x -> x |
32 YUV9 -> YV12 | 32 YUV9 -> YV12 |
33 YUV9/YV12 -> Y800 | 33 YUV9/YV12 -> Y800 |
34 Y800 -> YUV9/YV12 | 34 Y800 -> YUV9/YV12 |
35 BGR24 -> BGR32 & RGB24 -> RGB32 | 35 BGR24 -> BGR32 & RGB24 -> RGB32 |
36 BGR32 -> BGR24 & RGB32 -> RGB24 | 36 BGR32 -> BGR24 & RGB32 -> RGB24 |
37 BGR15 -> BGR16 | 37 BGR15 -> BGR16 |
38 */ | 38 */ |
39 | 39 |
40 /* | 40 /* |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 #ifdef M_PI | 83 #ifdef M_PI |
84 #define PI M_PI | 84 #define PI M_PI |
85 #else | 85 #else |
86 #define PI 3.14159265358979323846 | 86 #define PI 3.14159265358979323846 |
87 #endif | 87 #endif |
88 | 88 |
89 #define isPacked(x) ( \ | 89 #define isPacked(x) ( \ |
90 (x)==PIX_FMT_PAL8 \ | 90 (x)==PIX_FMT_PAL8 \ |
91 || (x)==PIX_FMT_YUYV422 \ | 91 || (x)==PIX_FMT_YUYV422 \ |
92 || (x)==PIX_FMT_UYVY422 \ | 92 || (x)==PIX_FMT_UYVY422 \ |
93 || isRGB(x) \ | 93 || isAnyRGB(x) \ |
94 || isBGR(x) \ | |
95 ) | 94 ) |
96 #define usePal(x) (av_pix_fmt_descriptors[x].flags & PIX_FMT_PAL) | |
97 | 95 |
98 #define RGB2YUV_SHIFT 15 | 96 #define RGB2YUV_SHIFT 15 |
99 #define BY ( (int)(0.114*219/255*(1<<RGB2YUV_SHIFT)+0.5)) | 97 #define BY ( (int)(0.114*219/255*(1<<RGB2YUV_SHIFT)+0.5)) |
100 #define BV (-(int)(0.081*224/255*(1<<RGB2YUV_SHIFT)+0.5)) | 98 #define BV (-(int)(0.081*224/255*(1<<RGB2YUV_SHIFT)+0.5)) |
101 #define BU ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5)) | 99 #define BU ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5)) |
102 #define GY ( (int)(0.587*219/255*(1<<RGB2YUV_SHIFT)+0.5)) | 100 #define GY ( (int)(0.587*219/255*(1<<RGB2YUV_SHIFT)+0.5)) |
103 #define GV (-(int)(0.419*224/255*(1<<RGB2YUV_SHIFT)+0.5)) | 101 #define GV (-(int)(0.419*224/255*(1<<RGB2YUV_SHIFT)+0.5)) |
104 #define GU (-(int)(0.331*224/255*(1<<RGB2YUV_SHIFT)+0.5)) | 102 #define GU (-(int)(0.331*224/255*(1<<RGB2YUV_SHIFT)+0.5)) |
105 #define RY ( (int)(0.299*219/255*(1<<RGB2YUV_SHIFT)+0.5)) | 103 #define RY ( (int)(0.299*219/255*(1<<RGB2YUV_SHIFT)+0.5)) |
106 #define RV ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5)) | 104 #define RV ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5)) |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 DECLARE_ALIGNED(8, static const uint8_t, dither_2x2_4)[2][8]={ | 190 DECLARE_ALIGNED(8, static const uint8_t, dither_2x2_4)[2][8]={ |
193 { 1, 3, 1, 3, 1, 3, 1, 3, }, | 191 { 1, 3, 1, 3, 1, 3, 1, 3, }, |
194 { 2, 0, 2, 0, 2, 0, 2, 0, }, | 192 { 2, 0, 2, 0, 2, 0, 2, 0, }, |
195 }; | 193 }; |
196 | 194 |
197 DECLARE_ALIGNED(8, static const uint8_t, dither_2x2_8)[2][8]={ | 195 DECLARE_ALIGNED(8, static const uint8_t, dither_2x2_8)[2][8]={ |
198 { 6, 2, 6, 2, 6, 2, 6, 2, }, | 196 { 6, 2, 6, 2, 6, 2, 6, 2, }, |
199 { 0, 4, 0, 4, 0, 4, 0, 4, }, | 197 { 0, 4, 0, 4, 0, 4, 0, 4, }, |
200 }; | 198 }; |
201 | 199 |
| 200 DECLARE_ALIGNED(8, const uint8_t, dither_4x4_16)[4][8]={ |
| 201 { 8, 4, 11, 7, 8, 4, 11, 7, }, |
| 202 { 2, 14, 1, 13, 2, 14, 1, 13, }, |
| 203 { 10, 6, 9, 5, 10, 6, 9, 5, }, |
| 204 { 0, 12, 3, 15, 0, 12, 3, 15, }, |
| 205 }; |
| 206 |
202 DECLARE_ALIGNED(8, const uint8_t, dither_8x8_32)[8][8]={ | 207 DECLARE_ALIGNED(8, const uint8_t, dither_8x8_32)[8][8]={ |
203 { 17, 9, 23, 15, 16, 8, 22, 14, }, | 208 { 17, 9, 23, 15, 16, 8, 22, 14, }, |
204 { 5, 29, 3, 27, 4, 28, 2, 26, }, | 209 { 5, 29, 3, 27, 4, 28, 2, 26, }, |
205 { 21, 13, 19, 11, 20, 12, 18, 10, }, | 210 { 21, 13, 19, 11, 20, 12, 18, 10, }, |
206 { 0, 24, 6, 30, 1, 25, 7, 31, }, | 211 { 0, 24, 6, 30, 1, 25, 7, 31, }, |
207 { 16, 8, 22, 14, 17, 9, 23, 15, }, | 212 { 16, 8, 22, 14, 17, 9, 23, 15, }, |
208 { 4, 28, 2, 26, 5, 29, 3, 27, }, | 213 { 4, 28, 2, 26, 5, 29, 3, 27, }, |
209 { 20, 12, 18, 10, 21, 13, 19, 11, }, | 214 { 20, 12, 18, 10, 21, 13, 19, 11, }, |
210 { 1, 25, 7, 31, 0, 24, 6, 30, }, | 215 { 1, 25, 7, 31, 0, 24, 6, 30, }, |
211 }; | 216 }; |
(...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 func(uint8_t,0)\ | 764 func(uint8_t,0)\ |
760 ((uint8_t*)dest)[0]= b[Y1];\ | 765 ((uint8_t*)dest)[0]= b[Y1];\ |
761 ((uint8_t*)dest)[1]= g[Y1];\ | 766 ((uint8_t*)dest)[1]= g[Y1];\ |
762 ((uint8_t*)dest)[2]= r[Y1];\ | 767 ((uint8_t*)dest)[2]= r[Y1];\ |
763 ((uint8_t*)dest)[3]= b[Y2];\ | 768 ((uint8_t*)dest)[3]= b[Y2];\ |
764 ((uint8_t*)dest)[4]= g[Y2];\ | 769 ((uint8_t*)dest)[4]= g[Y2];\ |
765 ((uint8_t*)dest)[5]= r[Y2];\ | 770 ((uint8_t*)dest)[5]= r[Y2];\ |
766 dest+=6;\ | 771 dest+=6;\ |
767 }\ | 772 }\ |
768 break;\ | 773 break;\ |
769 case PIX_FMT_RGB565:\ | 774 case PIX_FMT_RGB565BE:\ |
770 case PIX_FMT_BGR565:\ | 775 case PIX_FMT_RGB565LE:\ |
| 776 case PIX_FMT_BGR565BE:\ |
| 777 case PIX_FMT_BGR565LE:\ |
771 {\ | 778 {\ |
772 const int dr1= dither_2x2_8[y&1 ][0];\ | 779 const int dr1= dither_2x2_8[y&1 ][0];\ |
773 const int dg1= dither_2x2_4[y&1 ][0];\ | 780 const int dg1= dither_2x2_4[y&1 ][0];\ |
774 const int db1= dither_2x2_8[(y&1)^1][0];\ | 781 const int db1= dither_2x2_8[(y&1)^1][0];\ |
775 const int dr2= dither_2x2_8[y&1 ][1];\ | 782 const int dr2= dither_2x2_8[y&1 ][1];\ |
776 const int dg2= dither_2x2_4[y&1 ][1];\ | 783 const int dg2= dither_2x2_4[y&1 ][1];\ |
777 const int db2= dither_2x2_8[(y&1)^1][1];\ | 784 const int db2= dither_2x2_8[(y&1)^1][1];\ |
778 func(uint16_t,0)\ | 785 func(uint16_t,0)\ |
779 ((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\ | 786 ((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\ |
780 ((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\ | 787 ((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\ |
781 }\ | 788 }\ |
782 }\ | 789 }\ |
783 break;\ | 790 break;\ |
784 case PIX_FMT_RGB555:\ | 791 case PIX_FMT_RGB555BE:\ |
785 case PIX_FMT_BGR555:\ | 792 case PIX_FMT_RGB555LE:\ |
| 793 case PIX_FMT_BGR555BE:\ |
| 794 case PIX_FMT_BGR555LE:\ |
786 {\ | 795 {\ |
787 const int dr1= dither_2x2_8[y&1 ][0];\ | 796 const int dr1= dither_2x2_8[y&1 ][0];\ |
788 const int dg1= dither_2x2_8[y&1 ][1];\ | 797 const int dg1= dither_2x2_8[y&1 ][1];\ |
789 const int db1= dither_2x2_8[(y&1)^1][0];\ | 798 const int db1= dither_2x2_8[(y&1)^1][0];\ |
790 const int dr2= dither_2x2_8[y&1 ][1];\ | 799 const int dr2= dither_2x2_8[y&1 ][1];\ |
791 const int dg2= dither_2x2_8[y&1 ][0];\ | 800 const int dg2= dither_2x2_8[y&1 ][0];\ |
792 const int db2= dither_2x2_8[(y&1)^1][1];\ | 801 const int db2= dither_2x2_8[(y&1)^1][1];\ |
793 func(uint16_t,0)\ | 802 func(uint16_t,0)\ |
794 ((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\ | 803 ((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\ |
795 ((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\ | 804 ((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\ |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1126 } | 1135 } |
1127 } | 1136 } |
1128 | 1137 |
1129 //Note: we have C, MMX, MMX2, 3DNOW versions, there is no 3DNOW+MMX2 one | 1138 //Note: we have C, MMX, MMX2, 3DNOW versions, there is no 3DNOW+MMX2 one |
1130 //Plain C versions | 1139 //Plain C versions |
1131 #if ((!HAVE_MMX || !CONFIG_GPL) && !HAVE_ALTIVEC) || CONFIG_RUNTIME_CPUDETECT | 1140 #if ((!HAVE_MMX || !CONFIG_GPL) && !HAVE_ALTIVEC) || CONFIG_RUNTIME_CPUDETECT |
1132 #define COMPILE_C | 1141 #define COMPILE_C |
1133 #endif | 1142 #endif |
1134 | 1143 |
1135 #if ARCH_PPC | 1144 #if ARCH_PPC |
1136 #if HAVE_ALTIVEC || CONFIG_RUNTIME_CPUDETECT | 1145 #if HAVE_ALTIVEC |
1137 #define COMPILE_ALTIVEC | 1146 #define COMPILE_ALTIVEC |
1138 #endif | 1147 #endif |
1139 #endif //ARCH_PPC | 1148 #endif //ARCH_PPC |
1140 | 1149 |
1141 #if ARCH_X86 | 1150 #if ARCH_X86 |
1142 | 1151 |
1143 #if ((HAVE_MMX && !HAVE_AMD3DNOW && !HAVE_MMX2) || CONFIG_RUNTIME_CPUDETECT) &&
CONFIG_GPL | 1152 #if ((HAVE_MMX && !HAVE_AMD3DNOW && !HAVE_MMX2) || CONFIG_RUNTIME_CPUDETECT) &&
CONFIG_GPL |
1144 #define COMPILE_MMX | 1153 #define COMPILE_MMX |
1145 #endif | 1154 #endif |
1146 | 1155 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1229 return swScale_3DNow; | 1238 return swScale_3DNow; |
1230 } else if (flags & SWS_CPU_CAPS_MMX) { | 1239 } else if (flags & SWS_CPU_CAPS_MMX) { |
1231 sws_init_swScale_MMX(c); | 1240 sws_init_swScale_MMX(c); |
1232 return swScale_MMX; | 1241 return swScale_MMX; |
1233 } else { | 1242 } else { |
1234 sws_init_swScale_C(c); | 1243 sws_init_swScale_C(c); |
1235 return swScale_C; | 1244 return swScale_C; |
1236 } | 1245 } |
1237 | 1246 |
1238 #else | 1247 #else |
1239 #if ARCH_PPC | 1248 #if ARCH_PPC && COMPILE_ALTIVEC |
1240 if (flags & SWS_CPU_CAPS_ALTIVEC) { | 1249 if (flags & SWS_CPU_CAPS_ALTIVEC) { |
1241 sws_init_swScale_altivec(c); | 1250 sws_init_swScale_altivec(c); |
1242 return swScale_altivec; | 1251 return swScale_altivec; |
1243 } else { | 1252 } else { |
1244 sws_init_swScale_C(c); | 1253 sws_init_swScale_C(c); |
1245 return swScale_C; | 1254 return swScale_C; |
1246 } | 1255 } |
1247 #endif | 1256 #endif |
1248 sws_init_swScale_C(c); | 1257 sws_init_swScale_C(c); |
1249 return swScale_C; | 1258 return swScale_C; |
(...skipping 11 matching lines...) Expand all Loading... |
1261 #elif COMPILE_TEMPLATE_ALTIVEC | 1270 #elif COMPILE_TEMPLATE_ALTIVEC |
1262 sws_init_swScale_altivec(c); | 1271 sws_init_swScale_altivec(c); |
1263 return swScale_altivec; | 1272 return swScale_altivec; |
1264 #else | 1273 #else |
1265 sws_init_swScale_C(c); | 1274 sws_init_swScale_C(c); |
1266 return swScale_C; | 1275 return swScale_C; |
1267 #endif | 1276 #endif |
1268 #endif //!CONFIG_RUNTIME_CPUDETECT | 1277 #endif //!CONFIG_RUNTIME_CPUDETECT |
1269 } | 1278 } |
1270 | 1279 |
1271 static int PlanarToNV12Wrapper(SwsContext *c, const uint8_t* src[], int srcStrid
e[], int srcSliceY, | 1280 static int planarToNv12Wrapper(SwsContext *c, const uint8_t* src[], int srcStrid
e[], int srcSliceY, |
1272 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) | 1281 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) |
1273 { | 1282 { |
1274 uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; | 1283 uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; |
1275 /* Copy Y plane */ | 1284 /* Copy Y plane */ |
1276 if (dstStride[0]==srcStride[0] && srcStride[0] > 0) | 1285 if (dstStride[0]==srcStride[0] && srcStride[0] > 0) |
1277 memcpy(dst, src[0], srcSliceH*dstStride[0]); | 1286 memcpy(dst, src[0], srcSliceH*dstStride[0]); |
1278 else { | 1287 else { |
1279 int i; | 1288 int i; |
1280 const uint8_t *srcPtr= src[0]; | 1289 const uint8_t *srcPtr= src[0]; |
1281 uint8_t *dstPtr= dst; | 1290 uint8_t *dstPtr= dst; |
1282 for (i=0; i<srcSliceH; i++) { | 1291 for (i=0; i<srcSliceH; i++) { |
1283 memcpy(dstPtr, srcPtr, c->srcW); | 1292 memcpy(dstPtr, srcPtr, c->srcW); |
1284 srcPtr+= srcStride[0]; | 1293 srcPtr+= srcStride[0]; |
1285 dstPtr+= dstStride[0]; | 1294 dstPtr+= dstStride[0]; |
1286 } | 1295 } |
1287 } | 1296 } |
1288 dst = dstParam[1] + dstStride[1]*srcSliceY/2; | 1297 dst = dstParam[1] + dstStride[1]*srcSliceY/2; |
1289 if (c->dstFormat == PIX_FMT_NV12) | 1298 if (c->dstFormat == PIX_FMT_NV12) |
1290 interleaveBytes(src[1], src[2], dst, c->srcW/2, srcSliceH/2, srcStride[1
], srcStride[2], dstStride[0]); | 1299 interleaveBytes(src[1], src[2], dst, c->srcW/2, srcSliceH/2, srcStride[1
], srcStride[2], dstStride[0]); |
1291 else | 1300 else |
1292 interleaveBytes(src[2], src[1], dst, c->srcW/2, srcSliceH/2, srcStride[2
], srcStride[1], dstStride[0]); | 1301 interleaveBytes(src[2], src[1], dst, c->srcW/2, srcSliceH/2, srcStride[2
], srcStride[1], dstStride[0]); |
1293 | 1302 |
1294 return srcSliceH; | 1303 return srcSliceH; |
1295 } | 1304 } |
1296 | 1305 |
1297 static int PlanarToYuy2Wrapper(SwsContext *c, const uint8_t* src[], int srcStrid
e[], int srcSliceY, | 1306 static int planarToYuy2Wrapper(SwsContext *c, const uint8_t* src[], int srcStrid
e[], int srcSliceY, |
1298 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) | 1307 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) |
1299 { | 1308 { |
1300 uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; | 1309 uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; |
1301 | 1310 |
1302 yv12toyuy2(src[0], src[1], src[2], dst, c->srcW, srcSliceH, srcStride[0], sr
cStride[1], dstStride[0]); | 1311 yv12toyuy2(src[0], src[1], src[2], dst, c->srcW, srcSliceH, srcStride[0], sr
cStride[1], dstStride[0]); |
1303 | 1312 |
1304 return srcSliceH; | 1313 return srcSliceH; |
1305 } | 1314 } |
1306 | 1315 |
1307 static int PlanarToUyvyWrapper(SwsContext *c, const uint8_t* src[], int srcStrid
e[], int srcSliceY, | 1316 static int planarToUyvyWrapper(SwsContext *c, const uint8_t* src[], int srcStrid
e[], int srcSliceY, |
1308 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) | 1317 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) |
1309 { | 1318 { |
1310 uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; | 1319 uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; |
1311 | 1320 |
1312 yv12touyvy(src[0], src[1], src[2], dst, c->srcW, srcSliceH, srcStride[0], sr
cStride[1], dstStride[0]); | 1321 yv12touyvy(src[0], src[1], src[2], dst, c->srcW, srcSliceH, srcStride[0], sr
cStride[1], dstStride[0]); |
1313 | 1322 |
1314 return srcSliceH; | 1323 return srcSliceH; |
1315 } | 1324 } |
1316 | 1325 |
1317 static int YUV422PToYuy2Wrapper(SwsContext *c, const uint8_t* src[], int srcStri
de[], int srcSliceY, | 1326 static int yuv422pToYuy2Wrapper(SwsContext *c, const uint8_t* src[], int srcStri
de[], int srcSliceY, |
1318 int srcSliceH, uint8_t* dstParam[], int dstStrid
e[]) | 1327 int srcSliceH, uint8_t* dstParam[], int dstStrid
e[]) |
1319 { | 1328 { |
1320 uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; | 1329 uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; |
1321 | 1330 |
1322 yuv422ptoyuy2(src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStr
ide[1],dstStride[0]); | 1331 yuv422ptoyuy2(src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStr
ide[1],dstStride[0]); |
1323 | 1332 |
1324 return srcSliceH; | 1333 return srcSliceH; |
1325 } | 1334 } |
1326 | 1335 |
1327 static int YUV422PToUyvyWrapper(SwsContext *c, const uint8_t* src[], int srcStri
de[], int srcSliceY, | 1336 static int yuv422pToUyvyWrapper(SwsContext *c, const uint8_t* src[], int srcStri
de[], int srcSliceY, |
1328 int srcSliceH, uint8_t* dstParam[], int dstStrid
e[]) | 1337 int srcSliceH, uint8_t* dstParam[], int dstStrid
e[]) |
1329 { | 1338 { |
1330 uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; | 1339 uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; |
1331 | 1340 |
1332 yuv422ptouyvy(src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStr
ide[1],dstStride[0]); | 1341 yuv422ptouyvy(src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStr
ide[1],dstStride[0]); |
1333 | 1342 |
1334 return srcSliceH; | 1343 return srcSliceH; |
1335 } | 1344 } |
1336 | 1345 |
1337 static int YUYV2YUV420Wrapper(SwsContext *c, const uint8_t* src[], int srcStride
[], int srcSliceY, | 1346 static int yuyvToYuv420Wrapper(SwsContext *c, const uint8_t* src[], int srcStrid
e[], int srcSliceY, |
1338 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) | 1347 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) |
1339 { | 1348 { |
1340 uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY; | 1349 uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY; |
1341 uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY/2; | 1350 uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY/2; |
1342 uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY/2; | 1351 uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY/2; |
1343 | 1352 |
1344 yuyvtoyuv420(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dst
Stride[1], srcStride[0]); | 1353 yuyvtoyuv420(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dst
Stride[1], srcStride[0]); |
1345 | 1354 |
1346 if (dstParam[3]) | 1355 if (dstParam[3]) |
1347 fillPlane(dstParam[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255)
; | 1356 fillPlane(dstParam[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255)
; |
1348 | 1357 |
1349 return srcSliceH; | 1358 return srcSliceH; |
1350 } | 1359 } |
1351 | 1360 |
1352 static int YUYV2YUV422Wrapper(SwsContext *c, const uint8_t* src[], int srcStride
[], int srcSliceY, | 1361 static int yuyvToYuv422Wrapper(SwsContext *c, const uint8_t* src[], int srcStrid
e[], int srcSliceY, |
1353 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) | 1362 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) |
1354 { | 1363 { |
1355 uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY; | 1364 uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY; |
1356 uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY; | 1365 uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY; |
1357 uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY; | 1366 uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY; |
1358 | 1367 |
1359 yuyvtoyuv422(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dst
Stride[1], srcStride[0]); | 1368 yuyvtoyuv422(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dst
Stride[1], srcStride[0]); |
1360 | 1369 |
1361 return srcSliceH; | 1370 return srcSliceH; |
1362 } | 1371 } |
1363 | 1372 |
1364 static int UYVY2YUV420Wrapper(SwsContext *c, const uint8_t* src[], int srcStride
[], int srcSliceY, | 1373 static int uyvyToYuv420Wrapper(SwsContext *c, const uint8_t* src[], int srcStrid
e[], int srcSliceY, |
1365 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) | 1374 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) |
1366 { | 1375 { |
1367 uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY; | 1376 uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY; |
1368 uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY/2; | 1377 uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY/2; |
1369 uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY/2; | 1378 uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY/2; |
1370 | 1379 |
1371 uyvytoyuv420(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dst
Stride[1], srcStride[0]); | 1380 uyvytoyuv420(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dst
Stride[1], srcStride[0]); |
1372 | 1381 |
1373 if (dstParam[3]) | 1382 if (dstParam[3]) |
1374 fillPlane(dstParam[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255)
; | 1383 fillPlane(dstParam[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255)
; |
1375 | 1384 |
1376 return srcSliceH; | 1385 return srcSliceH; |
1377 } | 1386 } |
1378 | 1387 |
1379 static int UYVY2YUV422Wrapper(SwsContext *c, const uint8_t* src[], int srcStride
[], int srcSliceY, | 1388 static int uyvyToYuv422Wrapper(SwsContext *c, const uint8_t* src[], int srcStrid
e[], int srcSliceY, |
1380 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) | 1389 int srcSliceH, uint8_t* dstParam[], int dstStride
[]) |
1381 { | 1390 { |
1382 uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY; | 1391 uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY; |
1383 uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY; | 1392 uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY; |
1384 uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY; | 1393 uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY; |
1385 | 1394 |
1386 uyvytoyuv422(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dst
Stride[1], srcStride[0]); | 1395 uyvytoyuv422(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dst
Stride[1], srcStride[0]); |
1387 | 1396 |
1388 return srcSliceH; | 1397 return srcSliceH; |
1389 } | 1398 } |
1390 | 1399 |
1391 static int pal2rgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[],
int srcSliceY, | 1400 static int palToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[],
int srcSliceY, |
1392 int srcSliceH, uint8_t* dst[], int dstStride[]) | 1401 int srcSliceH, uint8_t* dst[], int dstStride[]) |
1393 { | 1402 { |
1394 const enum PixelFormat srcFormat= c->srcFormat; | 1403 const enum PixelFormat srcFormat= c->srcFormat; |
1395 const enum PixelFormat dstFormat= c->dstFormat; | 1404 const enum PixelFormat dstFormat= c->dstFormat; |
1396 void (*conv)(const uint8_t *src, uint8_t *dst, long num_pixels, | 1405 void (*conv)(const uint8_t *src, uint8_t *dst, long num_pixels, |
1397 const uint8_t *palette)=NULL; | 1406 const uint8_t *palette)=NULL; |
1398 int i; | 1407 int i; |
1399 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; | 1408 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; |
1400 const uint8_t *srcPtr= src[0]; | 1409 const uint8_t *srcPtr= src[0]; |
1401 | 1410 |
1402 if (usePal(srcFormat)) { | 1411 if (usePal(srcFormat)) { |
(...skipping 14 matching lines...) Expand all Loading... |
1417 for (i=0; i<srcSliceH; i++) { | 1426 for (i=0; i<srcSliceH; i++) { |
1418 conv(srcPtr, dstPtr, c->srcW, (uint8_t *) c->pal_rgb); | 1427 conv(srcPtr, dstPtr, c->srcW, (uint8_t *) c->pal_rgb); |
1419 srcPtr+= srcStride[0]; | 1428 srcPtr+= srcStride[0]; |
1420 dstPtr+= dstStride[0]; | 1429 dstPtr+= dstStride[0]; |
1421 } | 1430 } |
1422 } | 1431 } |
1423 | 1432 |
1424 return srcSliceH; | 1433 return srcSliceH; |
1425 } | 1434 } |
1426 | 1435 |
| 1436 #define isRGBA32(x) ( \ |
| 1437 (x) == PIX_FMT_ARGB \ |
| 1438 || (x) == PIX_FMT_RGBA \ |
| 1439 || (x) == PIX_FMT_BGRA \ |
| 1440 || (x) == PIX_FMT_ABGR \ |
| 1441 ) |
| 1442 |
1427 /* {RGB,BGR}{15,16,24,32,32_1} -> {RGB,BGR}{15,16,24,32} */ | 1443 /* {RGB,BGR}{15,16,24,32,32_1} -> {RGB,BGR}{15,16,24,32} */ |
1428 static int rgb2rgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[],
int srcSliceY, | 1444 static int rgbToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[],
int srcSliceY, |
1429 int srcSliceH, uint8_t* dst[], int dstStride[]) | 1445 int srcSliceH, uint8_t* dst[], int dstStride[]) |
1430 { | 1446 { |
1431 const enum PixelFormat srcFormat= c->srcFormat; | 1447 const enum PixelFormat srcFormat= c->srcFormat; |
1432 const enum PixelFormat dstFormat= c->dstFormat; | 1448 const enum PixelFormat dstFormat= c->dstFormat; |
1433 const int srcBpp= (c->srcFormatBpp + 7) >> 3; | 1449 const int srcBpp= (c->srcFormatBpp + 7) >> 3; |
1434 const int dstBpp= (c->dstFormatBpp + 7) >> 3; | 1450 const int dstBpp= (c->dstFormatBpp + 7) >> 3; |
1435 const int srcId= c->srcFormatBpp >> 2; /* 1:0, 4:1, 8:2, 15:3, 16:4, 24:6, 3
2:8 */ | 1451 const int srcId= c->srcFormatBpp >> 2; /* 1:0, 4:1, 8:2, 15:3, 16:4, 24:6, 3
2:8 */ |
1436 const int dstId= c->dstFormatBpp >> 2; | 1452 const int dstId= c->dstFormatBpp >> 2; |
1437 void (*conv)(const uint8_t *src, uint8_t *dst, long src_size)=NULL; | 1453 void (*conv)(const uint8_t *src, uint8_t *dst, long src_size)=NULL; |
1438 | 1454 |
| 1455 #define CONV_IS(src, dst) (srcFormat == PIX_FMT_##src && dstFormat == PIX_FMT_##
dst) |
| 1456 |
| 1457 if (isRGBA32(srcFormat) && isRGBA32(dstFormat)) { |
| 1458 if ( CONV_IS(ABGR, RGBA) |
| 1459 || CONV_IS(ARGB, BGRA) |
| 1460 || CONV_IS(BGRA, ARGB) |
| 1461 || CONV_IS(RGBA, ABGR)) conv = shuffle_bytes_3210; |
| 1462 else if (CONV_IS(ABGR, ARGB) |
| 1463 || CONV_IS(ARGB, ABGR)) conv = shuffle_bytes_0321; |
| 1464 else if (CONV_IS(ABGR, BGRA) |
| 1465 || CONV_IS(ARGB, RGBA)) conv = shuffle_bytes_1230; |
| 1466 else if (CONV_IS(BGRA, RGBA) |
| 1467 || CONV_IS(RGBA, BGRA)) conv = shuffle_bytes_2103; |
| 1468 else if (CONV_IS(BGRA, ABGR) |
| 1469 || CONV_IS(RGBA, ARGB)) conv = shuffle_bytes_3012; |
| 1470 } else |
1439 /* BGR -> BGR */ | 1471 /* BGR -> BGR */ |
1440 if ( (isBGR(srcFormat) && isBGR(dstFormat)) | 1472 if ( (isBGRinInt(srcFormat) && isBGRinInt(dstFormat)) |
1441 || (isRGB(srcFormat) && isRGB(dstFormat))) { | 1473 || (isRGBinInt(srcFormat) && isRGBinInt(dstFormat))) { |
1442 switch(srcId | (dstId<<4)) { | 1474 switch(srcId | (dstId<<4)) { |
1443 case 0x34: conv= rgb16to15; break; | 1475 case 0x34: conv= rgb16to15; break; |
1444 case 0x36: conv= rgb24to15; break; | 1476 case 0x36: conv= rgb24to15; break; |
1445 case 0x38: conv= rgb32to15; break; | 1477 case 0x38: conv= rgb32to15; break; |
1446 case 0x43: conv= rgb15to16; break; | 1478 case 0x43: conv= rgb15to16; break; |
1447 case 0x46: conv= rgb24to16; break; | 1479 case 0x46: conv= rgb24to16; break; |
1448 case 0x48: conv= rgb32to16; break; | 1480 case 0x48: conv= rgb32to16; break; |
1449 case 0x63: conv= rgb15to24; break; | 1481 case 0x63: conv= rgb15to24; break; |
1450 case 0x64: conv= rgb16to24; break; | 1482 case 0x64: conv= rgb16to24; break; |
1451 case 0x68: conv= rgb32to24; break; | 1483 case 0x68: conv= rgb32to24; break; |
1452 case 0x83: conv= rgb15to32; break; | 1484 case 0x83: conv= rgb15to32; break; |
1453 case 0x84: conv= rgb16to32; break; | 1485 case 0x84: conv= rgb16to32; break; |
1454 case 0x86: conv= rgb24to32; break; | 1486 case 0x86: conv= rgb24to32; break; |
1455 } | 1487 } |
1456 } else if ( (isBGR(srcFormat) && isRGB(dstFormat)) | 1488 } else if ( (isBGRinInt(srcFormat) && isRGBinInt(dstFormat)) |
1457 || (isRGB(srcFormat) && isBGR(dstFormat))) { | 1489 || (isRGBinInt(srcFormat) && isBGRinInt(dstFormat))) { |
1458 switch(srcId | (dstId<<4)) { | 1490 switch(srcId | (dstId<<4)) { |
1459 case 0x33: conv= rgb15tobgr15; break; | 1491 case 0x33: conv= rgb15tobgr15; break; |
1460 case 0x34: conv= rgb16tobgr15; break; | 1492 case 0x34: conv= rgb16tobgr15; break; |
1461 case 0x36: conv= rgb24tobgr15; break; | 1493 case 0x36: conv= rgb24tobgr15; break; |
1462 case 0x38: conv= rgb32tobgr15; break; | 1494 case 0x38: conv= rgb32tobgr15; break; |
1463 case 0x43: conv= rgb15tobgr16; break; | 1495 case 0x43: conv= rgb15tobgr16; break; |
1464 case 0x44: conv= rgb16tobgr16; break; | 1496 case 0x44: conv= rgb16tobgr16; break; |
1465 case 0x46: conv= rgb24tobgr16; break; | 1497 case 0x46: conv= rgb24tobgr16; break; |
1466 case 0x48: conv= rgb32tobgr16; break; | 1498 case 0x48: conv= rgb32tobgr16; break; |
1467 case 0x63: conv= rgb15tobgr24; break; | 1499 case 0x63: conv= rgb15tobgr24; break; |
1468 case 0x64: conv= rgb16tobgr24; break; | 1500 case 0x64: conv= rgb16tobgr24; break; |
1469 case 0x66: conv= rgb24tobgr24; break; | 1501 case 0x66: conv= rgb24tobgr24; break; |
1470 case 0x68: conv= rgb32tobgr24; break; | 1502 case 0x68: conv= rgb32tobgr24; break; |
1471 case 0x83: conv= rgb15tobgr32; break; | 1503 case 0x83: conv= rgb15tobgr32; break; |
1472 case 0x84: conv= rgb16tobgr32; break; | 1504 case 0x84: conv= rgb16tobgr32; break; |
1473 case 0x86: conv= rgb24tobgr32; break; | 1505 case 0x86: conv= rgb24tobgr32; break; |
1474 case 0x88: conv= rgb32tobgr32; break; | |
1475 } | 1506 } |
1476 } | 1507 } |
1477 | 1508 |
1478 if (!conv) { | 1509 if (!conv) { |
1479 av_log(c, AV_LOG_ERROR, "internal error %s -> %s converter\n", | 1510 av_log(c, AV_LOG_ERROR, "internal error %s -> %s converter\n", |
1480 sws_format_name(srcFormat), sws_format_name(dstFormat)); | 1511 sws_format_name(srcFormat), sws_format_name(dstFormat)); |
1481 } else { | 1512 } else { |
1482 const uint8_t *srcPtr= src[0]; | 1513 const uint8_t *srcPtr= src[0]; |
1483 if(srcFormat == PIX_FMT_RGB32_1 || srcFormat == PIX_FMT_BGR32_1) | 1514 uint8_t *dstPtr= dst[0]; |
| 1515 if ((srcFormat == PIX_FMT_RGB32_1 || srcFormat == PIX_FMT_BGR32_1) && !i
sRGBA32(dstFormat)) |
1484 srcPtr += ALT32_CORR; | 1516 srcPtr += ALT32_CORR; |
1485 | 1517 |
| 1518 if ((dstFormat == PIX_FMT_RGB32_1 || dstFormat == PIX_FMT_BGR32_1) && !i
sRGBA32(srcFormat)) |
| 1519 dstPtr += ALT32_CORR; |
| 1520 |
1486 if (dstStride[0]*srcBpp == srcStride[0]*dstBpp && srcStride[0] > 0) | 1521 if (dstStride[0]*srcBpp == srcStride[0]*dstBpp && srcStride[0] > 0) |
1487 conv(srcPtr, dst[0] + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]
); | 1522 conv(srcPtr, dstPtr + dstStride[0]*srcSliceY, srcSliceH*srcStride[0]
); |
1488 else { | 1523 else { |
1489 int i; | 1524 int i; |
1490 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; | 1525 dstPtr += dstStride[0]*srcSliceY; |
1491 | 1526 |
1492 for (i=0; i<srcSliceH; i++) { | 1527 for (i=0; i<srcSliceH; i++) { |
1493 conv(srcPtr, dstPtr, c->srcW*srcBpp); | 1528 conv(srcPtr, dstPtr, c->srcW*srcBpp); |
1494 srcPtr+= srcStride[0]; | 1529 srcPtr+= srcStride[0]; |
1495 dstPtr+= dstStride[0]; | 1530 dstPtr+= dstStride[0]; |
1496 } | 1531 } |
1497 } | 1532 } |
1498 } | 1533 } |
1499 return srcSliceH; | 1534 return srcSliceH; |
1500 } | 1535 } |
1501 | 1536 |
1502 static int bgr24toyv12Wrapper(SwsContext *c, const uint8_t* src[], int srcStride
[], int srcSliceY, | 1537 static int bgr24ToYv12Wrapper(SwsContext *c, const uint8_t* src[], int srcStride
[], int srcSliceY, |
1503 int srcSliceH, uint8_t* dst[], int dstStride[]) | 1538 int srcSliceH, uint8_t* dst[], int dstStride[]) |
1504 { | 1539 { |
1505 rgb24toyv12( | 1540 rgb24toyv12( |
1506 src[0], | 1541 src[0], |
1507 dst[0]+ srcSliceY *dstStride[0], | 1542 dst[0]+ srcSliceY *dstStride[0], |
1508 dst[1]+(srcSliceY>>1)*dstStride[1], | 1543 dst[1]+(srcSliceY>>1)*dstStride[1], |
1509 dst[2]+(srcSliceY>>1)*dstStride[2], | 1544 dst[2]+(srcSliceY>>1)*dstStride[2], |
1510 c->srcW, srcSliceH, | 1545 c->srcW, srcSliceH, |
1511 dstStride[0], dstStride[1], srcStride[0]); | 1546 dstStride[0], dstStride[1], srcStride[0]); |
1512 if (dst[3]) | 1547 if (dst[3]) |
1513 fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); | 1548 fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); |
1514 return srcSliceH; | 1549 return srcSliceH; |
1515 } | 1550 } |
1516 | 1551 |
1517 static int yvu9toyv12Wrapper(SwsContext *c, const uint8_t* src[], int srcStride[
], int srcSliceY, | 1552 static int yvu9ToYv12Wrapper(SwsContext *c, const uint8_t* src[], int srcStride[
], int srcSliceY, |
1518 int srcSliceH, uint8_t* dst[], int dstStride[]) | 1553 int srcSliceH, uint8_t* dst[], int dstStride[]) |
1519 { | 1554 { |
1520 int i; | 1555 int i; |
1521 | 1556 |
1522 /* copy Y */ | 1557 /* copy Y */ |
1523 if (srcStride[0]==dstStride[0] && srcStride[0] > 0) | 1558 if (srcStride[0]==dstStride[0] && srcStride[0] > 0) |
1524 memcpy(dst[0]+ srcSliceY*dstStride[0], src[0], srcStride[0]*srcSliceH); | 1559 memcpy(dst[0]+ srcSliceY*dstStride[0], src[0], srcStride[0]*srcSliceH); |
1525 else { | 1560 else { |
1526 const uint8_t *srcPtr= src[0]; | 1561 const uint8_t *srcPtr= src[0]; |
1527 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; | 1562 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; |
(...skipping 15 matching lines...) Expand all Loading... |
1543 srcSliceH >> 2, srcStride[1], dstStride[2]); | 1578 srcSliceH >> 2, srcStride[1], dstStride[2]); |
1544 planar2x(src[2], dst[1] + dstStride[1]*(srcSliceY >> 1), c->chrSrcW, | 1579 planar2x(src[2], dst[1] + dstStride[1]*(srcSliceY >> 1), c->chrSrcW, |
1545 srcSliceH >> 2, srcStride[2], dstStride[1]); | 1580 srcSliceH >> 2, srcStride[2], dstStride[1]); |
1546 } | 1581 } |
1547 if (dst[3]) | 1582 if (dst[3]) |
1548 fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); | 1583 fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); |
1549 return srcSliceH; | 1584 return srcSliceH; |
1550 } | 1585 } |
1551 | 1586 |
1552 /* unscaled copy like stuff (assumes nearly identical formats) */ | 1587 /* unscaled copy like stuff (assumes nearly identical formats) */ |
1553 static int packedCopy(SwsContext *c, const uint8_t* src[], int srcStride[], int
srcSliceY, | 1588 static int packedCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[
], int srcSliceY, |
1554 int srcSliceH, uint8_t* dst[], int dstStride[]) | 1589 int srcSliceH, uint8_t* dst[], int dstStride[]) |
1555 { | 1590 { |
1556 if (dstStride[0]==srcStride[0] && srcStride[0] > 0) | 1591 if (dstStride[0]==srcStride[0] && srcStride[0] > 0) |
1557 memcpy(dst[0] + dstStride[0]*srcSliceY, src[0], srcSliceH*dstStride[0]); | 1592 memcpy(dst[0] + dstStride[0]*srcSliceY, src[0], srcSliceH*dstStride[0]); |
1558 else { | 1593 else { |
1559 int i; | 1594 int i; |
1560 const uint8_t *srcPtr= src[0]; | 1595 const uint8_t *srcPtr= src[0]; |
1561 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; | 1596 uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY; |
1562 int length=0; | 1597 int length=0; |
1563 | 1598 |
1564 /* universal length finder */ | 1599 /* universal length finder */ |
1565 while(length+c->srcW <= FFABS(dstStride[0]) | 1600 while(length+c->srcW <= FFABS(dstStride[0]) |
1566 && length+c->srcW <= FFABS(srcStride[0])) length+= c->srcW; | 1601 && length+c->srcW <= FFABS(srcStride[0])) length+= c->srcW; |
1567 assert(length!=0); | 1602 assert(length!=0); |
1568 | 1603 |
1569 for (i=0; i<srcSliceH; i++) { | 1604 for (i=0; i<srcSliceH; i++) { |
1570 memcpy(dstPtr, srcPtr, length); | 1605 memcpy(dstPtr, srcPtr, length); |
1571 srcPtr+= srcStride[0]; | 1606 srcPtr+= srcStride[0]; |
1572 dstPtr+= dstStride[0]; | 1607 dstPtr+= dstStride[0]; |
1573 } | 1608 } |
1574 } | 1609 } |
1575 return srcSliceH; | 1610 return srcSliceH; |
1576 } | 1611 } |
1577 | 1612 |
1578 static int planarCopy(SwsContext *c, const uint8_t* src[], int srcStride[], int
srcSliceY, | 1613 static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[
], int srcSliceY, |
1579 int srcSliceH, uint8_t* dst[], int dstStride[]) | 1614 int srcSliceH, uint8_t* dst[], int dstStride[]) |
1580 { | 1615 { |
1581 int plane, i, j; | 1616 int plane, i, j; |
1582 for (plane=0; plane<4; plane++) { | 1617 for (plane=0; plane<4; plane++) { |
1583 int length= (plane==0 || plane==3) ? c->srcW : -((-c->srcW )>>c->chrDs
tHSubSample); | 1618 int length= (plane==0 || plane==3) ? c->srcW : -((-c->srcW )>>c->chrDs
tHSubSample); |
1584 int y= (plane==0 || plane==3) ? srcSliceY: -((-srcSliceY)>>c->chrDs
tVSubSample); | 1619 int y= (plane==0 || plane==3) ? srcSliceY: -((-srcSliceY)>>c->chrDs
tVSubSample); |
1585 int height= (plane==0 || plane==3) ? srcSliceH: -((-srcSliceH)>>c->chrDs
tVSubSample); | 1620 int height= (plane==0 || plane==3) ? srcSliceH: -((-srcSliceH)>>c->chrDs
tVSubSample); |
1586 const uint8_t *srcPtr= src[plane]; | 1621 const uint8_t *srcPtr= src[plane]; |
1587 uint8_t *dstPtr= dst[plane] + dstStride[plane]*y; | 1622 uint8_t *dstPtr= dst[plane] + dstStride[plane]*y; |
1588 | 1623 |
1589 if (!dst[plane]) continue; | 1624 if (!dst[plane]) continue; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1653 } | 1688 } |
1654 | 1689 |
1655 void ff_get_unscaled_swscale(SwsContext *c) | 1690 void ff_get_unscaled_swscale(SwsContext *c) |
1656 { | 1691 { |
1657 const enum PixelFormat srcFormat = c->srcFormat; | 1692 const enum PixelFormat srcFormat = c->srcFormat; |
1658 const enum PixelFormat dstFormat = c->dstFormat; | 1693 const enum PixelFormat dstFormat = c->dstFormat; |
1659 const int flags = c->flags; | 1694 const int flags = c->flags; |
1660 const int dstH = c->dstH; | 1695 const int dstH = c->dstH; |
1661 int needsDither; | 1696 int needsDither; |
1662 | 1697 |
1663 needsDither= (isBGR(dstFormat) || isRGB(dstFormat)) | 1698 needsDither= isAnyRGB(dstFormat) |
1664 && c->dstFormatBpp < 24 | 1699 && c->dstFormatBpp < 24 |
1665 && (c->dstFormatBpp < c->srcFormatBpp || (!(isRGB(srcFormat) || isBGR(sr
cFormat)))); | 1700 && (c->dstFormatBpp < c->srcFormatBpp || (!isAnyRGB(srcFormat))); |
1666 | 1701 |
1667 /* yv12_to_nv12 */ | 1702 /* yv12_to_nv12 */ |
1668 if ((srcFormat == PIX_FMT_YUV420P || srcFormat == PIX_FMT_YUVA420P) && (dstF
ormat == PIX_FMT_NV12 || dstFormat == PIX_FMT_NV21)) { | 1703 if ((srcFormat == PIX_FMT_YUV420P || srcFormat == PIX_FMT_YUVA420P) && (dstF
ormat == PIX_FMT_NV12 || dstFormat == PIX_FMT_NV21)) { |
1669 c->swScale= PlanarToNV12Wrapper; | 1704 c->swScale= planarToNv12Wrapper; |
1670 } | 1705 } |
1671 /* yuv2bgr */ | 1706 /* yuv2bgr */ |
1672 if ((srcFormat==PIX_FMT_YUV420P || srcFormat==PIX_FMT_YUV422P || srcFormat==
PIX_FMT_YUVA420P) && (isBGR(dstFormat) || isRGB(dstFormat)) | 1707 if ((srcFormat==PIX_FMT_YUV420P || srcFormat==PIX_FMT_YUV422P || srcFormat==
PIX_FMT_YUVA420P) && isAnyRGB(dstFormat) |
1673 && !(flags & SWS_ACCURATE_RND) && !(dstH&1)) { | 1708 && !(flags & SWS_ACCURATE_RND) && !(dstH&1)) { |
1674 c->swScale= ff_yuv2rgb_get_func_ptr(c); | 1709 c->swScale= ff_yuv2rgb_get_func_ptr(c); |
1675 } | 1710 } |
1676 | 1711 |
1677 if (srcFormat==PIX_FMT_YUV410P && (dstFormat==PIX_FMT_YUV420P || dstFormat==
PIX_FMT_YUVA420P) && !(flags & SWS_BITEXACT)) { | 1712 if (srcFormat==PIX_FMT_YUV410P && (dstFormat==PIX_FMT_YUV420P || dstFormat==
PIX_FMT_YUVA420P) && !(flags & SWS_BITEXACT)) { |
1678 c->swScale= yvu9toyv12Wrapper; | 1713 c->swScale= yvu9ToYv12Wrapper; |
1679 } | 1714 } |
1680 | 1715 |
1681 /* bgr24toYV12 */ | 1716 /* bgr24toYV12 */ |
1682 if (srcFormat==PIX_FMT_BGR24 && (dstFormat==PIX_FMT_YUV420P || dstFormat==PI
X_FMT_YUVA420P) && !(flags & SWS_ACCURATE_RND)) | 1717 if (srcFormat==PIX_FMT_BGR24 && (dstFormat==PIX_FMT_YUV420P || dstFormat==PI
X_FMT_YUVA420P) && !(flags & SWS_ACCURATE_RND)) |
1683 c->swScale= bgr24toyv12Wrapper; | 1718 c->swScale= bgr24ToYv12Wrapper; |
1684 | 1719 |
1685 /* RGB/BGR -> RGB/BGR (no dither needed forms) */ | 1720 /* RGB/BGR -> RGB/BGR (no dither needed forms) */ |
1686 if ( (isBGR(srcFormat) || isRGB(srcFormat)) | 1721 if ( isAnyRGB(srcFormat) |
1687 && (isBGR(dstFormat) || isRGB(dstFormat)) | 1722 && isAnyRGB(dstFormat) |
1688 && srcFormat != PIX_FMT_BGR8 && dstFormat != PIX_FMT_BGR8 | 1723 && srcFormat != PIX_FMT_BGR8 && dstFormat != PIX_FMT_BGR8 |
1689 && srcFormat != PIX_FMT_RGB8 && dstFormat != PIX_FMT_RGB8 | 1724 && srcFormat != PIX_FMT_RGB8 && dstFormat != PIX_FMT_RGB8 |
1690 && srcFormat != PIX_FMT_BGR4 && dstFormat != PIX_FMT_BGR4 | 1725 && srcFormat != PIX_FMT_BGR4 && dstFormat != PIX_FMT_BGR4 |
1691 && srcFormat != PIX_FMT_RGB4 && dstFormat != PIX_FMT_RGB4 | 1726 && srcFormat != PIX_FMT_RGB4 && dstFormat != PIX_FMT_RGB4 |
1692 && srcFormat != PIX_FMT_BGR4_BYTE && dstFormat != PIX_FMT_BGR4_BYTE | 1727 && srcFormat != PIX_FMT_BGR4_BYTE && dstFormat != PIX_FMT_BGR4_BYTE |
1693 && srcFormat != PIX_FMT_RGB4_BYTE && dstFormat != PIX_FMT_RGB4_BYTE | 1728 && srcFormat != PIX_FMT_RGB4_BYTE && dstFormat != PIX_FMT_RGB4_BYTE |
1694 && srcFormat != PIX_FMT_MONOBLACK && dstFormat != PIX_FMT_MONOBLACK | 1729 && srcFormat != PIX_FMT_MONOBLACK && dstFormat != PIX_FMT_MONOBLACK |
1695 && srcFormat != PIX_FMT_MONOWHITE && dstFormat != PIX_FMT_MONOWHITE | 1730 && srcFormat != PIX_FMT_MONOWHITE && dstFormat != PIX_FMT_MONOWHITE |
1696 && dstFormat != PIX_FMT_RGB32_1 | |
1697 && dstFormat != PIX_FMT_BGR32_1 | |
1698 && srcFormat != PIX_FMT_RGB48LE && dstFormat != PIX_FMT_RGB48LE | 1731 && srcFormat != PIX_FMT_RGB48LE && dstFormat != PIX_FMT_RGB48LE |
1699 && srcFormat != PIX_FMT_RGB48BE && dstFormat != PIX_FMT_RGB48BE | 1732 && srcFormat != PIX_FMT_RGB48BE && dstFormat != PIX_FMT_RGB48BE |
1700 && (!needsDither || (c->flags&(SWS_FAST_BILINEAR|SWS_POINT)))) | 1733 && (!needsDither || (c->flags&(SWS_FAST_BILINEAR|SWS_POINT)))) |
1701 c->swScale= rgb2rgbWrapper; | 1734 c->swScale= rgbToRgbWrapper; |
1702 | 1735 |
1703 if ((usePal(srcFormat) && ( | 1736 if ((usePal(srcFormat) && ( |
1704 dstFormat == PIX_FMT_RGB32 || | 1737 dstFormat == PIX_FMT_RGB32 || |
1705 dstFormat == PIX_FMT_RGB32_1 || | 1738 dstFormat == PIX_FMT_RGB32_1 || |
1706 dstFormat == PIX_FMT_RGB24 || | 1739 dstFormat == PIX_FMT_RGB24 || |
1707 dstFormat == PIX_FMT_BGR32 || | 1740 dstFormat == PIX_FMT_BGR32 || |
1708 dstFormat == PIX_FMT_BGR32_1 || | 1741 dstFormat == PIX_FMT_BGR32_1 || |
1709 dstFormat == PIX_FMT_BGR24))) | 1742 dstFormat == PIX_FMT_BGR24))) |
1710 c->swScale= pal2rgbWrapper; | 1743 c->swScale= palToRgbWrapper; |
1711 | 1744 |
1712 if (srcFormat == PIX_FMT_YUV422P) { | 1745 if (srcFormat == PIX_FMT_YUV422P) { |
1713 if (dstFormat == PIX_FMT_YUYV422) | 1746 if (dstFormat == PIX_FMT_YUYV422) |
1714 c->swScale= YUV422PToYuy2Wrapper; | 1747 c->swScale= yuv422pToYuy2Wrapper; |
1715 else if (dstFormat == PIX_FMT_UYVY422) | 1748 else if (dstFormat == PIX_FMT_UYVY422) |
1716 c->swScale= YUV422PToUyvyWrapper; | 1749 c->swScale= yuv422pToUyvyWrapper; |
1717 } | 1750 } |
1718 | 1751 |
1719 /* LQ converters if -sws 0 or -sws 4*/ | 1752 /* LQ converters if -sws 0 or -sws 4*/ |
1720 if (c->flags&(SWS_FAST_BILINEAR|SWS_POINT)) { | 1753 if (c->flags&(SWS_FAST_BILINEAR|SWS_POINT)) { |
1721 /* yv12_to_yuy2 */ | 1754 /* yv12_to_yuy2 */ |
1722 if (srcFormat == PIX_FMT_YUV420P || srcFormat == PIX_FMT_YUVA420P) { | 1755 if (srcFormat == PIX_FMT_YUV420P || srcFormat == PIX_FMT_YUVA420P) { |
1723 if (dstFormat == PIX_FMT_YUYV422) | 1756 if (dstFormat == PIX_FMT_YUYV422) |
1724 c->swScale= PlanarToYuy2Wrapper; | 1757 c->swScale= planarToYuy2Wrapper; |
1725 else if (dstFormat == PIX_FMT_UYVY422) | 1758 else if (dstFormat == PIX_FMT_UYVY422) |
1726 c->swScale= PlanarToUyvyWrapper; | 1759 c->swScale= planarToUyvyWrapper; |
1727 } | 1760 } |
1728 } | 1761 } |
1729 if(srcFormat == PIX_FMT_YUYV422 && (dstFormat == PIX_FMT_YUV420P || dstForma
t == PIX_FMT_YUVA420P)) | 1762 if(srcFormat == PIX_FMT_YUYV422 && (dstFormat == PIX_FMT_YUV420P || dstForma
t == PIX_FMT_YUVA420P)) |
1730 c->swScale= YUYV2YUV420Wrapper; | 1763 c->swScale= yuyvToYuv420Wrapper; |
1731 if(srcFormat == PIX_FMT_UYVY422 && (dstFormat == PIX_FMT_YUV420P || dstForma
t == PIX_FMT_YUVA420P)) | 1764 if(srcFormat == PIX_FMT_UYVY422 && (dstFormat == PIX_FMT_YUV420P || dstForma
t == PIX_FMT_YUVA420P)) |
1732 c->swScale= UYVY2YUV420Wrapper; | 1765 c->swScale= uyvyToYuv420Wrapper; |
1733 if(srcFormat == PIX_FMT_YUYV422 && dstFormat == PIX_FMT_YUV422P) | 1766 if(srcFormat == PIX_FMT_YUYV422 && dstFormat == PIX_FMT_YUV422P) |
1734 c->swScale= YUYV2YUV422Wrapper; | 1767 c->swScale= yuyvToYuv422Wrapper; |
1735 if(srcFormat == PIX_FMT_UYVY422 && dstFormat == PIX_FMT_YUV422P) | 1768 if(srcFormat == PIX_FMT_UYVY422 && dstFormat == PIX_FMT_YUV422P) |
1736 c->swScale= UYVY2YUV422Wrapper; | 1769 c->swScale= uyvyToYuv422Wrapper; |
1737 | 1770 |
1738 #ifdef COMPILE_ALTIVEC | 1771 #ifdef COMPILE_ALTIVEC |
1739 if ((c->flags & SWS_CPU_CAPS_ALTIVEC) && | 1772 if ((c->flags & SWS_CPU_CAPS_ALTIVEC) && |
1740 !(c->flags & SWS_BITEXACT) && | 1773 !(c->flags & SWS_BITEXACT) && |
1741 srcFormat == PIX_FMT_YUV420P) { | 1774 srcFormat == PIX_FMT_YUV420P) { |
1742 // unscaled YV12 -> packed YUV, we want speed | 1775 // unscaled YV12 -> packed YUV, we want speed |
1743 if (dstFormat == PIX_FMT_YUYV422) | 1776 if (dstFormat == PIX_FMT_YUYV422) |
1744 c->swScale= yv12toyuy2_unscaled_altivec; | 1777 c->swScale= yv12toyuy2_unscaled_altivec; |
1745 else if (dstFormat == PIX_FMT_UYVY422) | 1778 else if (dstFormat == PIX_FMT_UYVY422) |
1746 c->swScale= yv12touyvy_unscaled_altivec; | 1779 c->swScale= yv12touyvy_unscaled_altivec; |
1747 } | 1780 } |
1748 #endif | 1781 #endif |
1749 | 1782 |
1750 /* simple copy */ | 1783 /* simple copy */ |
1751 if ( srcFormat == dstFormat | 1784 if ( srcFormat == dstFormat |
1752 || (srcFormat == PIX_FMT_YUVA420P && dstFormat == PIX_FMT_YUV420P) | 1785 || (srcFormat == PIX_FMT_YUVA420P && dstFormat == PIX_FMT_YUV420P) |
1753 || (srcFormat == PIX_FMT_YUV420P && dstFormat == PIX_FMT_YUVA420P) | 1786 || (srcFormat == PIX_FMT_YUV420P && dstFormat == PIX_FMT_YUVA420P) |
1754 || (isPlanarYUV(srcFormat) && isGray(dstFormat)) | 1787 || (isPlanarYUV(srcFormat) && isGray(dstFormat)) |
1755 || (isPlanarYUV(dstFormat) && isGray(srcFormat)) | 1788 || (isPlanarYUV(dstFormat) && isGray(srcFormat)) |
1756 || (isGray(dstFormat) && isGray(srcFormat)) | 1789 || (isGray(dstFormat) && isGray(srcFormat)) |
1757 || (isPlanarYUV(srcFormat) && isPlanarYUV(dstFormat) | 1790 || (isPlanarYUV(srcFormat) && isPlanarYUV(dstFormat) |
1758 && c->chrDstHSubSample == c->chrSrcHSubSample | 1791 && c->chrDstHSubSample == c->chrSrcHSubSample |
1759 && c->chrDstVSubSample == c->chrSrcVSubSample | 1792 && c->chrDstVSubSample == c->chrSrcVSubSample |
1760 && dstFormat != PIX_FMT_NV12 && dstFormat != PIX_FMT_NV21 | 1793 && dstFormat != PIX_FMT_NV12 && dstFormat != PIX_FMT_NV21 |
1761 && srcFormat != PIX_FMT_NV12 && srcFormat != PIX_FMT_NV21)) | 1794 && srcFormat != PIX_FMT_NV12 && srcFormat != PIX_FMT_NV21)) |
1762 { | 1795 { |
1763 if (isPacked(c->srcFormat)) | 1796 if (isPacked(c->srcFormat)) |
1764 c->swScale= packedCopy; | 1797 c->swScale= packedCopyWrapper; |
1765 else /* Planar YUV or gray */ | 1798 else /* Planar YUV or gray */ |
1766 c->swScale= planarCopy; | 1799 c->swScale= planarCopyWrapper; |
1767 } | 1800 } |
1768 #if ARCH_BFIN | 1801 #if ARCH_BFIN |
1769 if (flags & SWS_CPU_CAPS_BFIN) | 1802 if (flags & SWS_CPU_CAPS_BFIN) |
1770 ff_bfin_get_unscaled_swscale (c); | 1803 ff_bfin_get_unscaled_swscale (c); |
1771 #endif | 1804 #endif |
1772 } | 1805 } |
1773 | 1806 |
1774 static void reset_ptr(const uint8_t* src[], int format) | 1807 static void reset_ptr(const uint8_t* src[], int format) |
1775 { | 1808 { |
1776 if(!isALPHA(format)) | 1809 if(!isALPHA(format)) |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1819 g= ((i>>2)&7)*36; | 1852 g= ((i>>2)&7)*36; |
1820 b= (i&3 )*85; | 1853 b= (i&3 )*85; |
1821 } else if(c->srcFormat == PIX_FMT_BGR8) { | 1854 } else if(c->srcFormat == PIX_FMT_BGR8) { |
1822 b= (i>>6 )*85; | 1855 b= (i>>6 )*85; |
1823 g= ((i>>3)&7)*36; | 1856 g= ((i>>3)&7)*36; |
1824 r= (i&7 )*36; | 1857 r= (i&7 )*36; |
1825 } else if(c->srcFormat == PIX_FMT_RGB4_BYTE) { | 1858 } else if(c->srcFormat == PIX_FMT_RGB4_BYTE) { |
1826 r= (i>>3 )*255; | 1859 r= (i>>3 )*255; |
1827 g= ((i>>1)&3)*85; | 1860 g= ((i>>1)&3)*85; |
1828 b= (i&1 )*255; | 1861 b= (i&1 )*255; |
| 1862 } else if(c->srcFormat == PIX_FMT_GRAY8) { |
| 1863 r = g = b = i; |
1829 } else { | 1864 } else { |
1830 assert(c->srcFormat == PIX_FMT_BGR4_BYTE); | 1865 assert(c->srcFormat == PIX_FMT_BGR4_BYTE); |
1831 b= (i>>3 )*255; | 1866 b= (i>>3 )*255; |
1832 g= ((i>>1)&3)*85; | 1867 g= ((i>>1)&3)*85; |
1833 r= (i&1 )*255; | 1868 r= (i&1 )*255; |
1834 } | 1869 } |
1835 y= av_clip_uint8((RY*r + GY*g + BY*b + ( 33<<(RGB2YUV_SHIFT-1)))>>RG
B2YUV_SHIFT); | 1870 y= av_clip_uint8((RY*r + GY*g + BY*b + ( 33<<(RGB2YUV_SHIFT-1)))>>RG
B2YUV_SHIFT); |
1836 u= av_clip_uint8((RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1)))>>RG
B2YUV_SHIFT); | 1871 u= av_clip_uint8((RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1)))>>RG
B2YUV_SHIFT); |
1837 v= av_clip_uint8((RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1)))>>RG
B2YUV_SHIFT); | 1872 v= av_clip_uint8((RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1)))>>RG
B2YUV_SHIFT); |
1838 c->pal_yuv[i]= y + (u<<8) + (v<<16); | 1873 c->pal_yuv[i]= y + (u<<8) + (v<<16); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1906 } | 1941 } |
1907 } | 1942 } |
1908 | 1943 |
1909 #if LIBSWSCALE_VERSION_MAJOR < 1 | 1944 #if LIBSWSCALE_VERSION_MAJOR < 1 |
1910 int sws_scale_ordered(SwsContext *c, const uint8_t* const src[], int srcStride[]
, int srcSliceY, | 1945 int sws_scale_ordered(SwsContext *c, const uint8_t* const src[], int srcStride[]
, int srcSliceY, |
1911 int srcSliceH, uint8_t* dst[], int dstStride[]) | 1946 int srcSliceH, uint8_t* dst[], int dstStride[]) |
1912 { | 1947 { |
1913 return sws_scale(c, src, srcStride, srcSliceY, srcSliceH, dst, dstStride); | 1948 return sws_scale(c, src, srcStride, srcSliceY, srcSliceH, dst, dstStride); |
1914 } | 1949 } |
1915 #endif | 1950 #endif |
OLD | NEW |