00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "libavutil/channel_layout.h"
00023 #include "avformat.h"
00024
00025 static int daud_header(AVFormatContext *s) {
00026 AVStream *st = avformat_new_stream(s, NULL);
00027 if (!st)
00028 return AVERROR(ENOMEM);
00029 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
00030 st->codec->codec_id = AV_CODEC_ID_PCM_S24DAUD;
00031 st->codec->codec_tag = MKTAG('d', 'a', 'u', 'd');
00032 st->codec->channels = 6;
00033 st->codec->channel_layout = AV_CH_LAYOUT_5POINT1;
00034 st->codec->sample_rate = 96000;
00035 st->codec->bit_rate = 3 * 6 * 96000 * 8;
00036 st->codec->block_align = 3 * 6;
00037 st->codec->bits_per_coded_sample = 24;
00038 return 0;
00039 }
00040
00041 static int daud_packet(AVFormatContext *s, AVPacket *pkt) {
00042 AVIOContext *pb = s->pb;
00043 int ret, size;
00044 if (url_feof(pb))
00045 return AVERROR(EIO);
00046 size = avio_rb16(pb);
00047 avio_rb16(pb);
00048 ret = av_get_packet(pb, pkt, size);
00049 pkt->stream_index = 0;
00050 return ret;
00051 }
00052
00053 static int daud_write_header(struct AVFormatContext *s)
00054 {
00055 AVCodecContext *codec = s->streams[0]->codec;
00056 if (codec->channels!=6 || codec->sample_rate!=96000)
00057 return -1;
00058 return 0;
00059 }
00060
00061 static int daud_write_packet(struct AVFormatContext *s, AVPacket *pkt)
00062 {
00063 if (pkt->size > 65535) {
00064 av_log(s, AV_LOG_ERROR,
00065 "Packet size too large for s302m. (%d > 65535)\n", pkt->size);
00066 return -1;
00067 }
00068 avio_wb16(s->pb, pkt->size);
00069 avio_wb16(s->pb, 0x8010);
00070 avio_write(s->pb, pkt->data, pkt->size);
00071 avio_flush(s->pb);
00072 return 0;
00073 }
00074
00075 #if CONFIG_DAUD_DEMUXER
00076 AVInputFormat ff_daud_demuxer = {
00077 .name = "daud",
00078 .long_name = NULL_IF_CONFIG_SMALL("D-Cinema audio"),
00079 .read_header = daud_header,
00080 .read_packet = daud_packet,
00081 .extensions = "302,daud",
00082 };
00083 #endif
00084
00085 #if CONFIG_DAUD_MUXER
00086 AVOutputFormat ff_daud_muxer = {
00087 .name = "daud",
00088 .long_name = NULL_IF_CONFIG_SMALL("D-Cinema audio"),
00089 .extensions = "302",
00090 .audio_codec = AV_CODEC_ID_PCM_S24DAUD,
00091 .video_codec = AV_CODEC_ID_NONE,
00092 .write_header = daud_write_header,
00093 .write_packet = daud_write_packet,
00094 .flags = AVFMT_NOTIMESTAMPS,
00095 };
00096 #endif