Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6148 serge 1
/*
2
 * Copyright (c) 2006 Luca Barbato 
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 "config.h"
22
#if HAVE_ALTIVEC_H
23
#include 
24
#endif
25
#include "libavutil/attributes.h"
26
#include "libavutil/cpu.h"
27
#include "libavcodec/vorbisdsp.h"
28
 
29
#if HAVE_ALTIVEC
30
static void vorbis_inverse_coupling_altivec(float *mag, float *ang,
31
                                            intptr_t blocksize)
32
{
33
    int i;
34
    vector float m, a;
35
    vector bool int t0, t1;
36
    const vector unsigned int v_31 = //XXX
37
        vec_add(vec_add(vec_splat_u32(15),vec_splat_u32(15)),vec_splat_u32(1));
38
    for (i = 0; i < blocksize; i += 4) {
39
        m = vec_ld(0, mag+i);
40
        a = vec_ld(0, ang+i);
41
        t0 = vec_cmple(m, (vector float)vec_splat_u32(0));
42
        t1 = vec_cmple(a, (vector float)vec_splat_u32(0));
43
        a = vec_xor(a, (vector float) vec_sl((vector unsigned int)t0, v_31));
44
        t0 = (vector bool int)vec_and(a, t1);
45
        t1 = (vector bool int)vec_andc(a, t1);
46
        a = vec_sub(m, (vector float)t1);
47
        m = vec_add(m, (vector float)t0);
48
        vec_stl(a, 0, ang+i);
49
        vec_stl(m, 0, mag+i);
50
    }
51
}
52
#endif /* HAVE_ALTIVEC */
53
 
54
av_cold void ff_vorbisdsp_init_ppc(VorbisDSPContext *c)
55
{
56
#if HAVE_ALTIVEC
57
    if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
58
        return;
59
 
60
    c->vorbis_inverse_coupling = vorbis_inverse_coupling_altivec;
61
#endif /* HAVE_ALTIVEC */
62
}