1 /* 2 * Copyright (c) 2022 Loongson Technology Corporation Limited 3 * Contributed by Lu Wang <wanglu@loongson.cn> 4 * Hao Chen <chenhao@loongson.cn> 5 * 6 * This file is part of FFmpeg. 7 * 8 * FFmpeg is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2.1 of the License, or (at your option) any later version. 12 * 13 * FFmpeg is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with FFmpeg; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21 */ 22 23 #ifndef AVCODEC_LOONGARCH_HEVCDSP_LSX_H 24 #define AVCODEC_LOONGARCH_HEVCDSP_LSX_H 25 26 #include "libavcodec/hevcdsp.h" 27 28 #define MC(PEL, DIR, WIDTH) \ 29 void ff_hevc_put_hevc_##PEL##_##DIR##WIDTH##_8_lsx(int16_t *dst, \ 30 uint8_t *src, \ 31 ptrdiff_t src_stride, \ 32 int height, \ 33 intptr_t mx, \ 34 intptr_t my, \ 35 int width) 36 37 MC(pel, pixels, 4); 38 MC(pel, pixels, 6); 39 MC(pel, pixels, 8); 40 MC(pel, pixels, 12); 41 MC(pel, pixels, 16); 42 MC(pel, pixels, 24); 43 MC(pel, pixels, 32); 44 MC(pel, pixels, 48); 45 MC(pel, pixels, 64); 46 47 MC(qpel, h, 4); 48 MC(qpel, h, 8); 49 MC(qpel, h, 12); 50 MC(qpel, h, 16); 51 MC(qpel, h, 24); 52 MC(qpel, h, 32); 53 MC(qpel, h, 48); 54 MC(qpel, h, 64); 55 56 MC(qpel, v, 4); 57 MC(qpel, v, 8); 58 MC(qpel, v, 12); 59 MC(qpel, v, 16); 60 MC(qpel, v, 24); 61 MC(qpel, v, 32); 62 MC(qpel, v, 48); 63 MC(qpel, v, 64); 64 65 MC(qpel, hv, 4); 66 MC(qpel, hv, 8); 67 MC(qpel, hv, 12); 68 MC(qpel, hv, 16); 69 MC(qpel, hv, 24); 70 MC(qpel, hv, 32); 71 MC(qpel, hv, 48); 72 MC(qpel, hv, 64); 73 74 MC(epel, h, 32); 75 76 MC(epel, v, 16); 77 MC(epel, v, 24); 78 MC(epel, v, 32); 79 80 MC(epel, hv, 8); 81 MC(epel, hv, 12); 82 MC(epel, hv, 16); 83 MC(epel, hv, 24); 84 MC(epel, hv, 32); 85 86 #undef MC 87 88 #define BI_MC(PEL, DIR, WIDTH) \ 89 void ff_hevc_put_hevc_bi_##PEL##_##DIR##WIDTH##_8_lsx(uint8_t *dst, \ 90 ptrdiff_t dst_stride, \ 91 uint8_t *src, \ 92 ptrdiff_t src_stride, \ 93 int16_t *src_16bit, \ 94 int height, \ 95 intptr_t mx, \ 96 intptr_t my, \ 97 int width) 98 99 BI_MC(pel, pixels, 4); 100 BI_MC(pel, pixels, 6); 101 BI_MC(pel, pixels, 8); 102 BI_MC(pel, pixels, 12); 103 BI_MC(pel, pixels, 16); 104 BI_MC(pel, pixels, 24); 105 BI_MC(pel, pixels, 32); 106 BI_MC(pel, pixels, 48); 107 BI_MC(pel, pixels, 64); 108 109 BI_MC(qpel, h, 16); 110 BI_MC(qpel, h, 24); 111 BI_MC(qpel, h, 32); 112 BI_MC(qpel, h, 48); 113 BI_MC(qpel, h, 64); 114 115 BI_MC(qpel, v, 8); 116 BI_MC(qpel, v, 16); 117 BI_MC(qpel, v, 24); 118 BI_MC(qpel, v, 32); 119 BI_MC(qpel, v, 48); 120 BI_MC(qpel, v, 64); 121 122 BI_MC(qpel, hv, 8); 123 BI_MC(qpel, hv, 16); 124 BI_MC(qpel, hv, 24); 125 BI_MC(qpel, hv, 32); 126 BI_MC(qpel, hv, 48); 127 BI_MC(qpel, hv, 64); 128 129 BI_MC(epel, h, 24); 130 BI_MC(epel, h, 32); 131 132 BI_MC(epel, v, 12); 133 BI_MC(epel, v, 16); 134 BI_MC(epel, v, 24); 135 BI_MC(epel, v, 32); 136 137 BI_MC(epel, hv, 6); 138 BI_MC(epel, hv, 8); 139 BI_MC(epel, hv, 16); 140 BI_MC(epel, hv, 24); 141 BI_MC(epel, hv, 32); 142 143 #undef BI_MC 144 145 #define UNI_MC(PEL, DIR, WIDTH) \ 146 void ff_hevc_put_hevc_uni_##PEL##_##DIR##WIDTH##_8_lsx(uint8_t *dst, \ 147 ptrdiff_t dst_stride, \ 148 uint8_t *src, \ 149 ptrdiff_t src_stride, \ 150 int height, \ 151 intptr_t mx, \ 152 intptr_t my, \ 153 int width) 154 155 UNI_MC(qpel, h, 64); 156 157 UNI_MC(qpel, v, 24); 158 UNI_MC(qpel, v, 32); 159 UNI_MC(qpel, v, 48); 160 UNI_MC(qpel, v, 64); 161 162 UNI_MC(qpel, hv, 8); 163 UNI_MC(qpel, hv, 16); 164 UNI_MC(qpel, hv, 24); 165 UNI_MC(qpel, hv, 32); 166 UNI_MC(qpel, hv, 48); 167 UNI_MC(qpel, hv, 64); 168 169 UNI_MC(epel, v, 24); 170 UNI_MC(epel, v, 32); 171 172 UNI_MC(epel, hv, 8); 173 UNI_MC(epel, hv, 12); 174 UNI_MC(epel, hv, 16); 175 UNI_MC(epel, hv, 24); 176 UNI_MC(epel, hv, 32); 177 178 #undef UNI_MC 179 180 #define UNI_W_MC(PEL, DIR, WIDTH) \ 181 void ff_hevc_put_hevc_uni_w_##PEL##_##DIR##WIDTH##_8_lsx(uint8_t *dst, \ 182 ptrdiff_t \ 183 dst_stride, \ 184 uint8_t *src, \ 185 ptrdiff_t \ 186 src_stride, \ 187 int height, \ 188 int denom, \ 189 int weight, \ 190 int offset, \ 191 intptr_t mx, \ 192 intptr_t my, \ 193 int width) 194 195 UNI_W_MC(qpel, hv, 8); 196 UNI_W_MC(qpel, hv, 16); 197 UNI_W_MC(qpel, hv, 24); 198 UNI_W_MC(qpel, hv, 32); 199 UNI_W_MC(qpel, hv, 48); 200 UNI_W_MC(qpel, hv, 64); 201 202 #undef UNI_W_MC 203 204 void ff_hevc_loop_filter_luma_h_8_lsx(uint8_t *src, ptrdiff_t stride, 205 int32_t beta, int32_t *tc, 206 uint8_t *p_is_pcm, uint8_t *q_is_pcm); 207 208 void ff_hevc_loop_filter_luma_v_8_lsx(uint8_t *src, ptrdiff_t stride, 209 int32_t beta, int32_t *tc, 210 uint8_t *p_is_pcm, uint8_t *q_is_pcm); 211 212 void ff_hevc_loop_filter_chroma_h_8_lsx(uint8_t *src, ptrdiff_t stride, 213 int32_t *tc, uint8_t *p_is_pcm, 214 uint8_t *q_is_pcm); 215 216 void ff_hevc_loop_filter_chroma_v_8_lsx(uint8_t *src, ptrdiff_t stride, 217 int32_t *tc, uint8_t *p_is_pcm, 218 uint8_t *q_is_pcm); 219 220 void ff_hevc_sao_edge_filter_8_lsx(uint8_t *dst, uint8_t *src, 221 ptrdiff_t stride_dst, 222 int16_t *sao_offset_val, 223 int eo, int width, int height); 224 225 void ff_hevc_idct_4x4_lsx(int16_t *coeffs, int col_limit); 226 void ff_hevc_idct_8x8_lsx(int16_t *coeffs, int col_limit); 227 void ff_hevc_idct_16x16_lsx(int16_t *coeffs, int col_limit); 228 void ff_hevc_idct_32x32_lsx(int16_t *coeffs, int col_limit); 229 230 #endif // #ifndef AVCODEC_LOONGARCH_HEVCDSP_LSX_H 231