Statistics
| Branch: | Revision:

ffmpeg / libavcodec / armv4l / dsputil_arm.c @ 569f5a75

History | View | Annotate | Download (7.28 KB)

1
/*
2
 * ARMv4L optimized DSP utils
3
 * Copyright (c) 2001 Lionel Ulmer.
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

    
22
#include "libavcodec/dsputil.h"
23
#ifdef HAVE_IPP
24
#include <ipp.h>
25
#endif
26

    
27
void dsputil_init_iwmmxt(DSPContext* c, AVCodecContext *avctx);
28
void ff_float_init_arm_vfp(DSPContext* c, AVCodecContext *avctx);
29
void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx);
30

    
31
void j_rev_dct_ARM(DCTELEM *data);
32
void simple_idct_ARM(DCTELEM *data);
33

    
34
void simple_idct_armv5te(DCTELEM *data);
35
void simple_idct_put_armv5te(uint8_t *dest, int line_size, DCTELEM *data);
36
void simple_idct_add_armv5te(uint8_t *dest, int line_size, DCTELEM *data);
37

    
38
void ff_simple_idct_armv6(DCTELEM *data);
39
void ff_simple_idct_put_armv6(uint8_t *dest, int line_size, DCTELEM *data);
40
void ff_simple_idct_add_armv6(uint8_t *dest, int line_size, DCTELEM *data);
41

    
42
/* XXX: local hack */
43
static void (*ff_put_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size);
44
static void (*ff_add_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size);
45

    
46
void put_pixels8_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
47
void put_pixels8_x2_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
48
void put_pixels8_y2_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
49
void put_pixels8_xy2_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
50

    
51
void put_no_rnd_pixels8_x2_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
52
void put_no_rnd_pixels8_y2_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
53
void put_no_rnd_pixels8_xy2_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
54

    
55
void put_pixels16_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
56

    
57
void ff_prefetch_arm(void *mem, int stride, int h);
58

    
59
CALL_2X_PIXELS(put_pixels16_x2_arm , put_pixels8_x2_arm , 8)
60
CALL_2X_PIXELS(put_pixels16_y2_arm , put_pixels8_y2_arm , 8)
61
CALL_2X_PIXELS(put_pixels16_xy2_arm, put_pixels8_xy2_arm, 8)
62
CALL_2X_PIXELS(put_no_rnd_pixels16_x2_arm , put_no_rnd_pixels8_x2_arm , 8)
63
CALL_2X_PIXELS(put_no_rnd_pixels16_y2_arm , put_no_rnd_pixels8_y2_arm , 8)
64
CALL_2X_PIXELS(put_no_rnd_pixels16_xy2_arm, put_no_rnd_pixels8_xy2_arm, 8)
65

    
66
void ff_add_pixels_clamped_ARM(short *block, unsigned char *dest,
67
                                      int line_size);
68

    
69
/* XXX: those functions should be suppressed ASAP when all IDCTs are
70
   converted */
