annotate ffmpeg/libavcodec/ffwavesynth.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * Wavesynth pseudo-codec
yading@10 3 * Copyright (c) 2011 Nicolas George
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 #include "libavutil/intreadwrite.h"
yading@10 23 #include "libavutil/log.h"
yading@10 24 #include "avcodec.h"
yading@10 25 #include "internal.h"
yading@10 26
yading@10 27
yading@10 28 #define SIN_BITS 14
yading@10 29 #define WS_MAX_CHANNELS 32
yading@10 30 #define INF_TS 0x7FFFFFFFFFFFFFFF
yading@10 31
yading@10 32 #define PINK_UNIT 128
yading@10 33
yading@10 34 /*
yading@10 35 Format of the extradata and packets
yading@10 36
yading@10 37 THIS INFORMATION IS NOT PART OF THE PUBLIC API OR ABI.
yading@10 38 IT CAN CHANGE WITHOUT NOTIFICATION.
yading@10 39
yading@10 40 All numbers are in little endian.
yading@10 41
yading@10 42 The codec extradata define a set of intervals with uniform content.
yading@10 43 Overlapping intervals are added together.
yading@10 44
yading@10 45 extradata:
yading@10 46 uint32 number of intervals
yading@10 47 ... intervals
yading@10 48
yading@10 49 interval:
yading@10 50 int64 start timestamp; time_base must be 1/sample_rate;
yading@10 51 start timestamps must be in ascending order
yading@10 52 int64 end timestamp
yading@10 53 uint32 type
yading@10 54 uint32 channels mask
yading@10 55 ... additional information, depends on type
yading@10 56
yading@10 57 sine interval (type fourcc "SINE"):
yading@10 58 int32 start frequency, in 1/(1<<16) Hz
yading@10 59 int32 end frequency
yading@10 60 int32 start amplitude, 1<<16 is the full amplitude
yading@10 61 int32 end amplitude
yading@10 62 uint32 start phase, 0 is sin(0), 0x20000000 is sin(pi/2), etc.;
yading@10 63 n | (1<<31) means to match the phase of previous channel #n
yading@10 64
yading@10 65 pink noise interval (type fourcc "NOIS"):
yading@10 66 int32 start amplitude
yading@10 67 int32 end amplitude
yading@10 68
yading@10 69 The input packets encode the time and duration of the requested segment.
yading@10 70
yading@10 71 packet:
yading@10 72 int64 start timestamp
yading@10 73 int32 duration
yading@10 74
yading@10 75 */
yading@10 76
yading@10 77 enum ws_interval_type {
yading@10 78 WS_SINE = MKTAG('S','I','N','E'),
yading@10 79 WS_NOISE = MKTAG('N','O','I','S'),
yading@10 80 };
yading@10 81
yading@10 82 struct ws_interval {
yading@10 83 int64_t ts_start, ts_end;
yading@10 84 uint64_t phi0, dphi0, ddphi;
yading@10 85 uint64_t amp0, damp;
yading@10 86 uint64_t phi, dphi, amp;
yading@10 87 uint32_t channels;
yading@10 88 enum ws_interval_type type;
yading@10 89 int next;
yading@10 90 };
yading@10 91
yading@10 92 struct wavesynth_context {
yading@10 93 int64_t cur_ts;
yading@10 94 int64_t next_ts;
yading@10 95 int32_t *sin;
yading@10 96 AVFrame frame;
yading@10 97 struct ws_interval *inter;
yading@10 98 uint32_t dither_state;
yading@10 99 uint32_t pink_state;
yading@10 100 int32_t pink_pool[PINK_UNIT];
yading@10 101 unsigned pink_need, pink_pos;
yading@10 102 int nb_inter;
yading@10 103 int cur_inter;
yading@10 104 int next_inter;
yading@10 105 };
yading@10 106
yading@10 107 #define LCG_A 1284865837
yading@10 108 #define LCG_C 4150755663
yading@10 109 #define LCG_AI 849225893 /* A*AI = 1 [mod 1<<32] */
yading@10 110
yading@10 111 static uint32_t lcg_next(uint32_t *s)
yading@10 112 {
yading@10 113 *s = *s * LCG_A + LCG_C;
yading@10 114 return *s;
yading@10 115 }
yading@10 116
yading@10 117 static void lcg_seek(uint32_t *s, int64_t dt)
yading@10 118 {
yading@10 119 uint32_t a, c, t = *s;
yading@10 120
yading@10 121 if (dt >= 0) {
yading@10 122 a = LCG_A;
yading@10 123 c = LCG_C;
yading@10 124 } else { /* coefficients for a step backward */
yading@10 125 a = LCG_AI;
yading@10 126 c = (uint32_t)(LCG_AI * LCG_C);
yading@10 127 dt = -dt;
yading@10 128 }
yading@10 129 while (dt) {
yading@10 130 if (dt & 1)
yading@10 131 t = a * t + c;
yading@10 132 c *= a + 1; /* coefficients for a double step */
yading@10 133 a *= a;
yading@10 134 dt >>= 1;
yading@10 135 }
yading@10 136 *s = t;
yading@10 137 }
yading@10 138
yading@10 139 /* Emulate pink noise by summing white noise at the sampling frequency,
yading@10 140 * white noise at half the sampling frequency (each value taken twice),
yading@10 141 * etc., with a total of 8 octaves.
yading@10 142 * This is known as the Voss-McCartney algorithm. */
yading@10 143
yading@10 144 static void pink_fill(struct wavesynth_context *ws)
yading@10 145 {
yading@10 146 int32_t vt[7] = { 0 }, v = 0;
yading@10 147 int i, j;
yading@10 148
yading@10 149 ws->pink_pos = 0;
yading@10 150 if (!ws->pink_need)
yading@10 151 return;
yading@10 152 for (i = 0; i < PINK_UNIT; i++) {
yading@10 153 for (j = 0; j < 7; j++) {
yading@10 154 if ((i >> j) & 1)
yading@10 155 break;
yading@10 156 v -= vt[j];
yading@10 157 vt[j] = (int32_t)lcg_next(&ws->pink_state) >> 3;
yading@10 158 v += vt[j];
yading@10 159 }
yading@10 160 ws->pink_pool[i] = v + ((int32_t)lcg_next(&ws->pink_state) >> 3);
yading@10 161 }
yading@10 162 lcg_next(&ws->pink_state); /* so we use exactly 256 steps */
yading@10 163 }
yading@10 164
yading@10 165 /**
yading@10 166 * @return (1<<64) * a / b, without overflow, if a < b
yading@10 167 */
yading@10 168 static uint64_t frac64(uint64_t a, uint64_t b)
yading@10 169 {
yading@10 170 uint64_t r = 0;
yading@10 171 int i;
yading@10 172
yading@10 173 if (b < (uint64_t)1 << 32) { /* b small, use two 32-bits steps */
yading@10 174 a <<= 32;
yading@10 175 return ((a / b) << 32) | ((a % b) << 32) / b;
yading@10 176 }
yading@10 177 if (b < (uint64_t)1 << 48) { /* b medium, use four 16-bits steps */
yading@10 178 for (i = 0; i < 4; i++) {
yading@10 179 a <<= 16;
yading@10 180 r = (r << 16) | (a / b);
yading@10 181 a %= b;
yading@10 182 }
yading@10 183 return r;
yading@10 184 }
yading@10 185 for (i = 63; i >= 0; i--) {
yading@10 186 if (a >= (uint64_t)1 << 63 || a << 1 >= b) {
yading@10 187 r |= (uint64_t)1 << i;
yading@10 188 a = (a << 1) - b;
yading@10 189 } else {
yading@10 190 a <<= 1;
yading@10 191 }
yading@10 192 }
yading@10 193 return r;
yading@10 194 }
yading@10 195
yading@10 196 static uint64_t phi_at(struct ws_interval *in, int64_t ts)
yading@10 197 {
yading@10 198 uint64_t dt = ts - in->ts_start;
yading@10 199 uint64_t dt2 = dt & 1 ? /* dt * (dt - 1) / 2 without overflow */
yading@10 200 dt * ((dt - 1) >> 1) : (dt >> 1) * (dt - 1);
yading@10 201 return in->phi0 + dt * in->dphi0 + dt2 * in->ddphi;
yading@10 202 }
yading@10 203
yading@10 204 static void wavesynth_seek(struct wavesynth_context *ws, int64_t ts)
yading@10 205 {
yading@10 206 int *last, i;
yading@10 207 struct ws_interval *in;
yading@10 208
yading@10 209 last = &ws->cur_inter;
yading@10 210 for (i = 0; i < ws->nb_inter; i++) {
yading@10 211 in = &ws->inter[i];
yading@10 212 if (ts < in->ts_start)
yading@10 213 break;
yading@10 214 if (ts >= in->ts_end)
yading@10 215 continue;
yading@10 216 *last = i;
yading@10 217 last = &in->next;
yading@10 218 in->phi = phi_at(in, ts);
yading@10 219 in->dphi = in->dphi0 + (ts - in->ts_start) * in->ddphi;
yading@10 220 in->amp = in->amp0 + (ts - in->ts_start) * in->damp;
yading@10 221 }
yading@10 222 ws->next_inter = i;
yading@10 223 ws->next_ts = i < ws->nb_inter ? ws->inter[i].ts_start : INF_TS;
yading@10 224 *last = -1;
yading@10 225 lcg_seek(&ws->dither_state, ts - ws->cur_ts);
yading@10 226 if (ws->pink_need) {
yading@10 227 int64_t pink_ts_cur = (ws->cur_ts + PINK_UNIT - 1) & ~(PINK_UNIT - 1);
yading@10 228 int64_t pink_ts_next = ts & ~(PINK_UNIT - 1);
yading@10 229 int pos = ts & (PINK_UNIT - 1);
yading@10 230 lcg_seek(&ws->pink_state, (pink_ts_next - pink_ts_cur) << 1);
yading@10 231 if (pos) {
yading@10 232 pink_fill(ws);
yading@10 233 ws->pink_pos = pos;
yading@10 234 } else {
yading@10 235 ws->pink_pos = PINK_UNIT;
yading@10 236 }
yading@10 237 }
yading@10 238 ws->cur_ts = ts;
yading@10 239 }
yading@10 240
yading@10 241 static int wavesynth_parse_extradata(AVCodecContext *avc)
yading@10 242 {
yading@10 243 struct wavesynth_context *ws = avc->priv_data;
yading@10 244 struct ws_interval *in;
yading@10 245 uint8_t *edata, *edata_end;
yading@10 246 int32_t f1, f2, a1, a2;
yading@10 247 uint32_t phi;
yading@10 248 int64_t dphi1, dphi2, dt, cur_ts = -0x8000000000000000;
yading@10 249 int i;
yading@10 250
yading@10 251 if (avc->extradata_size < 4)
yading@10 252 return AVERROR(EINVAL);
yading@10 253 edata = avc->extradata;
yading@10 254 edata_end = edata + avc->extradata_size;
yading@10 255 ws->nb_inter = AV_RL32(edata);
yading@10 256 edata += 4;
yading@10 257 if (ws->nb_inter < 0)
yading@10 258 return AVERROR(EINVAL);
yading@10 259 ws->inter = av_calloc(ws->nb_inter, sizeof(*ws->inter));
yading@10 260 if (!ws->inter)
yading@10 261 return AVERROR(ENOMEM);
yading@10 262 for (i = 0; i < ws->nb_inter; i++) {
yading@10 263 in = &ws->inter[i];
yading@10 264 if (edata_end - edata < 24)
yading@10 265 return AVERROR(EINVAL);
yading@10 266 in->ts_start = AV_RL64(edata + 0);
yading@10 267 in->ts_end = AV_RL64(edata + 8);
yading@10 268 in->type = AV_RL32(edata + 16);
yading@10 269 in->channels = AV_RL32(edata + 20);
yading@10 270 edata += 24;
yading@10 271 if (in->ts_start < cur_ts || in->ts_end <= in->ts_start)
yading@10 272 return AVERROR(EINVAL);
yading@10 273 cur_ts = in->ts_start;
yading@10 274 dt = in->ts_end - in->ts_start;
yading@10 275 switch (in->type) {
yading@10 276 case WS_SINE:
yading@10 277 if (edata_end - edata < 20)
yading@10 278 return AVERROR(EINVAL);
yading@10 279 f1 = AV_RL32(edata + 0);
yading@10 280 f2 = AV_RL32(edata + 4);
yading@10 281 a1 = AV_RL32(edata + 8);
yading@10 282 a2 = AV_RL32(edata + 12);
yading@10 283 phi = AV_RL32(edata + 16);
yading@10 284 edata += 20;
yading@10 285 dphi1 = frac64(f1, (int64_t)avc->sample_rate << 16);
yading@10 286 dphi2 = frac64(f2, (int64_t)avc->sample_rate << 16);
yading@10 287 in->dphi0 = dphi1;
yading@10 288 in->ddphi = (dphi2 - dphi1) / dt;
yading@10 289 if (phi & 0x80000000) {
yading@10 290 phi &= ~0x80000000;
yading@10 291 if (phi >= i)
yading@10 292 return AVERROR(EINVAL);
yading@10 293 in->phi0 = phi_at(&ws->inter[phi], in->ts_start);
yading@10 294 } else {
yading@10 295 in->phi0 = (uint64_t)phi << 33;
yading@10 296 }
yading@10 297 break;
yading@10 298 case WS_NOISE:
yading@10 299 if (edata_end - edata < 8)
yading@10 300 return AVERROR(EINVAL);
yading@10 301 a1 = AV_RL32(edata + 0);
yading@10 302 a2 = AV_RL32(edata + 4);
yading@10 303 edata += 8;
yading@10 304 break;
yading@10 305 default:
yading@10 306 return AVERROR(EINVAL);
yading@10 307 }
yading@10 308 in->amp0 = (int64_t)a1 << 32;
yading@10 309 in->damp = (((int64_t)a2 << 32) - ((int64_t)a1 << 32)) / dt;
yading@10 310 }
yading@10 311 if (edata != edata_end)
yading@10 312 return AVERROR(EINVAL);
yading@10 313 return 0;
yading@10 314 }
yading@10 315
yading@10 316 static av_cold int wavesynth_init(AVCodecContext *avc)
yading@10 317 {
yading@10 318 struct wavesynth_context *ws = avc->priv_data;
yading@10 319 int i, r;
yading@10 320
yading@10 321 if (avc->channels > WS_MAX_CHANNELS) {
yading@10 322 av_log(avc, AV_LOG_ERROR,
yading@10 323 "This implementation is limited to %d channels.\n",
yading@10 324 WS_MAX_CHANNELS);
yading@10 325 return AVERROR(EINVAL);
yading@10 326 }
yading@10 327 r = wavesynth_parse_extradata(avc);
yading@10 328 if (r < 0) {
yading@10 329 av_log(avc, AV_LOG_ERROR, "Invalid intervals definitions.\n");
yading@10 330 goto fail;
yading@10 331 }
yading@10 332 ws->sin = av_malloc(sizeof(*ws->sin) << SIN_BITS);
yading@10 333 if (!ws->sin) {
yading@10 334 r = AVERROR(ENOMEM);
yading@10 335 goto fail;
yading@10 336 }
yading@10 337 for (i = 0; i < 1 << SIN_BITS; i++)
yading@10 338 ws->sin[i] = floor(32767 * sin(2 * M_PI * i / (1 << SIN_BITS)));
yading@10 339 ws->dither_state = MKTAG('D','I','T','H');
yading@10 340 for (i = 0; i < ws->nb_inter; i++)
yading@10 341 ws->pink_need += ws->inter[i].type == WS_NOISE;
yading@10 342 ws->pink_state = MKTAG('P','I','N','K');
yading@10 343 ws->pink_pos = PINK_UNIT;
yading@10 344 avcodec_get_frame_defaults(&ws->frame);
yading@10 345 avc->coded_frame = &ws->frame;
yading@10 346 wavesynth_seek(ws, 0);
yading@10 347 avc->sample_fmt = AV_SAMPLE_FMT_S16;
yading@10 348 return 0;
yading@10 349
yading@10 350 fail:
yading@10 351 av_free(ws->inter);
yading@10 352 av_free(ws->sin);
yading@10 353 return r;
yading@10 354 }
yading@10 355
yading@10 356 static void wavesynth_synth_sample(struct wavesynth_context *ws, int64_t ts,
yading@10 357 int32_t *channels)
yading@10 358 {
yading@10 359 int32_t amp, val, *cv;
yading@10 360 struct ws_interval *in;
yading@10 361 int i, *last, pink;
yading@10 362 uint32_t c, all_ch = 0;
yading@10 363
yading@10 364 i = ws->cur_inter;
yading@10 365 last = &ws->cur_inter;
yading@10 366 if (ws->pink_pos == PINK_UNIT)
yading@10 367 pink_fill(ws);
yading@10 368 pink = ws->pink_pool[ws->pink_pos++] >> 16;
yading@10 369 while (i >= 0) {
yading@10 370 in = &ws->inter[i];
yading@10 371 i = in->next;
yading@10 372 if (ts >= in->ts_end) {
yading@10 373 *last = i;
yading@10 374 continue;
yading@10 375 }
yading@10 376 last = &in->next;
yading@10 377 amp = in->amp >> 32;
yading@10 378 in->amp += in->damp;
yading@10 379 switch (in->type) {
yading@10 380 case WS_SINE:
yading@10 381 val = amp * ws->sin[in->phi >> (64 - SIN_BITS)];
yading@10 382 in->phi += in->dphi;
yading@10 383 in->dphi += in->ddphi;
yading@10 384 break;
yading@10 385 case WS_NOISE:
yading@10 386 val = amp * pink;
yading@10 387 break;
yading@10 388 default:
yading@10 389 val = 0;
yading@10 390 }
yading@10 391 all_ch |= in->channels;
yading@10 392 for (c = in->channels, cv = channels; c; c >>= 1, cv++)
yading@10 393 if (c & 1)
yading@10 394 *cv += val;
yading@10 395 }
yading@10 396 val = (int32_t)lcg_next(&ws->dither_state) >> 16;
yading@10 397 for (c = all_ch, cv = channels; c; c >>= 1, cv++)
yading@10 398 if (c & 1)
yading@10 399 *cv += val;
yading@10 400 }
yading@10 401
yading@10 402 static void wavesynth_enter_intervals(struct wavesynth_context *ws, int64_t ts)
yading@10 403 {
yading@10 404 int *last, i;
yading@10 405 struct ws_interval *in;
yading@10 406
yading@10 407 last = &ws->cur_inter;
yading@10 408 for (i = ws->cur_inter; i >= 0; i = ws->inter[i].next)
yading@10 409 last = &ws->inter[i].next;
yading@10 410 for (i = ws->next_inter; i < ws->nb_inter; i++) {
yading@10 411 in = &ws->inter[i];
yading@10 412 if (ts < in->ts_start)
yading@10 413 break;
yading@10 414 if (ts >= in->ts_end)
yading@10 415 continue;
yading@10 416 *last = i;
yading@10 417 last = &in->next;
yading@10 418 in->phi = in->phi0;
yading@10 419 in->dphi = in->dphi0;
yading@10 420 in->amp = in->amp0;
yading@10 421 }
yading@10 422 ws->next_inter = i;
yading@10 423 ws->next_ts = i < ws->nb_inter ? ws->inter[i].ts_start : INF_TS;
yading@10 424 *last = -1;
yading@10 425 }
yading@10 426
yading@10 427 static int wavesynth_decode(AVCodecContext *avc, void *rframe, int *rgot_frame,
yading@10 428 AVPacket *packet)
yading@10 429 {
yading@10 430 struct wavesynth_context *ws = avc->priv_data;
yading@10 431 int64_t ts;
yading@10 432 int duration;
yading@10 433 int s, c, r;
yading@10 434 int16_t *pcm;
yading@10 435 int32_t channels[WS_MAX_CHANNELS];
yading@10 436
yading@10 437 *rgot_frame = 0;
yading@10 438 if (packet->size != 12)
yading@10 439 return AVERROR_INVALIDDATA;
yading@10 440 ts = AV_RL64(packet->data);
yading@10 441 if (ts != ws->cur_ts)
yading@10 442 wavesynth_seek(ws, ts);
yading@10 443 duration = AV_RL32(packet->data + 8);
yading@10 444 if (duration <= 0)
yading@10 445 return AVERROR(EINVAL);
yading@10 446 ws->frame.nb_samples = duration;
yading@10 447 r = ff_get_buffer(avc, &ws->frame, 0);
yading@10 448 if (r < 0)
yading@10 449 return r;
yading@10 450 pcm = (int16_t *)ws->frame.data[0];
yading@10 451 for (s = 0; s < duration; s++, ts++) {
yading@10 452 memset(channels, 0, avc->channels * sizeof(*channels));
yading@10 453 if (ts >= ws->next_ts)
yading@10 454 wavesynth_enter_intervals(ws, ts);
yading@10 455 wavesynth_synth_sample(ws, ts, channels);
yading@10 456 for (c = 0; c < avc->channels; c++)
yading@10 457 *(pcm++) = channels[c] >> 16;
yading@10 458 }
yading@10 459 ws->cur_ts += duration;
yading@10 460 *rgot_frame = 1;
yading@10 461 *(AVFrame *)rframe = ws->frame;
yading@10 462 return packet->size;
yading@10 463 }
yading@10 464
yading@10 465 static av_cold int wavesynth_close(AVCodecContext *avc)
yading@10 466 {
yading@10 467 struct wavesynth_context *ws = avc->priv_data;
yading@10 468
yading@10 469 av_free(ws->sin);
yading@10 470 av_free(ws->inter);
yading@10 471 return 0;
yading@10 472 }
yading@10 473
yading@10 474 AVCodec ff_ffwavesynth_decoder = {
yading@10 475 .name = "wavesynth",
yading@10 476 .type = AVMEDIA_TYPE_AUDIO,
yading@10 477 .id = AV_CODEC_ID_FFWAVESYNTH,
yading@10 478 .priv_data_size = sizeof(struct wavesynth_context),
yading@10 479 .init = wavesynth_init,
yading@10 480 .close = wavesynth_close,
yading@10 481 .decode = wavesynth_decode,
yading@10 482 .capabilities = CODEC_CAP_DR1,
yading@10 483 .long_name = NULL_IF_CONFIG_SMALL("Wave synthesis pseudo-codec"),
yading@10 484 };