Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6147 serge 1
/*
2
 * Core Audio Format demuxer
3
 * Copyright (c) 2007 Justin Ruggles
4
 * Copyright (c) 2009 Peter Ross
5
 *
6
 * This file is part of FFmpeg.
7
 *
8
 * FFmpeg is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU Lesser General Public
10
 * License as published by the Free Software Foundation; either
11
 * version 2.1 of the License, or (at your option) any later version.
12
 *
13
 * FFmpeg is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
 * Lesser General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Lesser General Public
19
 * License along with FFmpeg; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
 */
22
 
23
/**
24
 * @file
25
 * Core Audio Format demuxer
26
 */
27
 
28
#include 
29
 
30
#include "avformat.h"
31
#include "internal.h"
32
#include "isom.h"
33
#include "mov_chan.h"
34
#include "libavutil/intreadwrite.h"
35
#include "libavutil/intfloat.h"
36
#include "libavutil/dict.h"
37
#include "caf.h"
38
 
39
typedef struct CafContext {
40
    int bytes_per_packet;           ///< bytes in a packet, or 0 if variable
41
    int frames_per_packet;          ///< frames in a packet, or 0 if variable
42
    int64_t num_bytes;              ///< total number of bytes in stream
43
 
44
    int64_t packet_cnt;             ///< packet counter
45
    int64_t frame_cnt;              ///< frame counter
46
 
47
    int64_t data_start;             ///< data start position, in bytes
48
    int64_t data_size;              ///< raw data size, in bytes
49
} CafContext;
50
 
51
static int probe(AVProbeData *p)
52
{
53
    if (AV_RB32(p->buf) == MKBETAG('c','a','f','f') && AV_RB16(&p->buf[4]) == 1)
54
        return AVPROBE_SCORE_MAX;
55
    return 0;
56
}
57
 
58
/** Read audio description chunk */
59
static int read_desc_chunk(AVFormatContext *s)
60
{
61
    AVIOContext *pb = s->pb;
62
    CafContext *caf = s->priv_data;
63
    AVStream *st;
64
    int flags;
65
 
66
    /* new audio stream */
67
    st = avformat_new_stream(s, NULL);
68
    if (!st)
69
        return AVERROR(ENOMEM);
70
 
71
    /* parse format description */
72
    st->codec->codec_type  = AVMEDIA_TYPE_AUDIO;
73
    st->codec->sample_rate = av_int2double(avio_rb64(pb));
74
    st->codec->codec_tag   = avio_rl32(pb);
75
    flags = avio_rb32(pb);
76
    caf->bytes_per_packet  = avio_rb32(pb);
77
    st->codec->block_align = caf->bytes_per_packet;
78
    caf->frames_per_packet = avio_rb32(pb);
79
    st->codec->channels    = avio_rb32(pb);
80
    st->codec->bits_per_coded_sample = avio_rb32(pb);
81
 
82
    /* calculate bit rate for constant size packets */
83
    if (caf->frames_per_packet > 0 && caf->bytes_per_packet > 0) {
84
        st->codec->bit_rate = (uint64_t)st->codec->sample_rate * (uint64_t)caf->bytes_per_packet * 8
85
                              / (uint64_t)caf->frames_per_packet;
86
    } else {
87
        st->codec->bit_rate = 0;
88
    }
89
 
90
    /* determine codec */
91
    if (st->codec->codec_tag == MKTAG('l','p','c','m'))
92
        st->codec->codec_id = ff_mov_get_lpcm_codec_id(st->codec->bits_per_coded_sample, (flags ^ 0x2) | 0x4);
93
    else
94
        st->codec->codec_id = ff_codec_get_id(ff_codec_caf_tags, st->codec->codec_tag);
95
    return 0;
96
}
97
 
