FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/adxdec.c
Date: 2026-08-11 17:55:23
Exec Total Coverage
Lines: 77 120 64.2%
Functions: 4 5 80.0%
Branches: 39 78 50.0%

Line Branch Exec Source
1 /*
2 * ADX ADPCM codecs
3 * Copyright (c) 2001,2003 BERO
4 *
5 * This file is part of FFmpeg.
6 *
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.
11 *
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.
16 *
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
20 */
21
22 #include "libavutil/attributes.h"
23 #include "libavutil/intreadwrite.h"
24 #include "avcodec.h"
25 #include "adx.h"
26 #include "codec_internal.h"
27 #include "decode.h"
28 #include "get_bits.h"
29
30 /**
31 * @file
32 * SEGA CRI adx codecs.
33 *
34 * Reference documents:
35 * http://ku-www.ss.titech.ac.jp/~yatsushi/adx.html
36 * adx2wav & wav2adx http://www.geocities.co.jp/Playtown/2004/
37 */
38
39 /**
40 * Decode ADX stream header.
41 * Sets avctx->channels and avctx->sample_rate.
42 *
43 * @param avctx codec context
44 * @param buf header data
45 * @param bufsize data size, should be at least 24 bytes
46 * @param[out] header_size size of ADX header
47 * @param[out] coeff 2 LPC coefficients, can be NULL
48 * @return data offset or negative error code if header is invalid
49 */
50 4 static int adx_decode_header(AVCodecContext *avctx, const uint8_t *buf,
51 int bufsize, int *header_size, int *coeff)
52 {
53 int offset, cutoff, channels;
54
55
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (bufsize < 24)
56 return AVERROR_INVALIDDATA;
57
58
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (AV_RB16(buf) != 0x8000)
59 return AVERROR_INVALIDDATA;
60 4 offset = AV_RB16(buf + 2) + 4;
61
62 /* if copyright string is within the provided data, validate it */
63
3/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
4 if (bufsize >= offset && offset >= 6 && memcmp(buf + offset - 6, "(c)CRI", 6))
64 return AVERROR_INVALIDDATA;
65
66 /* check for encoding=3 block_size=18, sample_size=4 */
67
3/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
4 if (buf[4] != 3 || buf[5] != 18 || buf[6] != 4) {
68 avpriv_request_sample(avctx, "Support for this ADX format");
69 return AVERROR_PATCHWELCOME;
70 }
71
72 /* channels */
73 4 channels = buf[7];
74
2/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
4 if (channels <= 0 || channels > MAX_CHANNELS)
75 return AVERROR_INVALIDDATA;
76
77
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (avctx->ch_layout.nb_channels != channels) {
78 av_channel_layout_uninit(&avctx->ch_layout);
79 avctx->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
80 avctx->ch_layout.nb_channels = channels;
81 }
82
83 /* sample rate */
84 4 avctx->sample_rate = AV_RB32(buf + 8);
85
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 if (avctx->sample_rate < 1 ||
86
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 avctx->sample_rate > INT_MAX / (channels * BLOCK_SIZE * 8))
87 return AVERROR_INVALIDDATA;
88
89 /* bit rate */
90 4 avctx->bit_rate = avctx->sample_rate * channels * BLOCK_SIZE * 8 / BLOCK_SAMPLES;
91
92 /* LPC coefficients */
93
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 if (coeff) {
94 4 cutoff = AV_RB16(buf + 16);
95 4 ff_adx_calculate_coeffs(cutoff, avctx->sample_rate, COEFF_BITS, coeff);
96 }
97
98 4 *header_size = offset;
99 4 return 0;
100 }
101
102 4 static av_cold int adx_decode_init(AVCodecContext *avctx)
103 {
104 4 ADXContext *c = avctx->priv_data;
105 int ret, header_size;
106
107
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
4 if (avctx->extradata_size >= 24) {
108
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if ((ret = adx_decode_header(avctx, avctx->extradata,
109 avctx->extradata_size, &header_size,
110 2 c->coeff)) < 0) {
111 av_log(avctx, AV_LOG_ERROR, "error parsing ADX header\n");
112 return AVERROR_INVALIDDATA;
113 }
114 2 c->channels = avctx->ch_layout.nb_channels;
115 2 c->header_parsed = 1;
116 }
117
118 4 avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
119
120 4 return 0;
121 }
122
123 /**
124 * Decode 32 samples from 18 bytes.
125 *
126 * A 16-bit scalar value is applied to 32 residuals, which then have a
127 * 2nd-order LPC filter applied to it to form the output signal for a single
128 * channel.
129 */
130 16544 static int adx_decode(ADXContext *c, int16_t *out, int offset,
131 const uint8_t *in, int ch)
132 {
133 16544 ADXChannelState *prev = &c->prev[ch];
134 GetBitContext gb;
135 16544 int scale = AV_RB16(in);
136 int i;
137 int s0, s1, s2, d;
138
139 /* check if this is an EOF packet */
140
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16544 times.
16544 if (scale & 0x8000)
141 return -1;
142
143 16544 init_get_bits(&gb, in + 2, (BLOCK_SIZE - 2) * 8);
144 16544 out += offset;
145 16544 s1 = prev->s1;
146 16544 s2 = prev->s2;
147
2/2
✓ Branch 0 taken 529408 times.
✓ Branch 1 taken 16544 times.
545952 for (i = 0; i < BLOCK_SAMPLES; i++) {
148 529408 d = get_sbits(&gb, 4);
149 529408 s0 = d * scale + ((c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS);
150 529408 s2 = s1;
151 529408 s1 = av_clip_int16(s0);
152 529408 *out++ = s1;
153 }
154 16544 prev->s1 = s1;
155 16544 prev->s2 = s2;
156
157 16544 return 0;
158 }
159
160 8272 static int adx_decode_frame(AVCodecContext *avctx, AVFrame *frame,
161 int *got_frame_ptr, AVPacket *avpkt)
162 {
163 8272 int buf_size = avpkt->size;
164 8272 ADXContext *c = avctx->priv_data;
165 int16_t **samples;
166 int samples_offset;
167 8272 const uint8_t *buf = avpkt->data;
168 8272 const uint8_t *buf_end = buf + avpkt->size;
169 int num_blocks, ch, ret;
170 size_t new_extradata_size;
171 uint8_t *new_extradata;
172
173 8272 new_extradata = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA,
174 &new_extradata_size);
175
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8272 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
8272 if (new_extradata && new_extradata_size > 0) {
176 int old_channels = c->channels;
177 int header_size;
178 if ((ret = adx_decode_header(avctx, new_extradata,
179 new_extradata_size, &header_size,
180 c->coeff)) < 0) {
181 av_log(avctx, AV_LOG_ERROR, "error parsing new ADX extradata\n");
182 return AVERROR_INVALIDDATA;
183 }
184
185 c->channels = avctx->ch_layout.nb_channels;
186 c->header_parsed = 1;
187 if (old_channels != c->channels)
188 memset(c->prev, 0, sizeof(c->prev));
189 c->eof = 0;
190 }
191
192
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8272 times.
8272 if (c->eof) {
193 *got_frame_ptr = 0;
194 return buf_size;
195 }
196
197
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8270 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
8272 if (!c->header_parsed && buf_size >= 2 && AV_RB16(buf) == 0x8000) {
198 int header_size;
199
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if ((ret = adx_decode_header(avctx, buf, buf_size, &header_size,
200 2 c->coeff)) < 0) {
201 av_log(avctx, AV_LOG_ERROR, "error parsing ADX header\n");
202 return AVERROR_INVALIDDATA;
203 }
204 2 c->channels = avctx->ch_layout.nb_channels;
205 2 c->header_parsed = 1;
206
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (buf_size < header_size)
207 return AVERROR_INVALIDDATA;
208 2 buf += header_size;
209 2 buf_size -= header_size;
210 }
211
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8272 times.
8272 if (!c->header_parsed)
212 return AVERROR_INVALIDDATA;
213
214 /* calculate number of blocks in the packet */
215 8272 num_blocks = buf_size / (BLOCK_SIZE * c->channels);
216
217 /* if the packet is not an even multiple of BLOCK_SIZE, check for an EOF
218 packet */
219
2/4
✓ Branch 0 taken 8272 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8272 times.
8272 if (!num_blocks || buf_size % (BLOCK_SIZE * c->channels)) {
220 if (buf_size >= 4 && (AV_RB16(buf) & 0x8000)) {
221 c->eof = 1;
222 *got_frame_ptr = 0;
223 return avpkt->size;
224 }
225 return AVERROR_INVALIDDATA;
226 }
227
228 /* get output buffer */
229 8272 frame->nb_samples = num_blocks * BLOCK_SAMPLES;
230
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 8272 times.
8272 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
231 return ret;
232 8272 samples = (int16_t **)frame->extended_data;
233 8272 samples_offset = 0;
234
235
2/2
✓ Branch 0 taken 8272 times.
✓ Branch 1 taken 8272 times.
16544 while (num_blocks--) {
236
2/2
✓ Branch 0 taken 16544 times.
✓ Branch 1 taken 8272 times.
24816 for (ch = 0; ch < c->channels; ch++) {
237
2/4
✓ Branch 0 taken 16544 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 16544 times.
16544 if (buf_end - buf < BLOCK_SIZE || adx_decode(c, samples[ch], samples_offset, buf, ch)) {
238 c->eof = 1;
239 buf = avpkt->data + avpkt->size;
240 break;
241 }
242 16544 buf_size -= BLOCK_SIZE;
243 16544 buf += BLOCK_SIZE;
244 }
245
1/2
✓ Branch 0 taken 8272 times.
✗ Branch 1 not taken.
8272 if (!c->eof)
246 8272 samples_offset += BLOCK_SAMPLES;
247 }
248
249 8272 frame->nb_samples = samples_offset;
250 8272 *got_frame_ptr = 1;
251
252 8272 return buf - avpkt->data;
253 }
254
255 static av_cold void adx_decode_flush(AVCodecContext *avctx)
256 {
257 ADXContext *c = avctx->priv_data;
258 memset(c->prev, 0, sizeof(c->prev));
259 c->eof = 0;
260 }
261
262 const FFCodec ff_adpcm_adx_decoder = {
263 .p.name = "adpcm_adx",
264 CODEC_LONG_NAME("SEGA CRI ADX ADPCM"),
265 .p.type = AVMEDIA_TYPE_AUDIO,
266 .p.id = AV_CODEC_ID_ADPCM_ADX,
267 .priv_data_size = sizeof(ADXContext),
268 .init = adx_decode_init,
269 FF_CODEC_DECODE_CB(adx_decode_frame),
270 .flush = adx_decode_flush,
271 .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF |
272 AV_CODEC_CAP_DR1,
273 };
274