3 * Copyright (c) 2001,2003 BERO
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/intreadwrite.h"
30 * SEGA CRI adx codecs.
32 * Reference documents:
33 * http://ku-www.ss.titech.ac.jp/~yatsushi/adx.html
34 * adx2wav & wav2adx http://www.geocities.co.jp/Playtown/2004/
37 static av_cold
int adx_decode_init(AVCodecContext
*avctx
)
39 ADXContext
*c
= avctx
->priv_data
;
42 if (avctx
->extradata_size
>= 24) {
43 if ((ret
= ff_adx_decode_header(avctx
, avctx
->extradata
,
44 avctx
->extradata_size
, &header_size
,
46 av_log(avctx
, AV_LOG_ERROR
, "error parsing ADX header\n");
47 return AVERROR_INVALIDDATA
;
49 c
->channels
= avctx
->channels
;
53 avctx
->sample_fmt
= AV_SAMPLE_FMT_S16P
;
59 * Decode 32 samples from 18 bytes.
61 * A 16-bit scalar value is applied to 32 residuals, which then have a
62 * 2nd-order LPC filter applied to it to form the output signal for a single
65 static int adx_decode(ADXContext
*c
, int16_t *out
, int offset
,
66 const uint8_t *in
, int ch
)
68 ADXChannelState
*prev
= &c
->prev
[ch
];
70 int scale
= AV_RB16(in
);
74 /* check if this is an EOF packet */
78 init_get_bits(&gb
, in
+ 2, (BLOCK_SIZE
- 2) * 8);
82 for (i
= 0; i
< BLOCK_SAMPLES
; i
++) {
83 d
= get_sbits(&gb
, 4);
84 s0
= ((d
<< COEFF_BITS
) * scale
+ c
->coeff
[0] * s1
+ c
->coeff
[1] * s2
) >> COEFF_BITS
;
86 s1
= av_clip_int16(s0
);
95 static int adx_decode_frame(AVCodecContext
*avctx
, void *data
,
96 int *got_frame_ptr
, AVPacket
*avpkt
)
98 AVFrame
*frame
= data
;
99 int buf_size
= avpkt
->size
;
100 ADXContext
*c
= avctx
->priv_data
;
103 const uint8_t *buf
= avpkt
->data
;
104 const uint8_t *buf_end
= buf
+ avpkt
->size
;
105 int num_blocks
, ch
, ret
;
112 if (!c
->header_parsed
&& buf_size
>= 2 && AV_RB16(buf
) == 0x8000) {
114 if ((ret
= ff_adx_decode_header(avctx
, buf
, buf_size
, &header_size
,
116 av_log(avctx
, AV_LOG_ERROR
, "error parsing ADX header\n");
117 return AVERROR_INVALIDDATA
;
119 c
->channels
= avctx
->channels
;
120 c
->header_parsed
= 1;
121 if (buf_size
< header_size
)
122 return AVERROR_INVALIDDATA
;
124 buf_size
-= header_size
;
126 if (!c
->header_parsed
)
127 return AVERROR_INVALIDDATA
;
129 /* calculate number of blocks in the packet */
130 num_blocks
= buf_size
/ (BLOCK_SIZE
* c
->channels
);
132 /* if the packet is not an even multiple of BLOCK_SIZE, check for an EOF
134 if (!num_blocks
|| buf_size
% (BLOCK_SIZE
* avctx
->channels
)) {
135 if (buf_size
>= 4 && (AV_RB16(buf
) & 0x8000)) {
140 return AVERROR_INVALIDDATA
;
143 /* get output buffer */
144 frame
->nb_samples
= num_blocks
* BLOCK_SAMPLES
;
145 if ((ret
= ff_get_buffer(avctx
, frame
, 0)) < 0)
147 samples
= (int16_t **)frame
->extended_data
;
150 while (num_blocks
--) {
151 for (ch
= 0; ch
< c
->channels
; ch
++) {
152 if (buf_end
- buf
< BLOCK_SIZE
|| adx_decode(c
, samples
[ch
], samples_offset
, buf
, ch
)) {
154 buf
= avpkt
->data
+ avpkt
->size
;
157 buf_size
-= BLOCK_SIZE
;
161 samples_offset
+= BLOCK_SAMPLES
;
164 frame
->nb_samples
= samples_offset
;
167 return buf
- avpkt
->data
;
170 static void adx_decode_flush(AVCodecContext
*avctx
)
172 ADXContext
*c
= avctx
->priv_data
;
173 memset(c
->prev
, 0, sizeof(c
->prev
));
177 AVCodec ff_adpcm_adx_decoder
= {
179 .long_name
= NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"),
180 .type
= AVMEDIA_TYPE_AUDIO
,
181 .id
= AV_CODEC_ID_ADPCM_ADX
,
182 .priv_data_size
= sizeof(ADXContext
),
183 .init
= adx_decode_init
,
184 .decode
= adx_decode_frame
,
185 .flush
= adx_decode_flush
,
186 .capabilities
= CODEC_CAP_DR1
,
187 .sample_fmts
= (const enum AVSampleFormat
[]) { AV_SAMPLE_FMT_S16P
,
188 AV_SAMPLE_FMT_NONE
},