1/*
2 * Copyright (c) 2015 Parag Salasakar (Parag.Salasakar@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#include "libavutil/mips/cpu.h"
22#include "qpeldsp_mips.h"
23
24void ff_qpeldsp_init_mips(QpelDSPContext *c)
25{
26    int cpu_flags = av_get_cpu_flags();
27
28    if (have_msa(cpu_flags)) {
29        c->put_qpel_pixels_tab[0][0] = ff_copy_16x16_msa;
30        c->put_qpel_pixels_tab[0][1] = ff_horiz_mc_qpel_aver_src0_16width_msa;
31        c->put_qpel_pixels_tab[0][2] = ff_horiz_mc_qpel_16width_msa;
32        c->put_qpel_pixels_tab[0][3] = ff_horiz_mc_qpel_aver_src1_16width_msa;
33        c->put_qpel_pixels_tab[0][4] = ff_vert_mc_qpel_aver_src0_16x16_msa;
34        c->put_qpel_pixels_tab[0][5] = ff_hv_mc_qpel_aver_hv_src00_16x16_msa;
35        c->put_qpel_pixels_tab[0][6] = ff_hv_mc_qpel_aver_v_src0_16x16_msa;
36        c->put_qpel_pixels_tab[0][7] = ff_hv_mc_qpel_aver_hv_src10_16x16_msa;
37        c->put_qpel_pixels_tab[0][8] = ff_vert_mc_qpel_16x16_msa;
38        c->put_qpel_pixels_tab[0][9] = ff_hv_mc_qpel_aver_h_src0_16x16_msa;
39        c->put_qpel_pixels_tab[0][10] = ff_hv_mc_qpel_16x16_msa;
40        c->put_qpel_pixels_tab[0][11] = ff_hv_mc_qpel_aver_h_src1_16x16_msa;
41        c->put_qpel_pixels_tab[0][12] = ff_vert_mc_qpel_aver_src1_16x16_msa;
42        c->put_qpel_pixels_tab[0][13] = ff_hv_mc_qpel_aver_hv_src01_16x16_msa;
43        c->put_qpel_pixels_tab[0][14] = ff_hv_mc_qpel_aver_v_src1_16x16_msa;
44        c->put_qpel_pixels_tab[0][15] = ff_hv_mc_qpel_aver_hv_src11_16x16_msa;
45
46        c->put_qpel_pixels_tab[1][0] = ff_copy_8x8_msa;
47        c->put_qpel_pixels_tab[1][1] = ff_horiz_mc_qpel_aver_src0_8width_msa;
48        c->put_qpel_pixels_tab[1][2] = ff_horiz_mc_qpel_8width_msa;
49        c->put_qpel_pixels_tab[1][3] = ff_horiz_mc_qpel_aver_src1_8width_msa;
50        c->put_qpel_pixels_tab[1][4] = ff_vert_mc_qpel_aver_src0_8x8_msa;
51        c->put_qpel_pixels_tab[1][5] = ff_hv_mc_qpel_aver_hv_src00_8x8_msa;
52        c->put_qpel_pixels_tab[1][6] = ff_hv_mc_qpel_aver_v_src0_8x8_msa;
53        c->put_qpel_pixels_tab[1][7] = ff_hv_mc_qpel_aver_hv_src10_8x8_msa;
54        c->put_qpel_pixels_tab[1][8] = ff_vert_mc_qpel_8x8_msa;
55        c->put_qpel_pixels_tab[1][9] = ff_hv_mc_qpel_aver_h_src0_8x8_msa;
56        c->put_qpel_pixels_tab[1][10] = ff_hv_mc_qpel_8x8_msa;
57        c->put_qpel_pixels_tab[1][11] = ff_hv_mc_qpel_aver_h_src1_8x8_msa;
58        c->put_qpel_pixels_tab[1][12] = ff_vert_mc_qpel_aver_src1_8x8_msa;
59        c->put_qpel_pixels_tab[1][13] = ff_hv_mc_qpel_aver_hv_src01_8x8_msa;
60        c->put_qpel_pixels_tab[1][14] = ff_hv_mc_qpel_aver_v_src1_8x8_msa;
61        c->put_qpel_pixels_tab[1][15] = ff_hv_mc_qpel_aver_hv_src11_8x8_msa;
62
63        c->put_no_rnd_qpel_pixels_tab[0][0] = ff_copy_16x16_msa;
64        c->put_no_rnd_qpel_pixels_tab[0][1] =
65            ff_horiz_mc_qpel_no_rnd_aver_src0_16width_msa;
66        c->put_no_rnd_qpel_pixels_tab[0][2] = ff_horiz_mc_qpel_no_rnd_16width_msa;
67        c->put_no_rnd_qpel_pixels_tab[0][3] =
68            ff_horiz_mc_qpel_no_rnd_aver_src1_16width_msa;
69        c->put_no_rnd_qpel_pixels_tab[0][4] =
70            ff_vert_mc_qpel_no_rnd_aver_src0_16x16_msa;
71        c->put_no_rnd_qpel_pixels_tab[0][5] =
72            ff_hv_mc_qpel_no_rnd_aver_hv_src00_16x16_msa;
73        c->put_no_rnd_qpel_pixels_tab[0][6] =
74            ff_hv_mc_qpel_no_rnd_aver_v_src0_16x16_msa;
75        c->put_no_rnd_qpel_pixels_tab[0][7] =
76            ff_hv_mc_qpel_no_rnd_aver_hv_src10_16x16_msa;
77        c->put_no_rnd_qpel_pixels_tab[0][8] = ff_vert_mc_qpel_no_rnd_16x16_msa;
78        c->put_no_rnd_qpel_pixels_tab[0][9] =
79            ff_hv_mc_qpel_no_rnd_aver_h_src0_16x16_msa;
80        c->put_no_rnd_qpel_pixels_tab[0][10] = ff_hv_mc_qpel_no_rnd_16x16_msa;
81        c->put_no_rnd_qpel_pixels_tab[0][11] =
82            ff_hv_mc_qpel_no_rnd_aver_h_src1_16x16_msa;
83        c->put_no_rnd_qpel_pixels_tab[0][12] =
84            ff_vert_mc_qpel_no_rnd_aver_src1_16x16_msa;
85        c->put_no_rnd_qpel_pixels_tab[0][13] =
86            ff_hv_mc_qpel_no_rnd_aver_hv_src01_16x16_msa;
87        c->put_no_rnd_qpel_pixels_tab[0][14] =
88            ff_hv_mc_qpel_no_rnd_aver_v_src1_16x16_msa;
89        c->put_no_rnd_qpel_pixels_tab[0][15] =
90            ff_hv_mc_qpel_no_rnd_aver_hv_src11_16x16_msa;
91
92        c->put_no_rnd_qpel_pixels_tab[1][0] = ff_copy_8x8_msa;
93        c->put_no_rnd_qpel_pixels_tab[1][1] =
94            ff_horiz_mc_qpel_no_rnd_aver_src0_8width_msa;
95        c->put_no_rnd_qpel_pixels_tab[1][2] = ff_horiz_mc_qpel_no_rnd_8width_msa;
96        c->put_no_rnd_qpel_pixels_tab[1][3] =
97            ff_horiz_mc_qpel_no_rnd_aver_src1_8width_msa;
98        c->put_no_rnd_qpel_pixels_tab[1][4] =
99            ff_vert_mc_qpel_no_rnd_aver_src0_8x8_msa;
100        c->put_no_rnd_qpel_pixels_tab[1][5] =
101            ff_hv_mc_qpel_no_rnd_aver_hv_src00_8x8_msa;
102        c->put_no_rnd_qpel_pixels_tab[1][6] =
103            ff_hv_mc_qpel_no_rnd_aver_v_src0_8x8_msa;
104        c->put_no_rnd_qpel_pixels_tab[1][7] =
105            ff_hv_mc_qpel_no_rnd_aver_hv_src10_8x8_msa;
106        c->put_no_rnd_qpel_pixels_tab[1][8] = ff_vert_mc_qpel_no_rnd_8x8_msa;
107        c->put_no_rnd_qpel_pixels_tab[1][9] =
108            ff_hv_mc_qpel_no_rnd_aver_h_src0_8x8_msa;
109        c->put_no_rnd_qpel_pixels_tab[1][10] = ff_hv_mc_qpel_no_rnd_8x8_msa;
110        c->put_no_rnd_qpel_pixels_tab[1][11] =
111            ff_hv_mc_qpel_no_rnd_aver_h_src1_8x8_msa;
112        c->put_no_rnd_qpel_pixels_tab[1][12] =
113            ff_vert_mc_qpel_no_rnd_aver_src1_8x8_msa;
114        c->put_no_rnd_qpel_pixels_tab[1][13] =
115            ff_hv_mc_qpel_no_rnd_aver_hv_src01_8x8_msa;
116        c->put_no_rnd_qpel_pixels_tab[1][14] =
117            ff_hv_mc_qpel_no_rnd_aver_v_src1_8x8_msa;
118        c->put_no_rnd_qpel_pixels_tab[1][15] =
119            ff_hv_mc_qpel_no_rnd_aver_hv_src11_8x8_msa;
120
121        c->avg_qpel_pixels_tab[0][0] = ff_avg_width16_msa;
122        c->avg_qpel_pixels_tab[0][1] =
123            ff_horiz_mc_qpel_avg_dst_aver_src0_16width_msa;
124        c->avg_qpel_pixels_tab[0][2] = ff_horiz_mc_qpel_avg_dst_16width_msa;
125        c->avg_qpel_pixels_tab[0][3] =
126            ff_horiz_mc_qpel_avg_dst_aver_src1_16width_msa;
127        c->avg_qpel_pixels_tab[0][4] = ff_vert_mc_qpel_avg_dst_aver_src0_16x16_msa;
128        c->avg_qpel_pixels_tab[0][5] =
129            ff_hv_mc_qpel_avg_dst_aver_hv_src00_16x16_msa;
130        c->avg_qpel_pixels_tab[0][6] = ff_hv_mc_qpel_avg_dst_aver_v_src0_16x16_msa;
131        c->avg_qpel_pixels_tab[0][7] =
132            ff_hv_mc_qpel_avg_dst_aver_hv_src10_16x16_msa;
133        c->avg_qpel_pixels_tab[0][8] = ff_vert_mc_qpel_avg_dst_16x16_msa;
134        c->avg_qpel_pixels_tab[0][9] = ff_hv_mc_qpel_avg_dst_aver_h_src0_16x16_msa;
135        c->avg_qpel_pixels_tab[0][10] = ff_hv_mc_qpel_avg_dst_16x16_msa;
136        c->avg_qpel_pixels_tab[0][11] = ff_hv_mc_qpel_avg_dst_aver_h_src1_16x16_msa;
137        c->avg_qpel_pixels_tab[0][12] = ff_vert_mc_qpel_avg_dst_aver_src1_16x16_msa;
138        c->avg_qpel_pixels_tab[0][13] =
139            ff_hv_mc_qpel_avg_dst_aver_hv_src01_16x16_msa;
140        c->avg_qpel_pixels_tab[0][14] = ff_hv_mc_qpel_avg_dst_aver_v_src1_16x16_msa;
141        c->avg_qpel_pixels_tab[0][15] =
142            ff_hv_mc_qpel_avg_dst_aver_hv_src11_16x16_msa;
143
144        c->avg_qpel_pixels_tab[1][0] = ff_avg_width8_msa;
145        c->avg_qpel_pixels_tab[1][1] =
146            ff_horiz_mc_qpel_avg_dst_aver_src0_8width_msa;
147        c->avg_qpel_pixels_tab[1][2] = ff_horiz_mc_qpel_avg_dst_8width_msa;
148        c->avg_qpel_pixels_tab[1][3] =
149            ff_horiz_mc_qpel_avg_dst_aver_src1_8width_msa;
150        c->avg_qpel_pixels_tab[1][4] = ff_vert_mc_qpel_avg_dst_aver_src0_8x8_msa;
151        c->avg_qpel_pixels_tab[1][5] = ff_hv_mc_qpel_avg_dst_aver_hv_src00_8x8_msa;
152        c->avg_qpel_pixels_tab[1][6] = ff_hv_mc_qpel_avg_dst_aver_v_src0_8x8_msa;
153        c->avg_qpel_pixels_tab[1][7] = ff_hv_mc_qpel_avg_dst_aver_hv_src10_8x8_msa;
154        c->avg_qpel_pixels_tab[1][8] = ff_vert_mc_qpel_avg_dst_8x8_msa;
155        c->avg_qpel_pixels_tab[1][9] = ff_hv_mc_qpel_avg_dst_aver_h_src0_8x8_msa;
156        c->avg_qpel_pixels_tab[1][10] = ff_hv_mc_qpel_avg_dst_8x8_msa;
157        c->avg_qpel_pixels_tab[1][11] = ff_hv_mc_qpel_avg_dst_aver_h_src1_8x8_msa;
158        c->avg_qpel_pixels_tab[1][12] = ff_vert_mc_qpel_avg_dst_aver_src1_8x8_msa;
159        c->avg_qpel_pixels_tab[1][13] = ff_hv_mc_qpel_avg_dst_aver_hv_src01_8x8_msa;
160        c->avg_qpel_pixels_tab[1][14] = ff_hv_mc_qpel_avg_dst_aver_v_src1_8x8_msa;
161        c->avg_qpel_pixels_tab[1][15] = ff_hv_mc_qpel_avg_dst_aver_hv_src11_8x8_msa;
162    }
163}
164