2 * Wavesynth pseudo-codec
3 * Copyright (c) 2011 Nicolas George
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"
23 #include "libavutil/log.h"
24 #include "libavutil/mem.h"
26 #include "codec_internal.h"
31 #define WS_MAX_CHANNELS 32
32 #define INF_TS 0x7FFFFFFFFFFFFFFF
37 Format of the extradata and packets
39 THIS INFORMATION IS NOT PART OF THE PUBLIC API OR ABI.
40 IT CAN CHANGE WITHOUT NOTIFICATION.
42 All numbers are in little endian.
44 The codec extradata define a set of intervals with uniform content.
45 Overlapping intervals are added together.
48 uint32 number of intervals
52 int64 start timestamp; time_base must be 1/sample_rate;
53 start timestamps must be in ascending order
57 ... additional information, depends on type
59 sine interval (type fourcc "SINE"):
60 int32 start frequency, in 1/(1<<16) Hz
62 int32 start amplitude, 1<<16 is the full amplitude
64 uint32 start phase, 0 is sin(0), 0x20000000 is sin(pi/2), etc.;
65 n | (1<<31) means to match the phase of previous channel #n
67 pink noise interval (type fourcc "NOIS"):
71 The input packets encode the time and duration of the requested segment.
79 enum ws_interval_type
{
80 WS_SINE
= MKTAG('S','I','N','E'),
81 WS_NOISE
= MKTAG('N','O','I','S'),
85 int64_t ts_start
, ts_end
;
86 uint64_t phi0
, dphi0
, ddphi
;
88 uint64_t phi
, dphi
, amp
;
90 enum ws_interval_type type
;
94 struct wavesynth_context
{
98 struct ws_interval
*inter
;
99 uint32_t dither_state
;
101 int32_t pink_pool
[PINK_UNIT
];
102 unsigned pink_need
, pink_pos
;
108 #define LCG_A 1284865837
109 #define LCG_C 4150755663
110 #define LCG_AI 849225893 /* A*AI = 1 [mod 1<<32] */
112 static uint32_t lcg_next(uint32_t *s
)
114 *s
= *s
* LCG_A
+ LCG_C
;
118 static void lcg_seek(uint32_t *s
, uint32_t dt
)
120 uint32_t a
, c
, t
= *s
;
127 c
*= a
+ 1; /* coefficients for a double step */
134 /* Emulate pink noise by summing white noise at the sampling frequency,
135 * white noise at half the sampling frequency (each value taken twice),
136 * etc., with a total of 8 octaves.
137 * This is known as the Voss-McCartney algorithm. */
139 static void pink_fill(struct wavesynth_context
*ws
)
141 int32_t vt
[7] = { 0 }, v
= 0;
147 for (i
= 0; i
< PINK_UNIT
; i
++) {
148 for (j
= 0; j
< 7; j
++) {
152 vt
[j
] = (int32_t)lcg_next(&ws
->pink_state
) >> 3;
155 ws
->pink_pool
[i
] = v
+ ((int32_t)lcg_next(&ws
->pink_state
) >> 3);
157 lcg_next(&ws
->pink_state
); /* so we use exactly 256 steps */
161 * @return (1<<64) * a / b, without overflow, if a < b
163 static uint64_t frac64(uint64_t a
, uint64_t b
)
168 if (b
< (uint64_t)1 << 32) { /* b small, use two 32-bits steps */
170 return ((a
/ b
) << 32) | ((a
% b
) << 32) / b
;
172 if (b
< (uint64_t)1 << 48) { /* b medium, use four 16-bits steps */
173 for (i
= 0; i
< 4; i
++) {
175 r
= (r
<< 16) | (a
/ b
);
180 for (i
= 63; i
>= 0; i
--) {
181 if (a
>= (uint64_t)1 << 63 || a
<< 1 >= b
) {
182 r
|= (uint64_t)1 << i
;
191 static uint64_t phi_at(struct ws_interval
*in
, int64_t ts
)
193 uint64_t dt
= ts
- (uint64_t)in
->ts_start
;
194 uint64_t dt2
= dt
& 1 ? /* dt * (dt - 1) / 2 without overflow */
195 dt
* ((dt
- 1) >> 1) : (dt
>> 1) * (dt
- 1);
196 return in
->phi0
+ dt
* in
->dphi0
+ dt2
* in
->ddphi
;
199 static void wavesynth_seek(struct wavesynth_context
*ws
, int64_t ts
)
202 struct ws_interval
*in
;
204 last
= &ws
->cur_inter
;
205 for (i
= 0; i
< ws
->nb_inter
; i
++) {
207 if (ts
< in
->ts_start
)
209 if (ts
>= in
->ts_end
)
213 in
->phi
= phi_at(in
, ts
);
214 in
->dphi
= in
->dphi0
+ (ts
- in
->ts_start
) * in
->ddphi
;
215 in
->amp
= in
->amp0
+ (ts
- in
->ts_start
) * in
->damp
;
218 ws
->next_ts
= i
< ws
->nb_inter
? ws
->inter
[i
].ts_start
: INF_TS
;
220 lcg_seek(&ws
->dither_state
, (uint32_t)ts
- (uint32_t)ws
->cur_ts
);
222 uint64_t pink_ts_cur
= (ws
->cur_ts
+ (uint64_t)PINK_UNIT
- 1) & ~(PINK_UNIT
- 1);
223 uint64_t pink_ts_next
= ts
& ~(PINK_UNIT
- 1);
224 int pos
= ts
& (PINK_UNIT
- 1);
225 lcg_seek(&ws
->pink_state
, (uint32_t)(pink_ts_next
- pink_ts_cur
) * 2);
230 ws
->pink_pos
= PINK_UNIT
;
236 static int wavesynth_parse_extradata(AVCodecContext
*avc
)
238 struct wavesynth_context
*ws
= avc
->priv_data
;
239 struct ws_interval
*in
;
240 uint8_t *edata
, *edata_end
;
241 int32_t f1
, f2
, a1
, a2
;
243 int64_t dphi1
, dphi2
, dt
, cur_ts
= -0x8000000000000000;
246 if (avc
->extradata_size
< 4)
247 return AVERROR(EINVAL
);
248 edata
= avc
->extradata
;
249 edata_end
= edata
+ avc
->extradata_size
;
250 ws
->nb_inter
= AV_RL32(edata
);
252 if (ws
->nb_inter
< 0 || (edata_end
- edata
) / 24 < ws
->nb_inter
)
253 return AVERROR(EINVAL
);
254 ws
->inter
= av_calloc(ws
->nb_inter
, sizeof(*ws
->inter
));
256 return AVERROR(ENOMEM
);
257 for (i
= 0; i
< ws
->nb_inter
; i
++) {
259 if (edata_end
- edata
< 24)
260 return AVERROR(EINVAL
);
261 in
->ts_start
= AV_RL64(edata
+ 0);
262 in
->ts_end
= AV_RL64(edata
+ 8);
263 in
->type
= AV_RL32(edata
+ 16);
264 in
->channels
= AV_RL32(edata
+ 20);
266 if (in
->ts_start
< cur_ts
||
267 in
->ts_end
<= in
->ts_start
||
268 (uint64_t)in
->ts_end
- in
->ts_start
> INT64_MAX
270 return AVERROR(EINVAL
);
271 cur_ts
= in
->ts_start
;
272 dt
= in
->ts_end
- in
->ts_start
;
275 if (edata_end
- edata
< 20 || avc
->sample_rate
<= 0)
276 return AVERROR(EINVAL
);
277 f1
= AV_RL32(edata
+ 0);
278 f2
= AV_RL32(edata
+ 4);
279 a1
= AV_RL32(edata
+ 8);
280 a2
= AV_RL32(edata
+ 12);
281 phi
= AV_RL32(edata
+ 16);
283 dphi1
= frac64(f1
, (int64_t)avc
->sample_rate
<< 16);
284 dphi2
= frac64(f2
, (int64_t)avc
->sample_rate
<< 16);
286 in
->ddphi
= (int64_t)(dphi2
- (uint64_t)dphi1
) / dt
;
287 if (phi
& 0x80000000) {
290 return AVERROR(EINVAL
);
291 in
->phi0
= phi_at(&ws
->inter
[phi
], in
->ts_start
);
293 in
->phi0
= (uint64_t)phi
<< 33;
297 if (edata_end
- edata
< 8)
298 return AVERROR(EINVAL
);
299 a1
= AV_RL32(edata
+ 0);
300 a2
= AV_RL32(edata
+ 4);
304 return AVERROR(EINVAL
);
306 in
->amp0
= (uint64_t)a1
<< 32;
307 in
->damp
= (int64_t)(((uint64_t)a2
<< 32) - ((uint64_t)a1
<< 32)) / dt
;
309 if (edata
!= edata_end
)
310 return AVERROR(EINVAL
);
314 static av_cold
int wavesynth_init(AVCodecContext
*avc
)
316 struct wavesynth_context
*ws
= avc
->priv_data
;
319 if (avc
->ch_layout
.nb_channels
> WS_MAX_CHANNELS
) {
320 av_log(avc
, AV_LOG_ERROR
,
321 "This implementation is limited to %d channels.\n",
323 return AVERROR(EINVAL
);
325 r
= wavesynth_parse_extradata(avc
);
327 av_log(avc
, AV_LOG_ERROR
, "Invalid intervals definitions.\n");
330 ws
->sin
= av_malloc(sizeof(*ws
->sin
) << SIN_BITS
);
332 return AVERROR(ENOMEM
);
333 for (i
= 0; i
< 1 << SIN_BITS
; i
++)
334 ws
->sin
[i
] = floor(32767 * sin(2 * M_PI
* i
/ (1 << SIN_BITS
)));
335 ws
->dither_state
= MKTAG('D','I','T','H');
336 for (i
= 0; i
< ws
->nb_inter
; i
++)
337 ws
->pink_need
+= ws
->inter
[i
].type
== WS_NOISE
;
338 ws
->pink_state
= MKTAG('P','I','N','K');
339 ws
->pink_pos
= PINK_UNIT
;
340 wavesynth_seek(ws
, 0);
341 avc
->sample_fmt
= AV_SAMPLE_FMT_S16
;
345 static void wavesynth_synth_sample(struct wavesynth_context
*ws
, int64_t ts
,
350 struct ws_interval
*in
;
352 uint32_t c
, all_ch
= 0;
355 last
= &ws
->cur_inter
;
356 if (ws
->pink_pos
== PINK_UNIT
)
358 pink
= ws
->pink_pool
[ws
->pink_pos
++] >> 16;
362 if (ts
>= in
->ts_end
) {
371 val
= amp
* (unsigned)ws
->sin
[in
->phi
>> (64 - SIN_BITS
)];
373 in
->dphi
+= in
->ddphi
;
376 val
= amp
* (unsigned)pink
;
381 all_ch
|= in
->channels
;
382 for (c
= in
->channels
, cv
= channels
; c
; c
>>= 1, cv
++)
384 *cv
+= (unsigned)val
;
386 val
= (int32_t)lcg_next(&ws
->dither_state
) >> 16;
387 for (c
= all_ch
, cv
= channels
; c
; c
>>= 1, cv
++)
392 static void wavesynth_enter_intervals(struct wavesynth_context
*ws
, int64_t ts
)
395 struct ws_interval
*in
;
397 last
= &ws
->cur_inter
;
398 for (i
= ws
->cur_inter
; i
>= 0; i
= ws
->inter
[i
].next
)
399 last
= &ws
->inter
[i
].next
;
400 for (i
= ws
->next_inter
; i
< ws
->nb_inter
; i
++) {
402 if (ts
< in
->ts_start
)
404 if (ts
>= in
->ts_end
)
409 in
->dphi
= in
->dphi0
;
413 ws
->next_ts
= i
< ws
->nb_inter
? ws
->inter
[i
].ts_start
: INF_TS
;
417 static int wavesynth_decode(AVCodecContext
*avc
, AVFrame
*frame
,
418 int *rgot_frame
, AVPacket
*packet
)
420 struct wavesynth_context
*ws
= avc
->priv_data
;
425 int32_t channels
[WS_MAX_CHANNELS
];
428 if (packet
->size
!= 12)
429 return AVERROR_INVALIDDATA
;
430 ts
= AV_RL64(packet
->data
);
431 if (ts
!= ws
->cur_ts
)
432 wavesynth_seek(ws
, ts
);
433 duration
= AV_RL32(packet
->data
+ 8);
435 return AVERROR(EINVAL
);
436 frame
->nb_samples
= duration
;
437 r
= ff_get_buffer(avc
, frame
, 0);
440 pcm
= (int16_t *)frame
->data
[0];
441 for (s
= 0; s
< duration
; s
++, ts
+=(uint64_t)1) {
442 memset(channels
, 0, avc
->ch_layout
.nb_channels
* sizeof(*channels
));
443 if (ts
>= ws
->next_ts
)
444 wavesynth_enter_intervals(ws
, ts
);
445 wavesynth_synth_sample(ws
, ts
, channels
);
446 for (c
= 0; c
< avc
->ch_layout
.nb_channels
; c
++)
447 *(pcm
++) = channels
[c
] >> 16;
449 ws
->cur_ts
+= (uint64_t)duration
;
454 static av_cold
int wavesynth_close(AVCodecContext
*avc
)
456 struct wavesynth_context
*ws
= avc
->priv_data
;
459 av_freep(&ws
->inter
);
463 const FFCodec ff_ffwavesynth_decoder
= {
464 .p
.name
= "wavesynth",
465 CODEC_LONG_NAME("Wave synthesis pseudo-codec"),
466 .p
.type
= AVMEDIA_TYPE_AUDIO
,
467 .p
.id
= AV_CODEC_ID_FFWAVESYNTH
,
468 .priv_data_size
= sizeof(struct wavesynth_context
),
469 .init
= wavesynth_init
,
470 .close
= wavesynth_close
,
471 FF_CODEC_DECODE_CB(wavesynth_decode
),
472 .p
.capabilities
= AV_CODEC_CAP_DR1
,
473 .caps_internal
= FF_CODEC_CAP_INIT_CLEANUP
,