Skip to content

Commit 748e960

Browse files
committed
swscale/swscale_unscaled: fix packed16togbra16() for formats with bpc between 9-14 bits
Currently, packed16togbra16() always sets the alpha value to 0xFFFF, without taking the bit depth into consideration. This causes a bug on x86, which can be reproduced with: ./libswscale/tests/swscale -unscaled 1 -src xyz12le -dst gbrap12be The problem arises in ff_hscale14to15_4_ssse3(), in the conversion from gbrap12be to yuva444p, which comes after the conversion from xyz12le to gbrap12be. It has something to do with pmaddwd not working on unsigned values. There is some code to deal with 0xFFFF if the input has a bit depth of 16, but not for bit depths < 16. We could fix ff_hscale14to15_4_ssse3() to also work correctly with 0xFFFF on bit depths < 16, or we could just not write 0xFFFF there in the first place, which is what this commit does.
1 parent 0c1d87d commit 748e960

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

libswscale/swscale_unscaled.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
699699
dst[0][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
700700
dst[1][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
701701
dst[2][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
702-
dst[3][x] = 0xFFFF;
702+
dst[3][x] = av_bswap16(0xFFFF >> shift);
703703
}
704704
} else if (src_alpha) {
705705
for (x = 0; x < width; x++) {
@@ -729,7 +729,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
729729
dst[0][x] = av_bswap16(*src_line++ >> shift);
730730
dst[1][x] = av_bswap16(*src_line++ >> shift);
731731
dst[2][x] = av_bswap16(*src_line++ >> shift);
732-
dst[3][x] = 0xFFFF;
732+
dst[3][x] = av_bswap16(0xFFFF >> shift);
733733
}
734734
} else if (src_alpha) {
735735
for (x = 0; x < width; x++) {
@@ -759,7 +759,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
759759
dst[0][x] = av_bswap16(*src_line++) >> shift;
760760
dst[1][x] = av_bswap16(*src_line++) >> shift;
761761
dst[2][x] = av_bswap16(*src_line++) >> shift;
762-
dst[3][x] = 0xFFFF;
762+
dst[3][x] = 0xFFFF >> shift;
763763
}
764764
} else if (src_alpha) {
765765
for (x = 0; x < width; x++) {
@@ -789,7 +789,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
789789
dst[0][x] = *src_line++ >> shift;
790790
dst[1][x] = *src_line++ >> shift;
791791
dst[2][x] = *src_line++ >> shift;
792-
dst[3][x] = 0xFFFF;
792+
dst[3][x] = 0xFFFF >> shift;
793793
}
794794
} else if (src_alpha) {
795795
for (x = 0; x < width; x++) {

0 commit comments

Comments
 (0)