# HG changeset patch # User diego # Date 1175981658 0 # Node ID e7a4bc0aa0fe41f241ade73acb1a2d2e1d7ca67e # Parent 2af9c2f9b44df58bf6122dda6781967583a2d900 CRYO APC demuxer patch by Anssi Hannula, anssi.hannula gmail com diff -r 2af9c2f9b44d -r e7a4bc0aa0fe Makefile --- a/Makefile Sat Apr 07 20:51:58 2007 +0000 +++ b/Makefile Sat Apr 07 21:34:18 2007 +0000 @@ -17,6 +17,7 @@ OBJS-$(CONFIG_AIFF_MUXER) += aiff.o riff.o OBJS-$(CONFIG_AMR_DEMUXER) += amr.o OBJS-$(CONFIG_AMR_MUXER) += amr.o +OBJS-$(CONFIG_APC_DEMUXER) += apc.o OBJS-$(CONFIG_ASF_DEMUXER) += asf.o riff.o OBJS-$(CONFIG_ASF_MUXER) += asf-enc.o riff.o OBJS-$(CONFIG_ASF_STREAM_MUXER) += asf-enc.o riff.o diff -r 2af9c2f9b44d -r e7a4bc0aa0fe allformats.c --- a/allformats.c Sat Apr 07 20:51:58 2007 +0000 +++ b/allformats.c Sat Apr 07 21:34:18 2007 +0000 @@ -49,6 +49,7 @@ REGISTER_MUXER (ADTS, adts); REGISTER_MUXDEMUX(AIFF, aiff); REGISTER_MUXDEMUX(AMR, amr); + REGISTER_DEMUXER (APC, apc); REGISTER_MUXDEMUX(ASF, asf); REGISTER_MUXER (ASF_STREAM, asf_stream); REGISTER_MUXDEMUX(AU, au); diff -r 2af9c2f9b44d -r e7a4bc0aa0fe allformats.h --- a/allformats.h Sat Apr 07 20:51:58 2007 +0000 +++ b/allformats.h Sat Apr 07 21:34:18 2007 +0000 @@ -26,6 +26,7 @@ extern AVInputFormat ac3_demuxer; extern AVInputFormat aiff_demuxer; extern AVInputFormat amr_demuxer; +extern AVInputFormat apc_demuxer; extern AVInputFormat asf_demuxer; extern AVInputFormat au_demuxer; extern AVInputFormat audio_demuxer; diff -r 2af9c2f9b44d -r e7a4bc0aa0fe apc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/apc.c Sat Apr 07 21:34:18 2007 +0000 @@ -0,0 +1,93 @@ +/* + * CRYO APC audio format demuxer + * Copyright (c) 2007 Anssi Hannula + * + * 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 "avformat.h" +#include "string.h" + +static int apc_probe(AVProbeData *p) +{ + if (p->buf_size < 8) + return 0; + + if (!strncmp(p->buf, "CRYO_APC", 8)) + return AVPROBE_SCORE_MAX; + + return 0; +} + +static int apc_read_header(AVFormatContext *s, AVFormatParameters *ap) +{ + ByteIOContext *pb = &s->pb; + AVStream *st; + + get_le32(pb); /* CRYO */ + get_le32(pb); /* _APC */ + get_le32(pb); /* 1.20 */ + + st = av_new_stream(s, 0); + if (!st) + return AVERROR_NOMEM; + + st->codec->codec_type = CODEC_TYPE_AUDIO; + st->codec->codec_id = CODEC_ID_ADPCM_IMA_WS; + + get_le32(pb); /* number of samples */ + st->codec->sample_rate = get_le32(pb); + + st->codec->extradata_size = 2 * 4; + st->codec->extradata = av_malloc(st->codec->extradata_size + + FF_INPUT_BUFFER_PADDING_SIZE); + if (!st->codec->extradata) + return AVERROR_NOMEM; + + /* initial predictor values for adpcm decoder */ + get_buffer(pb, st->codec->extradata, 2 * 4); + + st->codec->channels = 1; + if (get_le32(pb)) + st->codec->channels = 2; + + st->codec->bits_per_sample = 4; + st->codec->bit_rate = st->codec->bits_per_sample * st->codec->channels + * st->codec->sample_rate; + st->codec->block_align = 1; + + return 0; +} + +#define MAX_READ_SIZE 4096 + +static int apc_read_packet(AVFormatContext *s, AVPacket *pkt) +{ + if (av_get_packet(&s->pb, pkt, MAX_READ_SIZE) <= 0) + return AVERROR_IO; + pkt->stream_index = 0; + return 0; +} + +AVInputFormat apc_demuxer = { + "apc", + "CRYO APC format", + 0, + apc_probe, + apc_read_header, + apc_read_packet, +};