annotate ffmpeg/libavformat/ircamdec.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * IRCAM demuxer
yading@11 3 * Copyright (c) 2012 Paul B Mahol
yading@11 4 *
yading@11 5 * This file is part of FFmpeg.
yading@11 6 *
yading@11 7 * FFmpeg is free software; you can redistribute it and/or
yading@11 8 * modify it under the terms of the GNU Lesser General Public
yading@11 9 * License as published by the Free Software Foundation; either
yading@11 10 * version 2.1 of the License, or (at your option) any later version.
yading@11 11 *
yading@11 12 * FFmpeg is distributed in the hope that it will be useful,
yading@11 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 15 * Lesser General Public License for more details.
yading@11 16 *
yading@11 17 * You should have received a copy of the GNU Lesser General Public
yading@11 18 * License along with FFmpeg; if not, write to the Free Software
yading@11 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 20 */
yading@11 21
yading@11 22 #include "libavutil/intreadwrite.h"
yading@11 23 #include "avformat.h"
yading@11 24 #include "internal.h"
yading@11 25 #include "pcm.h"
yading@11 26 #include "ircam.h"
yading@11 27
yading@11 28 static int ircam_probe(AVProbeData *p)
yading@11 29 {
yading@11 30 if ((p->buf[0] == 0x64 && p->buf[1] == 0xA3 && p->buf[3] == 0x00 &&
yading@11 31 p->buf[2] >= 1 && p->buf[2] <= 4) ||
yading@11 32 (p->buf[3] == 0x64 && p->buf[2] == 0xA3 && p->buf[0] == 0x00 &&
yading@11 33 p->buf[1] >= 1 && p->buf[1] <= 3) &&
yading@11 34 AV_RN32(p->buf + 4) && AV_RN32(p->buf + 8))
yading@11 35 return AVPROBE_SCORE_MAX / 4 * 3;
yading@11 36 return 0;
yading@11 37 }
yading@11 38
yading@11 39 static const struct endianess {
yading@11 40 uint32_t magic;
yading@11 41 int is_le;
yading@11 42 } table[] = {
yading@11 43 { 0x64A30100, 0 },
yading@11 44 { 0x64A30200, 1 },
yading@11 45 { 0x64A30300, 0 },
yading@11 46 { 0x64A30400, 1 },
yading@11 47 { 0x0001A364, 1 },
yading@11 48 { 0x0002A364, 0 },
yading@11 49 { 0x0003A364, 1 },
yading@11 50 };
yading@11 51
yading@11 52 static int ircam_read_header(AVFormatContext *s)
yading@11 53 {
yading@11 54 uint32_t magic, sample_rate, channels, tag;
yading@11 55 const AVCodecTag *tags;
yading@11 56 int le = -1, i;
yading@11 57 AVStream *st;
yading@11 58
yading@11 59 magic = avio_rl32(s->pb);
yading@11 60 for (i = 0; i < 7; i++) {
yading@11 61 if (magic == table[i].magic) {
yading@11 62 le = table[i].is_le;
yading@11 63 break;
yading@11 64 }
yading@11 65 }
yading@11 66
yading@11 67 if (le == 1) {
yading@11 68 sample_rate = av_int2float(avio_rl32(s->pb));
yading@11 69 channels = avio_rl32(s->pb);
yading@11 70 tag = avio_rl32(s->pb);
yading@11 71 tags = ff_codec_ircam_le_tags;
yading@11 72 } else if (le == 0) {
yading@11 73 sample_rate = av_int2float(avio_rb32(s->pb));
yading@11 74 channels = avio_rb32(s->pb);
yading@11 75 tag = avio_rb32(s->pb);
yading@11 76 tags = ff_codec_ircam_be_tags;
yading@11 77 } else {
yading@11 78 return AVERROR_INVALIDDATA;
yading@11 79 }
yading@11 80
yading@11 81 if (!channels || !sample_rate)
yading@11 82 return AVERROR_INVALIDDATA;
yading@11 83
yading@11 84 st = avformat_new_stream(s, NULL);
yading@11 85 if (!st)
yading@11 86 return AVERROR(ENOMEM);
yading@11 87
yading@11 88 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
yading@11 89 st->codec->channels = channels;
yading@11 90 st->codec->sample_rate = sample_rate;
yading@11 91
yading@11 92 st->codec->codec_id = ff_codec_get_id(tags, tag);
yading@11 93 if (st->codec->codec_id == AV_CODEC_ID_NONE) {
yading@11 94 av_log(s, AV_LOG_ERROR, "unknown tag %X\n", tag);
yading@11 95 return AVERROR_INVALIDDATA;
yading@11 96 }
yading@11 97
yading@11 98 st->codec->bits_per_coded_sample = av_get_bits_per_sample(st->codec->codec_id);
yading@11 99 st->codec->block_align = st->codec->bits_per_coded_sample * st->codec->channels / 8;
yading@11 100 avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
yading@11 101 avio_skip(s->pb, 1008);
yading@11 102
yading@11 103 return 0;
yading@11 104 }
yading@11 105
yading@11 106 AVInputFormat ff_ircam_demuxer = {
yading@11 107 .name = "ircam",
yading@11 108 .long_name = NULL_IF_CONFIG_SMALL("Berkeley/IRCAM/CARL Sound Format"),
yading@11 109 .read_probe = ircam_probe,
yading@11 110 .read_header = ircam_read_header,
yading@11 111 .read_packet = ff_pcm_read_packet,
yading@11 112 .read_seek = ff_pcm_read_seek,
yading@11 113 .extensions = "sf,ircam",
yading@11 114 .flags = AVFMT_GENERIC_INDEX,
yading@11 115 };