patch by Anssi Hannula, anssi.hannula gmail com Originally committed as revision 8656 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
@@ -79,6 +79,7 @@ version <next> | |||||
- Blackfin optimizations | - Blackfin optimizations | ||||
- Interplay C93 demuxer and video decoder | - Interplay C93 demuxer and video decoder | ||||
- Bethsoft VID demuxer and video decoder | - Bethsoft VID demuxer and video decoder | ||||
- CRYO APC demuxer | |||||
version 0.4.9-pre1: | version 0.4.9-pre1: | ||||
@@ -907,6 +907,8 @@ different game cutscenes repacked for use with ScummVM. | |||||
@tab Used in the game Cyberia from Interplay. | @tab Used in the game Cyberia from Interplay. | ||||
@item Bethsoft VID @tab @tab X | @item Bethsoft VID @tab @tab X | ||||
@tab Used in some games from Bethesda Softworks. | @tab Used in some games from Bethesda Softworks. | ||||
@item CRYO APC @tab @tab X | |||||
@tab Audio format used in some games by CRYO Interactive Entertainment. | |||||
@end multitable | @end multitable | ||||
@code{X} means that encoding (resp. decoding) is supported. | @code{X} means that encoding (resp. decoding) is supported. | ||||
@@ -612,6 +612,12 @@ static int adpcm_decode_init(AVCodecContext * avctx) | |||||
case CODEC_ID_ADPCM_CT: | case CODEC_ID_ADPCM_CT: | ||||
c->status[0].step = c->status[1].step = 511; | c->status[0].step = c->status[1].step = 511; | ||||
break; | break; | ||||
case CODEC_ID_ADPCM_IMA_WS: | |||||
if (avctx->extradata && avctx->extradata_size == 2 * 4) { | |||||
c->status[0].predictor = AV_RL32(avctx->extradata); | |||||
c->status[1].predictor = AV_RL32(avctx->extradata + 4); | |||||
} | |||||
break; | |||||
default: | default: | ||||
break; | break; | ||||
} | } | ||||
@@ -17,6 +17,7 @@ OBJS-$(CONFIG_AIFF_DEMUXER) += aiff.o riff.o | |||||
OBJS-$(CONFIG_AIFF_MUXER) += aiff.o riff.o | OBJS-$(CONFIG_AIFF_MUXER) += aiff.o riff.o | ||||
OBJS-$(CONFIG_AMR_DEMUXER) += amr.o | OBJS-$(CONFIG_AMR_DEMUXER) += amr.o | ||||
OBJS-$(CONFIG_AMR_MUXER) += 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_DEMUXER) += asf.o riff.o | ||||
OBJS-$(CONFIG_ASF_MUXER) += asf-enc.o riff.o | OBJS-$(CONFIG_ASF_MUXER) += asf-enc.o riff.o | ||||
OBJS-$(CONFIG_ASF_STREAM_MUXER) += asf-enc.o riff.o | OBJS-$(CONFIG_ASF_STREAM_MUXER) += asf-enc.o riff.o | ||||
@@ -49,6 +49,7 @@ void av_register_all(void) | |||||
REGISTER_MUXER (ADTS, adts); | REGISTER_MUXER (ADTS, adts); | ||||
REGISTER_MUXDEMUX(AIFF, aiff); | REGISTER_MUXDEMUX(AIFF, aiff); | ||||
REGISTER_MUXDEMUX(AMR, amr); | REGISTER_MUXDEMUX(AMR, amr); | ||||
REGISTER_DEMUXER (APC, apc); | |||||
REGISTER_MUXDEMUX(ASF, asf); | REGISTER_MUXDEMUX(ASF, asf); | ||||
REGISTER_MUXER (ASF_STREAM, asf_stream); | REGISTER_MUXER (ASF_STREAM, asf_stream); | ||||
REGISTER_MUXDEMUX(AU, au); | REGISTER_MUXDEMUX(AU, au); | ||||
@@ -26,6 +26,7 @@ extern AVInputFormat aac_demuxer; | |||||
extern AVInputFormat ac3_demuxer; | extern AVInputFormat ac3_demuxer; | ||||
extern AVInputFormat aiff_demuxer; | extern AVInputFormat aiff_demuxer; | ||||
extern AVInputFormat amr_demuxer; | extern AVInputFormat amr_demuxer; | ||||
extern AVInputFormat apc_demuxer; | |||||
extern AVInputFormat asf_demuxer; | extern AVInputFormat asf_demuxer; | ||||
extern AVInputFormat au_demuxer; | extern AVInputFormat au_demuxer; | ||||
extern AVInputFormat audio_demuxer; | extern AVInputFormat audio_demuxer; | ||||
@@ -0,0 +1,93 @@ | |||||
/* | |||||
* CRYO APC audio format demuxer | |||||
* Copyright (c) 2007 Anssi Hannula <anssi.hannula@gmail.com> | |||||
* | |||||
* 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, | |||||
}; |