~medibuntu-maintainers/mplayer/medibuntu.precise

« back to all changes in this revision

Viewing changes to ffmpeg/libavcodec/ws-snd1.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:
25
25
 
26
26
/**
27
27
 * @file
28
 
 * Westwood SNDx codecs.
 
28
 * Westwood SNDx codecs
29
29
 *
30
30
 * Reference documents about VQA format and its audio codecs
31
31
 * can be found here:
32
32
 * http://www.multimedia.cx
33
33
 */
34
34
 
35
 
static const int8_t ws_adpcm_2bit[] = { -2, -1, 0, 1};
36
35
static const int8_t ws_adpcm_4bit[] = {
37
36
    -9, -8, -6, -5, -4, -3, -2, -1,
38
 
     0,  1,  2,  3,  4,  5,  6,  8 };
39
 
 
40
 
#define CLIP8(a) if(a>127)a=127;if(a<-128)a=-128;
41
 
 
42
 
static av_cold int ws_snd_decode_init(AVCodecContext * avctx)
 
37
     0,  1,  2,  3,  4,  5,  6,  8
 
38
};
 
39
 
 
40
typedef struct WSSndContext {
 
41
    AVFrame frame;
 
42
} WSSndContext;
 
43
 
 
44
static av_cold int ws_snd_decode_init(AVCodecContext *avctx)
43
45
{
44
 
//    WSSNDContext *c = avctx->priv_data;
45
 
 
46
 
    avctx->sample_fmt = AV_SAMPLE_FMT_S16;
 
46
    WSSndContext *s = avctx->priv_data;
 
47
 
 
48
    if (avctx->channels != 1) {
 
49
        av_log_ask_for_sample(avctx, "unsupported number of channels\n");
 
50
        return AVERROR(EINVAL);
 
51
    }
 
52
 
 
53
    avctx->sample_fmt = AV_SAMPLE_FMT_U8;
 
54
 
 
55
    avcodec_get_frame_defaults(&s->frame);
 
56
    avctx->coded_frame = &s->frame;
 
57
 
47
58
    return 0;
48
59
}
49
60
 
50
 
static int ws_snd_decode_frame(AVCodecContext *avctx,
51
 
                void *data, int *data_size,
52
 
                AVPacket *avpkt)
 
61
static int ws_snd_decode_frame(AVCodecContext *avctx, void *data,
 
62
                               int *got_frame_ptr, AVPacket *avpkt)
53
63
{
 
64
    WSSndContext *s = avctx->priv_data;
54
65
    const uint8_t *buf = avpkt->data;
55
 
    int buf_size = avpkt->size;
56
 
//    WSSNDContext *c = avctx->priv_data;
 
66
    int buf_size       = avpkt->size;
57
67
 
58
 
    int in_size, out_size;
59
 
    int sample = 0;
60
 
    int i;
61
 
    short *samples = data;
 
68
    int in_size, out_size, ret;
 
69
    int sample = 128;
 
70
    uint8_t *samples;
 
71
    uint8_t *samples_end;
62
72
 
63
73
    if (!buf_size)
64
74
        return 0;
65
75
 
 
76
    if (buf_size < 4) {
 
77
        av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
 
78
        return AVERROR(EINVAL);
 
79
    }
 
80
 
66
81
    out_size = AV_RL16(&buf[0]);
67
 
    *data_size = out_size * 2;
68
 
    in_size = AV_RL16(&buf[2]);
 
82
    in_size  = AV_RL16(&buf[2]);
69
83
    buf += 4;
70
84
 
71
 
    if (out_size > *data_size) {
72
 
        av_log(avctx, AV_LOG_ERROR, "Frame is too large to fit in buffer\n");
73
 
        return -1;
74
 
    }
75
85
    if (in_size > buf_size) {
76
86
        av_log(avctx, AV_LOG_ERROR, "Frame data is larger than input buffer\n");
77
87
        return -1;
78
88
    }
 
89
 
 
90
    /* get output buffer */
 
91
    s->frame.nb_samples = out_size;
 
92
    if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
 
93
        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 
94
        return ret;
 
95
    }
 
96
    samples     = s->frame.data[0];
 
97
    samples_end = samples + out_size;
 
98
 
79
99
    if (in_size == out_size) {
80
 
        for (i = 0; i < out_size; i++)
81
 
            *samples++ = (*buf++ - 0x80) << 8;
 
100
        memcpy(samples, buf, out_size);
 
101
        *got_frame_ptr   = 1;
 
102
        *(AVFrame *)data = s->frame;
82
103
        return buf_size;
83
104
    }
84
105
 
