1 /* 2 * Copyright (c) 2015 Shivraj Patil (Shivraj.Patil@imgtec.com) 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21 #ifndef AVCODEC_MIPS_VP9DSP_MIPS_H 22 #define AVCODEC_MIPS_VP9DSP_MIPS_H 23 24 #include <stddef.h> 25 #include <stdint.h> 26 27 #define VP9_8TAP_MIPS_MSA_FUNC(SIZE, type, type_idx) \ 28 void ff_put_8tap_##type##_##SIZE##h_msa(uint8_t *dst, ptrdiff_t dststride, \ 29 const uint8_t *src, \ 30 ptrdiff_t srcstride, \ 31 int h, int mx, int my); \ 32 \ 33 void ff_put_8tap_##type##_##SIZE##v_msa(uint8_t *dst, ptrdiff_t dststride, \ 34 const uint8_t *src, \ 35 ptrdiff_t srcstride, \ 36 int h, int mx, int my); \ 37 \ 38 void ff_put_8tap_##type##_##SIZE##hv_msa(uint8_t *dst, ptrdiff_t dststride, \ 39 const uint8_t *src, \ 40 ptrdiff_t srcstride, \ 41 int h, int mx, int my); \ 42 \ 43 void ff_avg_8tap_##type##_##SIZE##h_msa(uint8_t *dst, ptrdiff_t dststride, \ 44 const uint8_t *src, \ 45 ptrdiff_t srcstride, \ 46 int h, int mx, int my); \ 47 \ 48 void ff_avg_8tap_##type##_##SIZE##v_msa(uint8_t *dst, ptrdiff_t dststride, \ 49 const uint8_t *src, \ 50 ptrdiff_t srcstride, \ 51 int h, int mx, int my); \ 52 \ 53 void ff_avg_8tap_##type##_##SIZE##hv_msa(uint8_t *dst, ptrdiff_t dststride, \ 54 const uint8_t *src, \ 55 ptrdiff_t srcstride, \ 56 int h, int mx, int my); 57 58 #define VP9_BILINEAR_MIPS_MSA_FUNC(SIZE) \ 59 void ff_put_bilin_##SIZE##h_msa(uint8_t *dst, ptrdiff_t dststride, \ 60 const uint8_t *src, ptrdiff_t srcstride, \ 61 int h, int mx, int my); \ 62 \ 63 void ff_put_bilin_##SIZE##v_msa(uint8_t *dst, ptrdiff_t dststride, \ 64 const uint8_t *src, ptrdiff_t srcstride, \ 65 int h, int mx, int my); \ 66 \ 67 void ff_put_bilin_##SIZE##hv_msa(uint8_t *dst, ptrdiff_t dststride, \ 68 const uint8_t *src, ptrdiff_t srcstride, \ 69 int h, int mx, int my); \ 70 \ 71 void ff_avg_bilin_##SIZE##h_msa(uint8_t *dst, ptrdiff_t dststride, \ 72 const uint8_t *src, ptrdiff_t srcstride, \ 73 int h, int mx, int my); \ 74 \ 75 void ff_avg_bilin_##SIZE##v_msa(uint8_t *dst, ptrdiff_t dststride, \ 76 const uint8_t *src, ptrdiff_t srcstride, \ 77 int h, int mx, int my); \ 78 \ 79 void ff_avg_bilin_##SIZE##hv_msa(uint8_t *dst, ptrdiff_t dststride, \ 80 const uint8_t *src, ptrdiff_t srcstride, \ 81 int h, int mx, int my); 82 83 #define VP9_COPY_AVG_MIPS_MSA_FUNC(SIZE) \ 84 void ff_copy##SIZE##_msa(uint8_t *dst, ptrdiff_t dststride, \ 85 const uint8_t *src, ptrdiff_t srcstride, \ 86 int h, int mx, int my); \ 87 \ 88 void ff_avg##SIZE##_msa(uint8_t *dst, ptrdiff_t dststride, \ 89 const uint8_t *src, ptrdiff_t srcstride, \ 90 int h, int mx, int my); 91 92 VP9_8TAP_MIPS_MSA_FUNC(64, regular, FILTER_8TAP_REGULAR); 93 VP9_8TAP_MIPS_MSA_FUNC(32, regular, FILTER_8TAP_REGULAR); 94 VP9_8TAP_MIPS_MSA_FUNC(16, regular, FILTER_8TAP_REGULAR); 95 VP9_8TAP_MIPS_MSA_FUNC(8, regular, FILTER_8TAP_REGULAR); 96 VP9_8TAP_MIPS_MSA_FUNC(4, regular, FILTER_8TAP_REGULAR); 97 98 VP9_8TAP_MIPS_MSA_FUNC(64, sharp, FILTER_8TAP_SHARP); 99 VP9_8TAP_MIPS_MSA_FUNC(32, sharp, FILTER_8TAP_SHARP); 100 VP9_8TAP_MIPS_MSA_FUNC(16, sharp, FILTER_8TAP_SHARP); 101 VP9_8TAP_MIPS_MSA_FUNC(8, sharp, FILTER_8TAP_SHARP); 102 VP9_8TAP_MIPS_MSA_FUNC(4, sharp, FILTER_8TAP_SHARP); 103 104 VP9_8TAP_MIPS_MSA_FUNC(64, smooth, FILTER_8TAP_SMOOTH); 105 VP9_8TAP_MIPS_MSA_FUNC(32, smooth, FILTER_8TAP_SMOOTH); 106 VP9_8TAP_MIPS_MSA_FUNC(16, smooth, FILTER_8TAP_SMOOTH); 107 VP9_8TAP_MIPS_MSA_FUNC(8, smooth, FILTER_8TAP_SMOOTH); 108 VP9_8TAP_MIPS_MSA_FUNC(4, smooth, FILTER_8TAP_SMOOTH); 109 110 VP9_BILINEAR_MIPS_MSA_FUNC(64); 111 VP9_BILINEAR_MIPS_MSA_FUNC(32); 112 VP9_BILINEAR_MIPS_MSA_FUNC(16); 113 VP9_BILINEAR_MIPS_MSA_FUNC(8); 114 VP9_BILINEAR_MIPS_MSA_FUNC(4); 115 116 VP9_COPY_AVG_MIPS_MSA_FUNC(64); 117 VP9_COPY_AVG_MIPS_MSA_FUNC(32); 118 VP9_COPY_AVG_MIPS_MSA_FUNC(16); 119 VP9_COPY_AVG_MIPS_MSA_FUNC(8); 120 VP9_COPY_AVG_MIPS_MSA_FUNC(4); 121 122 #undef VP9_8TAP_MIPS_MSA_FUNC 123 #undef VP9_BILINEAR_MIPS_MSA_FUNC 124 #undef VP9_COPY_AVG_MIPS_MSA_FUNC 125 126 void ff_loop_filter_h_4_8_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 127 int32_t i, int32_t h); 128 void ff_loop_filter_h_8_8_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 129 int32_t i, int32_t h); 130 void ff_loop_filter_h_16_8_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 131 int32_t i, int32_t h); 132 void ff_loop_filter_v_4_8_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 133 int32_t i, int32_t h); 134 void ff_loop_filter_v_8_8_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 135 int32_t i, int32_t h); 136 void ff_loop_filter_v_16_8_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 137 int32_t i, int32_t h); 138 void ff_loop_filter_h_44_16_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 139 int32_t i, int32_t h); 140 void ff_loop_filter_h_88_16_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 141 int32_t i, int32_t h); 142 void ff_loop_filter_h_16_16_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 143 int32_t i, int32_t h); 144 void ff_loop_filter_v_44_16_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 145 int32_t i, int32_t h); 146 void ff_loop_filter_v_88_16_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 147 int32_t i, int32_t h); 148 void ff_loop_filter_v_16_16_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 149 int32_t i, int32_t h); 150 void ff_loop_filter_h_48_16_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 151 int32_t i, int32_t h); 152 void ff_loop_filter_h_84_16_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 153 int32_t i, int32_t h); 154 void ff_loop_filter_v_48_16_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 155 int32_t i, int32_t h); 156 void ff_loop_filter_v_84_16_msa(uint8_t *dst, ptrdiff_t stride, int32_t e, 157 int32_t i, int32_t h); 158 void ff_idct_idct_4x4_add_msa(uint8_t *dst, ptrdiff_t stride, 159 int16_t *block, int eob); 160 void ff_idct_idct_8x8_add_msa(uint8_t *dst, ptrdiff_t stride, 161 int16_t *block, int eob); 162 void ff_idct_idct_16x16_add_msa(uint8_t *dst, ptrdiff_t stride, 163 int16_t *block, int eob); 164 void ff_idct_idct_32x32_add_msa(uint8_t *dst, ptrdiff_t stride, 165 int16_t *block, int eob); 166 void ff_iadst_iadst_4x4_add_msa(uint8_t *dst, ptrdiff_t stride, 167 int16_t *block, int eob); 168 void ff_iadst_iadst_8x8_add_msa(uint8_t *dst, ptrdiff_t stride, 169 int16_t *block, int eob); 170 void ff_iadst_iadst_16x16_add_msa(uint8_t *dst, ptrdiff_t stride, 171 int16_t *block, int eob); 172 void ff_iadst_idct_4x4_add_msa(uint8_t *dst, ptrdiff_t stride, 173 int16_t *block, int eob); 174 void ff_iadst_idct_8x8_add_msa(uint8_t *dst, ptrdiff_t stride, 175 int16_t *block, int eob); 176 void ff_iadst_idct_16x16_add_msa(uint8_t *dst, ptrdiff_t stride, 177 int16_t *block, int eob); 178 void ff_idct_iadst_4x4_add_msa(uint8_t *pu8Dest, ptrdiff_t stride, 179 int16_t *block, int eob); 180 void ff_idct_iadst_8x8_add_msa(uint8_t *pu8Dest, ptrdiff_t stride, 181 int16_t *block, int eob); 182 void ff_idct_iadst_16x16_add_msa(uint8_t *pu8Dest, ptrdiff_t stride, 183 int16_t *block, int eob); 184 void ff_iwht_iwht_4x4_add_msa(uint8_t *dst, ptrdiff_t stride, 185 int16_t *block, int eob); 186 187 void ff_vert_16x16_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 188 const uint8_t *top); 189 void ff_vert_32x32_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 190 const uint8_t *top); 191 void ff_hor_16x16_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 192 const uint8_t *top); 193 void ff_hor_32x32_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 194 const uint8_t *top); 195 void ff_dc_4x4_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 196 const uint8_t *top); 197 void ff_dc_8x8_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 198 const uint8_t *top); 199 void ff_dc_16x16_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 200 const uint8_t *top); 201 void ff_dc_32x32_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 202 const uint8_t *top); 203 void ff_dc_left_4x4_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 204 const uint8_t *top); 205 void ff_dc_left_8x8_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 206 const uint8_t *top); 207 void ff_dc_left_16x16_msa(uint8_t *dst, ptrdiff_t stride, 208 const uint8_t *left, const uint8_t *top); 209 void ff_dc_left_32x32_msa(uint8_t *dst, ptrdiff_t stride, 210 const uint8_t *left, const uint8_t *top); 211 void ff_dc_top_4x4_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 212 const uint8_t *top); 213 void ff_dc_top_8x8_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 214 const uint8_t *top); 215 void ff_dc_top_16x16_msa(uint8_t *dst, ptrdiff_t stride, 216 const uint8_t *left, const uint8_t *top); 217 void ff_dc_top_32x32_msa(uint8_t *dst, ptrdiff_t stride, 218 const uint8_t *left, const uint8_t *top); 219 void ff_dc_128_16x16_msa(uint8_t *dst, ptrdiff_t stride, 220 const uint8_t *left, const uint8_t *top); 221 void ff_dc_128_32x32_msa(uint8_t *dst, ptrdiff_t stride, 222 const uint8_t *left, const uint8_t *top); 223 void ff_dc_127_16x16_msa(uint8_t *dst, ptrdiff_t stride, 224 const uint8_t *left, const uint8_t *top); 225 void ff_dc_127_32x32_msa(uint8_t *dst, ptrdiff_t stride, 226 const uint8_t *left, const uint8_t *top); 227 void ff_dc_129_16x16_msa(uint8_t *dst, ptrdiff_t stride, 228 const uint8_t *left, const uint8_t *top); 229 void ff_dc_129_32x32_msa(uint8_t *dst, ptrdiff_t stride, 230 const uint8_t *left, const uint8_t *top); 231 void ff_tm_4x4_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 232 const uint8_t *top); 233 void ff_tm_8x8_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 234 const uint8_t *top); 235 void ff_tm_16x16_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 236 const uint8_t *top); 237 void ff_tm_32x32_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left, 238 const uint8_t *top); 239 240 #define VP9_8TAP_MIPS_MMI_FUNC(SIZE, type, type_idx) \ 241 void ff_put_8tap_##type##_##SIZE##h_mmi(uint8_t *dst, ptrdiff_t dststride, \ 242 const uint8_t *src, \ 243 ptrdiff_t srcstride, \ 244 int h, int mx, int my); \ 245 \ 246 void ff_put_8tap_##type##_##SIZE##v_mmi(uint8_t *dst, ptrdiff_t dststride, \ 247 const uint8_t *src, \ 248 ptrdiff_t srcstride, \ 249 int h, int mx, int my); \ 250 \ 251 void ff_put_8tap_##type##_##SIZE##hv_mmi(uint8_t *dst, ptrdiff_t dststride, \ 252 const uint8_t *src, \ 253 ptrdiff_t srcstride, \ 254 int h, int mx, int my); \ 255 \ 256 void ff_avg_8tap_##type##_##SIZE##h_mmi(uint8_t *dst, ptrdiff_t dststride, \ 257 const uint8_t *src, \ 258 ptrdiff_t srcstride, \ 259 int h, int mx, int my); \ 260 \ 261 void ff_avg_8tap_##type##_##SIZE##v_mmi(uint8_t *dst, ptrdiff_t dststride, \ 262 const uint8_t *src, \ 263 ptrdiff_t srcstride, \ 264 int h, int mx, int my); \ 265 \ 266 void ff_avg_8tap_##type##_##SIZE##hv_mmi(uint8_t *dst, ptrdiff_t dststride, \ 267 const uint8_t *src, \ 268 ptrdiff_t srcstride, \ 269 int h, int mx, int my); 270 271 VP9_8TAP_MIPS_MMI_FUNC(64, regular, FILTER_8TAP_REGULAR); 272 VP9_8TAP_MIPS_MMI_FUNC(32, regular, FILTER_8TAP_REGULAR); 273 VP9_8TAP_MIPS_MMI_FUNC(16, regular, FILTER_8TAP_REGULAR); 274 VP9_8TAP_MIPS_MMI_FUNC(8, regular, FILTER_8TAP_REGULAR); 275 VP9_8TAP_MIPS_MMI_FUNC(4, regular, FILTER_8TAP_REGULAR); 276 277 VP9_8TAP_MIPS_MMI_FUNC(64, sharp, FILTER_8TAP_SHARP); 278 VP9_8TAP_MIPS_MMI_FUNC(32, sharp, FILTER_8TAP_SHARP); 279 VP9_8TAP_MIPS_MMI_FUNC(16, sharp, FILTER_8TAP_SHARP); 280 VP9_8TAP_MIPS_MMI_FUNC(8, sharp, FILTER_8TAP_SHARP); 281 VP9_8TAP_MIPS_MMI_FUNC(4, sharp, FILTER_8TAP_SHARP); 282 283 VP9_8TAP_MIPS_MMI_FUNC(64, smooth, FILTER_8TAP_SMOOTH); 284 VP9_8TAP_MIPS_MMI_FUNC(32, smooth, FILTER_8TAP_SMOOTH); 285 VP9_8TAP_MIPS_MMI_FUNC(16, smooth, FILTER_8TAP_SMOOTH); 286 VP9_8TAP_MIPS_MMI_FUNC(8, smooth, FILTER_8TAP_SMOOTH); 287 VP9_8TAP_MIPS_MMI_FUNC(4, smooth, FILTER_8TAP_SMOOTH); 288 #undef VP9_8TAP_MIPS_MMI_FUNC 289 290 #endif // #ifndef AVCODEC_MIPS_VP9DSP_MIPS_H 291