Go to the documentation of this file.
35 0x0200020002000200LL,};
39 0x0004000400040004LL,};
56 #if HAVE_MMXEXT_INLINE
58 #undef COMPILE_TEMPLATE_MMXEXT
59 #define COMPILE_TEMPLATE_MMXEXT 1
60 #define RENAME(a) a ## _mmxext
66 const int dstH=
c->dstH;
69 SwsPlane *lumPlane = &
c->slice[
c->numSlice-2].plane[0];
70 SwsPlane *chrUPlane = &
c->slice[
c->numSlice-2].plane[1];
71 SwsPlane *alpPlane = &
c->slice[
c->numSlice-2].plane[3];
73 int hasAlpha =
c->needAlpha;
83 const int chrDstY=
dstY>>
c->chrDstVSubSample;
94 const int16_t **lumSrcPtr = (
const int16_t **)(
void*) lumPlane->
line + firstLumSrcY - lumPlane->
sliceY;
95 const int16_t **chrUSrcPtr = (
const int16_t **)(
void*) chrUPlane->
line + firstChrSrcY - chrUPlane->
sliceY;
96 const int16_t **alpSrcPtr = (CONFIG_SWSCALE_ALPHA && hasAlpha) ? (
const int16_t **)(
void*) alpPlane->
line + firstLumSrcY - alpPlane->
sliceY :
NULL;
99 if (firstLumSrcY < 0 || firstLumSrcY + vLumFilterSize >
c->srcH) {
100 const int16_t **tmpY = (
const int16_t **) lumPlane->
tmp;
103 for (
i = 0;
i < neg;
i++)
104 tmpY[
i] = lumSrcPtr[neg];
105 for ( ;
i < end;
i++)
106 tmpY[
i] = lumSrcPtr[
i];
112 const int16_t **tmpA = (
const int16_t **) alpPlane->
tmp;
114 tmpA[
i] = alpSrcPtr[neg];
115 for ( ;
i < end;
i++)
116 tmpA[
i] = alpSrcPtr[
i];
118 tmpA[
i] = tmpA[
i - 1];
122 if (firstChrSrcY < 0 || firstChrSrcY + vChrFilterSize >
c->chrSrcH) {
123 const int16_t **tmpU = (
const int16_t **) chrUPlane->
tmp;
125 for (
i = 0;
i < neg;
i++) {
126 tmpU[
i] = chrUSrcPtr[neg];
128 for ( ;
i < end;
i++) {
129 tmpU[
i] = chrUSrcPtr[
i];
132 tmpU[
i] = tmpU[
i - 1];
145 if (CONFIG_SWSCALE_ALPHA && hasAlpha) {
165 if (CONFIG_SWSCALE_ALPHA && hasAlpha) {
182 #define YUV2YUVX_FUNC_MMX(opt, step) \
183 void ff_yuv2yuvX_ ##opt(const int16_t *filter, int filterSize, int srcOffset, \
184 uint8_t *dest, int dstW, \
185 const uint8_t *dither, int offset); \
186 static void yuv2yuvX_ ##opt(const int16_t *filter, int filterSize, \
187 const int16_t **src, uint8_t *dest, int dstW, \
188 const uint8_t *dither, int offset) \
191 ff_yuv2yuvX_ ##opt(filter, filterSize - 1, 0, dest - offset, dstW + offset, dither, offset); \
195 #define YUV2YUVX_FUNC(opt, step) \
196 void ff_yuv2yuvX_ ##opt(const int16_t *filter, int filterSize, int srcOffset, \
197 uint8_t *dest, int dstW, \
198 const uint8_t *dither, int offset); \
199 static void yuv2yuvX_ ##opt(const int16_t *filter, int filterSize, \
200 const int16_t **src, uint8_t *dest, int dstW, \
201 const uint8_t *dither, int offset) \
203 int remainder = (dstW % step); \
204 int pixelsProcessed = dstW - remainder; \
205 if(((uintptr_t)dest) & 15){ \
206 yuv2yuvX_mmxext(filter, filterSize, src, dest, dstW, dither, offset); \
209 if(pixelsProcessed > 0) \
210 ff_yuv2yuvX_ ##opt(filter, filterSize - 1, 0, dest - offset, pixelsProcessed + offset, dither, offset); \
212 ff_yuv2yuvX_mmxext(filter, filterSize - 1, pixelsProcessed, dest - offset, pixelsProcessed + remainder + offset, dither, offset); \
217 #if HAVE_MMXEXT_EXTERNAL
220 #if HAVE_SSE3_EXTERNAL
223 #if HAVE_AVX2_EXTERNAL
227 #define SCALE_FUNC(filter_n, from_bpc, to_bpc, opt) \
228 void ff_hscale ## from_bpc ## to ## to_bpc ## _ ## filter_n ## _ ## opt( \
229 SwsContext *c, int16_t *data, \
230 int dstW, const uint8_t *src, \
231 const int16_t *filter, \
232 const int32_t *filterPos, int filterSize)
234 #define SCALE_FUNCS(filter_n, opt) \
235 SCALE_FUNC(filter_n, 8, 15, opt); \
236 SCALE_FUNC(filter_n, 9, 15, opt); \
237 SCALE_FUNC(filter_n, 10, 15, opt); \
238 SCALE_FUNC(filter_n, 12, 15, opt); \
239 SCALE_FUNC(filter_n, 14, 15, opt); \
240 SCALE_FUNC(filter_n, 16, 15, opt); \
241 SCALE_FUNC(filter_n, 8, 19, opt); \
242 SCALE_FUNC(filter_n, 9, 19, opt); \
243 SCALE_FUNC(filter_n, 10, 19, opt); \
244 SCALE_FUNC(filter_n, 12, 19, opt); \
245 SCALE_FUNC(filter_n, 14, 19, opt); \
246 SCALE_FUNC(filter_n, 16, 19, opt)
248 #define SCALE_FUNCS_MMX(opt) \
249 SCALE_FUNCS(4, opt); \
250 SCALE_FUNCS(8, opt); \
253 #define SCALE_FUNCS_SSE(opt) \
254 SCALE_FUNCS(4, opt); \
255 SCALE_FUNCS(8, opt); \
256 SCALE_FUNCS(X4, opt); \
266 #define VSCALEX_FUNC(size, opt) \
267 void ff_yuv2planeX_ ## size ## _ ## opt(const int16_t *filter, int filterSize, \
268 const int16_t **src, uint8_t *dest, int dstW, \
269 const uint8_t *dither, int offset)
270 #define VSCALEX_FUNCS(opt) \
271 VSCALEX_FUNC(8, opt); \
272 VSCALEX_FUNC(9, opt); \
273 VSCALEX_FUNC(10, opt)
281 #define VSCALE_FUNC(size, opt) \
282 void ff_yuv2plane1_ ## size ## _ ## opt(const int16_t *src, uint8_t *dst, int dstW, \
283 const uint8_t *dither, int offset)
284 #define VSCALE_FUNCS(opt1, opt2) \
285 VSCALE_FUNC(8, opt1); \
286 VSCALE_FUNC(9, opt2); \
287 VSCALE_FUNC(10, opt2); \
288 VSCALE_FUNC(16, opt1)
294 #define INPUT_Y_FUNC(fmt, opt) \
295 void ff_ ## fmt ## ToY_ ## opt(uint8_t *dst, const uint8_t *src, \
296 const uint8_t *unused1, const uint8_t *unused2, \
297 int w, uint32_t *unused, void *opq)
298 #define INPUT_UV_FUNC(fmt, opt) \
299 void ff_ ## fmt ## ToUV_ ## opt(uint8_t *dstU, uint8_t *dstV, \
300 const uint8_t *unused0, \
301 const uint8_t *src1, \
302 const uint8_t *src2, \
303 int w, uint32_t *unused, void *opq)
304 #define INPUT_FUNC(fmt, opt) \
305 INPUT_Y_FUNC(fmt, opt); \
306 INPUT_UV_FUNC(fmt, opt)
307 #define INPUT_FUNCS(opt) \
308 INPUT_FUNC(uyvy, opt); \
309 INPUT_FUNC(yuyv, opt); \
310 INPUT_UV_FUNC(nv12, opt); \
311 INPUT_UV_FUNC(nv21, opt); \
312 INPUT_FUNC(rgba, opt); \
313 INPUT_FUNC(bgra, opt); \
314 INPUT_FUNC(argb, opt); \
315 INPUT_FUNC(abgr, opt); \
316 INPUT_FUNC(rgb24, opt); \
317 INPUT_FUNC(bgr24, opt)
330 #define YUV2NV_DECL(fmt, opt) \
331 void ff_yuv2 ## fmt ## cX_ ## opt(enum AVPixelFormat format, const uint8_t *dither, \
332 const int16_t *filter, int filterSize, \
333 const int16_t **u, const int16_t **v, \
334 uint8_t *dst, int dstWidth)
336 YUV2NV_DECL(nv12, avx2);
337 YUV2NV_DECL(nv21, avx2);
339 #define YUV2GBRP_FN_DECL(fmt, opt) \
340 void ff_yuv2##fmt##_full_X_ ##opt(SwsContext *c, const int16_t *lumFilter, \
341 const int16_t **lumSrcx, int lumFilterSize, \
342 const int16_t *chrFilter, const int16_t **chrUSrcx, \
343 const int16_t **chrVSrcx, int chrFilterSize, \
344 const int16_t **alpSrcx, uint8_t **dest, \
347 #define YUV2GBRP_DECL(opt) \
348 YUV2GBRP_FN_DECL(gbrp, opt); \
349 YUV2GBRP_FN_DECL(gbrap, opt); \
350 YUV2GBRP_FN_DECL(gbrp9le, opt); \
351 YUV2GBRP_FN_DECL(gbrp10le, opt); \
352 YUV2GBRP_FN_DECL(gbrap10le, opt); \
353 YUV2GBRP_FN_DECL(gbrp12le, opt); \
354 YUV2GBRP_FN_DECL(gbrap12le, opt); \
355 YUV2GBRP_FN_DECL(gbrp14le, opt); \
356 YUV2GBRP_FN_DECL(gbrp16le, opt); \
357 YUV2GBRP_FN_DECL(gbrap16le, opt); \
358 YUV2GBRP_FN_DECL(gbrpf32le, opt); \
359 YUV2GBRP_FN_DECL(gbrapf32le, opt); \
360 YUV2GBRP_FN_DECL(gbrp9be, opt); \
361 YUV2GBRP_FN_DECL(gbrp10be, opt); \
362 YUV2GBRP_FN_DECL(gbrap10be, opt); \
363 YUV2GBRP_FN_DECL(gbrp12be, opt); \
364 YUV2GBRP_FN_DECL(gbrap12be, opt); \
365 YUV2GBRP_FN_DECL(gbrp14be, opt); \
366 YUV2GBRP_FN_DECL(gbrp16be, opt); \
367 YUV2GBRP_FN_DECL(gbrap16be, opt); \
368 YUV2GBRP_FN_DECL(gbrpf32be, opt); \
369 YUV2GBRP_FN_DECL(gbrapf32be, opt)
375 #define INPUT_PLANAR_RGB_Y_FN_DECL(fmt, opt) \
376 void ff_planar_##fmt##_to_y_##opt(uint8_t *dst, \
377 const uint8_t *src[4], int w, int32_t *rgb2yuv, \
380 #define INPUT_PLANAR_RGB_UV_FN_DECL(fmt, opt) \
381 void ff_planar_##fmt##_to_uv_##opt(uint8_t *dstU, uint8_t *dstV, \
382 const uint8_t *src[4], int w, int32_t *rgb2yuv, \
385 #define INPUT_PLANAR_RGB_A_FN_DECL(fmt, opt) \
386 void ff_planar_##fmt##_to_a_##opt(uint8_t *dst, \
387 const uint8_t *src[4], int w, int32_t *rgb2yuv, \
391 #define INPUT_PLANAR_RGBXX_A_DECL(fmt, opt) \
392 INPUT_PLANAR_RGB_A_FN_DECL(fmt##le, opt); \
393 INPUT_PLANAR_RGB_A_FN_DECL(fmt##be, opt)
395 #define INPUT_PLANAR_RGBXX_Y_DECL(fmt, opt) \
396 INPUT_PLANAR_RGB_Y_FN_DECL(fmt##le, opt); \
397 INPUT_PLANAR_RGB_Y_FN_DECL(fmt##be, opt)
399 #define INPUT_PLANAR_RGBXX_UV_DECL(fmt, opt) \
400 INPUT_PLANAR_RGB_UV_FN_DECL(fmt##le, opt); \
401 INPUT_PLANAR_RGB_UV_FN_DECL(fmt##be, opt)
403 #define INPUT_PLANAR_RGBXX_YUVA_DECL(fmt, opt) \
404 INPUT_PLANAR_RGBXX_Y_DECL(fmt, opt); \
405 INPUT_PLANAR_RGBXX_UV_DECL(fmt, opt); \
406 INPUT_PLANAR_RGBXX_A_DECL(fmt, opt)
408 #define INPUT_PLANAR_RGBXX_YUV_DECL(fmt, opt) \
409 INPUT_PLANAR_RGBXX_Y_DECL(fmt, opt); \
410 INPUT_PLANAR_RGBXX_UV_DECL(fmt, opt)
412 #define INPUT_PLANAR_RGBXX_UVA_DECL(fmt, opt) \
413 INPUT_PLANAR_RGBXX_UV_DECL(fmt, opt); \
414 INPUT_PLANAR_RGBXX_A_DECL(fmt, opt)
416 #define INPUT_PLANAR_RGB_A_ALL_DECL(opt) \
417 INPUT_PLANAR_RGB_A_FN_DECL(rgb, opt); \
418 INPUT_PLANAR_RGBXX_A_DECL(rgb10, opt); \
419 INPUT_PLANAR_RGBXX_A_DECL(rgb12, opt); \
420 INPUT_PLANAR_RGBXX_A_DECL(rgb16, opt); \
421 INPUT_PLANAR_RGBXX_A_DECL(rgbf32, opt)
423 #define INPUT_PLANAR_RGB_Y_ALL_DECL(opt) \
424 INPUT_PLANAR_RGB_Y_FN_DECL(rgb, opt); \
425 INPUT_PLANAR_RGBXX_Y_DECL(rgb9, opt); \
426 INPUT_PLANAR_RGBXX_Y_DECL(rgb10, opt); \
427 INPUT_PLANAR_RGBXX_Y_DECL(rgb12, opt); \
428 INPUT_PLANAR_RGBXX_Y_DECL(rgb14, opt); \
429 INPUT_PLANAR_RGBXX_Y_DECL(rgb16, opt); \
430 INPUT_PLANAR_RGBXX_Y_DECL(rgbf32, opt)
432 #define INPUT_PLANAR_RGB_UV_ALL_DECL(opt) \
433 INPUT_PLANAR_RGB_UV_FN_DECL(rgb, opt); \
434 INPUT_PLANAR_RGBXX_UV_DECL(rgb9, opt); \
435 INPUT_PLANAR_RGBXX_UV_DECL(rgb10, opt); \
436 INPUT_PLANAR_RGBXX_UV_DECL(rgb12, opt); \
437 INPUT_PLANAR_RGBXX_UV_DECL(rgb14, opt); \
438 INPUT_PLANAR_RGBXX_UV_DECL(rgb16, opt); \
439 INPUT_PLANAR_RGBXX_UV_DECL(rgbf32, opt)
441 INPUT_PLANAR_RGBXX_Y_DECL(rgbf32, sse2);
442 INPUT_PLANAR_RGB_UV_ALL_DECL(sse2);
443 INPUT_PLANAR_RGB_A_ALL_DECL(sse2);
445 INPUT_PLANAR_RGB_Y_ALL_DECL(sse4);
446 INPUT_PLANAR_RGB_UV_ALL_DECL(sse4);
447 INPUT_PLANAR_RGBXX_A_DECL(rgbf32, sse4);
449 INPUT_PLANAR_RGB_Y_ALL_DECL(avx2);
450 INPUT_PLANAR_RGB_UV_ALL_DECL(avx2);
451 INPUT_PLANAR_RGB_A_ALL_DECL(avx2);
454 #define RANGE_CONVERT_FUNCS(opt) do { \
455 if (c->dstBpc <= 14) { \
457 c->lumConvertRange = ff_lumRangeFromJpeg_ ##opt; \
458 c->chrConvertRange = ff_chrRangeFromJpeg_ ##opt; \
460 c->lumConvertRange = ff_lumRangeToJpeg_ ##opt; \
461 c->chrConvertRange = ff_chrRangeToJpeg_ ##opt; \
466 #define RANGE_CONVERT_FUNCS_DECL(opt) \
467 void ff_lumRangeFromJpeg_ ##opt(int16_t *dst, int width); \
468 void ff_chrRangeFromJpeg_ ##opt(int16_t *dstU, int16_t *dstV, int width); \
469 void ff_lumRangeToJpeg_ ##opt(int16_t *dst, int width); \
470 void ff_chrRangeToJpeg_ ##opt(int16_t *dstU, int16_t *dstV, int width); \
477 if (
c->srcRange !=
c->dstRange && !
isAnyRGB(
c->dstFormat)) {
491 #if HAVE_MMXEXT_INLINE
493 sws_init_swscale_mmxext(
c);
496 #if HAVE_MMXEXT_EXTERNAL
498 c->yuv2planeX = yuv2yuvX_mmxext;
500 #if HAVE_SSE3_EXTERNAL
502 c->yuv2planeX = yuv2yuvX_sse3;
504 #if HAVE_AVX2_EXTERNAL
506 c->yuv2planeX = yuv2yuvX_avx2;
509 #if ARCH_X86_32 && !HAVE_ALIGNED_STACK
513 if (
c->dstBpc == 8 && !
c->use_mmx_vfilter)
514 c->yuv2planeX = ff_yuv2planeX_8_mmxext;
518 #define ASSIGN_SCALE_FUNC2(hscalefn, filtersize, opt1, opt2) do { \
519 if (c->srcBpc == 8) { \
520 hscalefn = c->dstBpc <= 14 ? ff_hscale8to15_ ## filtersize ## _ ## opt2 : \
521 ff_hscale8to19_ ## filtersize ## _ ## opt1; \
522 } else if (c->srcBpc == 9) { \
523 hscalefn = c->dstBpc <= 14 ? ff_hscale9to15_ ## filtersize ## _ ## opt2 : \
524 ff_hscale9to19_ ## filtersize ## _ ## opt1; \
525 } else if (c->srcBpc == 10) { \
526 hscalefn = c->dstBpc <= 14 ? ff_hscale10to15_ ## filtersize ## _ ## opt2 : \
527 ff_hscale10to19_ ## filtersize ## _ ## opt1; \
528 } else if (c->srcBpc == 12) { \
529 hscalefn = c->dstBpc <= 14 ? ff_hscale12to15_ ## filtersize ## _ ## opt2 : \
530 ff_hscale12to19_ ## filtersize ## _ ## opt1; \
531 } else if (c->srcBpc == 14 || ((c->srcFormat==AV_PIX_FMT_PAL8||isAnyRGB(c->srcFormat)) && av_pix_fmt_desc_get(c->srcFormat)->comp[0].depth<16)) { \
532 hscalefn = c->dstBpc <= 14 ? ff_hscale14to15_ ## filtersize ## _ ## opt2 : \
533 ff_hscale14to19_ ## filtersize ## _ ## opt1; \
535 av_assert0(c->srcBpc == 16);\
536 hscalefn = c->dstBpc <= 14 ? ff_hscale16to15_ ## filtersize ## _ ## opt2 : \
537 ff_hscale16to19_ ## filtersize ## _ ## opt1; \
540 #define ASSIGN_VSCALEX_FUNC(vscalefn, opt, do_16_case, condition_8bit) \
542 case 16: do_16_case; break; \
543 case 10: if (!isBE(c->dstFormat) && !isSemiPlanarYUV(c->dstFormat)) vscalefn = ff_yuv2planeX_10_ ## opt; break; \
544 case 9: if (!isBE(c->dstFormat)) vscalefn = ff_yuv2planeX_9_ ## opt; break; \
545 case 8: if ((condition_8bit) && !c->use_mmx_vfilter) vscalefn = ff_yuv2planeX_8_ ## opt; break; \
547 #define ASSIGN_VSCALE_FUNC(vscalefn, opt) \
549 case 16: if (!isBE(c->dstFormat)) vscalefn = ff_yuv2plane1_16_ ## opt; break; \
550 case 10: if (!isBE(c->dstFormat) && !isSemiPlanarYUV(c->dstFormat)) vscalefn = ff_yuv2plane1_10_ ## opt; break; \
551 case 9: if (!isBE(c->dstFormat)) vscalefn = ff_yuv2plane1_9_ ## opt; break; \
552 case 8: vscalefn = ff_yuv2plane1_8_ ## opt; break; \
553 default: av_assert0(c->dstBpc>8); \
555 #define case_rgb(x, X, opt) \
556 case AV_PIX_FMT_ ## X: \
557 c->lumToYV12 = ff_ ## x ## ToY_ ## opt; \
558 if (!c->chrSrcHSubSample) \
559 c->chrToYV12 = ff_ ## x ## ToUV_ ## opt; \
561 #define ASSIGN_SSE_SCALE_FUNC(hscalefn, filtersize, opt1, opt2) \
562 switch (filtersize) { \
563 case 4: ASSIGN_SCALE_FUNC2(hscalefn, 4, opt1, opt2); break; \
564 case 8: ASSIGN_SCALE_FUNC2(hscalefn, 8, opt1, opt2); break; \
565 default: if (filtersize & 4) ASSIGN_SCALE_FUNC2(hscalefn, X4, opt1, opt2); \
566 else ASSIGN_SCALE_FUNC2(hscalefn, X8, opt1, opt2); \
573 HAVE_ALIGNED_STACK || ARCH_X86_64);
577 switch (
c->srcFormat) {
579 c->lumToYV12 = ff_yuyvToY_sse2;
581 c->alpToYV12 = ff_uyvyToY_sse2;
584 c->lumToYV12 = ff_yuyvToY_sse2;
585 c->chrToYV12 = ff_yuyvToUV_sse2;
588 c->lumToYV12 = ff_uyvyToY_sse2;
589 c->chrToYV12 = ff_uyvyToUV_sse2;
592 c->chrToYV12 = ff_nv12ToUV_sse2;
595 c->chrToYV12 = ff_nv21ToUV_sse2;
610 switch (
c->srcFormat) {
622 if (!
isBE(
c->dstFormat))
c->yuv2planeX = ff_yuv2planeX_16_sse4,
623 HAVE_ALIGNED_STACK || ARCH_X86_64);
625 c->yuv2plane1 = ff_yuv2plane1_16_sse4;
630 HAVE_ALIGNED_STACK || ARCH_X86_64);
634 switch (
c->srcFormat) {
636 c->chrToYV12 = ff_yuyvToUV_avx;
639 c->chrToYV12 = ff_uyvyToUV_avx;
642 c->chrToYV12 = ff_nv12ToUV_avx;
645 c->chrToYV12 = ff_nv21ToUV_avx;
659 #define ASSIGN_AVX2_SCALE_FUNC(hscalefn, filtersize) \
660 switch (filtersize) { \
661 case 4: hscalefn = ff_hscale8to15_4_avx2; break; \
662 default: hscalefn = ff_hscale8to15_X4_avx2; break; \
667 if ((
c->srcBpc == 8) && (
c->dstBpc <= 14)) {
668 ASSIGN_AVX2_SCALE_FUNC(
c->hcScale,
c->hChrFilterSize);
669 ASSIGN_AVX2_SCALE_FUNC(
c->hyScale,
c->hLumFilterSize);
675 switch (
c->srcFormat) {
683 switch (
c->dstFormat) {
686 c->yuv2nv12cX = ff_yuv2nv12cX_avx2;
690 c->yuv2nv12cX = ff_yuv2nv21cX_avx2;
698 #define INPUT_PLANER_RGB_A_FUNC_CASE_NOBREAK(fmt, name, opt) \
700 c->readAlpPlanar = ff_planar_##name##_to_a_##opt;
702 #define INPUT_PLANER_RGBA_YUV_FUNC_CASE(rgb_fmt, rgba_fmt, name, opt) \
705 c->readLumPlanar = ff_planar_##name##_to_y_##opt; \
706 c->readChrPlanar = ff_planar_##name##_to_uv_##opt; \
709 #define INPUT_PLANER_RGB_YUV_FUNC_CASE(fmt, name, opt) \
711 c->readLumPlanar = ff_planar_##name##_to_y_##opt; \
712 c->readChrPlanar = ff_planar_##name##_to_uv_##opt; \
715 #define INPUT_PLANER_RGB_UV_FUNC_CASE(fmt, name, opt) \
717 c->readChrPlanar = ff_planar_##name##_to_uv_##opt; \
720 #define INPUT_PLANER_RGBAXX_YUVA_FUNC_CASE(rgb_fmt, rgba_fmt, name, opt) \
721 INPUT_PLANER_RGB_A_FUNC_CASE_NOBREAK(rgba_fmt##LE, name##le, opt) \
722 INPUT_PLANER_RGB_YUV_FUNC_CASE(rgb_fmt##LE, name##le, opt) \
723 INPUT_PLANER_RGB_A_FUNC_CASE_NOBREAK(rgba_fmt##BE, name##be, opt) \
724 INPUT_PLANER_RGB_YUV_FUNC_CASE(rgb_fmt##BE, name##be, opt)
726 #define INPUT_PLANER_RGBAXX_UVA_FUNC_CASE(rgb_fmt, rgba_fmt, name, opt) \
727 INPUT_PLANER_RGB_A_FUNC_CASE_NOBREAK(rgba_fmt##LE, name##le, opt) \
728 INPUT_PLANER_RGB_UV_FUNC_CASE(rgb_fmt##LE, name##le, opt) \
729 INPUT_PLANER_RGB_A_FUNC_CASE_NOBREAK(rgba_fmt##BE, name##be, opt) \
730 INPUT_PLANER_RGB_UV_FUNC_CASE(rgb_fmt##BE, name##be, opt)
732 #define INPUT_PLANER_RGBAXX_YUV_FUNC_CASE(rgb_fmt, rgba_fmt, name, opt) \
733 INPUT_PLANER_RGBA_YUV_FUNC_CASE(rgb_fmt##LE, rgba_fmt##LE, name##le, opt) \
734 INPUT_PLANER_RGBA_YUV_FUNC_CASE(rgb_fmt##BE, rgba_fmt##BE, name##be, opt)
736 #define INPUT_PLANER_RGBXX_YUV_FUNC_CASE(rgb_fmt, name, opt) \
737 INPUT_PLANER_RGB_YUV_FUNC_CASE(rgb_fmt##LE, name##le, opt) \
738 INPUT_PLANER_RGB_YUV_FUNC_CASE(rgb_fmt##BE, name##be, opt)
740 #define INPUT_PLANER_RGBXX_UV_FUNC_CASE(rgb_fmt, name, opt) \
741 INPUT_PLANER_RGB_UV_FUNC_CASE(rgb_fmt##LE, name##le, opt) \
742 INPUT_PLANER_RGB_UV_FUNC_CASE(rgb_fmt##BE, name##be, opt)
744 #define INPUT_PLANER_RGB_YUVA_ALL_CASES(opt) \
745 INPUT_PLANER_RGB_A_FUNC_CASE_NOBREAK(AV_PIX_FMT_GBRAP, rgb, opt) \
746 INPUT_PLANER_RGB_YUV_FUNC_CASE( AV_PIX_FMT_GBRP, rgb, opt) \
747 INPUT_PLANER_RGBXX_YUV_FUNC_CASE( AV_PIX_FMT_GBRP9, rgb9, opt) \
748 INPUT_PLANER_RGBAXX_YUVA_FUNC_CASE(AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRAP10, rgb10, opt) \
749 INPUT_PLANER_RGBAXX_YUVA_FUNC_CASE(AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRAP12, rgb12, opt) \
750 INPUT_PLANER_RGBXX_YUV_FUNC_CASE( AV_PIX_FMT_GBRP14, rgb14, opt) \
751 INPUT_PLANER_RGBAXX_YUVA_FUNC_CASE(AV_PIX_FMT_GBRP16, AV_PIX_FMT_GBRAP16, rgb16, opt) \
752 INPUT_PLANER_RGBAXX_YUVA_FUNC_CASE(AV_PIX_FMT_GBRPF32, AV_PIX_FMT_GBRAPF32, rgbf32, opt)
756 switch (
c->srcFormat) {
771 switch (
c->srcFormat) {
786 switch (
c->srcFormat) {
787 INPUT_PLANER_RGB_YUVA_ALL_CASES(avx2)
799 #define YUV2ANYX_FUNC_CASE(fmt, name, opt) \
801 c->yuv2anyX = ff_yuv2##name##_full_X_##opt; \
804 #define YUV2ANYX_GBRAP_CASES(opt) \
805 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRP, gbrp, opt) \
806 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRAP, gbrap, opt) \
807 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRP9LE, gbrp9le, opt) \
808 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRP10LE, gbrp10le, opt) \
809 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRAP10LE, gbrap10le, opt) \
810 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRP12LE, gbrp12le, opt) \
811 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRAP12LE, gbrap12le, opt) \
812 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRP14LE, gbrp14le, opt) \
813 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRP16LE, gbrp16le, opt) \
814 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRAP16LE, gbrap16le, opt) \
815 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRPF32LE, gbrpf32le, opt) \
816 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRAPF32LE, gbrapf32le, opt) \
817 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRP9BE, gbrp9be, opt) \
818 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRP10BE, gbrp10be, opt) \
819 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRAP10BE, gbrap10be, opt) \
820 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRP12BE, gbrp12be, opt) \
821 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRAP12BE, gbrap12be, opt) \
822 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRP14BE, gbrp14be, opt) \
823 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRP16BE, gbrp16be, opt) \
824 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRAP16BE, gbrap16be, opt) \
825 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRPF32BE, gbrpf32be, opt) \
826 YUV2ANYX_FUNC_CASE(AV_PIX_FMT_GBRAPF32BE, gbrapf32be, opt)
829 switch (
c->dstFormat) {
830 YUV2ANYX_GBRAP_CASES(sse2)
837 switch (
c->dstFormat) {
838 YUV2ANYX_GBRAP_CASES(sse4)
845 switch (
c->dstFormat) {
846 YUV2ANYX_GBRAP_CASES(avx2)
int vLumFilterSize
Vertical filter size for luma/alpha pixels.
#define AV_PIX_FMT_GBRAP16
#define DECLARE_ASM_ALIGNED(n, t, v)
uint8_t ** line
line buffer
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
int dstY
Last destination vertical line output from last slice.
#define EXTERNAL_AVX2_FAST(flags)
int16_t * vChrFilter
Array of vertical filter coefficients for chroma planes.
int32_t lumMmxFilter[4 *MAX_FILTER_SIZE]
int16_t * vLumFilter
Array of vertical filter coefficients for luma/alpha planes.
#define RANGE_CONVERT_FUNCS(opt)
#define DECLARE_ASM_CONST(n, t, v)
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
static atomic_int cpu_flags
#define INPUT_FUNC(fmt, opt)
#define AV_PIX_FMT_GBRP14
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
#define AV_PIX_FMT_GBRP10
#define AV_CPU_FLAG_SLOW_GATHER
CPU has slow gathers.
av_cold void ff_sws_init_range_convert_x86(SwsContext *c)
#define AV_PIX_FMT_GBRAP10
#define AV_PIX_FMT_GBRAP12
#define av_assert0(cond)
assert() equivalent, that is always enabled.
uint8_t ** tmp
Tmp line buffer used by mmx code.
#define SCALE_FUNC(filter_n, from_bpc, to_bpc, opt)
#define VSCALE_FUNCS(opt1, opt2)
int32_t * vLumFilterPos
Array of vertical filter starting positions for each dst[i] for luma/alpha planes.
#define VSCALEX_FUNC(size, opt)
#define AV_PIX_FMT_GBRP16
#define ASSIGN_SSE_SCALE_FUNC(hscalefn, filtersize, opt1, opt2)
av_cold void ff_sws_init_swscale_x86(SwsContext *c)
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
#define EXTERNAL_SSE3(flags)
#define ASSIGN_VSCALEX_FUNC(vscalefn, opt, do_16_case, condition_8bit)
int32_t alpMmxFilter[4 *MAX_FILTER_SIZE]
#define ASSIGN_VSCALE_FUNC(vscalefn, opt)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
int32_t * vChrFilterPos
Array of vertical filter starting positions for each dst[i] for chroma planes.
static av_always_inline int isBE(enum AVPixelFormat pix_fmt)
#define DECLARE_ALIGNED(n, t, v)
static av_always_inline int isAnyRGB(enum AVPixelFormat pix_fmt)
#define SWS_FULL_CHR_H_INT
Perform full chroma upsampling when upscaling to RGB.
#define AV_PIX_FMT_GBRPF32
#define AV_PIX_FMT_BGR555
int vChrFilterSize
Vertical filter size for chroma pixels.
#define EXTERNAL_SSE2(flags)
#define i(width, name, range_min, range_max)
#define AV_PIX_FMT_GBRP12
@ AV_PIX_FMT_NV24
planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
#define AV_PIX_FMT_RGB555
@ AV_PIX_FMT_NV21
as above, but U and V bytes are swapped
@ AV_PIX_FMT_NV42
as above, but U and V bytes are swapped
const uint64_t ff_dither8[2]
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
#define EXTERNAL_AVX(flags)
@ AV_PIX_FMT_UYVY422
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
#define EXTERNAL_SSE4(flags)
#define AV_PIX_FMT_GBRAPF32
#define YUV2YUVX_FUNC_MMX(opt, step)
#define INLINE_MMXEXT(flags)
int32_t chrMmxFilter[4 *MAX_FILTER_SIZE]
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
#define RANGE_CONVERT_FUNCS_DECL(opt)
int sliceY
index of first line
#define VSCALE_FUNC(size, opt)
#define case_rgb(x, X, opt)
#define flags(name, subs,...)
#define YUV2YUVX_FUNC(opt, step)
void ff_updateMMXDitherTables(SwsContext *c, int dstY)
#define EXTERNAL_SSSE3(flags)
#define SCALE_FUNCS_SSE(opt)
int dstH
Height of destination luma/alpha planes.
#define VSCALEX_FUNCS(opt)
#define EXTERNAL_MMXEXT(flags)
const uint64_t ff_dither4[2]