~medibuntu-maintainers/mplayer/medibuntu.precise

« back to all changes in this revision

Viewing changes to ffmpeg/libavcodec/g722dec.c

  • Committer: Gauvain Pocentek
  • Date: 2012-03-06 11:59:12 UTC
  • mfrom: (66.1.15 precise)
  • Revision ID: gauvain@pocentek.net-20120306115912-h9d6kt9j0l532oo5
* Merge from Ubuntu:
  - put back faac support
  - recommends apport-hooks-medibuntu
  - change Maintainer, Uploaders & Vcs-* fields.
* New upstream snapshot
* upload to unstable
* Build against external libmpeg2
* drop 51_FTBFS_arm.patch again
* no longer build depend on libcdparanoia-dev on the Hurd
* Fix FTBFS on the hurd.
  Thanks to Samuel Thibault <sthibault@debian.org> (Closes: #654974)
* Fix FTBFS on arm
* New upstream snapshot, Closes: #650339, #643621, #481807
* Imported Upstream version 1.0~rc4+svn34492
* Bump standards version
* Bump dependency on libav >= 4:0.8~, Closes: #653887
* Fix build-indep
* Build mplayer-gui again, Closes: #568514
* Drop debian/all-lang-config-mak.sh, no longer needed
* include .dfsg1 in version number
* remove get-orig-source target
* no longer prune compiler flags from the environment
* No longer advertise nor build 3fdx, mga and dxr3 backends,
  Closes: #496106, #442181, #533546
* beautify mplayer version identification string
* Brown paperbag upload.
* Next try to fix build failure on sparce after recent binutils change.
* Brown paperbag upload.
* Really fix build failure on sparc after recent binutils change.
* Properly set Replaces/Conflicts on mplayer2{,-dbg} to avoid
  file overwrite errors.
* Adjust versioning of mplayer listed in the mplayer-dbg's Depends field.
* Fix build failure on sparc after recent binutils change.
* Urgency medium bumped because of RC-level bugfix
  and speeding up x264 transition.
* Update to my @debian.org email.
* Upload to unstable
* Enable joystick support on Linux only, Closes: #638408
* Rebuild fixes toolchain issue on arm, Closes: #637077
* New upstream snapshot
* following the discussion started by Diego Biurrun <diego@biurrun.de>
  in debian-devel, I have prepared a new packaging of 'mplayer'
  (with code that comes from CVS)
* the upstream tar.bz cannot be distributed by Debian, since it contains
   CSS code; so I am repackaging it 
* I have tried my best to address all known issues:
  - the package contains the detailed Copyright made by Diego Biurrun 
  - the package does not contain CSS code, or  AFAIK other code on which 
     there is active patent enforcement
  - there is a script  debian/cvs-changelog.sh  that shows all changes
     done to files included in this source.
    This should comply with GPLv2 sec 2.a  (in spirit if not in letter)
    For this reason, the source code contains CVS directories.
* needs   make (>= 3.80) for 'html-chunked-$(1)' in DOCS/xml/Makefile

* some corrections, as suggested Diego Biurrun
  - binary codecs should go into /usr/lib/codecs (upstream default)
  - better template 'mplayer/install_codecs'
  - an empty 'font=' in mplayer.conf breaks mplayer: postinst corrected
* correction in 'mplayer/cfgnote'
* better mplayer.postinst and mplayer.config

* New upstream release
* better debian/copyright file
* do not ship a skin
* New upstream release
* changed DEB_BUILD_OPTIONS to DEB_BUILD_CONFIGURE ,
  DEB_BUILD_OPTIONS is used as in debian policy
* use gcc-3.4
* changed xlibs-dev to a long list of dependencies, for Debian/etch
* try to adhere to  http://www.mplayerhq.hu/DOCS/tech/binary-packaging.txt
  (see README.Debian for details)
* removed dependency on xlibmesa-dev, disabled opengl
* New upstream release
* Simon McVittie <hacks@pseudorandom.co.uk> wonderful work:
- Work around Debian bug #267442 (glibc's sys/uio.h and gcc's altivec.h have
  conflicting uses for __vector) by re-ordering #includes
- Fix potential symlink attack in ./configure
- Disable support for binary codecs on platforms for which those codecs
  aren't available; also disable the corresponding Debconf note when it's
  inappropriate