85
 
    while (out_size > 0) {
86
 
        int code;
 
106
    while (samples < samples_end && buf - avpkt->data < buf_size) {
 
107
        int code, smp, size;
87
108
        uint8_t count;
88
 
        code = (*buf) >> 6;
89
 
        count = (*buf) & 0x3F;
 
109
        code  = *buf >> 6;
 
110
        count = *buf & 0x3F;
90
111
        buf++;
91
 
        switch(code) {
 
112
 
 
113
        /* make sure we don't write past the output buffer */
 
114
        switch (code) {
 
115
        case 0:  smp = 4;                              break;
 
116
        case 1:  smp = 2;                              break;
 
117
        case 2:  smp = (count & 0x20) ? 1 : count + 1; break;
 
118
        default: smp = count + 1;                      break;
 
119
        }
 
120
        if (samples_end - samples < smp)
 
121
            break;
 
122
 
 
123
        /* make sure we don't read past the input buffer */
 
124
        size = ((code == 2 && (count & 0x20)) || code == 3) ? 0 : count + 1;
 
125
        if ((buf - avpkt->data) + size > buf_size)
 
126
            break;
 
127
 
 
128
        switch (code) {
92
129
        case 0: /* ADPCM 2-bit */
93
130
            for (count++; count > 0; count--) {
94
131
                code = *buf++;
95
 
                sample += ws_adpcm_2bit[code & 0x3];
96
 
                CLIP8(sample);
97
 
                *samples++ = sample << 8;
98
 
                sample += ws_adpcm_2bit[(code >> 2) & 0x3];
99
 
                CLIP8(sample);
100
 
                *samples++ = sample << 8;
101
 
                sample += ws_adpcm_2bit[(code >> 4) & 0x3];
102
 
                CLIP8(sample);
103
 
                *samples++ = sample << 8;
104
 
                sample += ws_adpcm_2bit[(code >> 6) & 0x3];
105
 
                CLIP8(sample);
106
 
                *samples++ = sample << 8;
107
 
                out_size -= 4;
 
132
                sample += ( code       & 0x3) - 2;
 
133
                sample = av_clip_uint8(sample);
 
134
                *samples++ = sample;
 
135
                sample += ((code >> 2) & 0x3) - 2;
 
136
                sample = av_clip_uint8(sample);
 
137
                *samples++ = sample;
 
138
                sample += ((code >> 4) & 0x3) - 2;
 
139
                sample = av_clip_uint8(sample);
 
140
                *samples++ = sample;
 
141
                sample +=  (code >> 6)        - 2;
 
142
                sample = av_clip_uint8(sample);
 
143
                *samples++ = sample;
108
144
            }
109
145
            break;
110
146
        case 1: /* ADPCM 4-bit */
111
147
            for (count++; count > 0; count--) {
112
148
                code = *buf++;
113
149
                sample += ws_adpcm_4bit[code & 0xF];
114
 
                CLIP8(sample);
115
 
                *samples++ = sample << 8;
 
150
                sample = av_clip_uint8(sample);
 
151
                *samples++ = sample;
116
152
                sample += ws_adpcm_4bit[code >> 4];
117
 
                CLIP8(sample);
118
 
                *samples++ = sample << 8;
119
 
                out_size -= 2;
 
153
                sample = av_clip_uint8(sample);
 
154
                *samples++ = sample;
120
155
            }
121
156
            break;
122
157
        case 2: /* no compression */
125
160
                t = count;
126
161
                t <<= 3;
127
162
                sample += t >> 3;
128
 
                *samples++ = sample << 8;
129
 
                out_size--;
 
163
                sample = av_clip_uint8(sample);
 
164
                *samples++ = sample;
130
165
            } else { /* copy */
131
 
                for (count++; count > 0; count--) {
132
 
                    *samples++ = (*buf++ - 0x80) << 8;
133
 
                    out_size--;
134
 
                }
135
 
                sample = buf[-1] - 0x80;
 
166
                memcpy(samples, buf, smp);
 
167
                samples += smp;
 
168
                buf     += smp;
 
169
                sample = buf[-1];
136
170
            }
137
171
            break;
138
172
        default: /* run */
139
 
            for(count++; count > 0; count--) {
140
 
                *samples++ = sample << 8;
141
 
                out_size--;
142
 
            }
 
173
            memset(samples, sample, smp);
 
174
            samples += smp;
143
175
        }
144
176
    }
145
177
 
 
178
    s->frame.nb_samples = samples - s->frame.data[0];
 
179
    *got_frame_ptr   = 1;
 
180
    *(AVFrame *)data = s->frame;
 
181
 
146
182
    return buf_size;
147
183
}
148
184
 
149
185
AVCodec ff_ws_snd1_decoder = {
150
 
    "ws_snd1",
151
 
    AVMEDIA_TYPE_AUDIO,
152
 
    CODEC_ID_WESTWOOD_SND1,
153
 
    0,
154
 
    ws_snd_decode_init,
155
 
    NULL,
156
 
    NULL,
157
 
    ws_snd_decode_frame,
 
186
    .name           = "ws_snd1",
 
187
    .type           = AVMEDIA_TYPE_AUDIO,
 
188
    .id             = CODEC_ID_WESTWOOD_SND1,
 
189
    .priv_data_size = sizeof(WSSndContext),
 
190
    .init           = ws_snd_decode_init,
 
191
    .decode         = ws_snd_decode_frame,
 
192
    .capabilities   = CODEC_CAP_DR1,
158
193
    .long_name = NULL_IF_CONFIG_SMALL("Westwood Audio (SND1)"),
159
194
};