~ubuntu-branches/ubuntu/vivid/ffmpeg/vivid

« back to all changes in this revision

Viewing changes to libavcodec/adx.c

  • Committer: Package Import Robot
  • Author(s): Andreas Cadhalpun
  • Date: 2014-11-05 01:18:23 UTC
  • mfrom: (0.2.17 sid)
  • Revision ID: package-import@ubuntu.com-20141105011823-xsbeceffs43wtkn7
Tags: 7:2.4.3-1
* Import new upstream bugfix release 2.4.3.
   - Refresh Change-symbol-versioning.patch.
   - Add new symbols to the libavdevice symbols file.
* Enable libbs2b on arm64, since it is now available.
* Disable frei0r and libx264 on x32, libsoxr and openal on sparc64
  and libopencv on m68k, sh4, sparc64 and x32, because they are not
  (yet) avialable there.
* Disable assembler optimizations on x32, as they wouldn't work there.
* Include config.log in the build-log, when compiling fails.
* Add fix-hppa-tests.patch to work around a gcc bug on hppa.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2011  Justin Ruggles
 
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 "libavutil/common.h"
 
22
#include "libavutil/intreadwrite.h"
 
23
#include "libavutil/mathematics.h"
 
24
#include "adx.h"
 
25
 
 
26
void ff_adx_calculate_coeffs(int cutoff, int sample_rate, int bits, int *coeff)
 
27
{
 
28
    double a, b, c;
 
29
 
 
30
    a = M_SQRT2 - cos(2.0 * M_PI * cutoff / sample_rate);
 
31
    b = M_SQRT2 - 1.0;
 
32
    c = (a - sqrt((a + b) * (a - b))) / b;
 
33
 
 
34
    coeff[0] = lrintf(c * 2.0  * (1 << bits));
 
35
    coeff[1] = lrintf(-(c * c) * (1 << bits));
 
36
}
 
37
 
 
38
int ff_adx_decode_header(AVCodecContext *avctx, const uint8_t *buf,
 
39
                         int bufsize, int *header_size, int *coeff)
 
40
{
 
41
    int offset, cutoff;
 
42
 
 
43
    if (bufsize < 24)
 
44
        return AVERROR_INVALIDDATA;
 
45
 
 
46
    if (AV_RB16(buf) != 0x8000)
 
47
        return AVERROR_INVALIDDATA;
 
48
    offset = AV_RB16(buf + 2) + 4;
 
49
 
 
50
    /* if copyright string is within the provided data, validate it */
 
51
    if (bufsize >= offset && offset >= 6 && memcmp(buf + offset - 6, "(c)CRI", 6))
 
52
        return AVERROR_INVALIDDATA;
 
53
 
 
54
    /* check for encoding=3 block_size=18, sample_size=4 */
 
55
    if (buf[4] != 3 || buf[5] != 18 || buf[6] != 4) {
 
56
        avpriv_request_sample(avctx, "Support for this ADX format");
 
57
        return AVERROR_PATCHWELCOME;
 
58
    }
 
59
 
 
60
    /* channels */
 
61
    avctx->channels = buf[7];
 
62
    if (avctx->channels <= 0 || avctx->channels > 2)
 
63
        return AVERROR_INVALIDDATA;
 
64
 
 
65
    /* sample rate */
 
66
    avctx->sample_rate = AV_RB32(buf + 8);
 
67
    if (avctx->sample_rate < 1 ||
 
68
        avctx->sample_rate > INT_MAX / (avctx->channels * BLOCK_SIZE * 8))
 
69
        return AVERROR_INVALIDDATA;
 
70
 
 
71
    /* bit rate */
 
72
    avctx->bit_rate = avctx->sample_rate * avctx->channels * BLOCK_SIZE * 8 / BLOCK_SAMPLES;
 
73
 
 
74
    /* LPC coefficients */
 
75
    if (coeff) {
 
76
        cutoff = AV_RB16(buf + 16);
 
77
        ff_adx_calculate_coeffs(cutoff, avctx->sample_rate, COEFF_BITS, coeff);
 
78
    }
 
79
 
 
80
    *header_size = offset;
 
81
    return 0;
 
82
}