118 lines · 3.6 KB · C
RawDownload
/* * IRCAM demuxer * Copyright (c) 2012 Paul B Mahol * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "libavutil/intreadwrite.h"#include "libavcodec/internal.h"#include "avformat.h"#include "internal.h"#include "pcm.h"#include "ircam.h" static int ircam_probe(AVProbeData *p){    if ((p->buf[0] == 0x64 && p->buf[1] == 0xA3 && p->buf[3] == 0x00 &&         p->buf[2] >=    1 && p->buf[2] <= 4) ||        (p->buf[3] == 0x64 && p->buf[2] == 0xA3 && p->buf[0] == 0x00 &&         p->buf[1] >=    1 && p->buf[1] <= 3) &&        AV_RN32(p->buf + 4) && AV_RN32(p->buf + 8))        return AVPROBE_SCORE_MAX / 4 * 3;    return 0;} static const struct endianess {    uint32_t magic;    int      is_le;} table[] = {  { 0x64A30100, 0 },  { 0x64A30200, 1 },  { 0x64A30300, 0 },  { 0x64A30400, 1 },  { 0x0001A364, 1 },  { 0x0002A364, 0 },  { 0x0003A364, 1 },}; static int ircam_read_header(AVFormatContext *s){    uint32_t magic, sample_rate, channels, tag;    const AVCodecTag *tags;    int le = -1, i;    AVStream *st;     magic = avio_rl32(s->pb);    for (i = 0; i < 7; i++) {        if (magic == table[i].magic) {            le = table[i].is_le;            break;        }    }     if (le == 1) {        sample_rate = av_int2float(avio_rl32(s->pb));        channels    = avio_rl32(s->pb);        tag         = avio_rl32(s->pb);        tags        = ff_codec_ircam_le_tags;    } else if (le == 0) {        sample_rate = av_int2float(avio_rb32(s->pb));        channels    = avio_rb32(s->pb);        tag         = avio_rb32(s->pb);        tags        = ff_codec_ircam_be_tags;    } else {        return AVERROR_INVALIDDATA;    }     if (!channels || !sample_rate)        return AVERROR_INVALIDDATA;     st = avformat_new_stream(s, NULL);    if (!st)        return AVERROR(ENOMEM);     st->codecpar->codec_type  = AVMEDIA_TYPE_AUDIO;    st->codecpar->channels    = channels;    if (st->codecpar->channels > FF_SANE_NB_CHANNELS)        return AVERROR(ENOSYS);    st->codecpar->sample_rate = sample_rate;     st->codecpar->codec_id = ff_codec_get_id(tags, tag);    if (st->codecpar->codec_id == AV_CODEC_ID_NONE) {        av_log(s, AV_LOG_ERROR, "unknown tag %"PRIx32"\n", tag);        return AVERROR_INVALIDDATA;    }     st->codecpar->bits_per_coded_sample = av_get_bits_per_sample(st->codecpar->codec_id);    st->codecpar->block_align = st->codecpar->bits_per_coded_sample * st->codecpar->channels / 8;    avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);    avio_skip(s->pb, 1008);     return 0;} AVInputFormat ff_ircam_demuxer = {    .name           = "ircam",    .long_name      = NULL_IF_CONFIG_SMALL("Berkeley/IRCAM/CARL Sound Format"),    .read_probe     = ircam_probe,    .read_header    = ircam_read_header,    .read_packet    = ff_pcm_read_packet,    .read_seek      = ff_pcm_read_seek,    .extensions     = "sf,ircam",    .flags          = AVFMT_GENERIC_INDEX,};

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t