- Changed Build-Depends: so it works in pbuilder
- Explicitly build-depend on libjpeg62-dev, libfontconfig1-dev,
  libungif4-dev 
- Tweak debian/rules to avoid certain errors being ignored
- Use --language=all
* provide a target  'debian/rules get-orig-source' 
  that recreates the orig.tar.gz ; then use the above orig.tar.gz
* rewrote some parts of debian/rules
* don't clean and recompile docs if upstream ships them
* mplayer-doc was shipping too much stuff
* translated man pages where not installed properly
* compile with libdv4-dev
* correct README.Debian
* Forgot build-dep on libtheora
* Must not depend on libxvidcore
* New upstream release
* new release.
* rc1 to become 0.90
* new pre-release
* new pre-release
* gtk bug fixed.
* new release.
* version bumped
* 0.60 pre2 release
* 0.60 pre-release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) CMU 1993 Computer Science, Speech Group
 
3
 *                        Chengxiang Lu and Alex Hauptmann
 
4
 * Copyright (c) 2005 Steve Underwood <steveu at coppice.org>
 
5
 * Copyright (c) 2009 Kenan Gillet
 
6
 * Copyright (c) 2010 Martin Storsjo
 
7
 *
 
8
 * This file is part of Libav.
 
9
 *
 
10
 * Libav is free software; you can redistribute it and/or
 
11
 * modify it under the terms of the GNU Lesser General Public
 
12
 * License as published by the Free Software Foundation; either
 
13
 * version 2.1 of the License, or (at your option) any later version.
 
14
 *
 
15
 * Libav is distributed in the hope that it will be useful,
 
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
18
 * Lesser General Public License for more details.
 
19
 *
 
20
 * You should have received a copy of the GNU Lesser General Public
 
21
 * License along with Libav; if not, write to the Free Software
 
22
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
23
 */
 
24
 
 
25
/**
 
26
 * @file
 
27
 * G.722 ADPCM audio decoder
 
28
 *
 
29
 * This G.722 decoder is a bit-exact implementation of the ITU G.722
 
30
 * specification for all three specified bitrates - 64000bps, 56000bps
 
31
 * and 48000bps. It passes the ITU tests.
 
32
 *
 
33
 * @note For the 56000bps and 48000bps bitrates, the lowest 1 or 2 bits
 
34
 *       respectively of each byte are ignored.
 
35
 */
 
36
 
 
37
#include "avcodec.h"
 
38
#include "get_bits.h"
 
39
#include "g722.h"
 
40
#include "libavutil/opt.h"
 
41
 
 
42
#define OFFSET(x) offsetof(G722Context, x)
 
43
#define AD AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM
 
44
static const AVOption options[] = {
 
45
    { "bits_per_codeword", "Bits per G722 codeword", OFFSET(bits_per_codeword), AV_OPT_TYPE_FLAGS, { 8 }, 6, 8, AD },
 
46
    { NULL }
 
47
};
 
48
 
 
49
static const AVClass g722_decoder_class = {
 
50
    .class_name = "g722 decoder",
 
51
    .item_name  = av_default_item_name,
 
52
    .option     = options,
 
53
    .version    = LIBAVUTIL_VERSION_INT,
 
54
};
 
55
 
 
56
static av_cold int g722_decode_init(AVCodecContext * avctx)
 
57
{
 
58
    G722Context *c = avctx->priv_data;
 
59
 
 
60
    if (avctx->channels != 1) {
 
61
        av_log(avctx, AV_LOG_ERROR, "Only mono tracks are allowed.\n");
 
62
        return AVERROR_INVALIDDATA;
 
63
    }
 
64
    avctx->sample_fmt = AV_SAMPLE_FMT_S16;
 
65
 
 
66
    c->band[0].scale_factor = 8;
 
67
    c->band[1].scale_factor = 2;
 
68
    c->prev_samples_pos = 22;
 
69
 
 
70
    avcodec_get_frame_defaults(&c->frame);
 
71
    avctx->coded_frame = &c->frame;
 
72
 
 
73
    return 0;
 
74
}
 
