* [FFmpeg-devel] [PATCH v4 2/2] swscale: Neon rgb_to_yuv_half process 32 pixels at a time
[not found] <20250530084042.33204-1-dmtr.kovalenko@outlook.com>
@ 2025-05-30 8:40 ` Dmitriy Kovalenko
2025-05-30 9:10 ` Martin Storsjö
0 siblings, 1 reply; 6+ messages in thread
From: Dmitriy Kovalenko @ 2025-05-30 8:40 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Dmitriy Kovalenko
=== Feedback response ===
> Also, with that fixed, this fails to properly back up and restore registers v8-v15; checkasm doesn't notice this on macOS, but on Linux and windows, checkasm has a call wrapper which does detect such issues.
I managed to rewrite the function to avoid using any callee saved
registers. The only register I keep using is v7 which is not callee saved.
=== === === === === === === === ===
This patch integrates so called double bufferring when we are loading
2 batch of elements at a time and then processing them in parallel. On the
moden arm processors especially Apple Silicon it gives a visible
benefit, for subsampled pixel processing it is especially nice because
it allows to read elements w/ 2 instructions and write with a single one
(especially visible on a platforms with slower memory like ios).
Including the previous patch in a stack on macbook pro m4 max rgb_to_yuv_half
in checkasm goes up 2x of the c version
---
libswscale/aarch64/input.S | 130 ++++++++++++++++++++++++++-----------
1 file changed, 91 insertions(+), 39 deletions(-)
diff --git a/libswscale/aarch64/input.S b/libswscale/aarch64/input.S
index cf513d43d1..9e41ff6fcd 100644
--- a/libswscale/aarch64/input.S
+++ b/libswscale/aarch64/input.S
@@ -178,7 +178,7 @@ rgbToY_neon abgr32, argb32, element=4, alpha_first=1
.macro rgbToUV_half_neon fmt_bgr, fmt_rgb, element, alpha_first=0
function ff_\fmt_bgr\()ToUV_half_neon, export=1
- cbz w5, 3f // check width > 0
+ cbz w5, 3f
ldp w12, w11, [x6, #12]
ldp w10, w15, [x6, #20]
@@ -187,49 +187,101 @@ function ff_\fmt_bgr\()ToUV_half_neon, export=1
endfunc
function ff_\fmt_rgb\()ToUV_half_neon, export=1
- cmp w5, #0 // check width > 0
+ cmp w5, #0
b.le 3f
- ldp w10, w11, [x6, #12] // w10: ru, w11: gu
- ldp w12, w13, [x6, #20] // w12: bu, w13: rv
- ldp w14, w15, [x6, #28] // w14: gv, w15: bv
+ ldp w10, w11, [x6, #12]
+ ldp w12, w13, [x6, #20]
+ ldp w14, w15, [x6, #28]
4:
- cmp w5, #8
rgb_set_uv_coeff half=1
+
+ cmp w5, #16
b.lt 2f
-1: // load 16 pixels
+
+1:
.if \element == 3
ld3 { v16.16b, v17.16b, v18.16b }, [x3], #48
+ ld3 { v26.16b, v27.16b, v28.16b }, [x3], #48
.else
ld4 { v16.16b, v17.16b, v18.16b, v19.16b }, [x3], #64
+ ld4 { v26.16b, v27.16b, v28.16b, v29.16b }, [x3], #64
.endif
.if \alpha_first
- uaddlp v21.8h, v19.16b // v21: summed b pairs
- uaddlp v20.8h, v18.16b // v20: summed g pairs
- uaddlp v19.8h, v17.16b // v19: summed r pairs
+ uaddlp v21.8h, v19.16b
+ uaddlp v20.8h, v18.16b
+ uaddlp v19.8h, v17.16b
+ uaddlp v31.8h, v29.16b
+ uaddlp v30.8h, v28.16b
+ uaddlp v29.8h, v27.16b
.else
- uaddlp v19.8h, v16.16b // v19: summed r pairs
- uaddlp v20.8h, v17.16b // v20: summed g pairs
- uaddlp v21.8h, v18.16b // v21: summed b pairs
+ uaddlp v19.8h, v16.16b
+ uaddlp v20.8h, v17.16b
+ uaddlp v21.8h, v18.16b
+ uaddlp v29.8h, v26.16b
+ uaddlp v30.8h, v27.16b
+ uaddlp v31.8h, v28.16b
.endif
- mov v22.16b, v6.16b // U first half
- mov v23.16b, v6.16b // U second half
- mov v24.16b, v6.16b // V first half
- mov v25.16b, v6.16b // V second half
-
- rgb_to_uv_interleaved_product v19, v20, v21, v0, v1, v2, v3, v4, v5, v22, v23, v24, v25, v16, v17, #10
-
- str q16, [x0], #16 // store dst_u
- str q17, [x1], #16 // store dst_v
+ mov v7.16b, v6.16b
+ mov v16.16b, v6.16b
+ mov v17.16b, v6.16b
+ mov v18.16b, v6.16b
+ mov v26.16b, v6.16b
+ mov v27.16b, v6.16b
+ mov v28.16b, v6.16b
+ mov v25.16b, v6.16b
- sub w5, w5, #8 // width -= 8
- cmp w5, #8 // width >= 8 ?
+ smlal v7.4s, v0.4h, v19.4h
+ smlal v17.4s, v3.4h, v19.4h
+ smlal v26.4s, v0.4h, v29.4h
+ smlal v28.4s, v3.4h, v29.4h
+
+ smlal2 v16.4s, v0.8h, v19.8h
+ smlal2 v18.4s, v3.8h, v19.8h
+ smlal2 v27.4s, v0.8h, v29.8h
+ smlal2 v25.4s, v3.8h, v29.8h
+
+ smlal v7.4s, v1.4h, v20.4h
+ smlal v17.4s, v4.4h, v20.4h
+ smlal v26.4s, v1.4h, v30.4h
+ smlal v28.4s, v4.4h, v30.4h
+
+ smlal2 v16.4s, v1.8h, v20.8h
+ smlal2 v18.4s, v4.8h, v20.8h
+ smlal2 v27.4s, v1.8h, v30.8h
+ smlal2 v25.4s, v4.8h, v30.8h
+
+ smlal v7.4s, v2.4h, v21.4h
+ smlal v17.4s, v5.4h, v21.4h
+ smlal v26.4s, v2.4h, v31.4h
+ smlal v28.4s, v5.4h, v31.4h
+
+ smlal2 v16.4s, v2.8h, v21.8h
+ smlal2 v18.4s, v5.8h, v21.8h
+ smlal2 v27.4s, v2.8h, v31.8h
+ smlal2 v25.4s, v5.8h, v31.8h
+
+ sqshrn v19.4h, v7.4s, #10
+ sqshrn v20.4h, v17.4s, #10
+ sqshrn v22.4h, v26.4s, #10
+ sqshrn v23.4h, v28.4s, #10
+
+ sqshrn2 v19.8h, v16.4s, #10
+ sqshrn2 v20.8h, v18.4s, #10
+ sqshrn2 v22.8h, v27.4s, #10
+ sqshrn2 v23.8h, v25.4s, #10
+
+ stp q19, q22, [x0], #32
+ stp q20, q23, [x1], #32
+
+ sub w5, w5, #16
+ cmp w5, #16
b.ge 1b
- cbz w5, 3f // No pixels left? Exit
+ cbz w5, 3f
-2: // Scalar fallback for remaining pixels
+2:
.if \alpha_first
rgb_load_add_half 1, 5, 2, 6, 3, 7
.else
@@ -239,24 +291,24 @@ function ff_\fmt_rgb\()ToUV_half_neon, export=1
rgb_load_add_half 0, 4, 1, 5, 2, 6
.endif
.endif
- smaddl x8, w2, w10, x9 // dst_u = ru * r + const_offset
- smaddl x16, w2, w13, x9 // dst_v = rv * r + const_offset (parallel)
+ smaddl x8, w2, w10, x9
+ smaddl x16, w2, w13, x9
- smaddl x8, w4, w11, x8 // dst_u += gu * g
- smaddl x16, w4, w14, x16 // dst_v += gv * g (parallel)
+ smaddl x8, w4, w11, x8
+ smaddl x16, w4, w14, x16
- smaddl x8, w7, w12, x8 // dst_u += bu * b
- smaddl x16, w7, w15, x16 // dst_v += bv * b (parallel)
+ smaddl x8, w7, w12, x8
+ smaddl x16, w7, w15, x16
- asr w8, w8, #10 // dst_u >>= 10
- asr w16, w16, #10 // dst_v >>= 10
+ asr w8, w8, #10
+ asr w16, w16, #10
- strh w8, [x0], #2 // store dst_u
- strh w16, [x1], #2 // store dst_v
+ strh w8, [x0], #2
+ strh w16, [x1], #2
- sub w5, w5, #1 // width--
- add x3, x3, #(2*\element) // Advance source pointer
- cbnz w5, 2b // Process next pixel if any left
+ sub w5, w5, #1
+ add x3, x3, #(2*\element)
+ cbnz w5, 2b
3:
ret
endfunc
--
2.49.0
_______________________________________________
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] 6+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 2/2] swscale: Neon rgb_to_yuv_half process 32 pixels at a time
2025-05-30 8:40 ` [FFmpeg-devel] [PATCH v4 2/2] swscale: Neon rgb_to_yuv_half process 32 pixels at a time Dmitriy Kovalenko
@ 2025-05-30 9:10 ` Martin Storsjö
2025-05-31 8:59 ` Dmitriy Kovalenko
0 siblings, 1 reply; 6+ messages in thread
From: Martin Storsjö @ 2025-05-30 9:10 UTC (permalink / raw)
To: FFmpeg development discussions and patches; +Cc: Dmitriy Kovalenko
On Fri, 30 May 2025, Dmitriy Kovalenko wrote:
> === Feedback response ===
FWIW, the procedure is to respond to inline comments by replying to the
mails where those comments were made. When they're included here, they end
up as part of your suggested commit message.
Anyway, now this time, these patches do seem to work properly. There's
still the unnecessary changes from w to x register names in patch 1/2, but
other than that I no longer see strong blockers in the two patches.
I'll give the patches a second proper review at a later time.
// Martin
_______________________________________________
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] 6+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 2/2] swscale: Neon rgb_to_yuv_half process 32 pixels at a time
2025-05-30 9:10 ` Martin Storsjö
@ 2025-05-31 8:59 ` Dmitriy Kovalenko
2025-05-31 10:03 ` Martin Storsjö
0 siblings, 1 reply; 6+ messages in thread
From: Dmitriy Kovalenko @ 2025-05-31 8:59 UTC (permalink / raw)
To: Martin Storsjö; +Cc: FFmpeg development discussions and patches
Great. I send another version with the reverted change for the asr register change. What is the correct process to reply for the inline changes then? Inline email answer or cover letter?
> On May 30, 2025, at 11:10, Martin Storsjö <martin@martin.st> wrote:
>
> On Fri, 30 May 2025, Dmitriy Kovalenko wrote:
>
>> === Feedback response ===
>
> FWIW, the procedure is to respond to inline comments by replying to the mails where those comments were made. When they're included here, they end up as part of your suggested commit message.
>
> Anyway, now this time, these patches do seem to work properly. There's still the unnecessary changes from w to x register names in patch 1/2, but other than that I no longer see strong blockers in the two patches.
>
> I'll give the patches a second proper review at a later time.
>
> // Martin
>
_______________________________________________
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] 6+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 2/2] swscale: Neon rgb_to_yuv_half process 32 pixels at a time
2025-05-31 8:59 ` Dmitriy Kovalenko
@ 2025-05-31 10:03 ` Martin Storsjö
2025-05-31 10:43 ` Christopher Snowhill
0 siblings, 1 reply; 6+ messages in thread
From: Martin Storsjö @ 2025-05-31 10:03 UTC (permalink / raw)
To: Dmitriy Kovalenko; +Cc: FFmpeg development discussions and patches
On Sat, 31 May 2025, Dmitriy Kovalenko wrote:
> Great. I send another version with the reverted change for the asr
> register change. What is the correct process to reply for the inline
> changes then? Inline email answer or cover letter?
Do not top post. Reply to review comments in an inline reply to the email
with the review.
// Martin
_______________________________________________
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] 6+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 2/2] swscale: Neon rgb_to_yuv_half process 32 pixels at a time
2025-05-31 10:03 ` Martin Storsjö
@ 2025-05-31 10:43 ` Christopher Snowhill
2025-05-31 10:49 ` Dmitriy Kovalenko
0 siblings, 1 reply; 6+ messages in thread
From: Christopher Snowhill @ 2025-05-31 10:43 UTC (permalink / raw)
To: FFmpeg development discussions and patches, Dmitriy Kovalenko
Cc: ffmpeg-devel
On Sat May 31, 2025 at 3:03 AM PDT, Martin Storsjö wrote:
> On Sat, 31 May 2025, Dmitriy Kovalenko wrote:
>
>> Great. I send another version with the reverted change for the asr
>> register change. What is the correct process to reply for the inline
>> changes then? Inline email answer or cover letter?
>
> Do not top post. Reply to review comments in an inline reply to the email
> with the review.
I hope they are not using the Outlook.com web interface to do their
replying to this list. Most of the web mail silos do their worst to
encourage top posting, or even make it impossible to do otherwise, by
not allowing one to insert text into the middle of the quoted message.
Unfortunately, it seems that handling email properly for mailing list
based development often requires setting up proper clients. I've done
the worst by dedicating an entire Linux container to running aerc and
notmuch. However, there are definitely easier ways of handling
development mail.
Heck, I'm still using Gmail for this list, with an outside client, and I
don't even know if my replies are reaching the list. Certainly, Gmail
may be dropping my incoming list bound copies of my messages because of
the headers.
>
> // Martin
>
> _______________________________________________
> 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".
_______________________________________________
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] 6+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 2/2] swscale: Neon rgb_to_yuv_half process 32 pixels at a time
2025-05-31 10:43 ` Christopher Snowhill
@ 2025-05-31 10:49 ` Dmitriy Kovalenko
0 siblings, 0 replies; 6+ messages in thread
From: Dmitriy Kovalenko @ 2025-05-31 10:49 UTC (permalink / raw)
To: Christopher Snowhill; +Cc: ffmpeg-devel, ffmpeg-devel
I’m sorry for being slightly out of the process with my emails. I used the send-email and just thought it will be either to annotate the patches using cover letter but it seems like it is doing something weird with the messages.
> by
not allowing one to insert text into the middle of the quoted message.
You can still use “>” to make a partial quote (hope it works lol)
Best regards,
Dmitriy Kovalenko
> On May 31, 2025, at 12:43, Christopher Snowhill <kode54@gmail.com> wrote:
>
> by
> not allowing one to insert text into the middle of the quoted message.
_______________________________________________
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] 6+ messages in thread
end of thread, other threads:[~2025-05-31 10:49 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20250530084042.33204-1-dmtr.kovalenko@outlook.com>
2025-05-30 8:40 ` [FFmpeg-devel] [PATCH v4 2/2] swscale: Neon rgb_to_yuv_half process 32 pixels at a time Dmitriy Kovalenko
2025-05-30 9:10 ` Martin Storsjö
2025-05-31 8:59 ` Dmitriy Kovalenko
2025-05-31 10:03 ` Martin Storsjö
2025-05-31 10:43 ` Christopher Snowhill
2025-05-31 10:49 ` Dmitriy Kovalenko
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