FFmpeg
vp9dsp_init_loongarch.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021 Loongson Technology Corporation Limited
3  * Contributed by Hao Chen <chenhao@loongson.cn>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
23 #include "libavutil/attributes.h"
24 #include "libavcodec/vp9dsp.h"
25 #include "vp9dsp_loongarch.h"
26 
27 #define init_subpel1(idx1, idx2, idxh, idxv, sz, dir, type) \
28  dsp->mc[idx1][FILTER_8TAP_SMOOTH ][idx2][idxh][idxv] = \
29  ff_##type##_8tap_smooth_##sz##dir##_lsx; \
30  dsp->mc[idx1][FILTER_8TAP_REGULAR][idx2][idxh][idxv] = \
31  ff_##type##_8tap_regular_##sz##dir##_lsx; \
32  dsp->mc[idx1][FILTER_8TAP_SHARP ][idx2][idxh][idxv] = \
33  ff_##type##_8tap_sharp_##sz##dir##_lsx;
34 
35 #define init_subpel2(idx, idxh, idxv, dir, type) \
36  init_subpel1(0, idx, idxh, idxv, 64, dir, type); \
37  init_subpel1(1, idx, idxh, idxv, 32, dir, type); \
38  init_subpel1(2, idx, idxh, idxv, 16, dir, type); \
39  init_subpel1(3, idx, idxh, idxv, 8, dir, type); \
40  init_subpel1(4, idx, idxh, idxv, 4, dir, type);
41 
42 #define init_subpel3(idx, type) \
43  init_subpel2(idx, 1, 0, h, type); \
44  init_subpel2(idx, 0, 1, v, type); \
45  init_subpel2(idx, 1, 1, hv, type);
46 
47 #define init_fpel(idx1, idx2, sz, type) \
48  dsp->mc[idx1][FILTER_8TAP_SMOOTH ][idx2][0][0] = ff_##type##sz##_lsx; \
49  dsp->mc[idx1][FILTER_8TAP_REGULAR][idx2][0][0] = ff_##type##sz##_lsx; \
50  dsp->mc[idx1][FILTER_8TAP_SHARP ][idx2][0][0] = ff_##type##sz##_lsx; \
51  dsp->mc[idx1][FILTER_BILINEAR ][idx2][0][0] = ff_##type##sz##_lsx;
52 
53 #define init_copy(idx, sz) \
54  init_fpel(idx, 0, sz, copy); \
55  init_fpel(idx, 1, sz, avg);
56 
57 #define init_intra_pred1_lsx(tx, sz) \
58  dsp->intra_pred[tx][VERT_PRED] = ff_vert_##sz##_lsx; \
59  dsp->intra_pred[tx][HOR_PRED] = ff_hor_##sz##_lsx; \
60  dsp->intra_pred[tx][DC_PRED] = ff_dc_##sz##_lsx; \
61  dsp->intra_pred[tx][LEFT_DC_PRED] = ff_dc_left_##sz##_lsx; \
62  dsp->intra_pred[tx][TOP_DC_PRED] = ff_dc_top_##sz##_lsx; \
63  dsp->intra_pred[tx][DC_128_PRED] = ff_dc_128_##sz##_lsx; \
64  dsp->intra_pred[tx][DC_127_PRED] = ff_dc_127_##sz##_lsx; \
65  dsp->intra_pred[tx][DC_129_PRED] = ff_dc_129_##sz##_lsx; \
66  dsp->intra_pred[tx][TM_VP8_PRED] = ff_tm_##sz##_lsx; \
67 
68 #define init_intra_pred2_lsx(tx, sz) \
69  dsp->intra_pred[tx][DC_PRED] = ff_dc_##sz##_lsx; \
70  dsp->intra_pred[tx][LEFT_DC_PRED] = ff_dc_left_##sz##_lsx; \
71  dsp->intra_pred[tx][TOP_DC_PRED] = ff_dc_top_##sz##_lsx; \
72  dsp->intra_pred[tx][TM_VP8_PRED] = ff_tm_##sz##_lsx; \
73 
74 #define init_idct(tx, nm) \
75  dsp->itxfm_add[tx][DCT_DCT] = \
76  dsp->itxfm_add[tx][ADST_DCT] = \
77  dsp->itxfm_add[tx][DCT_ADST] = \
78  dsp->itxfm_add[tx][ADST_ADST] = nm##_add_lsx;
79 
80 #define init_itxfm(tx, sz) \
81  dsp->itxfm_add[tx][DCT_DCT] = ff_idct_idct_##sz##_add_lsx;
82 
84 {
86  if (have_lsx(cpu_flags))
87  if (bpp == 8) {
88  init_subpel3(0, put);
89  init_subpel3(1, avg);
90  init_copy(0, 64);
91  init_copy(1, 32);
92  init_copy(2, 16);
93  init_copy(3, 8);
98  init_itxfm(TX_8X8, 8x8);
99  init_itxfm(TX_16X16, 16x16);
100  init_idct(TX_32X32, ff_idct_idct_32x32);
107 
110 
119  }
120 }
121 
122 #undef init_subpel1
123 #undef init_subpel2
124 #undef init_subpel3
125 #undef init_copy
126 #undef init_fpel
127 #undef init_intra_pred1_lsx
128 #undef init_intra_pred2_lsx
129 #undef init_idct
130 #undef init_itxfm
VP9DSPContext::loop_filter_8
void(* loop_filter_8[3][2])(uint8_t *dst, ptrdiff_t stride, int mb_lim, int lim, int hev_thr)
Definition: vp9dsp.h:80
init_itxfm
#define init_itxfm(tx, sz)
Definition: vp9dsp_init_loongarch.c:80
VP9DSPContext
Definition: vp9dsp.h:39
ff_loop_filter_h_88_16_lsx
void ff_loop_filter_h_88_16_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:1594
av_get_cpu_flags
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
Definition: cpu.c:98
cpu_flags
static atomic_int cpu_flags
Definition: cpu.c:50
ff_loop_filter_h_16_8_lsx
void ff_loop_filter_h_16_8_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:2612
VP9DSPContext::loop_filter_mix2
void(* loop_filter_mix2[2][2][2])(uint8_t *dst, ptrdiff_t stride, int mb_lim, int lim, int hev_thr)
Definition: vp9dsp.h:102
ff_vp9dsp_init_loongarch
av_cold void ff_vp9dsp_init_loongarch(VP9DSPContext *dsp, int bpp)
Definition: vp9dsp_init_loongarch.c:83
ff_loop_filter_v_84_16_lsx
void ff_loop_filter_v_84_16_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:465
init_copy
#define init_copy(idx, sz)
Definition: vp9dsp_init_loongarch.c:53
init_idct
#define init_idct(tx, nm)
Definition: vp9dsp_init_loongarch.c:74
av_cold
#define av_cold
Definition: attributes.h:90
ff_loop_filter_h_84_16_lsx
void ff_loop_filter_h_84_16_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:1779
init_intra_pred1_lsx
#define init_intra_pred1_lsx(tx, sz)
Definition: vp9dsp_init_loongarch.c:57
ff_loop_filter_v_16_16_lsx
void ff_loop_filter_v_16_16_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:1080
ff_loop_filter_v_8_8_lsx
void ff_loop_filter_v_8_8_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:302
TX_8X8
@ TX_8X8
Definition: vp9.h:29
ff_loop_filter_v_4_8_lsx
void ff_loop_filter_v_4_8_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:229
TX_16X16
@ TX_16X16
Definition: vp9.h:30
vp9dsp.h
have_lsx
#define have_lsx(flags)
Definition: cpu.h:28
init_subpel3
#define init_subpel3(idx, type)
Definition: vp9dsp_init_loongarch.c:42
avg
#define avg(a, b, c, d)
Definition: colorspacedsp_template.c:28
TX_4X4
@ TX_4X4
Definition: vp9.h:28
attributes.h
ff_loop_filter_v_48_16_lsx
void ff_loop_filter_v_48_16_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:547
ff_loop_filter_h_44_16_lsx
void ff_loop_filter_h_44_16_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:1396
vp9dsp_loongarch.h
ff_loop_filter_h_48_16_lsx
void ff_loop_filter_h_48_16_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:1954
ff_loop_filter_h_8_8_lsx
void ff_loop_filter_h_8_8_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:1476
ff_loop_filter_v_16_8_lsx
void ff_loop_filter_v_16_8_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:1096
ff_loop_filter_v_88_16_lsx
void ff_loop_filter_v_88_16_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:374
ff_loop_filter_h_4_8_lsx
void ff_loop_filter_h_4_8_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:1350
TX_32X32
@ TX_32X32
Definition: vp9.h:31
init_intra_pred2_lsx
#define init_intra_pred2_lsx(tx, sz)
Definition: vp9dsp_init_loongarch.c:68
VP9DSPContext::loop_filter_16
void(* loop_filter_16[2])(uint8_t *dst, ptrdiff_t stride, int mb_lim, int lim, int hev_thr)
Definition: vp9dsp.h:88
cpu.h
ff_loop_filter_v_44_16_lsx
void ff_loop_filter_v_44_16_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:262
ff_loop_filter_h_16_16_lsx
void ff_loop_filter_h_16_16_lsx(uint8_t *dst, ptrdiff_t stride, int32_t b_limit_ptr, int32_t limit_ptr, int32_t thresh_ptr)
Definition: vp9_lpf_lsx.c:3118