Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6147 serge 1
/*
2
 * Copyright (c) 2014 James Almer
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 "libavcodec/flacdsp.h"
22
#include "libavutil/x86/cpu.h"
23
#include "config.h"
24
 
25
void ff_flac_lpc_32_sse4(int32_t *samples, const int coeffs[32], int order,
26
                         int qlevel, int len);
27
void ff_flac_lpc_32_xop(int32_t *samples, const int coeffs[32], int order,
28
                        int qlevel, int len);
29
 
30
void ff_flac_enc_lpc_16_sse4(int32_t *, const int32_t *, int, int, const int32_t *,int);
31
 
32
#define DECORRELATE_FUNCS(fmt, opt)                                                      \
33
void ff_flac_decorrelate_ls_##fmt##_##opt(uint8_t **out, int32_t **in, int channels,     \
34
                                          int len, int shift);                           \
35
void ff_flac_decorrelate_rs_##fmt##_##opt(uint8_t **out, int32_t **in, int channels,     \
36
                                          int len, int shift);                           \
37
void ff_flac_decorrelate_ms_##fmt##_##opt(uint8_t **out, int32_t **in, int channels,     \
38
                                          int len, int shift);                           \
39
void ff_flac_decorrelate_indep2_##fmt##_##opt(uint8_t **out, int32_t **in, int channels, \
40
                                             int len, int shift);                        \
41
void ff_flac_decorrelate_indep4_##fmt##_##opt(uint8_t **out, int32_t **in, int channels, \
42
                                              int len, int shift);                       \
43
void ff_flac_decorrelate_indep6_##fmt##_##opt(uint8_t **out, int32_t **in, int channels, \
44
                                              int len, int shift);                       \
45
void ff_flac_decorrelate_indep8_##fmt##_##opt(uint8_t **out, int32_t **in, int channels, \
46
                                              int len, int shift)
47
 
48
DECORRELATE_FUNCS(16, sse2);
49
DECORRELATE_FUNCS(16,  avx);
50
DECORRELATE_FUNCS(32, sse2);
51
DECORRELATE_FUNCS(32,  avx);
52
 
53
av_cold void ff_flacdsp_init_x86(FLACDSPContext *c, enum AVSampleFormat fmt, int channels,
54
                                 int bps)
55
{
56
#if HAVE_YASM
57
    int cpu_flags = av_get_cpu_flags();
58
 
59
#if CONFIG_FLAC_DECODER
60
    if (EXTERNAL_SSE2(cpu_flags)) {
61
        if (fmt == AV_SAMPLE_FMT_S16) {
62
            if (channels == 2)
63
                c->decorrelate[0] = ff_flac_decorrelate_indep2_16_sse2;
64
            else if (channels == 4)
65
                c->decorrelate[0] = ff_flac_decorrelate_indep4_16_sse2;
66
            else if (channels == 6)
67
                c->decorrelate[0] = ff_flac_decorrelate_indep6_16_sse2;
68
            else if (ARCH_X86_64 && channels == 8)
69
                c->decorrelate[0] = ff_flac_decorrelate_indep8_16_sse2;
70
            c->decorrelate[1] = ff_flac_decorrelate_ls_16_sse2;
71
            c->decorrelate[2] = ff_flac_decorrelate_rs_16_sse2;
72
            c->decorrelate[3] = ff_flac_decorrelate_ms_16_sse2;
73
        } else if (fmt == AV_SAMPLE_FMT_S32) {
74
            if (channels == 2)
75
                c->decorrelate[0] = ff_flac_decorrelate_indep2_32_sse2;
76
            else if (channels == 4)
77
                c->decorrelate[0] = ff_flac_decorrelate_indep4_32_sse2;
78
            else if (channels == 6)
79
                c->decorrelate[0] = ff_flac_decorrelate_indep6_32_sse2;
80
            else if (ARCH_X86_64 && channels == 8)
81
                c->decorrelate[0] = ff_flac_decorrelate_indep8_32_sse2;
82
            c->decorrelate[1] = ff_flac_decorrelate_ls_32_sse2;
83
            c->decorrelate[2] = ff_flac_decorrelate_rs_32_sse2;
84
            c->decorrelate[3] = ff_flac_decorrelate_ms_32_sse2;
85
        }
86
    }
87
    if (EXTERNAL_SSE4(cpu_flags)) {
88
        c->lpc32 = ff_flac_lpc_32_sse4;
89
    }
90
    if (EXTERNAL_AVX(cpu_flags)) {
91
        if (fmt == AV_SAMPLE_FMT_S16) {
92
            if (ARCH_X86_64 && channels == 8)
93
                c->decorrelate[0] = ff_flac_decorrelate_indep8_16_avx;
94
        } else if (fmt == AV_SAMPLE_FMT_S32) {
95
            if (channels == 4)
96
                c->decorrelate[0] = ff_flac_decorrelate_indep4_32_avx;
97
            else if (channels == 6)
98
                c->decorrelate[0] = ff_flac_decorrelate_indep6_32_avx;
99
            else if (ARCH_X86_64 && channels == 8)
100
                c->decorrelate[0] = ff_flac_decorrelate_indep8_32_avx;
101
        }
102
    }
103
    if (EXTERNAL_XOP(cpu_flags)) {
104
        c->lpc32 = ff_flac_lpc_32_xop;
105
    }
106
#endif
107
 
108
#if CONFIG_FLAC_ENCODER
109
    if (EXTERNAL_SSE4(cpu_flags)) {
110
        if (CONFIG_GPL)
111
            c->lpc16_encode = ff_flac_enc_lpc_16_sse4;
112
    }
113
#endif
114
#endif /* HAVE_YASM */
115
}