Revision 47b47bbd

View differences:

libavformat/Makefile
14 14
OBJS-$(CONFIG_ADTS_MUXER)                += adtsenc.o
15 15
OBJS-$(CONFIG_AEA_DEMUXER)               += aea.o
16 16
OBJS-$(CONFIG_AIFF_DEMUXER)              += aiff.o riff.o raw.o
17
OBJS-$(CONFIG_AIFF_MUXER)                += aiff.o riff.o
17
OBJS-$(CONFIG_AIFF_MUXER)                += aiffenc.o riff.o
18 18
OBJS-$(CONFIG_AMR_DEMUXER)               += amr.o
19 19
OBJS-$(CONFIG_AMR_MUXER)                 += amr.o
20 20
OBJS-$(CONFIG_APC_DEMUXER)               += apc.o
libavformat/aiff.c
1 1
/*
2
 * AIFF/AIFF-C muxer and demuxer
2
 * AIFF/AIFF-C demuxer
3 3
 * Copyright (c) 2006  Patrick Guimond
4 4
 *
5 5
 * This file is part of FFmpeg.
......
22 22
#include "libavutil/intfloat_readwrite.h"
23 23
#include "avformat.h"
24 24
#include "raw.h"
25
#include "riff.h"
26

  
27
static const AVCodecTag codec_aiff_tags[] = {
28
    { CODEC_ID_PCM_S16BE,    MKTAG('N','O','N','E') },
29
    { CODEC_ID_PCM_S8,       MKTAG('N','O','N','E') },
30
    { CODEC_ID_PCM_S24BE,    MKTAG('N','O','N','E') },
31
    { CODEC_ID_PCM_S32BE,    MKTAG('N','O','N','E') },
32
    { CODEC_ID_PCM_F32BE,    MKTAG('f','l','3','2') },
33
    { CODEC_ID_PCM_F64BE,    MKTAG('f','l','6','4') },
34
    { CODEC_ID_PCM_ALAW,     MKTAG('a','l','a','w') },
35
    { CODEC_ID_PCM_MULAW,    MKTAG('u','l','a','w') },
36
    { CODEC_ID_MACE3,        MKTAG('M','A','C','3') },
37
    { CODEC_ID_MACE6,        MKTAG('M','A','C','6') },
38
    { CODEC_ID_GSM,          MKTAG('G','S','M',' ') },
39
    { CODEC_ID_ADPCM_G726,   MKTAG('G','7','2','6') },
40
    { CODEC_ID_PCM_S16LE,    MKTAG('s','o','w','t') },
41
    { CODEC_ID_ADPCM_IMA_QT, MKTAG('i','m','a','4') },
42
    { CODEC_ID_QDM2,         MKTAG('Q','D','M','2') },
43
    { 0, 0 },
44
};
25
#include "aiff.h"
45 26

  
46 27
#define AIFF                    0
47 28
#define AIFF_C_VERSION1         0xA2805140
......
123 104
    /* Got an AIFF-C? */