71
static void j_rev_dct_ARM_put(uint8_t *dest, int line_size, DCTELEM *block)
72
{
73
    j_rev_dct_ARM (block);
74
    ff_put_pixels_clamped(block, dest, line_size);
75
}
76
static void j_rev_dct_ARM_add(uint8_t *dest, int line_size, DCTELEM *block)
77
{
78
    j_rev_dct_ARM (block);
79
    ff_add_pixels_clamped(block, dest, line_size);
80
}
81
static void simple_idct_ARM_put(uint8_t *dest, int line_size, DCTELEM *block)
82
{
83
    simple_idct_ARM (block);
84
    ff_put_pixels_clamped(block, dest, line_size);
85
}
86
static void simple_idct_ARM_add(uint8_t *dest, int line_size, DCTELEM *block)
87
{
88
    simple_idct_ARM (block);
89
    ff_add_pixels_clamped(block, dest, line_size);
90
}
91

    
92
#ifdef HAVE_IPP
93
static void simple_idct_ipp(DCTELEM *block)
94
{
95
    ippiDCT8x8Inv_Video_16s_C1I(block);
96
}
97
static void simple_idct_ipp_put(uint8_t *dest, int line_size, DCTELEM *block)
98
{
99
    ippiDCT8x8Inv_Video_16s8u_C1R(block, dest, line_size);
100
}
101

    
102
void add_pixels_clamped_iwmmxt(const DCTELEM *block, uint8_t *pixels, int line_size);
103

    
104
static void simple_idct_ipp_add(uint8_t *dest, int line_size, DCTELEM *block)
105
{
106
    ippiDCT8x8Inv_Video_16s_C1I(block);
107
#ifdef HAVE_IWMMXT
108
    add_pixels_clamped_iwmmxt(block, dest, line_size);
109
#else
110
    ff_add_pixels_clamped_ARM(block, dest, line_size);
111
#endif
112
}
113
#endif
114

    
115
int mm_support(void)
116
{
117
    return ENABLE_IWMMXT * FF_MM_IWMMXT;
118
}
119

    
120
void dsputil_init_armv4l(DSPContext* c, AVCodecContext *avctx)
121
{
122
    int idct_algo= avctx->idct_algo;
123

    
124
    ff_put_pixels_clamped = c->put_pixels_clamped;
125
    ff_add_pixels_clamped = c->add_pixels_clamped;
126

    
127
    if (avctx->lowres == 0) {
128
        if(idct_algo == FF_IDCT_AUTO){
129
#if defined(HAVE_IPP)
130
            idct_algo = FF_IDCT_IPP;
131
#elif defined(HAVE_ARMV6)
132
            idct_algo = FF_IDCT_SIMPLEARMV6;
133
#elif defined(HAVE_ARMV5TE)
134
            idct_algo = FF_IDCT_SIMPLEARMV5TE;
135
#else
136
            idct_algo = FF_IDCT_ARM;
137
#endif
138
        }
139

    
140
        if(idct_algo==FF_IDCT_ARM){
141
            c->idct_put= j_rev_dct_ARM_put;
142
            c->idct_add= j_rev_dct_ARM_add;
143
            c->idct    = j_rev_dct_ARM;
144
            c->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM;
145
        } else if (idct_algo==FF_IDCT_SIMPLEARM){
146
            c->idct_put= simple_idct_ARM_put;
147
            c->idct_add= simple_idct_ARM_add;
148
            c->idct    = simple_idct_ARM;
149
            c->idct_permutation_type= FF_NO_IDCT_PERM;
150
#ifdef HAVE_ARMV6
151
        } else if (idct_algo==FF_IDCT_SIMPLEARMV6){
152
            c->idct_put= ff_simple_idct_put_armv6;
153
            c->idct_add= ff_simple_idct_add_armv6;
154
            c->idct    = ff_simple_idct_armv6;
155
            c->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM;
156
#endif
157
#ifdef HAVE_ARMV5TE
158
        } else if (idct_algo==FF_IDCT_SIMPLEARMV5TE){
159
            c->idct_put= simple_idct_put_armv5te;
160
            c->idct_add= simple_idct_add_armv5te;
161
            c->idct    = simple_idct_armv5te;
162
            c->idct_permutation_type = FF_NO_IDCT_PERM;
163
#endif
164
#ifdef HAVE_IPP
165
        } else if (idct_algo==FF_IDCT_IPP){
166
            c->idct_put= simple_idct_ipp_put;
167
            c->idct_add= simple_idct_ipp_add;
168
            c->idct    = simple_idct_ipp;
169
            c->idct_permutation_type= FF_NO_IDCT_PERM;
170
#endif
171
        }
172
    }
173

    
174
    c->put_pixels_tab[0][0] = put_pixels16_arm;
175
    c->put_pixels_tab[0][1] = put_pixels16_x2_arm;
176
    c->put_pixels_tab[0][2] = put_pixels16_y2_arm;
177
    c->put_pixels_tab[0][3] = put_pixels16_xy2_arm;
178
    c->put_no_rnd_pixels_tab[0][0] = put_pixels16_arm;
179
    c->put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_arm;
180
    c->put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_arm;
181
    c->put_no_rnd_pixels_tab[0][3] = put_no_rnd_pixels16_xy2_arm;
182
    c->put_pixels_tab[1][0] = put_pixels8_arm;
183
    c->put_pixels_tab[1][1] = put_pixels8_x2_arm;
184
    c->put_pixels_tab[1][2] = put_pixels8_y2_arm;
185
    c->put_pixels_tab[1][3] = put_pixels8_xy2_arm;
186
    c->put_no_rnd_pixels_tab[1][0] = put_pixels8_arm;
187
    c->put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_arm;
188
    c->put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_arm;
189
    c->put_no_rnd_pixels_tab[1][3] = put_no_rnd_pixels8_xy2_arm;
190

    
191
#ifdef HAVE_ARMV5TE
192
    c->prefetch = ff_prefetch_arm;
193
#endif
194

    
195
#ifdef HAVE_IWMMXT
196
    dsputil_init_iwmmxt(c, avctx);
197
#endif
198
#ifdef HAVE_ARMVFP
199
    ff_float_init_arm_vfp(c, avctx);
200
#endif
201
#ifdef HAVE_NEON
202
    ff_dsputil_init_neon(c, avctx);
203
#endif
204
}