Statistics
| Branch: | Revision:

ffmpeg / libavcodec / arm / dsputil_init_arm.c @ 0115b3ea

History | View | Annotate | Download (5.29 KB)

1 92651f67 Fabrice Bellard
/*
2 a2fc0f6a Måns Rullgård
 * ARM optimized DSP utils
3 406792e7 Diego Biurrun
 * Copyright (c) 2001 Lionel Ulmer
4 92651f67 Fabrice Bellard
 *
5 b78e7197 Diego Biurrun
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8 ff4ec49e Fabrice Bellard
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10 b78e7197 Diego Biurrun
 * version 2.1 of the License, or (at your option) any later version.
11 92651f67 Fabrice Bellard
 *
12 b78e7197 Diego Biurrun
 * FFmpeg is distributed in the hope that it will be useful,
13 92651f67 Fabrice Bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ff4ec49e Fabrice Bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16 92651f67 Fabrice Bellard
 *
17 ff4ec49e Fabrice Bellard
 * You should have received a copy of the GNU Lesser General Public
18 b78e7197 Diego Biurrun
 * License along with FFmpeg; if not, write to the Free Software
19 5509bffa Diego Biurrun
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 92651f67 Fabrice Bellard
 */
21
22 245976da Diego Biurrun
#include "libavcodec/dsputil.h"
23 84d430f8 Måns Rullgård
#include "dsputil_arm.h"
24 92651f67 Fabrice Bellard
25 2ad4c241 Måns Rullgård
void ff_j_rev_dct_arm(DCTELEM *data);
26
void ff_simple_idct_arm(DCTELEM *data);
27 92651f67 Fabrice Bellard
28 b0368839 Michael Niedermayer
/* XXX: local hack */
29
static void (*ff_put_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size);
30
static void (*ff_add_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size);
31
32 55c0e1e6 Måns Rullgård
void ff_put_pixels8_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
33
void ff_put_pixels8_x2_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
34
void ff_put_pixels8_y2_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
35
void ff_put_pixels8_xy2_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
36 6ad1fa5a Bernhard Rosenkränzer
37 55c0e1e6 Måns Rullgård
void ff_put_no_rnd_pixels8_x2_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
38
void ff_put_no_rnd_pixels8_y2_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
39
void ff_put_no_rnd_pixels8_xy2_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
40 6ad1fa5a Bernhard Rosenkränzer
41 55c0e1e6 Måns Rullgård
void ff_put_pixels16_arm(uint8_t *block, const uint8_t *pixels, int line_size, int h);
42 6ad1fa5a Bernhard Rosenkränzer
43 55c0e1e6 Måns Rullgård
CALL_2X_PIXELS(ff_put_pixels16_x2_arm,         ff_put_pixels8_x2_arm,        8)
44
CALL_2X_PIXELS(ff_put_pixels16_y2_arm,         ff_put_pixels8_y2_arm,        8)
45
CALL_2X_PIXELS(ff_put_pixels16_xy2_arm,        ff_put_pixels8_xy2_arm,       8)
46
CALL_2X_PIXELS(ff_put_no_rnd_pixels16_x2_arm,  ff_put_no_rnd_pixels8_x2_arm, 8)
47
CALL_2X_PIXELS(ff_put_no_rnd_pixels16_y2_arm,  ff_put_no_rnd_pixels8_y2_arm, 8)
48
CALL_2X_PIXELS(ff_put_no_rnd_pixels16_xy2_arm, ff_put_no_rnd_pixels8_xy2_arm,8)
49 6ad1fa5a Bernhard Rosenkränzer
50 2ad4c241 Måns Rullgård
void ff_add_pixels_clamped_arm(const DCTELEM *block, uint8_t *dest,
51 cf57bea6 Måns Rullgård
                               int line_size);
52 6ad1fa5a Bernhard Rosenkränzer
53 b0368839 Michael Niedermayer
/* XXX: those functions should be suppressed ASAP when all IDCTs are
54
   converted */
