* [FFmpeg-devel] [PATCH 1/3] swscale/swscale_unscaled: fix planarCopyWrapper() for yuv444p => yuva444p
@ 2025-05-18 20:52 Ramiro Polla
2025-05-18 20:52 ` [FFmpeg-devel] [PATCH 2/3] swscale/swscale_unscaled: fix packed30togbra10() for formats with bpc between 9-14 bits Ramiro Polla
2025-05-18 20:52 ` [FFmpeg-devel] [PATCH 3/3] swscale/swscale_unscaled: fix packed16togbra16() " Ramiro Polla
0 siblings, 2 replies; 7+ messages in thread
From: Ramiro Polla @ 2025-05-18 20:52 UTC (permalink / raw)
To: ffmpeg-devel
Currently, planarCopyWrapper() assumes that src[3] must be NULL when
the source format has no alpha plane.
This commit updates the condition for filling the alpha plane based on
the number of components available in the source format as well.
---
libswscale/swscale_unscaled.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index b84120549e..307e5471a9 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -2221,7 +2221,7 @@ static int planarCopyWrapper(SwsInternal *c, const uint8_t *const src[],
// ignore palette for GRAY8
if (plane == 1 && desc_dst->nb_components < 3) continue;
- if (!src[plane] || (plane == 1 && desc_src->nb_components < 3)) {
+ if (!src[plane] || (plane == 1 && desc_src->nb_components < 3) || (plane == 3 && desc_src->nb_components <= 3)) {
if (is16BPS(c->opts.dst_format) || isNBPS(c->opts.dst_format)) {
fillPlane16(dst[plane], dstStride[plane], length, height, y,
plane == 3, desc_dst->comp[plane].depth,
--
2.30.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
* [FFmpeg-devel] [PATCH 2/3] swscale/swscale_unscaled: fix packed30togbra10() for formats with bpc between 9-14 bits
2025-05-18 20:52 [FFmpeg-devel] [PATCH 1/3] swscale/swscale_unscaled: fix planarCopyWrapper() for yuv444p => yuva444p Ramiro Polla
@ 2025-05-18 20:52 ` Ramiro Polla
2025-05-18 20:52 ` [FFmpeg-devel] [PATCH 3/3] swscale/swscale_unscaled: fix packed16togbra16() " Ramiro Polla
1 sibling, 0 replies; 7+ messages in thread
From: Ramiro Polla @ 2025-05-18 20:52 UTC (permalink / raw)
To: ffmpeg-devel
Currently, packed30togbra10() always sets the alpha value to 0xFFFF,
without taking the bit depth into consideration.
This commit restricts the alpha value to the bit depth.
---
libswscale/swscale_unscaled.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 307e5471a9..8d71a88c23 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -818,6 +818,7 @@ static void packed30togbra10(const uint8_t *src, int srcStride,
int x, h, i;
int dst_alpha = dst[3] != NULL;
int scale_high = bpc - 10, scale_low = 10 - scale_high;
+ uint16_t alpha_val = (1U << bpc) - 1;
for (h = 0; h < srcSliceH; h++) {
uint32_t *src_line = (uint32_t *)(src + srcStride * h);
unsigned component;
@@ -834,7 +835,7 @@ static void packed30togbra10(const uint8_t *src, int srcStride,
dst[1][x] = av_bswap16(component << scale_high | component >> scale_low);
component = p & 0x3FF;
dst[2][x] = av_bswap16(component << scale_high | component >> scale_low);
- dst[3][x] = 0xFFFF;
+ dst[3][x] = av_bswap16(alpha_val);
src_line++;
}
} else {
@@ -860,7 +861,7 @@ static void packed30togbra10(const uint8_t *src, int srcStride,
dst[1][x] = component << scale_high | component >> scale_low;
component = p & 0x3FF;
dst[2][x] = component << scale_high | component >> scale_low;
- dst[3][x] = 0xFFFF;
+ dst[3][x] = alpha_val;
src_line++;
}
} else {
--
2.30.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
* [FFmpeg-devel] [PATCH 3/3] swscale/swscale_unscaled: fix packed16togbra16() for formats with bpc between 9-14 bits
2025-05-18 20:52 [FFmpeg-devel] [PATCH 1/3] swscale/swscale_unscaled: fix planarCopyWrapper() for yuv444p => yuva444p Ramiro Polla
2025-05-18 20:52 ` [FFmpeg-devel] [PATCH 2/3] swscale/swscale_unscaled: fix packed30togbra10() for formats with bpc between 9-14 bits Ramiro Polla
@ 2025-05-18 20:52 ` Ramiro Polla
2025-05-18 21:14 ` James Almer
1 sibling, 1 reply; 7+ messages in thread
From: Ramiro Polla @ 2025-05-18 20:52 UTC (permalink / raw)
To: ffmpeg-devel
Currently, packed16togbra16() always sets the alpha value to 0xFFFF,
without taking the bit depth into consideration.
This commit restricts the alpha value to the bit depth.
---
libswscale/swscale_unscaled.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 8d71a88c23..488db43e0b 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -699,7 +699,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
dst[0][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
dst[1][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
dst[2][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
- dst[3][x] = 0xFFFF;
+ dst[3][x] = av_bswap16(0xFFFF >> shift);
}
} else if (src_alpha) {
for (x = 0; x < width; x++) {
@@ -729,7 +729,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
dst[0][x] = av_bswap16(*src_line++ >> shift);
dst[1][x] = av_bswap16(*src_line++ >> shift);
dst[2][x] = av_bswap16(*src_line++ >> shift);
- dst[3][x] = 0xFFFF;
+ dst[3][x] = av_bswap16(0xFFFF >> shift);
}
} else if (src_alpha) {
for (x = 0; x < width; x++) {
@@ -759,7 +759,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
dst[0][x] = av_bswap16(*src_line++) >> shift;
dst[1][x] = av_bswap16(*src_line++) >> shift;
dst[2][x] = av_bswap16(*src_line++) >> shift;
- dst[3][x] = 0xFFFF;
+ dst[3][x] = 0xFFFF >> shift;
}
} else if (src_alpha) {
for (x = 0; x < width; x++) {
@@ -789,7 +789,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
dst[0][x] = *src_line++ >> shift;
dst[1][x] = *src_line++ >> shift;
dst[2][x] = *src_line++ >> shift;
- dst[3][x] = 0xFFFF;
+ dst[3][x] = 0xFFFF >> shift;
}
} else if (src_alpha) {
for (x = 0; x < width; x++) {
--
2.30.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH 3/3] swscale/swscale_unscaled: fix packed16togbra16() for formats with bpc between 9-14 bits
2025-05-18 20:52 ` [FFmpeg-devel] [PATCH 3/3] swscale/swscale_unscaled: fix packed16togbra16() " Ramiro Polla
@ 2025-05-18 21:14 ` James Almer
2025-05-18 21:17 ` James Almer
0 siblings, 1 reply; 7+ messages in thread
From: James Almer @ 2025-05-18 21:14 UTC (permalink / raw)
To: ffmpeg-devel
[-- Attachment #1.1.1: Type: text/plain, Size: 2740 bytes --]
On 5/18/2025 5:52 PM, Ramiro Polla wrote:
> Currently, packed16togbra16() always sets the alpha value to 0xFFFF,
> without taking the bit depth into consideration.
>
> This commit restricts the alpha value to the bit depth.
packed16togbra16() seems to only be called for BGR48 and BGRA64, both of
which are 16bits, so this change is superfluous.
> ---
> libswscale/swscale_unscaled.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
> index 8d71a88c23..488db43e0b 100644
> --- a/libswscale/swscale_unscaled.c
> +++ b/libswscale/swscale_unscaled.c
> @@ -699,7 +699,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
> dst[0][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
> dst[1][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
> dst[2][x] = av_bswap16(av_bswap16(*src_line++) >> shift);
> - dst[3][x] = 0xFFFF;
> + dst[3][x] = av_bswap16(0xFFFF >> shift);
> }
> } else if (src_alpha) {
> for (x = 0; x < width; x++) {
> @@ -729,7 +729,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
> dst[0][x] = av_bswap16(*src_line++ >> shift);
> dst[1][x] = av_bswap16(*src_line++ >> shift);
> dst[2][x] = av_bswap16(*src_line++ >> shift);
> - dst[3][x] = 0xFFFF;
> + dst[3][x] = av_bswap16(0xFFFF >> shift);
> }
> } else if (src_alpha) {
> for (x = 0; x < width; x++) {
> @@ -759,7 +759,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
> dst[0][x] = av_bswap16(*src_line++) >> shift;
> dst[1][x] = av_bswap16(*src_line++) >> shift;
> dst[2][x] = av_bswap16(*src_line++) >> shift;
> - dst[3][x] = 0xFFFF;
> + dst[3][x] = 0xFFFF >> shift;
> }
> } else if (src_alpha) {
> for (x = 0; x < width; x++) {
> @@ -789,7 +789,7 @@ static void packed16togbra16(const uint8_t *src, int srcStride,
> dst[0][x] = *src_line++ >> shift;
> dst[1][x] = *src_line++ >> shift;
> dst[2][x] = *src_line++ >> shift;
> - dst[3][x] = 0xFFFF;
> + dst[3][x] = 0xFFFF >> shift;
> }
> } else if (src_alpha) {
> for (x = 0; x < width; x++) {
[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH 3/3] swscale/swscale_unscaled: fix packed16togbra16() for formats with bpc between 9-14 bits
2025-05-18 21:14 ` James Almer
@ 2025-05-18 21:17 ` James Almer
2025-05-18 22:02 ` Ramiro Polla
0 siblings, 1 reply; 7+ messages in thread
From: James Almer @ 2025-05-18 21:17 UTC (permalink / raw)
To: ffmpeg-devel
[-- Attachment #1.1.1: Type: text/plain, Size: 3656 bytes --]
On 5/18/2025 6:14 PM, James Almer wrote:
> On 5/18/2025 5:52 PM, Ramiro Polla wrote:
>> Currently, packed16togbra16() always sets the alpha value to 0xFFFF,
>> without taking the bit depth into consideration.
>>
>> This commit restricts the alpha value to the bit depth.
>
> packed16togbra16() seems to only be called for BGR48 and BGRA64, both of
> which are 16bits, so this change is superfluous.
Ah, nevermind, i was looking at the src formats, not dst.
Are there no tests that cover these paths? I added a bunch a couple
months ago, so maybe it could be extended.
>
>> ---
>> libswscale/swscale_unscaled.c | 8 ++++----
>> 1 file changed, 4 insertions(+), 4 deletions(-)
>>
>> diff --git a/libswscale/swscale_unscaled.c b/libswscale/
>> swscale_unscaled.c
>> index 8d71a88c23..488db43e0b 100644
>> --- a/libswscale/swscale_unscaled.c
>> +++ b/libswscale/swscale_unscaled.c
>> @@ -699,7 +699,7 @@ static void packed16togbra16(const uint8_t *src,
>> int srcStride,
>> dst[0][x] = av_bswap16(av_bswap16(*src_line++)
>> >> shift);
>> dst[1][x] = av_bswap16(av_bswap16(*src_line++)
>> >> shift);
>> dst[2][x] = av_bswap16(av_bswap16(*src_line++)
>> >> shift);
>> - dst[3][x] = 0xFFFF;
>> + dst[3][x] = av_bswap16(0xFFFF >> shift);
>> }
>> } else if (src_alpha) {
>> for (x = 0; x < width; x++) {
>> @@ -729,7 +729,7 @@ static void packed16togbra16(const uint8_t *src,
>> int srcStride,
>> dst[0][x] = av_bswap16(*src_line++ >> shift);
>> dst[1][x] = av_bswap16(*src_line++ >> shift);
>> dst[2][x] = av_bswap16(*src_line++ >> shift);
>> - dst[3][x] = 0xFFFF;
>> + dst[3][x] = av_bswap16(0xFFFF >> shift);
>> }
>> } else if (src_alpha) {
>> for (x = 0; x < width; x++) {
>> @@ -759,7 +759,7 @@ static void packed16togbra16(const uint8_t *src,
>> int srcStride,
>> dst[0][x] = av_bswap16(*src_line++) >> shift;
>> dst[1][x] = av_bswap16(*src_line++) >> shift;
>> dst[2][x] = av_bswap16(*src_line++) >> shift;
>> - dst[3][x] = 0xFFFF;
>> + dst[3][x] = 0xFFFF >> shift;
>> }
>> } else if (src_alpha) {
>> for (x = 0; x < width; x++) {
>> @@ -789,7 +789,7 @@ static void packed16togbra16(const uint8_t *src,
>> int srcStride,
>> dst[0][x] = *src_line++ >> shift;
>> dst[1][x] = *src_line++ >> shift;
>> dst[2][x] = *src_line++ >> shift;
>> - dst[3][x] = 0xFFFF;
>> + dst[3][x] = 0xFFFF >> shift;
>> }
>> } else if (src_alpha) {
>> for (x = 0; x < width; x++) {
>
[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH 3/3] swscale/swscale_unscaled: fix packed16togbra16() for formats with bpc between 9-14 bits
2025-05-18 21:17 ` James Almer
@ 2025-05-18 22:02 ` Ramiro Polla
2025-05-21 22:23 ` Ramiro Polla
0 siblings, 1 reply; 7+ messages in thread
From: Ramiro Polla @ 2025-05-18 22:02 UTC (permalink / raw)
To: FFmpeg development discussions and patches
On Sun, May 18, 2025 at 11:17 PM James Almer <jamrial@gmail.com> wrote:
> On 5/18/2025 6:14 PM, James Almer wrote:
> > On 5/18/2025 5:52 PM, Ramiro Polla wrote:
> >> Currently, packed16togbra16() always sets the alpha value to 0xFFFF,
> >> without taking the bit depth into consideration.
> >>
> >> This commit restricts the alpha value to the bit depth.
> >
> > packed16togbra16() seems to only be called for BGR48 and BGRA64, both of
> > which are 16bits, so this change is superfluous.
>
> Ah, nevermind, i was looking at the src formats, not dst.
>
> Are there no tests that cover these paths? I added a bunch a couple
> months ago, so maybe it could be extended.
It can be reproduced with:
./libswscale/tests/swscale -unscaled 1 -src xyz12le -dst gbrap12be
A little bit more information: this bug only happens on x86. The
problem arises from the optimized conversion that comes afterwards,
from gbrap12be to yuva444p, in ff_hscale14to15_4_ssse3(). It has
something to do with pmaddwd not working on unsigned values IIRC. 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 patch does.
I thought about adding libswscale/tests/swscale to FATE, but the tests
take way too long.
Ramiro
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH 3/3] swscale/swscale_unscaled: fix packed16togbra16() for formats with bpc between 9-14 bits
2025-05-18 22:02 ` Ramiro Polla
@ 2025-05-21 22:23 ` Ramiro Polla
0 siblings, 0 replies; 7+ messages in thread
From: Ramiro Polla @ 2025-05-21 22:23 UTC (permalink / raw)
To: FFmpeg development discussions and patches
On Mon, May 19, 2025 at 12:02 AM Ramiro Polla <ramiro.polla@gmail.com> wrote:
> On Sun, May 18, 2025 at 11:17 PM James Almer <jamrial@gmail.com> wrote:
> > On 5/18/2025 6:14 PM, James Almer wrote:
> > > On 5/18/2025 5:52 PM, Ramiro Polla wrote:
> > >> Currently, packed16togbra16() always sets the alpha value to 0xFFFF,
> > >> without taking the bit depth into consideration.
> > >>
> > >> This commit restricts the alpha value to the bit depth.
> > >
> > > packed16togbra16() seems to only be called for BGR48 and BGRA64, both of
> > > which are 16bits, so this change is superfluous.
> >
> > Ah, nevermind, i was looking at the src formats, not dst.
> >
> > Are there no tests that cover these paths? I added a bunch a couple
> > months ago, so maybe it could be extended.
>
> It can be reproduced with:
> ./libswscale/tests/swscale -unscaled 1 -src xyz12le -dst gbrap12be
>
> A little bit more information: this bug only happens on x86. The
> problem arises from the optimized conversion that comes afterwards,
> from gbrap12be to yuva444p, in ff_hscale14to15_4_ssse3(). It has
> something to do with pmaddwd not working on unsigned values IIRC. 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 patch does.
>
> I thought about adding libswscale/tests/swscale to FATE, but the tests
> take way too long.
I'll apply this patchset and the other similar patch about
planarRgbToplanarRgbWrapper() tomorrow if there are no more comments.
Ramiro
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-05-21 22:24 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-05-18 20:52 [FFmpeg-devel] [PATCH 1/3] swscale/swscale_unscaled: fix planarCopyWrapper() for yuv444p => yuva444p Ramiro Polla
2025-05-18 20:52 ` [FFmpeg-devel] [PATCH 2/3] swscale/swscale_unscaled: fix packed30togbra10() for formats with bpc between 9-14 bits Ramiro Polla
2025-05-18 20:52 ` [FFmpeg-devel] [PATCH 3/3] swscale/swscale_unscaled: fix packed16togbra16() " Ramiro Polla
2025-05-18 21:14 ` James Almer
2025-05-18 21:17 ` James Almer
2025-05-18 22:02 ` Ramiro Polla
2025-05-21 22:23 ` Ramiro Polla
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git