124 105
    if (version == AIFF_C_VERSION1) {
125 106
        codec->codec_tag = get_le32(pb);
126
        codec->codec_id  = ff_codec_get_id(codec_aiff_tags, codec->codec_tag);
107
        codec->codec_id  = ff_codec_get_id(ff_codec_aiff_tags, codec->codec_tag);
127 108

  
128 109
        switch (codec->codec_id) {
129 110
        case CODEC_ID_PCM_S16BE:
......
171 152
    return num_frames;
172 153
}
173 154

  
174
#if CONFIG_AIFF_MUXER
175
typedef struct {
176
    int64_t form;
177
    int64_t frames;
178
    int64_t ssnd;
179
} AIFFOutputContext;
180

  
181
static int aiff_write_header(AVFormatContext *s)
182
{
183
    AIFFOutputContext *aiff = s->priv_data;
184
    ByteIOContext *pb = s->pb;
185
    AVCodecContext *enc = s->streams[0]->codec;
186
    AVExtFloat sample_rate;
187
    int aifc = 0;
188

  
189
    /* First verify if format is ok */
190
    if (!enc->codec_tag)
191
        return -1;
192
    if (enc->codec_tag != MKTAG('N','O','N','E'))
193
        aifc = 1;
194

  
195
    /* FORM AIFF header */
196
    put_tag(pb, "FORM");
197
    aiff->form = url_ftell(pb);
198
    put_be32(pb, 0);                    /* file length */
199
    put_tag(pb, aifc ? "AIFC" : "AIFF");
200

  
201
    if (aifc) { // compressed audio
202
        enc->bits_per_coded_sample = 16;
203
        if (!enc->block_align) {
204
            av_log(s, AV_LOG_ERROR, "block align not set\n");
205
            return -1;
206
        }
207
        /* Version chunk */
208
        put_tag(pb, "FVER");
209
        put_be32(pb, 4);
210
        put_be32(pb, 0xA2805140);
211
    }
212

  
213
    /* Common chunk */
214
    put_tag(pb, "COMM");
215
    put_be32(pb, aifc ? 24 : 18); /* size */
216
    put_be16(pb, enc->channels);  /* Number of channels */
217

  
218
    aiff->frames = url_ftell(pb);
219
    put_be32(pb, 0);              /* Number of frames */
220

  
221
    if (!enc->bits_per_coded_sample)
222
        enc->bits_per_coded_sample = av_get_bits_per_sample(enc->codec_id);
223
    if (!enc->bits_per_coded_sample) {
224
        av_log(s, AV_LOG_ERROR, "could not compute bits per sample\n");
225
        return -1;
226
    }
227
    if (!enc->block_align)
228
        enc->block_align = (enc->bits_per_coded_sample * enc->channels) >> 3;
229

  
230
    put_be16(pb, enc->bits_per_coded_sample); /* Sample size */
231

  
232
    sample_rate = av_dbl2ext((double)enc->sample_rate);
233
    put_buffer(pb, (uint8_t*)&sample_rate, sizeof(sample_rate));
234

  
235
    if (aifc) {
236
        put_le32(pb, enc->codec_tag);
237
        put_be16(pb, 0);
238
    }
239

  
240
    /* Sound data chunk */
241
    put_tag(pb, "SSND");
242
    aiff->ssnd = url_ftell(pb);         /* Sound chunk size */
243
    put_be32(pb, 0);                    /* Sound samples data size */
244
    put_be32(pb, 0);                    /* Data offset */
245
    put_be32(pb, 0);                    /* Block-size (block align) */
246

  
247
    av_set_pts_info(s->streams[0], 64, 1, s->streams[0]->codec->sample_rate);
248

  
249
    /* Data is starting here */
250
    put_flush_packet(pb);
251

  
252
    return 0;
253
}
254

  
255
static int aiff_write_packet(AVFormatContext *s, AVPacket *pkt)
256
{
257
    ByteIOContext *pb = s->pb;
258
    put_buffer(pb, pkt->data, pkt->size);
259
    return 0;
260
}
261

  
262
static int aiff_write_trailer(AVFormatContext *s)
263
{
264
    ByteIOContext *pb = s->pb;
265
    AIFFOutputContext *aiff = s->priv_data;
266
    AVCodecContext *enc = s->streams[0]->codec;
267

  
268
    /* Chunks sizes must be even */
269
    int64_t file_size, end_size;
270
    end_size = file_size = url_ftell(pb);
271
    if (file_size & 1) {
272
        put_byte(pb, 0);
273
        end_size++;
274
    }
275

  
276
    if (!url_is_streamed(s->pb)) {
277
        /* File length */
278
        url_fseek(pb, aiff->form, SEEK_SET);
279
        put_be32(pb, file_size - aiff->form - 4);
280

  
281
        /* Number of sample frames */
282
        url_fseek(pb, aiff->frames, SEEK_SET);
283
        put_be32(pb, (file_size-aiff->ssnd-12)/enc->block_align);
284

  
285
        /* Sound Data chunk size */
286
        url_fseek(pb, aiff->ssnd, SEEK_SET);
287
        put_be32(pb, file_size - aiff->ssnd - 4);
288

  
289
        /* return to the end */
290
        url_fseek(pb, end_size, SEEK_SET);
291

  
292
        put_flush_packet(pb);
293
    }
294

  
295
    return 0;
296
}
297
#endif /* CONFIG_AIFF_MUXER */
298

  
299 155
static int aiff_probe(AVProbeData *p)
300 156
{
301 157
    /* check file header */
......
446 302
    return 0;
447 303
}
448 304

  
449
#if CONFIG_AIFF_DEMUXER
450 305
AVInputFormat aiff_demuxer = {
451 306
    "aiff",
452 307
    NULL_IF_CONFIG_SMALL("Audio IFF"),
......
456 311
    aiff_read_packet,
457 312
    NULL,
458 313
    pcm_read_seek,
459
    .codec_tag= (const AVCodecTag* const []){codec_aiff_tags, 0},
460
};
461
#endif
462

  
463
#if CONFIG_AIFF_MUXER
464
AVOutputFormat aiff_muxer = {
465
    "aiff",
466
    NULL_IF_CONFIG_SMALL("Audio IFF"),
467
    "audio/aiff",
468
    "aif,aiff,afc,aifc",
469
    sizeof(AIFFOutputContext),
470
    CODEC_ID_PCM_S16BE,
471
    CODEC_ID_NONE,
472
    aiff_write_header,
473
    aiff_write_packet,
474
    aiff_write_trailer,
475
    .codec_tag= (const AVCodecTag* const []){codec_aiff_tags, 0},
314
    .codec_tag= (const AVCodecTag* const []){ff_codec_aiff_tags, 0},
476 315
};
477
#endif
libavformat/aiff.h
1
/*
2
 * AIFF/AIFF-C muxer/demuxer common header
3
 * Copyright (c) 2006  Patrick Guimond
4
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg 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
 * FFmpeg 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 FFmpeg; 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 libavformat/aiff.h
24
 * common header for AIFF muxer and demuxer
25
 */
26

  
27
#ifndef AVFORMAT_AIFF_H
28
#define AVFORMAT_AIFF_H
29

  
30
#include "avformat.h"
31
#include "riff.h"
32

  
33
static const AVCodecTag ff_codec_aiff_tags[] = {
34
    { CODEC_ID_PCM_S16BE,    MKTAG('N','O','N','E') },
35
    { CODEC_ID_PCM_S8,       MKTAG('N','O','N','E') },
36
    { CODEC_ID_PCM_S24BE,    MKTAG('N','O','N','E') },
37
    { CODEC_ID_PCM_S32BE,    MKTAG('N','O','N','E') },
38
    { CODEC_ID_PCM_F32BE,    MKTAG('f','l','3','2') },
39
    { CODEC_ID_PCM_F64BE,    MKTAG('f','l','6','4') },
40
    { CODEC_ID_PCM_ALAW,     MKTAG('a','l','a','w') },
41
    { CODEC_ID_PCM_MULAW,    MKTAG('u','l','a','w') },
42
    { CODEC_ID_MACE3,        MKTAG('M','A','C','3') },
43
    { CODEC_ID_MACE6,        MKTAG('M','A','C','6') },
44
    { CODEC_ID_GSM,          MKTAG('G','S','M',' ') },
45
    { CODEC_ID_ADPCM_G726,   MKTAG('G','7','2','6') },
46
    { CODEC_ID_PCM_S16LE,    MKTAG('s','o','w','t') },
47
    { CODEC_ID_ADPCM_IMA_QT, MKTAG('i','m','a','4') },
48
    { CODEC_ID_QDM2,         MKTAG('Q','D','M','2') },
49
    { 0, 0 },
50
};
51

  
52
#endif /* AVFORMAT_AIFF_H */
libavformat/aiffenc.c
1
/*
2
 * AIFF/AIFF-C muxer
3
 * Copyright (c) 2006  Patrick Guimond
4
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg 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
 * FFmpeg 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 FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21

  
22
#include "avformat.h"
23
#include "aiff.h"
24

  
25
typedef struct {
26
    int64_t form;
27
    int64_t frames;
28
    int64_t ssnd;
29
} AIFFOutputContext;
30

  
31
static int aiff_write_header(AVFormatContext *s)
32
{
33
    AIFFOutputContext *aiff = s->priv_data;
34
    ByteIOContext *pb = s->pb;
35
    AVCodecContext *enc = s->streams[0]->codec;
36
    AVExtFloat sample_rate;
37
    int aifc = 0;
38

  
39
    /* First verify if format is ok */
40
    if (!enc->codec_tag)
41
        return -1;
42
    if (enc->codec_tag != MKTAG('N','O','N','E'))
43
        aifc = 1;
44

  
45
    /* FORM AIFF header */
46
    put_tag(pb, "FORM");
47
    aiff->form = url_ftell(pb);
48
    put_be32(pb, 0);                    /* file length */
49
    put_tag(pb, aifc ? "AIFC" : "AIFF");
50

  
51
    if (aifc) { // compressed audio
52
        enc->bits_per_coded_sample = 16;
53
        if (!enc->block_align) {
54
            av_log(s, AV_LOG_ERROR, "block align not set\n");
55
            return -1;
56
        }
57
        /* Version chunk */
58
        put_tag(pb, "FVER");
59
        put_be32(pb, 4);
60
        put_be32(pb, 0xA2805140);
61
    }
62

  
63
    /* Common chunk */
64
    put_tag(pb, "COMM");
65
    put_be32(pb, aifc ? 24 : 18); /* size */
66
    put_be16(pb, enc->channels);  /* Number of channels */
67

  
68
    aiff->frames = url_ftell(pb);
69
    put_be32(pb, 0);              /* Number of frames */
70

  
71
    if (!enc->bits_per_coded_sample)
72
        enc->bits_per_coded_sample = av_get_bits_per_sample(enc->codec_id);
73
    if (!enc->bits_per_coded_sample) {
74
        av_log(s, AV_LOG_ERROR, "could not compute bits per sample\n");
75
        return -1;
76
    }
77
    if (!enc->block_align)
78
        enc->block_align = (enc->bits_per_coded_sample * enc->channels) >> 3;
79

  
80
    put_be16(pb, enc->bits_per_coded_sample); /* Sample size */
81

  
82
    sample_rate = av_dbl2ext((double)enc->sample_rate);
83
    put_buffer(pb, (uint8_t*)&sample_rate, sizeof(sample_rate));
84

  
85
    if (aifc) {
86
        put_le32(pb, enc->codec_tag);
87
        put_be16(pb, 0);
88
    }
89

  
90
    /* Sound data chunk */
91
    put_tag(pb, "SSND");
92
    aiff->ssnd = url_ftell(pb);         /* Sound chunk size */
93
    put_be32(pb, 0);                    /* Sound samples data size */
94
    put_be32(pb, 0);                    /* Data offset */
95
    put_be32(pb, 0);                    /* Block-size (block align) */
96

  
97
    av_set_pts_info(s->streams[0], 64, 1, s->streams[0]->codec->sample_rate);
98

  
99
    /* Data is starting here */
100
    put_flush_packet(pb);
101

  
102
    return 0;
103
}
104

  
105
static int aiff_write_packet(AVFormatContext *s, AVPacket *pkt)
106
{
107
    ByteIOContext *pb = s->pb;
108
    put_buffer(pb, pkt->data, pkt->size);
109
    return 0;
110
}
111

  
112
static int aiff_write_trailer(AVFormatContext *s)
113
{
114
    ByteIOContext *pb = s->pb;
115
    AIFFOutputContext *aiff = s->priv_data;
116
    AVCodecContext *enc = s->streams[0]->codec;
117

  
118
    /* Chunks sizes must be even */
119
    int64_t file_size, end_size;
120
    end_size = file_size = url_ftell(pb);
121
    if (file_size & 1) {
122
        put_byte(pb, 0);
123
        end_size++;
124
    }
125

  
126
    if (!url_is_streamed(s->pb)) {
127
        /* File length */
128
        url_fseek(pb, aiff->form, SEEK_SET);
129
        put_be32(pb, file_size - aiff->form - 4);
130

  
131
        /* Number of sample frames */
132
        url_fseek(pb, aiff->frames, SEEK_SET);
133
        put_be32(pb, (file_size-aiff->ssnd-12)/enc->block_align);
134

  
135
        /* Sound Data chunk size */
136
        url_fseek(pb, aiff->ssnd, SEEK_SET);
137
        put_be32(pb, file_size - aiff->ssnd - 4);
138

  
139
        /* return to the end */
140
        url_fseek(pb, end_size, SEEK_SET);
141

  
142
        put_flush_packet(pb);
143
    }
144

  
145
    return 0;
146
}
147

  
148
AVOutputFormat aiff_muxer = {
149
    "aiff",
150
    NULL_IF_CONFIG_SMALL("Audio IFF"),
151
    "audio/aiff",
152
    "aif,aiff,afc,aifc",
153
    sizeof(AIFFOutputContext),
154
    CODEC_ID_PCM_S16BE,
155
    CODEC_ID_NONE,
156
    aiff_write_header,
157
    aiff_write_packet,
158
    aiff_write_trailer,
159
    .codec_tag= (const AVCodecTag* const []){ff_codec_aiff_tags, 0},
160
};

Also available in: Unified diff