Statistics
| Branch: | Revision:

ffmpeg / libavformat / daud.c @ 2912e87a

History | View | Annotate | Download (2.54 KB)

1
/*
2
 * D-Cinema audio demuxer
3
 * Copyright (c) 2005 Reimar Döffinger
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
#include "avformat.h"
22

    
23
static int daud_header(AVFormatContext *s, AVFormatParameters *ap) {
24
    AVStream *st = av_new_stream(s, 0);
25
    if (!st)
26
        return AVERROR(ENOMEM);
27
    st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
28
    st->codec->codec_id = CODEC_ID_PCM_S24DAUD;
29
    st->codec->codec_tag = MKTAG('d', 'a', 'u', 'd');
30
    st->codec->channels = 6;
31
    st->codec->sample_rate = 96000;
32
    st->codec->bit_rate = 3 * 6 * 96000 * 8;
33
    st->codec->block_align = 3 * 6;
34
    st->codec->bits_per_coded_sample = 24;
35
    return 0;
36
}
37

    
38
static int daud_packet(AVFormatContext *s, AVPacket *pkt) {
39
    AVIOContext *pb = s->pb;
40
    int ret, size;
41
    if (pb->eof_reached)
42
        return AVERROR(EIO);
43
    size = avio_rb16(pb);
44
    avio_rb16(pb); // unknown
45
    ret = av_get_packet(pb, pkt, size);
46
    pkt->stream_index = 0;
47
    return ret;
48
}
49

    
50
static int daud_write_header(struct AVFormatContext *s)
51
{
52
    AVCodecContext *codec = s->streams[0]->codec;
53
    if (codec->channels!=6 || codec->sample_rate!=96000)
54
        return -1;
55
    return 0;
56
}
57

    
58
static int daud_write_packet(struct AVFormatContext *s, AVPacket *pkt)
59
{
60
    avio_wb16(s->pb, pkt->size);
61
    avio_wb16(s->pb, 0x8010); // unknown
62
    avio_write(s->pb, pkt->data, pkt->size);
63
    avio_flush(s->pb);
64
    return 0;
65
}
66

    
67
#if CONFIG_DAUD_DEMUXER
68
AVInputFormat ff_daud_demuxer = {
69
    "daud",
70
    NULL_IF_CONFIG_SMALL("D-Cinema audio format"),
71
    0,
72
    NULL,
73
    daud_header,
74
    daud_packet,
75
    NULL,
76
    NULL,
77
    .extensions = "302",
78
};
79
#endif
80

    
81
#if CONFIG_DAUD_MUXER
82
AVOutputFormat ff_daud_muxer =
83
{
84
    "daud",
85
    NULL_IF_CONFIG_SMALL("D-Cinema audio format"),
86
    NULL,
87
    "302",
88
    0,
89
    CODEC_ID_PCM_S24DAUD,
90
    CODEC_ID_NONE,
91
    daud_write_header,
92
    daud_write_packet,
93
    .flags= AVFMT_NOTIMESTAMPS,
94
};
95
#endif