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

« back to all changes in this revision

Viewing changes to gst-libs/ext/libav/libavformat/westwood_aud.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
 * Westwood Studios AUD Format Demuxer
 
3
 * Copyright (c) 2003 The ffmpeg Project
 
4
 *
 
5
 * This file is part of Libav.
 
6
 *
 
7
 * Libav is free software; you can redistribute it and/or
 
8
 * modify it under the terms of the GNU Lesser General Public
 
9
 * License as published by the Free Software Foundation; either
 
10
 * version 2.1 of the License, or (at your option) any later version.
 
11
 *
 
12
 * Libav is distributed in the hope that it will be useful,
 
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
15
 * Lesser General Public License for more details.
 
16
 *
 
17
 * You should have received a copy of the GNU Lesser General Public
 
18
 * License along with Libav; if not, write to the Free Software
 
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
20
 */
 
21
 
 
22
/**
 
23
 * @file
 
24
 * Westwood Studios AUD file demuxer
 
25
 * by Mike Melanson (melanson@pcisys.net)
 
26
 * for more information on the Westwood file formats, visit:
 
27
 *   http://www.pcisys.net/~melanson/codecs/
 
28
 *   http://www.geocities.com/SiliconValley/8682/aud3.txt
 
29
 *
 
30
 * Implementation note: There is no definite file signature for AUD files.
 
31
 * The demuxer uses a probabilistic strategy for content detection. This
 
32
 * entails performing sanity checks on certain header values in order to
 
33
 * qualify a file. Refer to wsaud_probe() for the precise parameters.
 
34
 */
 
35
 
 
36
#include "libavutil/channel_layout.h"
 
37
#include "libavutil/intreadwrite.h"
 
38
#include "avformat.h"
 
39
#include "internal.h"
 
40
 
 
41
#define AUD_HEADER_SIZE 12
 
42
#define AUD_CHUNK_PREAMBLE_SIZE 8
 
43
#define AUD_CHUNK_SIGNATURE 0x0000DEAF
 
44
 
 
45
static int wsaud_probe(AVProbeData *p)
 
46
{
 
47
    int field;
 
48
 
 
49
    /* Probabilistic content detection strategy: There is no file signature
 
50
     * so perform sanity checks on various header parameters:
 
51
     *   8000 <= sample rate (16 bits) <= 48000  ==> 40001 acceptable numbers
 
52
     *   flags <= 0x03 (2 LSBs are used)         ==> 4 acceptable numbers
 
53
     *   compression type (8 bits) = 1 or 99     ==> 2 acceptable numbers
 
54
     *   first audio chunk signature (32 bits)   ==> 1 acceptable number
 
55
     * The number space contains 2^64 numbers. There are 40001 * 4 * 2 * 1 =
 
56
     * 320008 acceptable number combinations.
 
57
     */
 
58
 
 
59
    if (p->buf_size < AUD_HEADER_SIZE + AUD_CHUNK_PREAMBLE_SIZE)
 
60
        return 0;
 
61
 
 
62
    /* check sample rate */
 
63
    field = AV_RL16(&p->buf[0]);
 
64
    if ((field < 8000) || (field > 48000))
 
65
        return 0;
 
66
 
 
67
    /* enforce the rule that the top 6 bits of this flags field are reserved (0);
 
68
     * this might not be true, but enforce it until deemed unnecessary */
 
69
    if (p->buf[10] & 0xFC)
 
70
        return 0;
 
71
 
 
72
    /* note: only check for WS IMA (type 99) right now since there is no
 
73
     * support for type 1 */
 
74
    if (p->buf[11] != 99 && p->buf[11] != 1)
 
75
        return 0;
 
76
 
 
77
    /* read ahead to the first audio chunk and validate the first header signature */
 
78
    if (AV_RL32(&p->buf[16]) != AUD_CHUNK_SIGNATURE)
 
79
        return 0;
 
80
 
 
81
    /* return 1/2 certainty since this file check is a little sketchy */
 
82
    return AVPROBE_SCORE_MAX / 2;
 
83
}
 
84
 
 
85
static int wsaud_read_header(AVFormatContext *s)
 
