Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Side by Side Diff: patched-ffmpeg-mt/libswscale/swscale.c

Issue 789004: ffmpeg roll of source to mar 9 version... (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/ffmpeg/
Patch Set: '' Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698