75
 
 
76
static const int16_t low_inv_quant5[32] = {
 
77
     -35,   -35, -2919, -2195, -1765, -1458, -1219, -1023,
 
78
    -858,  -714,  -587,  -473,  -370,  -276,  -190,  -110,
 
79
    2919,  2195,  1765,  1458,  1219,  1023,   858,   714,
 
80
     587,   473,   370,   276,   190,   110,    35,   -35
 
81
};
 
82
 
 
83
static const int16_t *low_inv_quants[3] = { ff_g722_low_inv_quant6,
 
84
                                                    low_inv_quant5,
 
85
                                            ff_g722_low_inv_quant4 };
 
86
 
 
87
static int g722_decode_frame(AVCodecContext *avctx, void *data,
 
88
                             int *got_frame_ptr, AVPacket *avpkt)
 
89
{
 
90
    G722Context *c = avctx->priv_data;
 
91
    int16_t *out_buf;
 
92
    int j, ret;
 
93
    const int skip = 8 - c->bits_per_codeword;
 
94
    const int16_t *quantizer_table = low_inv_quants[skip];
 
95
    GetBitContext gb;
 
96
 
 
97
    /* get output buffer */
 
98
    c->frame.nb_samples = avpkt->size * 2;
 
99
    if ((ret = avctx->get_buffer(avctx, &c->frame)) < 0) {
 
100
        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 
101
        return ret;
 
102
    }
 
103
    out_buf = (int16_t *)c->frame.data[0];
 
104
 
 
105
    init_get_bits(&gb, avpkt->data, avpkt->size * 8);
 
106
 
 
107
    for (j = 0; j < avpkt->size; j++) {
 
108
        int ilow, ihigh, rlow, rhigh, dhigh;
 
109
        int xout1, xout2;
 
110
 
 
111
        ihigh = get_bits(&gb, 2);
 
112
        ilow = get_bits(&gb, 6 - skip);
 
113
        skip_bits(&gb, skip);
 
114
 
 
115
        rlow = av_clip((c->band[0].scale_factor * quantizer_table[ilow] >> 10)
 
116
                      + c->band[0].s_predictor, -16384, 16383);
 
117
 
 
118
        ff_g722_update_low_predictor(&c->band[0], ilow >> (2 - skip));
 
119
 
 
120
        dhigh = c->band[1].scale_factor * ff_g722_high_inv_quant[ihigh] >> 10;
 
121
        rhigh = av_clip(dhigh + c->band[1].s_predictor, -16384, 16383);
 
122
 
 
123
        ff_g722_update_high_predictor(&c->band[1], dhigh, ihigh);
 
124
 
 
125
        c->prev_samples[c->prev_samples_pos++] = rlow + rhigh;
 
126
        c->prev_samples[c->prev_samples_pos++] = rlow - rhigh;
 
127
        ff_g722_apply_qmf(c->prev_samples + c->prev_samples_pos - 24,
 
128
                          &xout1, &xout2);
 
129
        *out_buf++ = av_clip_int16(xout1 >> 12);
 
130
        *out_buf++ = av_clip_int16(xout2 >> 12);
 
131
        if (c->prev_samples_pos >= PREV_SAMPLES_BUF_SIZE) {
 
132
            memmove(c->prev_samples, c->prev_samples + c->prev_samples_pos - 22,
 
133
                    22 * sizeof(c->prev_samples[0]));
 
134
            c->prev_samples_pos = 22;
 
135
        }
 
136
    }
 
137
 
 
138
    *got_frame_ptr   = 1;
 
139
    *(AVFrame *)data = c->frame;
 
140
 
 
141
    return avpkt->size;
 
142
}
 
143
 
 
144
AVCodec ff_adpcm_g722_decoder = {
 
145
    .name           = "g722",
 
146
    .type           = AVMEDIA_TYPE_AUDIO,
 
147
    .id             = CODEC_ID_ADPCM_G722,
 
148
    .priv_data_size = sizeof(G722Context),
 
149
    .init           = g722_decode_init,
 
150
    .decode         = g722_decode_frame,
 
151
    .capabilities   = CODEC_CAP_DR1,
 
152
    .long_name      = NULL_IF_CONFIG_SMALL("G.722 ADPCM"),
 
153
    .priv_class     = &g722_decoder_class,
 
154
};