Commit 186bd30a authored by Janne Grunau's avatar Janne Grunau

h264/arm64: implement missing 4:2:2 chroma loop filter neon functions

parent 7e42d5f0
...@@ -37,10 +37,14 @@ void ff_h264_v_loop_filter_chroma_neon(uint8_t *pix, int stride, int alpha, ...@@ -37,10 +37,14 @@ void ff_h264_v_loop_filter_chroma_neon(uint8_t *pix, int stride, int alpha,
int beta, int8_t *tc0); int beta, int8_t *tc0);
void ff_h264_h_loop_filter_chroma_neon(uint8_t *pix, int stride, int alpha, void ff_h264_h_loop_filter_chroma_neon(uint8_t *pix, int stride, int alpha,
int beta, int8_t *tc0); int beta, int8_t *tc0);
void ff_h264_h_loop_filter_chroma422_neon(uint8_t *pix, int stride, int alpha,
int beta, int8_t *tc0);
void ff_h264_v_loop_filter_chroma_intra_neon(uint8_t *pix, int stride, void ff_h264_v_loop_filter_chroma_intra_neon(uint8_t *pix, int stride,
int alpha, int beta); int alpha, int beta);
void ff_h264_h_loop_filter_chroma_intra_neon(uint8_t *pix, int stride, void ff_h264_h_loop_filter_chroma_intra_neon(uint8_t *pix, int stride,
int alpha, int beta); int alpha, int beta);
void ff_h264_h_loop_filter_chroma422_intra_neon(uint8_t *pix, int stride,
int alpha, int beta);
void ff_h264_h_loop_filter_chroma_mbaff_intra_neon(uint8_t *pix, int stride, void ff_h264_h_loop_filter_chroma_mbaff_intra_neon(uint8_t *pix, int stride,
int alpha, int beta); int alpha, int beta);
...@@ -91,10 +95,18 @@ av_cold void ff_h264dsp_init_aarch64(H264DSPContext *c, const int bit_depth, ...@@ -91,10 +95,18 @@ av_cold void ff_h264dsp_init_aarch64(H264DSPContext *c, const int bit_depth,
c->h264_h_loop_filter_luma_intra= ff_h264_h_loop_filter_luma_intra_neon; c->h264_h_loop_filter_luma_intra= ff_h264_h_loop_filter_luma_intra_neon;
c->h264_v_loop_filter_chroma = ff_h264_v_loop_filter_chroma_neon; c->h264_v_loop_filter_chroma = ff_h264_v_loop_filter_chroma_neon;
c->h264_h_loop_filter_chroma = ff_h264_h_loop_filter_chroma_neon;
c->h264_v_loop_filter_chroma_intra = ff_h264_v_loop_filter_chroma_intra_neon; c->h264_v_loop_filter_chroma_intra = ff_h264_v_loop_filter_chroma_intra_neon;
c->h264_h_loop_filter_chroma_intra = ff_h264_h_loop_filter_chroma_intra_neon;
c->h264_h_loop_filter_chroma_mbaff_intra = ff_h264_h_loop_filter_chroma_mbaff_intra_neon; if (chroma_format_idc <= 1) {
c->h264_h_loop_filter_chroma = ff_h264_h_loop_filter_chroma_neon;
c->h264_h_loop_filter_chroma_intra = ff_h264_h_loop_filter_chroma_intra_neon;
c->h264_h_loop_filter_chroma_mbaff_intra = ff_h264_h_loop_filter_chroma_mbaff_intra_neon;
} else {
c->h264_h_loop_filter_chroma = ff_h264_h_loop_filter_chroma422_neon;
c->h264_h_loop_filter_chroma_mbaff = ff_h264_h_loop_filter_chroma_neon;
c->h264_h_loop_filter_chroma_intra = ff_h264_h_loop_filter_chroma422_intra_neon;
c->h264_h_loop_filter_chroma_mbaff_intra = ff_h264_h_loop_filter_chroma_intra_neon;
}
c->weight_h264_pixels_tab[0] = ff_weight_h264_pixels_16_neon; c->weight_h264_pixels_tab[0] = ff_weight_h264_pixels_16_neon;
c->weight_h264_pixels_tab[1] = ff_weight_h264_pixels_8_neon; c->weight_h264_pixels_tab[1] = ff_weight_h264_pixels_8_neon;
......
...@@ -28,9 +28,9 @@ ...@@ -28,9 +28,9 @@
ldr w6, [x4] ldr w6, [x4]
ccmp w3, #0, #0, ne ccmp w3, #0, #0, ne
mov v24.S[0], w6 mov v24.S[0], w6
and w6, w6, w6, lsl #16 and w8, w6, w6, lsl #16
b.eq 1f b.eq 1f
ands w6, w6, w6, lsl #8 ands w8, w8, w8, lsl #8
b.ge 2f b.ge 2f
1: 1:
ret ret
...@@ -394,10 +394,10 @@ endfunc ...@@ -394,10 +394,10 @@ endfunc
usubw v4.8H, v4.8H, v16.8B usubw v4.8H, v4.8H, v16.8B
and v26.8B, v26.8B, v30.8B and v26.8B, v26.8B, v30.8B
shl v4.8H, v4.8H, #2 shl v4.8H, v4.8H, #2
mov x2, v26.d[0] mov x8, v26.d[0]
sli v24.8H, v24.8H, #8 sli v24.8H, v24.8H, #8
uaddw v4.8H, v4.8H, v18.8B uaddw v4.8H, v4.8H, v18.8B
cbz x2, 9f cbz x8, 9f
usubw v4.8H, v4.8H, v2.8B usubw v4.8H, v4.8H, v2.8B
rshrn v4.8B, v4.8H, #3 rshrn v4.8B, v4.8H, #3
smin v4.8B, v4.8B, v24.8B smin v4.8B, v4.8B, v24.8B
...@@ -436,6 +436,7 @@ function ff_h264_h_loop_filter_chroma_neon, export=1 ...@@ -436,6 +436,7 @@ function ff_h264_h_loop_filter_chroma_neon, export=1
sxtw x1, w1 sxtw x1, w1
sub x0, x0, #2 sub x0, x0, #2
h_loop_filter_chroma420:
ld1 {v18.S}[0], [x0], x1 ld1 {v18.S}[0], [x0], x1
ld1 {v16.S}[0], [x0], x1 ld1 {v16.S}[0], [x0], x1
ld1 {v0.S}[0], [x0], x1 ld1 {v0.S}[0], [x0], x1
...@@ -464,6 +465,19 @@ function ff_h264_h_loop_filter_chroma_neon, export=1 ...@@ -464,6 +465,19 @@ function ff_h264_h_loop_filter_chroma_neon, export=1
ret ret
endfunc endfunc
function ff_h264_h_loop_filter_chroma422_neon, export=1
sxtw x1, w1
h264_loop_filter_start
add x5, x0, x1
sub x0, x0, #2
add x1, x1, x1
mov x7, x30
bl h_loop_filter_chroma420
mov x30, x7
sub x0, x5, #2
mov v24.s[0], w6
b h_loop_filter_chroma420
endfunc
.macro h264_loop_filter_chroma_intra .macro h264_loop_filter_chroma_intra
uabd v26.8b, v16.8b, v17.8b // abs(p0 - q0) uabd v26.8b, v16.8b, v17.8b // abs(p0 - q0)
...@@ -536,6 +550,7 @@ function ff_h264_h_loop_filter_chroma_intra_neon, export=1 ...@@ -536,6 +550,7 @@ function ff_h264_h_loop_filter_chroma_intra_neon, export=1
sub x4, x0, #2 sub x4, x0, #2
sub x0, x0, #1 sub x0, x0, #1
h_loop_filter_chroma420_intra:
ld1 {v18.8b}, [x4], x1 ld1 {v18.8b}, [x4], x1
ld1 {v16.8b}, [x4], x1 ld1 {v16.8b}, [x4], x1
ld1 {v17.8b}, [x4], x1 ld1 {v17.8b}, [x4], x1
...@@ -543,7 +558,7 @@ function ff_h264_h_loop_filter_chroma_intra_neon, export=1 ...@@ -543,7 +558,7 @@ function ff_h264_h_loop_filter_chroma_intra_neon, export=1
ld1 {v18.s}[1], [x4], x1 ld1 {v18.s}[1], [x4], x1
ld1 {v16.s}[1], [x4], x1 ld1 {v16.s}[1], [x4], x1
ld1 {v17.s}[1], [x4], x1 ld1 {v17.s}[1], [x4], x1
ld1 {v19.s}[1], [x4] ld1 {v19.s}[1], [x4], x1
transpose_4x8B v18, v16, v17, v19, v26, v27, v28, v29 transpose_4x8B v18, v16, v17, v19, v26, v27, v28, v29
...@@ -562,6 +577,17 @@ function ff_h264_h_loop_filter_chroma_intra_neon, export=1 ...@@ -562,6 +577,17 @@ function ff_h264_h_loop_filter_chroma_intra_neon, export=1
ret ret
endfunc endfunc
function ff_h264_h_loop_filter_chroma422_intra_neon, export=1
h264_loop_filter_start_intra
sub x4, x0, #2
add x5, x0, x1, lsl #3
sub x0, x0, #1
mov x7, x30
bl h_loop_filter_chroma420_intra
sub x0, x5, #1
mov x30, x7
b h_loop_filter_chroma420_intra
endfunc
.macro biweight_16 macs, macd .macro biweight_16 macs, macd
dup v0.16B, w5 dup v0.16B, w5
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment