Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6148 serge 1
/*
2
 * Copyright (c) 2011 Janne Grunau 
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 
22
 
23
#include "libavutil/attributes.h"
24
#include "libavcodec/avcodec.h"
25
#include "libavcodec/rv34dsp.h"
26
#include "libavutil/arm/cpu.h"
27
 
28
#define DECL_QPEL3(type, w, pos) \
29
    void ff_##type##_rv40_qpel##w##_mc##pos##_neon(uint8_t *dst, uint8_t *src,\
30
                                                   ptrdiff_t stride)
31
#define DECL_QPEL2(w, pos)                      \
32
    DECL_QPEL3(put, w, pos);                    \
33
    DECL_QPEL3(avg, w, pos)
34
 
35
#define DECL_QPEL_XY(x, y)                      \
36
    DECL_QPEL2(16, x ## y);                     \
37
    DECL_QPEL2(8,  x ## y)
38
 
39
#define DECL_QPEL_Y(y)                          \
40
    DECL_QPEL_XY(0, y);                         \
41
    DECL_QPEL_XY(1, y);                         \
42
    DECL_QPEL_XY(2, y);                         \
43
    DECL_QPEL_XY(3, y);                         \
44
 
45
DECL_QPEL_Y(0);
46
DECL_QPEL_Y(1);
47
DECL_QPEL_Y(2);
48
DECL_QPEL_Y(3);
49
 
50
void ff_put_rv40_chroma_mc8_neon(uint8_t *, uint8_t *, int, int, int, int);
51
void ff_put_rv40_chroma_mc4_neon(uint8_t *, uint8_t *, int, int, int, int);
52
 
53
void ff_avg_rv40_chroma_mc8_neon(uint8_t *, uint8_t *, int, int, int, int);
54
void ff_avg_rv40_chroma_mc4_neon(uint8_t *, uint8_t *, int, int, int, int);
55
 
56
void ff_rv40_weight_func_16_neon(uint8_t *, uint8_t *, uint8_t *, int, int, ptrdiff_t);
57
void ff_rv40_weight_func_8_neon(uint8_t *, uint8_t *, uint8_t *, int, int, ptrdiff_t);
58
 
59
int ff_rv40_h_loop_filter_strength_neon(uint8_t *src, ptrdiff_t stride,
60
                                        int beta, int beta2, int edge,
61
                                        int *p1, int *q1);
62
int ff_rv40_v_loop_filter_strength_neon(uint8_t *src, ptrdiff_t stride,
63
                                        int beta, int beta2, int edge,
64
                                        int *p1, int *q1);
65
 
66
void ff_rv40_h_weak_loop_filter_neon(uint8_t *src, ptrdiff_t stride, int filter_p1,
67
                                     int filter_q1, int alpha, int beta,
68
                                     int lim_p0q0, int lim_q1, int lim_p1);
69
void ff_rv40_v_weak_loop_filter_neon(uint8_t *src, ptrdiff_t stride, int filter_p1,
70
                                     int filter_q1, int alpha, int beta,
71
                                     int lim_p0q0, int lim_q1, int lim_p1);
72
 
73
static av_cold void rv40dsp_init_neon(RV34DSPContext *c)
74
{
75
    c->put_pixels_tab[0][ 1] = ff_put_rv40_qpel16_mc10_neon;
76
    c->put_pixels_tab[0][ 3] = ff_put_rv40_qpel16_mc30_neon;
77
    c->put_pixels_tab[0][ 4] = ff_put_rv40_qpel16_mc01_neon;
78
    c->put_pixels_tab[0][ 5] = ff_put_rv40_qpel16_mc11_neon;
79
    c->put_pixels_tab[0][ 6] = ff_put_rv40_qpel16_mc21_neon;
80
    c->put_pixels_tab[0][ 7] = ff_put_rv40_qpel16_mc31_neon;
81
    c->put_pixels_tab[0][ 9] = ff_put_rv40_qpel16_mc12_neon;
82
    c->put_pixels_tab[0][10] = ff_put_rv40_qpel16_mc22_neon;
83
    c->put_pixels_tab[0][11] = ff_put_rv40_qpel16_mc32_neon;
84
    c->put_pixels_tab[0][12] = ff_put_rv40_qpel16_mc03_neon;
85
    c->put_pixels_tab[0][13] = ff_put_rv40_qpel16_mc13_neon;
86
    c->put_pixels_tab[0][14] = ff_put_rv40_qpel16_mc23_neon;
87
    c->put_pixels_tab[0][15] = ff_put_rv40_qpel16_mc33_neon;
88
    c->avg_pixels_tab[0][ 1] = ff_avg_rv40_qpel16_mc10_neon;
89
    c->avg_pixels_tab[0][ 3] = ff_avg_rv40_qpel16_mc30_neon;
90
    c->avg_pixels_tab[0][ 4] = ff_avg_rv40_qpel16_mc01_neon;
91
    c->avg_pixels_tab[0][ 5] = ff_avg_rv40_qpel16_mc11_neon;
92
    c->avg_pixels_tab[0][ 6] = ff_avg_rv40_qpel16_mc21_neon;
93
    c->avg_pixels_tab[0][ 7] = ff_avg_rv40_qpel16_mc31_neon;
94
    c->avg_pixels_tab[0][ 9] = ff_avg_rv40_qpel16_mc12_neon;
95
    c->avg_pixels_tab[0][10] = ff_avg_rv40_qpel16_mc22_neon;
96
    c->avg_pixels_tab[0][11] = ff_avg_rv40_qpel16_mc32_neon;
97
    c->avg_pixels_tab[0][12] = ff_avg_rv40_qpel16_mc03_neon;
98
    c->avg_pixels_tab[0][13] = ff_avg_rv40_qpel16_mc13_neon;
99
    c->avg_pixels_tab[0][14] = ff_avg_rv40_qpel16_mc23_neon;
100
    c->avg_pixels_tab[0][15] = ff_avg_rv40_qpel16_mc33_neon;
101
    c->put_pixels_tab[1][ 1] = ff_put_rv40_qpel8_mc10_neon;
102
    c->put_pixels_tab[1][ 3] = ff_put_rv40_qpel8_mc30_neon;
103
    c->put_pixels_tab[1][ 4] = ff_put_rv40_qpel8_mc01_neon;
104
    c->put_pixels_tab[1][ 5] = ff_put_rv40_qpel8_mc11_neon;
105
    c->put_pixels_tab[1][ 6] = ff_put_rv40_qpel8_mc21_neon;
106
    c->put_pixels_tab[1][ 7] = ff_put_rv40_qpel8_mc31_neon;
107
    c->put_pixels_tab[1][ 9] = ff_put_rv40_qpel8_mc12_neon;
108
    c->put_pixels_tab[1][10] = ff_put_rv40_qpel8_mc22_neon;
109
    c->put_pixels_tab[1][11] = ff_put_rv40_qpel8_mc32_neon;
110
    c->put_pixels_tab[1][12] = ff_put_rv40_qpel8_mc03_neon;
111
    c->put_pixels_tab[1][13] = ff_put_rv40_qpel8_mc13_neon;
112
    c->put_pixels_tab[1][14] = ff_put_rv40_qpel8_mc23_neon;
113
    c->put_pixels_tab[1][15] = ff_put_rv40_qpel8_mc33_neon;
114
    c->avg_pixels_tab[1][ 1] = ff_avg_rv40_qpel8_mc10_neon;
115
    c->avg_pixels_tab[1][ 3] = ff_avg_rv40_qpel8_mc30_neon;
116
    c->avg_pixels_tab[1][ 4] = ff_avg_rv40_qpel8_mc01_neon;
117
    c->avg_pixels_tab[1][ 5] = ff_avg_rv40_qpel8_mc11_neon;
118
    c->avg_pixels_tab[1][ 6] = ff_avg_rv40_qpel8_mc21_neon;
119
    c->avg_pixels_tab[1][ 7] = ff_avg_rv40_qpel8_mc31_neon;
120
    c->avg_pixels_tab[1][ 9] = ff_avg_rv40_qpel8_mc12_neon;
121
    c->avg_pixels_tab[1][10] = ff_avg_rv40_qpel8_mc22_neon;
122
    c->avg_pixels_tab[1][11] = ff_avg_rv40_qpel8_mc32_neon;
123
    c->avg_pixels_tab[1][12] = ff_avg_rv40_qpel8_mc03_neon;
124
    c->avg_pixels_tab[1][13] = ff_avg_rv40_qpel8_mc13_neon;
125
    c->avg_pixels_tab[1][14] = ff_avg_rv40_qpel8_mc23_neon;
126
    c->avg_pixels_tab[1][15] = ff_avg_rv40_qpel8_mc33_neon;
127
 
128
    c->put_chroma_pixels_tab[0] = ff_put_rv40_chroma_mc8_neon;
129
    c->put_chroma_pixels_tab[1] = ff_put_rv40_chroma_mc4_neon;
130
    c->avg_chroma_pixels_tab[0] = ff_avg_rv40_chroma_mc8_neon;
131
    c->avg_chroma_pixels_tab[1] = ff_avg_rv40_chroma_mc4_neon;
132
 
133
    c->rv40_weight_pixels_tab[0][0] = ff_rv40_weight_func_16_neon;
134
    c->rv40_weight_pixels_tab[0][1] = ff_rv40_weight_func_8_neon;
135
 
136
    c->rv40_loop_filter_strength[0] = ff_rv40_h_loop_filter_strength_neon;
137
    c->rv40_loop_filter_strength[1] = ff_rv40_v_loop_filter_strength_neon;
138
    c->rv40_weak_loop_filter[0]     = ff_rv40_h_weak_loop_filter_neon;
139
    c->rv40_weak_loop_filter[1]     = ff_rv40_v_weak_loop_filter_neon;
140
}
141
 
142
av_cold void ff_rv40dsp_init_arm(RV34DSPContext *c)
143
{
144
    int cpu_flags = av_get_cpu_flags();
145
 
146
    if (have_neon(cpu_flags))
147
        rv40dsp_init_neon(c);
148
}