FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/adxdec.c
Date: 2025-10-10 03:51:19
Exec Total Coverage
Lines: 77 115 67.0%
Functions: 4 5 80.0%
Branches: 39 76 51.3%

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 header_size;
177 if ((ret = adx_decode_header(avctx, new_extradata,
178 new_extradata_size, &header_size,
179 c->coeff)) < 0) {
180 av_log(avctx, AV_LOG_ERROR, "error parsing new ADX extradata\n");
181 return AVERROR_INVALIDDATA;
182 }
183
184 c->eof = 0;
185 }
186
187
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8272 times.
8272 if (c->eof) {
188 *got_frame_ptr = 0;
189 return buf_size;
190 }
191
192
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) {
193 int header_size;
194
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if ((ret = adx_decode_header(avctx, buf, buf_size, &header_size,
195 2 c->coeff)) < 0) {
196 av_log(avctx, AV_LOG_ERROR, "error parsing ADX header\n");
197 return AVERROR_INVALIDDATA;
198 }
199 2 c->channels = avctx->ch_layout.nb_channels;
200 2 c->header_parsed = 1;
201
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (buf_size < header_size)
202 return AVERROR_INVALIDDATA;
203 2 buf += header_size;
204 2 buf_size -= header_size;
205 }
206
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8272 times.
8272 if (!c->header_parsed)
207 return AVERROR_INVALIDDATA;
208
209 /* calculate number of blocks in the packet */
210 8272 num_blocks = buf_size / (BLOCK_SIZE * c->channels);
211
212 /* if the packet is not an even multiple of BLOCK_SIZE, check for an EOF
213 packet */
214
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)) {
215 if (buf_size >= 4 && (AV_RB16(buf) & 0x8000)) {
216 c->eof = 1;
217 *got_frame_ptr = 0;
218 return avpkt->size;
219 }
220 return AVERROR_INVALIDDATA;
221 }
222
223 /* get output buffer */
224 8272 frame->nb_samples = num_blocks * BLOCK_SAMPLES;
225
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 8272 times.
8272 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
226 return ret;
227 8272 samples = (int16_t **)frame->extended_data;
228 8272 samples_offset = 0;
229
230
2/2
✓ Branch 0 taken 8272 times.
✓ Branch 1 taken 8272 times.
16544 while (num_blocks--) {
231
2/2
✓ Branch 0 taken 16544 times.
✓ Branch 1 taken 8272 times.
24816 for (ch = 0; ch < c->channels; ch++) {
232
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)) {
233 c->eof = 1;
234 buf = avpkt->data + avpkt->size;
235 break;
236 }
237 16544 buf_size -= BLOCK_SIZE;
238 16544 buf += BLOCK_SIZE;
239 }
240
1/2
✓ Branch 0 taken 8272 times.
✗ Branch 1 not taken.
8272 if (!c->eof)
241 8272 samples_offset += BLOCK_SAMPLES;
242 }
243
244 8272 frame->nb_samples = samples_offset;
245 8272 *got_frame_ptr = 1;
246
247 8272 return buf - avpkt->data;
248 }
249
250 static av_cold void adx_decode_flush(AVCodecContext *avctx)
251 {
252 ADXContext *c = avctx->priv_data;
253 memset(c->prev, 0, sizeof(c->prev));
254 c->eof = 0;
255 }
256
257 const FFCodec ff_adpcm_adx_decoder = {
258 .p.name = "adpcm_adx",
259 CODEC_LONG_NAME("SEGA CRI ADX ADPCM"),
260 .p.type = AVMEDIA_TYPE_AUDIO,
261 .p.id = AV_CODEC_ID_ADPCM_ADX,
262 .priv_data_size = sizeof(ADXContext),
263 .init = adx_decode_init,
264 FF_CODEC_DECODE_CB(adx_decode_frame),
265 .flush = adx_decode_flush,
266 .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF |
267 AV_CODEC_CAP_DR1,
268 CODEC_SAMPLEFMTS(AV_SAMPLE_FMT_S16P),
269 };
270