55 2ad4c241 Måns Rullgård
static void j_rev_dct_arm_put(uint8_t *dest, int line_size, DCTELEM *block)
56 b0368839 Michael Niedermayer
{
57 2ad4c241 Måns Rullgård
    ff_j_rev_dct_arm (block);
58 b0368839 Michael Niedermayer
    ff_put_pixels_clamped(block, dest, line_size);
59
}
60 2ad4c241 Måns Rullgård
static void j_rev_dct_arm_add(uint8_t *dest, int line_size, DCTELEM *block)
61 b0368839 Michael Niedermayer
{
62 2ad4c241 Måns Rullgård
    ff_j_rev_dct_arm (block);
63 b0368839 Michael Niedermayer
    ff_add_pixels_clamped(block, dest, line_size);
64
}
65 2ad4c241 Måns Rullgård
static void simple_idct_arm_put(uint8_t *dest, int line_size, DCTELEM *block)
66 bd7d1ea7 Alex Beregszaszi
{
67 2ad4c241 Måns Rullgård
    ff_simple_idct_arm (block);
68 bd7d1ea7 Alex Beregszaszi
    ff_put_pixels_clamped(block, dest, line_size);
69
}
70 2ad4c241 Måns Rullgård
static void simple_idct_arm_add(uint8_t *dest, int line_size, DCTELEM *block)
71 bd7d1ea7 Alex Beregszaszi
{
72 2ad4c241 Måns Rullgård
    ff_simple_idct_arm (block);
73 bd7d1ea7 Alex Beregszaszi
    ff_add_pixels_clamped(block, dest, line_size);
74
}
75 f07e8487 Måns Rullgård
76 37dcd091 Matthieu Castet
int mm_support(void)
77
{
78 49fb20cb Aurelien Jacobs
    return HAVE_IWMMXT * FF_MM_IWMMXT;
79 37dcd091 Matthieu Castet
}
80
81 a2fc0f6a Måns Rullgård
void dsputil_init_arm(DSPContext* c, AVCodecContext *avctx)
82 92651f67 Fabrice Bellard
{
83 b0368839 Michael Niedermayer
    ff_put_pixels_clamped = c->put_pixels_clamped;
84
    ff_add_pixels_clamped = c->add_pixels_clamped;
85
86 9abcc9a6 Måns Rullgård
    if (!avctx->lowres) {
87 84d430f8 Måns Rullgård
        if(avctx->idct_algo == FF_IDCT_AUTO ||
88
           avctx->idct_algo == FF_IDCT_ARM){
89 2ad4c241 Måns Rullgård
            c->idct_put              = j_rev_dct_arm_put;
90
            c->idct_add              = j_rev_dct_arm_add;
91
            c->idct                  = ff_j_rev_dct_arm;
92 9abcc9a6 Måns Rullgård
            c->idct_permutation_type = FF_LIBMPEG2_IDCT_PERM;
93
        } else if (avctx->idct_algo == FF_IDCT_SIMPLEARM){
94 2ad4c241 Måns Rullgård
            c->idct_put              = simple_idct_arm_put;
95
            c->idct_add              = simple_idct_arm_add;
96
            c->idct                  = ff_simple_idct_arm;
97 9abcc9a6 Måns Rullgård
            c->idct_permutation_type = FF_NO_IDCT_PERM;
98 d761f089 Guillaume Poirier
        }
99 13686bc2 Siarhei Siamashka
    }
100 6ad1fa5a Bernhard Rosenkränzer
101 2ad4c241 Måns Rullgård
    c->add_pixels_clamped = ff_add_pixels_clamped_arm;
102 cf57bea6 Måns Rullgård
103 55c0e1e6 Måns Rullgård
    c->put_pixels_tab[0][0] = ff_put_pixels16_arm;
104
    c->put_pixels_tab[0][1] = ff_put_pixels16_x2_arm;
105
    c->put_pixels_tab[0][2] = ff_put_pixels16_y2_arm;
106
    c->put_pixels_tab[0][3] = ff_put_pixels16_xy2_arm;
107
    c->put_pixels_tab[1][0] = ff_put_pixels8_arm;
108
    c->put_pixels_tab[1][1] = ff_put_pixels8_x2_arm;
109
    c->put_pixels_tab[1][2] = ff_put_pixels8_y2_arm;
110
    c->put_pixels_tab[1][3] = ff_put_pixels8_xy2_arm;
111 9abcc9a6 Måns Rullgård
112 55c0e1e6 Måns Rullgård
    c->put_no_rnd_pixels_tab[0][0] = ff_put_pixels16_arm;
113
    c->put_no_rnd_pixels_tab[0][1] = ff_put_no_rnd_pixels16_x2_arm;
114
    c->put_no_rnd_pixels_tab[0][2] = ff_put_no_rnd_pixels16_y2_arm;
115
    c->put_no_rnd_pixels_tab[0][3] = ff_put_no_rnd_pixels16_xy2_arm;
116
    c->put_no_rnd_pixels_tab[1][0] = ff_put_pixels8_arm;
117
    c->put_no_rnd_pixels_tab[1][1] = ff_put_no_rnd_pixels8_x2_arm;
118
    c->put_no_rnd_pixels_tab[1][2] = ff_put_no_rnd_pixels8_y2_arm;
119
    c->put_no_rnd_pixels_tab[1][3] = ff_put_no_rnd_pixels8_xy2_arm;
120 6ad1fa5a Bernhard Rosenkränzer
121 84d430f8 Måns Rullgård
    if (HAVE_ARMV5TE) ff_dsputil_init_armv5te(c, avctx);
122
    if (HAVE_ARMV6)   ff_dsputil_init_armv6(c, avctx);
123 55c0e1e6 Måns Rullgård
    if (HAVE_IWMMXT)  ff_dsputil_init_iwmmxt(c, avctx);
124 f67e0b82 Måns Rullgård
    if (HAVE_ARMVFP)  ff_dsputil_init_vfp(c, avctx);
125
    if (HAVE_NEON)    ff_dsputil_init_neon(c, avctx);
126 92651f67 Fabrice Bellard
}