| 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 |