| @@ -472,11 +472,10 @@ static void yuv2nv12cX_c(enum AVPixelFormat dstFormat, const uint8_t *chrDither, · 471 unmodified lines |
| 472 | 472 | |
| 473 | 473 | static void yuv2p01xl1_c(const int16_t *src, |
| 474 | 474 | uint16_t *dest, int dstW, |
| 475 | | − int big_endian, int output_bits) |
| 475 | + int big_endian, int output_bits, int output_shift) |
| 476 | 476 | { |
| 477 | 477 | int i; |
| 478 | 478 | int shift = 15 - output_bits; |
| 479 | | − int output_shift = 16 - output_bits; |
| 480 | 479 | |
| 481 | 480 | for (i = 0; i < dstW; i++) { |
| 482 | 481 | int val = src[i] + (1 << (shift - 1)); |
| @@ -486,11 +485,10 @@ static void yuv2p01xl1_c(const int16_t *src, · 3 unmodified lines |
| 486 | 485 | |
| 487 | 486 | static void yuv2p01xlX_c(const int16_t *filter, int filterSize, |
| 488 | 487 | const int16_t **src, uint16_t *dest, int dstW, |
| 489 | | − int big_endian, int output_bits) |
| 488 | + int big_endian, int output_bits, int output_shift) |
| 490 | 489 | { |
| 491 | 490 | int i, j; |
| 492 | 491 | int shift = 11 + 16 - output_bits; |
| 493 | | − int output_shift = 16 - output_bits; |
| 494 | 492 | |
| 495 | 493 | for (i = 0; i < dstW; i++) { |
| 496 | 494 | int val = 1 << (shift - 1); |
| @@ -505,12 +503,11 @@ static void yuv2p01xlX_c(const int16_t *filter, int filterSize, · 8 unmodified lines |
| 505 | 503 | static void yuv2p01xcX_c(int big_endian, const uint8_t *chrDither, |
| 506 | 504 | const int16_t *chrFilter, int chrFilterSize, |
| 507 | 505 | const int16_t **chrUSrc, const int16_t **chrVSrc, |
| 508 | | − uint8_t *dest8, int chrDstW, int output_bits) |
| 506 | + uint8_t *dest8, int chrDstW, int output_bits, int output_shift) |
| 509 | 507 | { |
| 510 | 508 | uint16_t *dest = (uint16_t*)dest8; |
| 511 | 509 | int i, j; |
| 512 | 510 | int shift = 11 + 16 - output_bits; |
| 513 | | − int output_shift = 16 - output_bits; |
| 514 | 511 | |
| 515 | 512 | for (i = 0; i < chrDstW; i++) { |
| 516 | 513 | int u = 1 << (shift - 1); |
| @@ -528,38 +525,40 @@ static void yuv2p01xcX_c(int big_endian, const uint8_t *chrDither, · 11 unmodified lines |
| 528 | 525 | |
| 529 | 526 | #undef output_pixel |
| 530 | 527 | |
| 531 | | −#define yuv2p01x_wrapper(bits) \ |
| 532 | | − static void yuv2p0 ## bits ## l1_LE_c(const int16_t *src, \ |
| 528 | +#define yuv2p01x_wrapper(fmt, bits, shift) \ |
| 529 | + static void yuv2 ## fmt ## l1_LE_c(const int16_t *src, \ |
| 533 | 530 | uint8_t *dest, int dstW, \ |
| 534 | 531 | const uint8_t *dither, int offset) \ |
| 535 | 532 | { \ |
| 536 | | − yuv2p01xl1_c(src, (uint16_t*)dest, dstW, 0, bits); \ |
| 533 | + yuv2p01xl1_c(src, (uint16_t*)dest, dstW, 0, bits, shift); \ |
| 537 | 534 | } \ |
| 538 | 535 | \ |
| 539 | | − static void yuv2p0 ## bits ## l1_BE_c(const int16_t *src, \ |
| 536 | + static void yuv2 ## fmt ## l1_BE_c(const int16_t *src, \ |
| 540 | 537 | uint8_t *dest, int dstW, \ |
| 541 | 538 | const uint8_t *dither, int offset) \ |
| 542 | 539 | { \ |
| 543 | | − yuv2p01xl1_c(src, (uint16_t*)dest, dstW, 1, bits); \ |
| 540 | + yuv2p01xl1_c(src, (uint16_t*)dest, dstW, 1, bits, shift); \ |
| 544 | 541 | } \ |
| 545 | 542 | \ |
| 546 | | − static void yuv2p0 ## bits ## lX_LE_c(const int16_t *filter, \ |
| 543 | + static void yuv2 ## fmt ## lX_LE_c(const int16_t *filter, \ |
| 547 | 544 | int filterSize, const int16_t **src, \ |
| 548 | 545 | uint8_t *dest, int dstW, \ |
| 549 | 546 | const uint8_t *dither, int offset) \ |
| 550 | 547 | { \ |
| 551 | | − yuv2p01xlX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 0, bits); \ |
| 548 | + yuv2p01xlX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 0, \ |
| 549 | + bits, shift); \ |
| 552 | 550 | } \ |
| 553 | 551 | \ |
| 554 | | − static void yuv2p0 ## bits ## lX_BE_c(const int16_t *filter, \ |
| 552 | + static void yuv2 ## fmt ## lX_BE_c(const int16_t *filter, \ |
| 555 | 553 | int filterSize, const int16_t **src, \ |
| 556 | 554 | uint8_t *dest, int dstW, \ |
| 557 | 555 | const uint8_t *dither, int offset) \ |
| 558 | 556 | { \ |
| 559 | | − yuv2p01xlX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 1, bits); \ |
| 557 | + yuv2p01xlX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 1, \ |
| 558 | + bits, shift); \ |
| 560 | 559 | } \ |
| 561 | 560 | \ |
| 562 | | − static void yuv2p0 ## bits ## cX_LE_c(enum AVPixelFormat dstFormat, \ |
| 561 | + static void yuv2 ## fmt ## cX_LE_c(enum AVPixelFormat dstFormat, \ |
| 563 | 562 | const uint8_t *chrDither, \ |
| 564 | 563 | const int16_t *chrFilter, \ |
| 565 | 564 | int chrFilterSize, \ |
| @@ -568,10 +567,10 @@ static void yuv2p01xcX_c(int big_endian, const uint8_t *chrDither, · 2 unmodified lines |
| 568 | 567 | uint8_t *dest8, int chrDstW) \ |
| 569 | 568 | { \ |
| 570 | 569 | yuv2p01xcX_c(0, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, \ |
| 571 | | − dest8, chrDstW, bits); \ |
| 570 | + dest8, chrDstW, bits, shift); \ |
| 572 | 571 | } \ |
| 573 | 572 | \ |
| 574 | | − static void yuv2p0 ## bits ## cX_BE_c(enum AVPixelFormat dstFormat, \ |
| 573 | + static void yuv2 ## fmt ## cX_BE_c(enum AVPixelFormat dstFormat, \ |
| 575 | 574 | const uint8_t *chrDither, \ |
| 576 | 575 | const int16_t *chrFilter, \ |
| 577 | 576 | int chrFilterSize, \ |
| @@ -580,11 +579,12 @@ static void yuv2p01xcX_c(int big_endian, const uint8_t *chrDither, · 2 unmodified lines |
| 580 | 579 | uint8_t *dest8, int chrDstW) \ |
| 581 | 580 | { \ |
| 582 | 581 | yuv2p01xcX_c(1, chrDither, chrFilter, chrFilterSize, chrUSrc, chrVSrc, \ |
| 583 | | − dest8, chrDstW, bits); \ |
| 582 | + dest8, chrDstW, bits, shift); \ |
| 584 | 583 | } |
| 585 | 584 | |
| 586 | | −yuv2p01x_wrapper(10) |
| 587 | | −yuv2p01x_wrapper(12) |
| 585 | +yuv2p01x_wrapper(p010, 10, 6) |
| 586 | +yuv2p01x_wrapper(p012, 12, 4) |
| 587 | +yuv2p01x_wrapper(nv20, 10, 0) |
| 588 | 588 | |
| 589 | 589 | #define accumulate_bit(acc, val) \ |
| 590 | 590 | acc <<= 1; \ |
| @@ -3201,6 +3201,13 @@ av_cold void ff_sws_init_output_funcs(SwsInternal *c, · 2610 unmodified lines |
| 3201 | 3201 | *yuv2nv12cX = isBE(dstFormat) ? yuv2p012cX_BE_c : yuv2p012cX_LE_c; |
| 3202 | 3202 | } else |
| 3203 | 3203 | av_assert0(0); |
| 3204 | + } else if (isSemiPlanarYUV(dstFormat) && isNBPS(dstFormat)) { |
| 3205 | + if (desc->comp[0].depth == 10) { |
| 3206 | + *yuv2plane1 = isBE(dstFormat) ? yuv2nv20l1_BE_c : yuv2nv20l1_LE_c; |
| 3207 | + *yuv2planeX = isBE(dstFormat) ? yuv2nv20lX_BE_c : yuv2nv20lX_LE_c; |
| 3208 | + *yuv2nv12cX = isBE(dstFormat) ? yuv2nv20cX_BE_c : yuv2nv20cX_LE_c; |
| 3209 | + } else |
| 3210 | + av_assert0(0); |
| 3204 | 3211 | } else if (is16BPS(dstFormat)) { |
| 3205 | 3212 | *yuv2planeX = isBE(dstFormat) ? yuv2planeX_16BE_c : yuv2planeX_16LE_c; |
| 3206 | 3213 | *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_16BE_c : yuv2plane1_16LE_c; |