98
/** Read magic cookie chunk */
99
static int read_kuki_chunk(AVFormatContext *s, int64_t size)
100
{
101
    AVIOContext *pb = s->pb;
102
    AVStream *st      = s->streams[0];
103
 
104
    if (size < 0 || size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
105
        return -1;
106
 
107
    if (st->codec->codec_id == AV_CODEC_ID_AAC) {
108
        /* The magic cookie format for AAC is an mp4 esds atom.
109
           The lavc AAC decoder requires the data from the codec specific
110
           description as extradata input. */
111
        int strt, skip;
112
 
113
        strt = avio_tell(pb);
114
        ff_mov_read_esds(s, pb);
115
        skip = size - (avio_tell(pb) - strt);
116
        if (skip < 0 || !st->codec->extradata ||
117
            st->codec->codec_id != AV_CODEC_ID_AAC) {
118
            av_log(s, AV_LOG_ERROR, "invalid AAC magic cookie\n");
119
            return AVERROR_INVALIDDATA;
120
        }
121
        avio_skip(pb, skip);
122
    } else if (st->codec->codec_id == AV_CODEC_ID_ALAC) {
123
#define ALAC_PREAMBLE 12
124
#define ALAC_HEADER   36
125
#define ALAC_NEW_KUKI 24
126
        uint8_t preamble[12];
127
        if (size < ALAC_NEW_KUKI) {
128
            av_log(s, AV_LOG_ERROR, "invalid ALAC magic cookie\n");
129
            avio_skip(pb, size);
130
            return AVERROR_INVALIDDATA;
131
        }
132
        if (avio_read(pb, preamble, ALAC_PREAMBLE) != ALAC_PREAMBLE) {
133
            av_log(s, AV_LOG_ERROR, "failed to read preamble\n");
134
            return AVERROR_INVALIDDATA;
135
        }
136
 
137
        av_freep(&st->codec->extradata);
138
        if (ff_alloc_extradata(st->codec, ALAC_HEADER))
139
            return AVERROR(ENOMEM);
140
 
141
        /* For the old style cookie, we skip 12 bytes, then read 36 bytes.
142
         * The new style cookie only contains the last 24 bytes of what was
143
         * 36 bytes in the old style cookie, so we fabricate the first 12 bytes
144
         * in that case to maintain compatibility. */
145
        if (!memcmp(&preamble[4], "frmaalac", 8)) {
146
            if (size < ALAC_PREAMBLE + ALAC_HEADER) {
147
                av_log(s, AV_LOG_ERROR, "invalid ALAC magic cookie\n");
148
                av_freep(&st->codec->extradata);
149
                return AVERROR_INVALIDDATA;
150
            }
151
            if (avio_read(pb, st->codec->extradata, ALAC_HEADER) != ALAC_HEADER) {
152
                av_log(s, AV_LOG_ERROR, "failed to read kuki header\n");
153
                av_freep(&st->codec->extradata);
154
                return AVERROR_INVALIDDATA;
155
            }
156
            avio_skip(pb, size - ALAC_PREAMBLE - ALAC_HEADER);
157
        } else {
158
            AV_WB32(st->codec->extradata, 36);
159
            memcpy(&st->codec->extradata[4], "alac", 4);
160
            AV_WB32(&st->codec->extradata[8], 0);
161
            memcpy(&st->codec->extradata[12], preamble, 12);
162
            if (avio_read(pb, &st->codec->extradata[24], ALAC_NEW_KUKI - 12) != ALAC_NEW_KUKI - 12) {
163
                av_log(s, AV_LOG_ERROR, "failed to read new kuki header\n");
164
                av_freep(&st->codec->extradata);
165
                return AVERROR_INVALIDDATA;
166
            }
167
            avio_skip(pb, size - ALAC_NEW_KUKI);
168
        }
169
    } else {
170
        av_freep(&st->codec->extradata);
171
        if (ff_get_extradata(st->codec, pb, size) < 0)
172
            return AVERROR(ENOMEM);
173
    }
174
 
175
    return 0;
176
}
177
 
178
/** Read packet table chunk */
179
static int read_pakt_chunk(AVFormatContext *s, int64_t size)
180
{
181
    AVIOContext *pb = s->pb;
182
    AVStream *st      = s->streams[0];
183
    CafContext *caf   = s->priv_data;
184
    int64_t pos = 0, ccount, num_packets;
185
    int i;
186
 
187
    ccount = avio_tell(pb);
188
 
189
    num_packets = avio_rb64(pb);
190
    if (num_packets < 0 || INT32_MAX / sizeof(AVIndexEntry) < num_packets)
191
        return AVERROR_INVALIDDATA;
192
 
193
    st->nb_frames  = avio_rb64(pb); /* valid frames */
194
    st->nb_frames += avio_rb32(pb); /* priming frames */
195
    st->nb_frames += avio_rb32(pb); /* remainder frames */
196
 
197
    st->duration = 0;
198
    for (i = 0; i < num_packets; i++) {
199
        av_add_index_entry(s->streams[0], pos, st->duration, 0, 0, AVINDEX_KEYFRAME);
200
        pos += caf->bytes_per_packet ? caf->bytes_per_packet : ff_mp4_read_descr_len(pb);
201
        st->duration += caf->frames_per_packet ? caf->frames_per_packet : ff_mp4_read_descr_len(pb);
202
    }
203
 
204
    if (avio_tell(pb) - ccount > size) {
205
        av_log(s, AV_LOG_ERROR, "error reading packet table\n");
206
        return AVERROR_INVALIDDATA;
207
    }
208
    avio_skip(pb, ccount + size - avio_tell(pb));
209
 
210
    caf->num_bytes = pos;
211
    return 0;
212
}
213
 
214
/** Read information chunk */
215
static void read_info_chunk(AVFormatContext *s, int64_t size)
216
{
217
    AVIOContext *pb = s->pb;
218
    unsigned int i;
219
    unsigned int nb_entries = avio_rb32(pb);
220
    for (i = 0; i < nb_entries && !avio_feof(pb); i++) {
221
        char key[32];
222
        char value[1024];
223
        avio_get_str(pb, INT_MAX, key, sizeof(key));
224
        avio_get_str(pb, INT_MAX, value, sizeof(value));
225
        av_dict_set(&s->metadata, key, value, 0);
226
    }
227
}
228
 
229
static int read_header(AVFormatContext *s)
230
{
231
    AVIOContext *pb = s->pb;
232
    CafContext *caf = s->priv_data;
233
    AVStream *st;
234
    uint32_t tag = 0;
235
    int found_data, ret;
236
    int64_t size, pos;
237
 
238
    avio_skip(pb, 8); /* magic, version, file flags */
239
 
240
    /* audio description chunk */
241
    if (avio_rb32(pb) != MKBETAG('d','e','s','c')) {
242
        av_log(s, AV_LOG_ERROR, "desc chunk not present\n");
243
        return AVERROR_INVALIDDATA;
244
    }
245
    size = avio_rb64(pb);
246
    if (size != 32)
247
        return AVERROR_INVALIDDATA;
248
 
249
    ret = read_desc_chunk(s);
250
    if (ret)
251
        return ret;
252
    st = s->streams[0];
253
 
254
    /* parse each chunk */
255
    found_data = 0;
256
    while (!avio_feof(pb)) {
257
 
258
        /* stop at data chunk if seeking is not supported or
259
           data chunk size is unknown */
260
        if (found_data && (caf->data_size < 0 || !pb->seekable))
261
            break;
262
 
263
        tag  = avio_rb32(pb);
264
        size = avio_rb64(pb);
265
        pos  = avio_tell(pb);
266
        if (avio_feof(pb))
267
            break;
268
 
269
        switch (tag) {
270
        case MKBETAG('d','a','t','a'):
271
            avio_skip(pb, 4); /* edit count */
272
            caf->data_start = avio_tell(pb);
273
            caf->data_size  = size < 0 ? -1 : size - 4;
274
            if (caf->data_size > 0 && pb->seekable)
275
                avio_skip(pb, caf->data_size);
276
            found_data = 1;
277
            break;
278
 
279
        case MKBETAG('c','h','a','n'):
280
            if ((ret = ff_mov_read_chan(s, s->pb, st, size)) < 0)
281
                return ret;
282
            break;
283
 
284
        /* magic cookie chunk */
285
        case MKBETAG('k','u','k','i'):
286
            if (read_kuki_chunk(s, size))
287
                return AVERROR_INVALIDDATA;
288
            break;
289
 
290
        /* packet table chunk */
291
        case MKBETAG('p','a','k','t'):
292
            if (read_pakt_chunk(s, size))
293
                return AVERROR_INVALIDDATA;
294
            break;
295
 
296
        case MKBETAG('i','n','f','o'):
297
            read_info_chunk(s, size);
298
            break;
299
 
300
        default:
301
#define _(x) ((x) >= ' ' ? (x) : ' ')
302
            av_log(s, AV_LOG_WARNING,
303
                   "skipping CAF chunk: %08"PRIX32" (%c%c%c%c), size %"PRId64"\n",
304
                tag, _(tag>>24), _((tag>>16)&0xFF), _((tag>>8)&0xFF), _(tag&0xFF), size);
305
#undef _
306
        case MKBETAG('f','r','e','e'):
307
            if (size < 0)
308
                return AVERROR_INVALIDDATA;
309
            break;
310
        }
311
 
312
        if (size > 0) {
313
            if (pos > INT64_MAX - size)
314
                return AVERROR_INVALIDDATA;
315
            avio_skip(pb, FFMAX(0, pos + size - avio_tell(pb)));
316
        }
317
    }
318
 
319
    if (!found_data)
320
        return AVERROR_INVALIDDATA;
321
 
322
    if (caf->bytes_per_packet > 0 && caf->frames_per_packet > 0) {
323
        if (caf->data_size > 0)
324
            st->nb_frames = (caf->data_size / caf->bytes_per_packet) * caf->frames_per_packet;
325
    } else if (st->nb_index_entries && st->duration > 0) {
326
        st->codec->bit_rate = st->codec->sample_rate * caf->data_size * 8 /
327
                              st->duration;
328
    } else {
329
        av_log(s, AV_LOG_ERROR, "Missing packet table. It is required when "
330
                                "block size or frame size are variable.\n");
331
        return AVERROR_INVALIDDATA;
332
    }
333
 
334
    avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
335
    st->start_time = 0;
336
 
337
    /* position the stream at the start of data */
338
    if (caf->data_size >= 0)
339
        avio_seek(pb, caf->data_start, SEEK_SET);
340
 
341
    return 0;
342
}
343
 
344
#define CAF_MAX_PKT_SIZE 4096
345
 
346
static int read_packet(AVFormatContext *s, AVPacket *pkt)
347
{
348
    AVIOContext *pb = s->pb;
349
    AVStream *st      = s->streams[0];
350
    CafContext *caf   = s->priv_data;
351
    int res, pkt_size = 0, pkt_frames = 0;
352
    int64_t left      = CAF_MAX_PKT_SIZE;
353
 
354
    if (avio_feof(pb))
355
        return AVERROR_EOF;
356
 
357
    /* don't read past end of data chunk */
358
    if (caf->data_size > 0) {
359
        left = (caf->data_start + caf->data_size) - avio_tell(pb);
360
        if (!left)
361
            return AVERROR_EOF;
362
        if (left < 0)
363
            return AVERROR(EIO);
364
    }
365
 
366
    pkt_frames = caf->frames_per_packet;
367
    pkt_size   = caf->bytes_per_packet;
368
 
369
    if (pkt_size > 0 && pkt_frames == 1) {
370
        pkt_size   = (CAF_MAX_PKT_SIZE / pkt_size) * pkt_size;
371
        pkt_size   = FFMIN(pkt_size, left);
372
        pkt_frames = pkt_size / caf->bytes_per_packet;
373
    } else if (st->nb_index_entries) {
374
        if (caf->packet_cnt < st->nb_index_entries - 1) {
375
            pkt_size   = st->index_entries[caf->packet_cnt + 1].pos       - st->index_entries[caf->packet_cnt].pos;
376
            pkt_frames = st->index_entries[caf->packet_cnt + 1].timestamp - st->index_entries[caf->packet_cnt].timestamp;
377
        } else if (caf->packet_cnt == st->nb_index_entries - 1) {
378
            pkt_size   = caf->num_bytes - st->index_entries[caf->packet_cnt].pos;
379
            pkt_frames = st->duration   - st->index_entries[caf->packet_cnt].timestamp;
380
        } else {
381
            return AVERROR(EIO);
382
        }
383
    }
384
 
385
    if (pkt_size == 0 || pkt_frames == 0 || pkt_size > left)
386
        return AVERROR(EIO);
387
 
388
    res = av_get_packet(pb, pkt, pkt_size);
389
    if (res < 0)
390
        return res;
391
 
392
    pkt->size           = res;
393
    pkt->stream_index   = 0;
394
    pkt->dts = pkt->pts = caf->frame_cnt;
395
 
396
    caf->packet_cnt++;
397
    caf->frame_cnt += pkt_frames;
398
 
399
    return 0;
400
}
401
 
402
static int read_seek(AVFormatContext *s, int stream_index,
403
                     int64_t timestamp, int flags)
404
{
405
    AVStream *st = s->streams[0];
406
    CafContext *caf = s->priv_data;
407
    int64_t pos, packet_cnt, frame_cnt;
408
 
409
    timestamp = FFMAX(timestamp, 0);
410
 
411
    if (caf->frames_per_packet > 0 && caf->bytes_per_packet > 0) {
412
        /* calculate new byte position based on target frame position */
413
        pos = caf->bytes_per_packet * (timestamp / caf->frames_per_packet);
414
        if (caf->data_size > 0)
415
            pos = FFMIN(pos, caf->data_size);
416
        packet_cnt = pos / caf->bytes_per_packet;
417
        frame_cnt  = caf->frames_per_packet * packet_cnt;
418
    } else if (st->nb_index_entries) {
419
        packet_cnt = av_index_search_timestamp(st, timestamp, flags);
420
        frame_cnt  = st->index_entries[packet_cnt].timestamp;
421
        pos        = st->index_entries[packet_cnt].pos;
422
    } else {
423
        return -1;
424
    }
425
 
426
    if (avio_seek(s->pb, pos + caf->data_start, SEEK_SET) < 0)
427
        return -1;
428
 
429
    caf->packet_cnt = packet_cnt;
430
    caf->frame_cnt  = frame_cnt;
431
 
432
    return 0;
433
}
434
 
435
AVInputFormat ff_caf_demuxer = {
436
    .name           = "caf",
437
    .long_name      = NULL_IF_CONFIG_SMALL("Apple CAF (Core Audio Format)"),
438
    .priv_data_size = sizeof(CafContext),
439
    .read_probe     = probe,
440
    .read_header    = read_header,
441
    .read_packet    = read_packet,
442
    .read_seek      = read_seek,
443
    .codec_tag      = (const AVCodecTag* const []){ ff_codec_caf_tags, 0 },
444
};