86
{
 
87
    AVIOContext *pb = s->pb;
 
88
    AVStream *st;
 
89
    unsigned char header[AUD_HEADER_SIZE];
 
90
    int sample_rate, channels, codec;
 
91
 
 
92
    if (avio_read(pb, header, AUD_HEADER_SIZE) != AUD_HEADER_SIZE)
 
93
        return AVERROR(EIO);
 
94
 
 
95
    sample_rate = AV_RL16(&header[0]);
 
96
    channels    = (header[10] & 0x1) + 1;
 
97
    codec       = header[11];
 
98
 
 
99
    /* initialize the audio decoder stream */
 
100
    st = avformat_new_stream(s, NULL);
 
101
    if (!st)
 
102
        return AVERROR(ENOMEM);
 
103
 
 
104
    switch (codec) {
 
105
    case  1:
 
106
        if (channels != 1) {
 
107
            av_log_ask_for_sample(s, "Stereo WS-SND1 is not supported.\n");
 
108
            return AVERROR_PATCHWELCOME;
 
109
        }
 
110
        st->codec->codec_id = AV_CODEC_ID_WESTWOOD_SND1;
 
111
        break;
 
112
    case 99:
 
113
        st->codec->codec_id = AV_CODEC_ID_ADPCM_IMA_WS;
 
114
        st->codec->bits_per_coded_sample = 4;
 
115
        st->codec->bit_rate = channels * sample_rate * 4;
 
116
        break;
 
117
    default:
 
118
        av_log_ask_for_sample(s, "Unknown codec: %d\n", codec);
 
119
        return AVERROR_PATCHWELCOME;
 
120
    }
 
121
    avpriv_set_pts_info(st, 64, 1, sample_rate);
 
122
    st->codec->codec_type  = AVMEDIA_TYPE_AUDIO;
 
123
    st->codec->channels    = channels;
 
124
    st->codec->channel_layout = channels == 1 ? AV_CH_LAYOUT_MONO :
 
125
                                                AV_CH_LAYOUT_STEREO;
 
126
    st->codec->sample_rate = sample_rate;
 
127
 
 
128
    return 0;
 
129
}
 
130
 
 
131
static int wsaud_read_packet(AVFormatContext *s,
 
132
                             AVPacket *pkt)
 
133
{
 
134
    AVIOContext *pb = s->pb;
 
135
    unsigned char preamble[AUD_CHUNK_PREAMBLE_SIZE];
 
136
    unsigned int chunk_size;
 
137
    int ret = 0;
 
138
    AVStream *st = s->streams[0];
 
139
 
 
140
    if (avio_read(pb, preamble, AUD_CHUNK_PREAMBLE_SIZE) !=
 
141
        AUD_CHUNK_PREAMBLE_SIZE)
 
142
        return AVERROR(EIO);
 
143
 
 
144
    /* validate the chunk */
 
145
    if (AV_RL32(&preamble[4]) != AUD_CHUNK_SIGNATURE)
 
146
        return AVERROR_INVALIDDATA;
 
147
 
 
148
    chunk_size = AV_RL16(&preamble[0]);
 
149
 
 
150
    if (st->codec->codec_id == AV_CODEC_ID_WESTWOOD_SND1) {
 
151
        /* For Westwood SND1 audio we need to add the output size and input
 
152
           size to the start of the packet to match what is in VQA.
 
153
           Specifically, this is needed to signal when a packet should be
 
154
           decoding as raw 8-bit pcm or variable-size ADPCM. */
 
155
        int out_size = AV_RL16(&preamble[2]);
 
156
        if ((ret = av_new_packet(pkt, chunk_size + 4)))
 
157
            return ret;
 
158
        if ((ret = avio_read(pb, &pkt->data[4], chunk_size)) != chunk_size)
 
159
            return ret < 0 ? ret : AVERROR(EIO);
 
160
        AV_WL16(&pkt->data[0], out_size);
 
161
        AV_WL16(&pkt->data[2], chunk_size);
 
162
 
 
163
        pkt->duration = out_size;
 
164
    } else {
 
165
        ret = av_get_packet(pb, pkt, chunk_size);
 
166
        if (ret != chunk_size)
 
167
            return AVERROR(EIO);
 
168
 
 
169
        /* 2 samples/byte, 1 or 2 samples per frame depending on stereo */
 
170
        pkt->duration = (chunk_size * 2) / st->codec->channels;
 
171
    }
 
172
    pkt->stream_index = st->index;
 
173
 
 
174
    return ret;
 
175
}
 
176
 
 
177
AVInputFormat ff_wsaud_demuxer = {
 
178
    .name           = "wsaud",
 
179
    .long_name      = NULL_IF_CONFIG_SMALL("Westwood Studios audio"),
 
180
    .read_probe     = wsaud_probe,
 
181
    .read_header    = wsaud_read_header,
 
182
    .read_packet    = wsaud_read_packet,
 
183
};