~ubuntu-branches/ubuntu/saucy/gst-libav1.0/saucy-proposed

« back to all changes in this revision

Viewing changes to gst-libs/ext/libav/libavcodec/flacdsp.c

  • Committer: Package Import Robot
  • Author(s): Sebastian Dröge
  • Date: 2013-07-30 09:00:15 UTC
  • mfrom: (1.1.16) (7.1.7 experimental)
  • Revision ID: package-import@ubuntu.com-20130730090015-sc1ou2yssu7q5w4e
Tags: 1.1.3-1
* New upstream development snapshot:
  + debian/control:
    - Build depend on GStreamer and gst-plugins-base >= 1.1.3.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2012 Mans Rullgard <mans@mansr.com>
 
3
 *
 
4
 * This file is part of Libav.
 
5
 *
 
6
 * Libav 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
 * Libav 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 Libav; if not, write to the Free Software
 
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
19
 */
 
20
 
 
21
#include "libavutil/attributes.h"
 
22
#include "libavutil/samplefmt.h"
 
23
#include "flacdsp.h"
 
24
#include "config.h"
 
25
 
 
26
#define SAMPLE_SIZE 16
 
27
#define PLANAR 0
 
28
#include "flacdsp_template.c"
 
29
#include "flacdsp_lpc_template.c"
 
30
 
 
31
#undef  PLANAR
 
32
#define PLANAR 1
 
33
#include "flacdsp_template.c"
 
34
 
 
35
#undef  SAMPLE_SIZE
 
36
#undef  PLANAR
 
37
#define SAMPLE_SIZE 32
 
38
#define PLANAR 0
 
39
#include "flacdsp_template.c"
 
40
#include "flacdsp_lpc_template.c"
 
41
 
 
42
#undef  PLANAR
 
43
#define PLANAR 1
 
44
#include "flacdsp_template.c"
 
45
 
 
46
static void flac_lpc_16_c(int32_t *decoded, const int coeffs[32],
 
47
                          int pred_order, int qlevel, int len)
 
48
{
 
49
    int i, j;
 
50
 
 
51
    for (i = pred_order; i < len - 1; i += 2, decoded += 2) {
 
52
        int c = coeffs[0];
 
53
        int d = decoded[0];
 
54
        int s0 = 0, s1 = 0;
 
55
        for (j = 1; j < pred_order; j++) {
 
56
            s0 += c*d;
 
57
            d = decoded[j];
 
58
            s1 += c*d;
 
59
            c = coeffs[j];
 
60
        }
 
61
        s0 += c*d;
 
62
        d = decoded[j] += s0 >> qlevel;
 
63
        s1 += c*d;
 
64
        decoded[j + 1] += s1 >> qlevel;
 
65
    }
 
66
    if (i < len) {
 
67
        int sum = 0;
 
68
        for (j = 0; j < pred_order; j++)
 
69
            sum += coeffs[j] * decoded[j];
 
70
        decoded[j] += sum >> qlevel;
 
71
    }
 
72
}
 
73
 
 
74
static void flac_lpc_32_c(int32_t *decoded, const int coeffs[32],
 
75
                          int pred_order, int qlevel, int len)
 
76
{
 
77
    int i, j;
 
78
 
 
79
    for (i = pred_order; i < len; i++, decoded++) {
 
80
        int64_t sum = 0;
 
81
        for (j = 0; j < pred_order; j++)
 
82
            sum += (int64_t)coeffs[j] * decoded[j];
 
83
        decoded[j] += sum >> qlevel;
 
84
    }
 
85
 
 
86
}
 
87
 
 
88
av_cold void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt,
 
89
                             int bps)
 
90
{
 
91
    if (bps > 16) {
 
92
        c->lpc            = flac_lpc_32_c;
 
93
        c->lpc_encode     = flac_lpc_encode_c_32;
 
94
    } else {
 
95
        c->lpc            = flac_lpc_16_c;
 
96
        c->lpc_encode     = flac_lpc_encode_c_16;
 
97
    }
 
98
 
 
99
    switch (fmt) {
 
100
    case AV_SAMPLE_FMT_S32:
 
101
        c->decorrelate[0] = flac_decorrelate_indep_c_32;
 
102
        c->decorrelate[1] = flac_decorrelate_ls_c_32;
 
103
        c->decorrelate[2] = flac_decorrelate_rs_c_32;
 
104
        c->decorrelate[3] = flac_decorrelate_ms_c_32;
 
105
        break;
 
106
 
 
107
    case AV_SAMPLE_FMT_S32P:
 
108
        c->decorrelate[0] = flac_decorrelate_indep_c_32p;
 
109
        c->decorrelate[1] = flac_decorrelate_ls_c_32p;
 
110
        c->decorrelate[2] = flac_decorrelate_rs_c_32p;
 
111
        c->decorrelate[3] = flac_decorrelate_ms_c_32p;
 
112
        break;
 
113
 
 
114
    case AV_SAMPLE_FMT_S16:
 
115
        c->decorrelate[0] = flac_decorrelate_indep_c_16;
 
116
        c->decorrelate[1] = flac_decorrelate_ls_c_16;
 
117
        c->decorrelate[2] = flac_decorrelate_rs_c_16;
 
118
        c->decorrelate[3] = flac_decorrelate_ms_c_16;
 
119
        break;
 
120
 
 
121
    case AV_SAMPLE_FMT_S16P:
 
122
        c->decorrelate[0] = flac_decorrelate_indep_c_16p;
 
123
        c->decorrelate[1] = flac_decorrelate_ls_c_16p;
 
124
        c->decorrelate[2] = flac_decorrelate_rs_c_16p;
 
125
        c->decorrelate[3] = flac_decorrelate_ms_c_16p;
 
126
        break;
 
127
    }
 
128
 
 
129
    if (ARCH_ARM)
 
130
        ff_flacdsp_init_arm(c, fmt, bps);
 
131
}