annotate ffmpeg/libavformat/sbgdec.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 f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * SBG (SBaGen) file format decoder
yading@11 3 * Copyright (c) 2011 Nicolas George
yading@11 4 *
yading@11 5 * This file is part of FFmpeg.
yading@11 6 *
yading@11 7 * FFmpeg is free software; you can redistribute it and/or
yading@11 8 * modify it under the terms of the GNU Lesser General Public
yading@11 9 * License as published by the Free Software Foundation; either
yading@11 10 * version 2.1 of the License, or (at your option) any later version.
yading@11 11 *
yading@11 12 * FFmpeg is distributed in the hope that it will be useful,
yading@11 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 15 * Lesser General Public License for more details.
yading@11 16 *
yading@11 17 * You should have received a copy of the GNU Lesser General Public
yading@11 18 * License along with FFmpeg; if not, write to the Free Software
yading@11 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 20 */
yading@11 21
yading@11 22 #include <stdio.h>
yading@11 23 #include <stdlib.h>
yading@11 24 #include <time.h>
yading@11 25 #include "libavutil/intreadwrite.h"
yading@11 26 #include "libavutil/log.h"
yading@11 27 #include "libavutil/opt.h"
yading@11 28 #include "avformat.h"
yading@11 29 #include "internal.h"
yading@11 30
yading@11 31 #define SBG_SCALE (1 << 16)
yading@11 32 #define DAY (24 * 60 * 60)
yading@11 33 #define DAY_TS ((int64_t)DAY * AV_TIME_BASE)
yading@11 34
yading@11 35 struct sbg_demuxer {
yading@11 36 AVClass *class;
yading@11 37 int sample_rate;
yading@11 38 int frame_size;
yading@11 39 int max_file_size;
yading@11 40 };
yading@11 41
yading@11 42 struct sbg_string {
yading@11 43 char *s;
yading@11 44 char *e;
yading@11 45 };
yading@11 46
yading@11 47 enum sbg_fade_type {
yading@11 48 SBG_FADE_SILENCE = 0,
yading@11 49 SBG_FADE_SAME = 1,
yading@11 50 SBG_FADE_ADAPT = 3,
yading@11 51 };
yading@11 52
yading@11 53 struct sbg_fade {
yading@11 54 int8_t in, out, slide;
yading@11 55 };
yading@11 56
yading@11 57 enum sbg_synth_type {
yading@11 58 SBG_TYPE_NONE,
yading@11 59 SBG_TYPE_SINE,
yading@11 60 SBG_TYPE_NOISE,
yading@11 61 SBG_TYPE_BELL,
yading@11 62 SBG_TYPE_MIX,
yading@11 63 SBG_TYPE_SPIN,
yading@11 64 };
yading@11 65
yading@11 66 /* bell: freq constant, ampl decreases exponentially, can be approx lin */
yading@11 67
yading@11 68 struct sbg_timestamp {
yading@11 69 int64_t t;
yading@11 70 char type; /* 0 for relative, 'N' for now, 'T' for absolute */
yading@11 71 };
yading@11 72
yading@11 73 struct sbg_script_definition {
yading@11 74 char *name;
yading@11 75 int name_len;
yading@11 76 int elements, nb_elements;
yading@11 77 char type; /* 'S' or 'B' */
yading@11 78 };
yading@11 79
yading@11 80 struct sbg_script_synth {
yading@11 81 int carrier;
yading@11 82 int beat;
yading@11 83 int vol;
yading@11 84 enum sbg_synth_type type;
yading@11 85 struct {
yading@11 86 int l, r;
yading@11 87 } ref;
yading@11 88 };
yading@11 89
yading@11 90 struct sbg_script_tseq {
yading@11 91 struct sbg_timestamp ts;
yading@11 92 char *name;
yading@11 93 int name_len;
yading@11 94 int lock;
yading@11 95 struct sbg_fade fade;
yading@11 96 };
yading@11 97
yading@11 98 struct sbg_script_event {
yading@11 99 int64_t ts;
yading@11 100 int64_t ts_int, ts_trans, ts_next;
yading@11 101 int elements, nb_elements;
yading@11 102 struct sbg_fade fade;
yading@11 103 };
yading@11 104
yading@11 105 struct sbg_script {
yading@11 106 struct sbg_script_definition *def;
yading@11 107 struct sbg_script_synth *synth;
yading@11 108 struct sbg_script_tseq *tseq;
yading@11 109 struct sbg_script_tseq *block_tseq;
yading@11 110 struct sbg_script_event *events;
yading@11 111 int nb_def;
yading@11 112 int nb_tseq;
yading@11 113 int nb_events;
yading@11 114 int nb_synth;
yading@11 115 int64_t start_ts;
yading@11 116 int64_t end_ts;
yading@11 117 int64_t opt_fade_time;
yading@11 118 int64_t opt_duration;
yading@11 119 char *opt_mix;
yading@11 120 int sample_rate;
yading@11 121 uint8_t opt_start_at_first;
yading@11 122 uint8_t opt_end_at_last;
yading@11 123 };
yading@11 124
yading@11 125 struct sbg_parser {
yading@11 126 void *log;
yading@11 127 char *script, *end;
yading@11 128 char *cursor;
yading@11 129 struct sbg_script scs;
yading@11 130 struct sbg_timestamp current_time;
yading@11 131 int nb_block_tseq;
yading@11 132 int nb_def_max, nb_synth_max, nb_tseq_max, nb_block_tseq_max;
yading@11 133 int line_no;
yading@11 134 char err_msg[128];
yading@11 135 };
yading@11 136
yading@11 137 enum ws_interval_type {
yading@11 138 WS_SINE = MKTAG('S','I','N','E'),
yading@11 139 WS_NOISE = MKTAG('N','O','I','S'),
yading@11 140 };
yading@11 141
yading@11 142 struct ws_interval {
yading@11 143 int64_t ts1, ts2;
yading@11 144 enum ws_interval_type type;
yading@11 145 uint32_t channels;
yading@11 146 int32_t f1, f2;
yading@11 147 int32_t a1, a2;
yading@11 148 uint32_t phi;
yading@11 149 };
yading@11 150
yading@11 151 struct ws_intervals {
yading@11 152 struct ws_interval *inter;
yading@11 153 int nb_inter;
yading@11 154 int max_inter;
yading@11 155 };
yading@11 156
yading@11 157 static void *alloc_array_elem(void **array, size_t elsize,
yading@11 158 int *size, int *max_size)
yading@11 159 {
yading@11 160 void *ret;
yading@11 161
yading@11 162 if (*size == *max_size) {
yading@11 163 int m = FFMAX(32, FFMIN(*max_size, INT_MAX / 2) * 2);
yading@11 164 if (*size >= m)
yading@11 165 return NULL;
yading@11 166 *array = av_realloc_f(*array, m, elsize);
yading@11 167 if (!*array)
yading@11 168 return NULL;
yading@11 169 *max_size = m;
yading@11 170 }
yading@11 171 ret = (char *)*array + elsize * *size;
yading@11 172 memset(ret, 0, elsize);
yading@11 173 (*size)++;
yading@11 174 return ret;
yading@11 175 }
yading@11 176
yading@11 177 static int str_to_time(const char *str, int64_t *rtime)
yading@11 178 {
yading@11 179 const char *cur = str;
yading@11 180 char *end;
yading@11 181 int hours, minutes;
yading@11 182 double seconds = 0;
yading@11 183
yading@11 184 if (*cur < '0' || *cur > '9')
yading@11 185 return 0;
yading@11 186 hours = strtol(cur, &end, 10);
yading@11 187 if (end == cur || *end != ':' || end[1] < '0' || end[1] > '9')
yading@11 188 return 0;
yading@11 189 cur = end + 1;
yading@11 190 minutes = strtol(cur, &end, 10);
yading@11 191 if (end == cur)
yading@11 192 return 0;
yading@11 193 cur = end;
yading@11 194 if (*end == ':'){
yading@11 195 seconds = strtod(cur + 1, &end);
yading@11 196 if (end > cur + 1)
yading@11 197 cur = end;
yading@11 198 }
yading@11 199 *rtime = (hours * 3600 + minutes * 60 + seconds) * AV_TIME_BASE;
yading@11 200 return cur - str;
yading@11 201 }
yading@11 202
yading@11 203 static inline int is_space(char c)
yading@11 204 {
yading@11 205 return c == ' ' || c == '\t' || c == '\r';
yading@11 206 }
yading@11 207
yading@11 208 static inline int scale_double(void *log, double d, double m, int *r)
yading@11 209 {
yading@11 210 m *= d * SBG_SCALE;
yading@11 211 if (m < INT_MIN || m >= INT_MAX) {
yading@11 212 if (log)
yading@11 213 av_log(log, AV_LOG_ERROR, "%g is too large\n", d);
yading@11 214 return AVERROR(EDOM);
yading@11 215 }
yading@11 216 *r = m;
yading@11 217 return 0;
yading@11 218 }
yading@11 219
yading@11 220 static int lex_space(struct sbg_parser *p)
yading@11 221 {
yading@11 222 char *c = p->cursor;
yading@11 223
yading@11 224 while (p->cursor < p->end && is_space(*p->cursor))
yading@11 225 p->cursor++;
yading@11 226 return p->cursor > c;
yading@11 227 }
yading@11 228
yading@11 229 static int lex_char(struct sbg_parser *p, char c)
yading@11 230 {
yading@11 231 int r = p->cursor < p->end && *p->cursor == c;
yading@11 232
yading@11 233 p->cursor += r;
yading@11 234 return r;
yading@11 235 }
yading@11 236
yading@11 237 static int lex_double(struct sbg_parser *p, double *r)
yading@11 238 {
yading@11 239 double d;
yading@11 240 char *end;
yading@11 241
yading@11 242 if (p->cursor == p->end || is_space(*p->cursor) || *p->cursor == '\n')
yading@11 243 return 0;
yading@11 244 d = strtod(p->cursor, &end);
yading@11 245 if (end > p->cursor) {
yading@11 246 *r = d;
yading@11 247 p->cursor = end;
yading@11 248 return 1;
yading@11 249 }
yading@11 250 return 0;
yading@11 251 }
yading@11 252
yading@11 253 static int lex_fixed(struct sbg_parser *p, const char *t, int l)
yading@11 254 {
yading@11 255 if (p->end - p->cursor < l || memcmp(p->cursor, t, l))
yading@11 256 return 0;
yading@11 257 p->cursor += l;
yading@11 258 return 1;
yading@11 259 }
yading@11 260
yading@11 261 static int lex_line_end(struct sbg_parser *p)
yading@11 262 {
yading@11 263 if (p->cursor < p->end && *p->cursor == '#') {
yading@11 264 p->cursor++;
yading@11 265 while (p->cursor < p->end && *p->cursor != '\n')
yading@11 266 p->cursor++;
yading@11 267 }
yading@11 268 if (p->cursor == p->end)
yading@11 269 /* simulate final LF for files lacking it */
yading@11 270 return 1;
yading@11 271 if (*p->cursor != '\n')
yading@11 272 return 0;
yading@11 273 p->cursor++;
yading@11 274 p->line_no++;
yading@11 275 lex_space(p);
yading@11 276 return 1;
yading@11 277 }
yading@11 278
yading@11 279 static int lex_wsword(struct sbg_parser *p, struct sbg_string *rs)
yading@11 280 {
yading@11 281 char *s = p->cursor, *c = s;
yading@11 282
yading@11 283 if (s == p->end || *s == '\n')
yading@11 284 return 0;
yading@11 285 while (c < p->end && *c != '\n' && !is_space(*c))
yading@11 286 c++;
yading@11 287 rs->s = s;
yading@11 288 rs->e = p->cursor = c;
yading@11 289 lex_space(p);
yading@11 290 return 1;
yading@11 291 }
yading@11 292
yading@11 293 static int lex_name(struct sbg_parser *p, struct sbg_string *rs)
yading@11 294 {
yading@11 295 char *s = p->cursor, *c = s;
yading@11 296
yading@11 297 while (c < p->end && ((*c >= 'a' && *c <= 'z') || (*c >= 'A' && *c <= 'Z')
yading@11 298 || (*c >= '0' && *c <= '9') || *c == '_' || *c == '-'))
yading@11 299 c++;
yading@11 300 if (c == s)
yading@11 301 return 0;
yading@11 302 rs->s = s;
yading@11 303 rs->e = p->cursor = c;
yading@11 304 return 1;
yading@11 305 }
yading@11 306
yading@11 307 static int lex_time(struct sbg_parser *p, int64_t *rt)
yading@11 308 {
yading@11 309 int r = str_to_time(p->cursor, rt);
yading@11 310 p->cursor += r;
yading@11 311 return r > 0;
yading@11 312 }
yading@11 313
yading@11 314 #define FORWARD_ERROR(c) \
yading@11 315 do { \
yading@11 316 int errcode = c; \
yading@11 317 if (errcode <= 0) \
yading@11 318 return errcode ? errcode : AVERROR_INVALIDDATA; \
yading@11 319 } while(0);
yading@11 320
yading@11 321 static int parse_immediate(struct sbg_parser *p)
yading@11 322 {
yading@11 323 snprintf(p->err_msg, sizeof(p->err_msg),
yading@11 324 "immediate sequences not yet implemented");
yading@11 325 return AVERROR_PATCHWELCOME;
yading@11 326 }
yading@11 327
yading@11 328 static int parse_preprogrammed(struct sbg_parser *p)
yading@11 329 {
yading@11 330 snprintf(p->err_msg, sizeof(p->err_msg),
yading@11 331 "preprogrammed sequences not yet implemented");
yading@11 332 return AVERROR_PATCHWELCOME;
yading@11 333 }
yading@11 334
yading@11 335 static int parse_optarg(struct sbg_parser *p, char o, struct sbg_string *r)
yading@11 336 {
yading@11 337 if (!lex_wsword(p, r)) {
yading@11 338 snprintf(p->err_msg, sizeof(p->err_msg),
yading@11 339 "option '%c' requires an argument", o);
yading@11 340 return AVERROR_INVALIDDATA;
yading@11 341 }
yading@11 342 return 1;
yading@11 343 }
yading@11 344
yading@11 345 static int parse_options(struct sbg_parser *p)
yading@11 346 {
yading@11 347 struct sbg_string ostr, oarg;
yading@11 348 char mode = 0;
yading@11 349 int r;
yading@11 350 char *tptr;
yading@11 351 double v;
yading@11 352
yading@11 353 if (p->cursor == p->end || *p->cursor != '-')
yading@11 354 return 0;
yading@11 355 while (lex_char(p, '-') && lex_wsword(p, &ostr)) {
yading@11 356 for (; ostr.s < ostr.e; ostr.s++) {
yading@11 357 char opt = *ostr.s;
yading@11 358 switch (opt) {
yading@11 359 case 'S':
yading@11 360 p->scs.opt_start_at_first = 1;
yading@11 361 break;
yading@11 362 case 'E':
yading@11 363 p->scs.opt_end_at_last = 1;
yading@11 364 break;
yading@11 365 case 'i':
yading@11 366 mode = 'i';
yading@11 367 break;
yading@11 368 case 'p':
yading@11 369 mode = 'p';
yading@11 370 break;
yading@11 371 case 'F':
yading@11 372 FORWARD_ERROR(parse_optarg(p, opt, &oarg));
yading@11 373 v = strtod(oarg.s, &tptr);
yading@11 374 if (oarg.e != tptr) {
yading@11 375 snprintf(p->err_msg, sizeof(p->err_msg),
yading@11 376 "syntax error for option -F");
yading@11 377 return AVERROR_INVALIDDATA;
yading@11 378 }
yading@11 379 p->scs.opt_fade_time = v * AV_TIME_BASE / 1000;
yading@11 380 break;
yading@11 381 case 'L':
yading@11 382 FORWARD_ERROR(parse_optarg(p, opt, &oarg));
yading@11 383 r = str_to_time(oarg.s, &p->scs.opt_duration);
yading@11 384 if (oarg.e != oarg.s + r) {
yading@11 385 snprintf(p->err_msg, sizeof(p->err_msg),
yading@11 386 "syntax error for option -L");
yading@11 387 return AVERROR_INVALIDDATA;
yading@11 388 }
yading@11 389 break;
yading@11 390 case 'T':
yading@11 391 FORWARD_ERROR(parse_optarg(p, opt, &oarg));
yading@11 392 r = str_to_time(oarg.s, &p->scs.start_ts);
yading@11 393 if (oarg.e != oarg.s + r) {
yading@11 394 snprintf(p->err_msg, sizeof(p->err_msg),
yading@11 395 "syntax error for option -T");
yading@11 396 return AVERROR_INVALIDDATA;
yading@11 397 }
yading@11 398 break;
yading@11 399 case 'm':
yading@11 400 FORWARD_ERROR(parse_optarg(p, opt, &oarg));
yading@11 401 tptr = av_malloc(oarg.e - oarg.s + 1);
yading@11 402 if (!tptr)
yading@11 403 return AVERROR(ENOMEM);
yading@11 404 memcpy(tptr, oarg.s, oarg.e - oarg.s);
yading@11 405 tptr[oarg.e - oarg.s] = 0;
yading@11 406 av_free(p->scs.opt_mix);
yading@11 407 p->scs.opt_mix = tptr;
yading@11 408 break;
yading@11 409 case 'q':
yading@11 410 FORWARD_ERROR(parse_optarg(p, opt, &oarg));
yading@11 411 v = strtod(oarg.s, &tptr);
yading@11 412 if (oarg.e != tptr) {
yading@11 413 snprintf(p->err_msg, sizeof(p->err_msg),
yading@11 414 "syntax error for option -q");
yading@11 415 return AVERROR_INVALIDDATA;
yading@11 416 }
yading@11 417 if (v != 1) {
yading@11 418 snprintf(p->err_msg, sizeof(p->err_msg),
yading@11 419 "speed factor other than 1 not supported");
yading@11 420 return AVERROR_PATCHWELCOME;
yading@11 421 }
yading@11 422 break;
yading@11 423 case 'r':
yading@11 424 FORWARD_ERROR(parse_optarg(p, opt, &oarg));
yading@11 425 r = strtol(oarg.s, &tptr, 10);
yading@11 426 if (oarg.e != tptr) {
yading@11 427 snprintf(p->err_msg, sizeof(p->err_msg),
yading@11 428 "syntax error for option -r");
yading@11 429 return AVERROR_INVALIDDATA;
yading@11 430 }
yading@11 431 if (r < 40) {
yading@11 432 snprintf(p->err_msg, sizeof(p->err_msg),
yading@11 433 "invalid sample rate");
yading@11 434 return AVERROR_PATCHWELCOME;
yading@11 435 }
yading@11 436 p->scs.sample_rate = r;
yading@11 437 break;
yading@11 438 default:
yading@11 439 snprintf(p->err_msg, sizeof(p->err_msg),
yading@11 440 "unknown option: '%c'", *ostr.s);
yading@11 441 return AVERROR_INVALIDDATA;
yading@11 442 }
yading@11 443 }
yading@11 444 }
yading@11 445 switch (mode) {
yading@11 446 case 'i':
yading@11 447 return parse_immediate(p);
yading@11 448 case 'p':
yading@11 449 return parse_preprogrammed(p);
yading@11 450 case 0:
yading@11 451 if (!lex_line_end(p))
yading@11 452 return AVERROR_INVALIDDATA;
yading@11 453 return 1;
yading@11 454 }
yading@11 455 return AVERROR_BUG;
yading@11 456 }
yading@11 457
yading@11 458 static int parse_timestamp(struct sbg_parser *p,
yading@11 459 struct sbg_timestamp *rts, int64_t *rrel)
yading@11 460 {
yading@11 461 int64_t abs = 0, rel = 0, dt;
yading@11 462 char type = 0;
yading@11 463 int r;
yading@11 464
yading@11 465 if (lex_fixed(p, "NOW", 3)) {
yading@11 466 type = 'N';
yading@11 467 r = 1;
yading@11 468 } else {
yading@11 469 r = lex_time(p, &abs);
yading@11 470 if (r)
yading@11 471 type = 'T';
yading@11 472 }
yading@11 473 while (lex_char(p, '+')) {
yading@11 474 if (!lex_time(p, &dt))
yading@11 475 return AVERROR_INVALIDDATA;
yading@11 476 rel += dt;
yading@11 477 r = 1;
yading@11 478 }
yading@11 479 if (r) {
yading@11 480 if (!lex_space(p))
yading@11 481 return AVERROR_INVALIDDATA;
yading@11 482 rts->type = type;
yading@11 483 rts->t = abs;
yading@11 484 *rrel = rel;
yading@11 485 }
yading@11 486 return r;
yading@11 487 }
yading@11 488
yading@11 489 static int parse_fade(struct sbg_parser *p, struct sbg_fade *fr)
yading@11 490 {
yading@11 491 struct sbg_fade f = {0};
yading@11 492
yading@11 493 if (lex_char(p, '<'))
yading@11 494 f.in = SBG_FADE_SILENCE;
yading@11 495 else if (lex_char(p, '-'))
yading@11 496 f.in = SBG_FADE_SAME;
yading@11 497 else if (lex_char(p, '='))
yading@11 498 f.in = SBG_FADE_ADAPT;
yading@11 499 else
yading@11 500 return 0;
yading@11 501 if (lex_char(p, '>'))
yading@11 502 f.out = SBG_FADE_SILENCE;
yading@11 503 else if (lex_char(p, '-'))
yading@11 504 f.out = SBG_FADE_SAME;
yading@11 505 else if (lex_char(p, '='))
yading@11 506 f.out = SBG_FADE_ADAPT;
yading@11 507 else
yading@11 508 return AVERROR_INVALIDDATA;
yading@11 509 *fr = f;
yading@11 510 return 1;
yading@11 511 }
yading@11 512
yading@11 513 static int parse_time_sequence(struct sbg_parser *p, int inblock)
yading@11 514 {
yading@11 515 struct sbg_timestamp ts;
yading@11 516 int64_t rel_ts;
yading@11 517 int r;
yading@11 518 struct sbg_fade fade = { SBG_FADE_SAME, SBG_FADE_SAME, 0 };
yading@11 519 struct sbg_string name;
yading@11 520 struct sbg_script_tseq *tseq;
yading@11 521
yading@11 522 r = parse_timestamp(p, &ts, &rel_ts);
yading@11 523 if (!r)
yading@11 524 return 0;
yading@11 525 if (r < 0)
yading@11 526 return r;
yading@11 527 if (ts.type) {
yading@11 528 if (inblock)
yading@11 529 return AVERROR_INVALIDDATA;
yading@11 530 p->current_time.type = ts.type;
yading@11 531 p->current_time.t = ts.t;
yading@11 532 } else if(!inblock && !p->current_time.type) {
yading@11 533 snprintf(p->err_msg, sizeof(p->err_msg),
yading@11 534 "relative time without previous absolute time");
yading@11 535 return AVERROR_INVALIDDATA;
yading@11 536 }
yading@11 537 ts.type = p->current_time.type;
yading@11 538 ts.t = p->current_time.t + rel_ts;
yading@11 539 r = parse_fade(p, &fade);
yading@11 540 if (r < 0)
yading@11 541 return r;
yading@11 542 lex_space(p);
yading@11 543 if (!lex_name(p, &name))
yading@11 544 return AVERROR_INVALIDDATA;
yading@11 545 lex_space(p);
yading@11 546 if (lex_fixed(p, "->", 2)) {
yading@11 547 fade.slide = SBG_FADE_ADAPT;
yading@11 548 lex_space(p);
yading@11 549 }
yading@11 550 if (!lex_line_end(p))
yading@11 551 return AVERROR_INVALIDDATA;
yading@11 552 tseq = inblock ?
yading@11 553 alloc_array_elem((void **)&p->scs.block_tseq, sizeof(*tseq),
yading@11 554 &p->nb_block_tseq, &p->nb_block_tseq_max) :
yading@11 555 alloc_array_elem((void **)&p->scs.tseq, sizeof(*tseq),
yading@11 556 &p->scs.nb_tseq, &p->nb_tseq_max);
yading@11 557 if (!tseq)
yading@11 558 return AVERROR(ENOMEM);
yading@11 559 tseq->ts = ts;
yading@11 560 tseq->name = name.s;
yading@11 561 tseq->name_len = name.e - name.s;
yading@11 562 tseq->fade = fade;
yading@11 563 return 1;
yading@11 564 }
yading@11 565
yading@11 566 static int parse_wave_def(struct sbg_parser *p, int wavenum)
yading@11 567 {
yading@11 568 snprintf(p->err_msg, sizeof(p->err_msg),
yading@11 569 "waveform definitions not yet implemented");
yading@11 570 return AVERROR_PATCHWELCOME;
yading@11 571 }
yading@11 572
yading@11 573 static int parse_block_def(struct sbg_parser *p,
yading@11 574 struct sbg_script_definition *def)
yading@11 575 {
yading@11 576 int r, tseq;
yading@11 577
yading@11 578 lex_space(p);
yading@11 579 if (!lex_line_end(p))
yading@11 580 return AVERROR_INVALIDDATA;
yading@11 581 tseq = p->nb_block_tseq;
yading@11 582 while (1) {
yading@11 583 r = parse_time_sequence(p, 1);
yading@11 584 if (r < 0)
yading@11 585 return r;
yading@11 586 if (!r)
yading@11 587 break;
yading@11 588 }
yading@11 589 if (!lex_char(p, '}'))
yading@11 590 return AVERROR_INVALIDDATA;
yading@11 591 lex_space(p);
yading@11 592 if (!lex_line_end(p))
yading@11 593 return AVERROR_INVALIDDATA;
yading@11 594 def->type = 'B';
yading@11 595 def->elements = tseq;
yading@11 596 def->nb_elements = p->nb_block_tseq - tseq;
yading@11 597 if (!def->nb_elements)
yading@11 598 return AVERROR_INVALIDDATA;
yading@11 599 return 1;
yading@11 600 }
yading@11 601
yading@11 602 static int parse_volume(struct sbg_parser *p, int *vol)
yading@11 603 {
yading@11 604 double v;
yading@11 605
yading@11 606 if (!lex_char(p, '/'))
yading@11 607 return 0;
yading@11 608 if (!lex_double(p, &v))
yading@11 609 return AVERROR_INVALIDDATA;
yading@11 610 if (scale_double(p->log, v, 0.01, vol))
yading@11 611 return AVERROR(ERANGE);
yading@11 612 return 1;
yading@11 613 }
yading@11 614
yading@11 615 static int parse_synth_channel_sine(struct sbg_parser *p,
yading@11 616 struct sbg_script_synth *synth)
yading@11 617 {
yading@11 618 double carrierf, beatf;
yading@11 619 int carrier, beat, vol;
yading@11 620
yading@11 621 if (!lex_double(p, &carrierf))
yading@11 622 return 0;
yading@11 623 if (!lex_double(p, &beatf))
yading@11 624 beatf = 0;
yading@11 625 FORWARD_ERROR(parse_volume(p, &vol));
yading@11 626 if (scale_double(p->log, carrierf, 1, &carrier) < 0 ||
yading@11 627 scale_double(p->log, beatf, 1, &beat) < 0)
yading@11 628 return AVERROR(EDOM);
yading@11 629 synth->type = SBG_TYPE_SINE;
yading@11 630 synth->carrier = carrier;
yading@11 631 synth->beat = beat;
yading@11 632 synth->vol = vol;
yading@11 633 return 1;
yading@11 634 }
yading@11 635
yading@11 636 static int parse_synth_channel_pink(struct sbg_parser *p,
yading@11 637 struct sbg_script_synth *synth)
yading@11 638 {
yading@11 639 int vol;
yading@11 640
yading@11 641 if (!lex_fixed(p, "pink", 4))
yading@11 642 return 0;
yading@11 643 FORWARD_ERROR(parse_volume(p, &vol));
yading@11 644 synth->type = SBG_TYPE_NOISE;
yading@11 645 synth->vol = vol;
yading@11 646 return 1;
yading@11 647 }
yading@11 648
yading@11 649 static int parse_synth_channel_bell(struct sbg_parser *p,
yading@11 650 struct sbg_script_synth *synth)
yading@11 651 {
yading@11 652 double carrierf;
yading@11 653 int carrier, vol;
yading@11 654
yading@11 655 if (!lex_fixed(p, "bell", 4))
yading@11 656 return 0;
yading@11 657 if (!lex_double(p, &carrierf))
yading@11 658 return AVERROR_INVALIDDATA;
yading@11 659 FORWARD_ERROR(parse_volume(p, &vol));
yading@11 660 if (scale_double(p->log, carrierf, 1, &carrier) < 0)
yading@11 661 return AVERROR(EDOM);
yading@11 662 synth->type = SBG_TYPE_BELL;
yading@11 663 synth->carrier = carrier;
yading@11 664 synth->vol = vol;
yading@11 665 return 1;
yading@11 666 }
yading@11 667
yading@11 668 static int parse_synth_channel_mix(struct sbg_parser *p,
yading@11 669 struct sbg_script_synth *synth)
yading@11 670 {
yading@11 671 int vol;
yading@11 672
yading@11 673 if (!lex_fixed(p, "mix", 3))
yading@11 674 return 0;
yading@11 675 FORWARD_ERROR(parse_volume(p, &vol));
yading@11 676 synth->type = SBG_TYPE_MIX;
yading@11 677 synth->vol = vol;
yading@11 678 return 1;
yading@11 679 }
yading@11 680
yading@11 681 static int parse_synth_channel_spin(struct sbg_parser *p,
yading@11 682 struct sbg_script_synth *synth)
yading@11 683 {
yading@11 684 double carrierf, beatf;
yading@11 685 int carrier, beat, vol;
yading@11 686
yading@11 687 if (!lex_fixed(p, "spin:", 5))
yading@11 688 return 0;
yading@11 689 if (!lex_double(p, &carrierf))
yading@11 690 return AVERROR_INVALIDDATA;
yading@11 691 if (!lex_double(p, &beatf))
yading@11 692 return AVERROR_INVALIDDATA;
yading@11 693 FORWARD_ERROR(parse_volume(p, &vol));
yading@11 694 if (scale_double(p->log, carrierf, 1, &carrier) < 0 ||
yading@11 695 scale_double(p->log, beatf, 1, &beat) < 0)
yading@11 696 return AVERROR(EDOM);
yading@11 697 synth->type = SBG_TYPE_SPIN;
yading@11 698 synth->carrier = carrier;
yading@11 699 synth->beat = beat;
yading@11 700 synth->vol = vol;
yading@11 701 return 1;
yading@11 702 }
yading@11 703
yading@11 704 static int parse_synth_channel(struct sbg_parser *p)
yading@11 705 {
yading@11 706 int r;
yading@11 707 struct sbg_script_synth *synth;
yading@11 708
yading@11 709 synth = alloc_array_elem((void **)&p->scs.synth, sizeof(*synth),
yading@11 710 &p->scs.nb_synth, &p->nb_synth_max);
yading@11 711 if (!synth)
yading@11 712 return AVERROR(ENOMEM);
yading@11 713 r = lex_char(p, '-');
yading@11 714 if (!r)
yading@11 715 r = parse_synth_channel_pink(p, synth);
yading@11 716 if (!r)
yading@11 717 r = parse_synth_channel_bell(p, synth);
yading@11 718 if (!r)
yading@11 719 r = parse_synth_channel_mix(p, synth);
yading@11 720 if (!r)
yading@11 721 r = parse_synth_channel_spin(p, synth);
yading@11 722 /* Unimplemented: wave%d:%f%f/vol (carrier, beat) */
yading@11 723 if (!r)
yading@11 724 r = parse_synth_channel_sine(p, synth);
yading@11 725 if (r <= 0)
yading@11 726 p->scs.nb_synth--;
yading@11 727 return r;
yading@11 728 }
yading@11 729
yading@11 730 static int parse_synth_def(struct sbg_parser *p,
yading@11 731 struct sbg_script_definition *def)
yading@11 732 {
yading@11 733 int r, synth;
yading@11 734
yading@11 735 synth = p->scs.nb_synth;
yading@11 736 while (1) {
yading@11 737 r = parse_synth_channel(p);
yading@11 738 if (r < 0)
yading@11 739 return r;
yading@11 740 if (!r || !lex_space(p))
yading@11 741 break;
yading@11 742 }
yading@11 743 lex_space(p);
yading@11 744 if (synth == p->scs.nb_synth)
yading@11 745 return AVERROR_INVALIDDATA;
yading@11 746 if (!lex_line_end(p))
yading@11 747 return AVERROR_INVALIDDATA;
yading@11 748 def->type = 'S';
yading@11 749 def->elements = synth;
yading@11 750 def->nb_elements = p->scs.nb_synth - synth;
yading@11 751 return 1;
yading@11 752 }
yading@11 753
yading@11 754 static int parse_named_def(struct sbg_parser *p)
yading@11 755 {
yading@11 756 char *cursor_save = p->cursor;
yading@11 757 struct sbg_string name;
yading@11 758 struct sbg_script_definition *def;
yading@11 759
yading@11 760 if (!lex_name(p, &name) || !lex_char(p, ':') || !lex_space(p)) {
yading@11 761 p->cursor = cursor_save;
yading@11 762 return 0;
yading@11 763 }
yading@11 764 if (name.e - name.s == 6 && !memcmp(name.s, "wave", 4) &&
yading@11 765 name.s[4] >= '0' && name.s[4] <= '9' &&
yading@11 766 name.s[5] >= '0' && name.s[5] <= '9') {
yading@11 767 int wavenum = (name.s[4] - '0') * 10 + (name.s[5] - '0');
yading@11 768 return parse_wave_def(p, wavenum);
yading@11 769 }
yading@11 770 def = alloc_array_elem((void **)&p->scs.def, sizeof(*def),
yading@11 771 &p->scs.nb_def, &p->nb_def_max);
yading@11 772 if (!def)
yading@11 773 return AVERROR(ENOMEM);
yading@11 774 def->name = name.s;
yading@11 775 def->name_len = name.e - name.s;
yading@11 776 if (lex_char(p, '{'))
yading@11 777 return parse_block_def(p, def);
yading@11 778 return parse_synth_def(p, def);
yading@11 779 }
yading@11 780
yading@11 781 static void free_script(struct sbg_script *s)
yading@11 782 {
yading@11 783 av_freep(&s->def);
yading@11 784 av_freep(&s->synth);
yading@11 785 av_freep(&s->tseq);
yading@11 786 av_freep(&s->block_tseq);
yading@11 787 av_freep(&s->events);
yading@11 788 av_freep(&s->opt_mix);
yading@11 789 }
yading@11 790
yading@11 791 static int parse_script(void *log, char *script, int script_len,
yading@11 792 struct sbg_script *rscript)
yading@11 793 {
yading@11 794 struct sbg_parser sp = {
yading@11 795 .log = log,
yading@11 796 .script = script,
yading@11 797 .end = script + script_len,
yading@11 798 .cursor = script,
yading@11 799 .line_no = 1,
yading@11 800 .err_msg = "",
yading@11 801 .scs = {
yading@11 802 /* default values */
yading@11 803 .start_ts = AV_NOPTS_VALUE,
yading@11 804 .sample_rate = 44100,
yading@11 805 .opt_fade_time = 60 * AV_TIME_BASE,
yading@11 806 },
yading@11 807 };
yading@11 808 int r;
yading@11 809
yading@11 810 lex_space(&sp);
yading@11 811 while (sp.cursor < sp.end) {
yading@11 812 r = parse_options(&sp);
yading@11 813 if (r < 0)
yading@11 814 goto fail;
yading@11 815 if (!r && !lex_line_end(&sp))
yading@11 816 break;
yading@11 817 }
yading@11 818 while (sp.cursor < sp.end) {
yading@11 819 r = parse_named_def(&sp);
yading@11 820 if (!r)
yading@11 821 r = parse_time_sequence(&sp, 0);
yading@11 822 if (!r)
yading@11 823 r = lex_line_end(&sp) ? 1 : AVERROR_INVALIDDATA;
yading@11 824 if (r < 0)
yading@11 825 goto fail;
yading@11 826 }
yading@11 827 *rscript = sp.scs;
yading@11 828 return 1;
yading@11 829 fail:
yading@11 830 free_script(&sp.scs);
yading@11 831 if (!*sp.err_msg)
yading@11 832 if (r == AVERROR_INVALIDDATA)
yading@11 833 snprintf(sp.err_msg, sizeof(sp.err_msg), "syntax error");
yading@11 834 if (log && *sp.err_msg) {
yading@11 835 const char *ctx = sp.cursor;
yading@11 836 const char *ectx = av_x_if_null(memchr(ctx, '\n', sp.end - sp.cursor),
yading@11 837 sp.end);
yading@11 838 int lctx = ectx - ctx;
yading@11 839 const char *quote = "\"";
yading@11 840 if (lctx > 0 && ctx[lctx - 1] == '\r')
yading@11 841 lctx--;
yading@11 842 if (lctx == 0) {
yading@11 843 ctx = "the end of line";
yading@11 844 lctx = strlen(ctx);
yading@11 845 quote = "";
yading@11 846 }
yading@11 847 av_log(log, AV_LOG_ERROR, "Error line %d: %s near %s%.*s%s.\n",
yading@11 848 sp.line_no, sp.err_msg, quote, lctx, ctx, quote);
yading@11 849 }
yading@11 850 return r;
yading@11 851 }
yading@11 852
yading@11 853 static int read_whole_file(AVIOContext *io, int max_size, char **rbuf)
yading@11 854 {
yading@11 855 char *buf = NULL;
yading@11 856 int size = 0, bufsize = 0, r;
yading@11 857
yading@11 858 while (1) {
yading@11 859 if (bufsize - size < 1024) {
yading@11 860 bufsize = FFMIN(FFMAX(2 * bufsize, 8192), max_size);
yading@11 861 if (bufsize - size < 2) {
yading@11 862 size = AVERROR(EFBIG);
yading@11 863 goto fail;
yading@11 864 }
yading@11 865 buf = av_realloc_f(buf, bufsize, 1);
yading@11 866 if (!buf) {
yading@11 867 size = AVERROR(ENOMEM);
yading@11 868 goto fail;
yading@11 869 }
yading@11 870 }
yading@11 871 r = avio_read(io, buf, bufsize - size - 1);
yading@11 872 if (r == AVERROR_EOF)
yading@11 873 break;
yading@11 874 if (r < 0)
yading@11 875 goto fail;
yading@11 876 size += r;
yading@11 877 }
yading@11 878 buf[size] = 0;
yading@11 879 *rbuf = buf;
yading@11 880 return size;
yading@11 881 fail:
yading@11 882 av_free(buf);
yading@11 883 return size;
yading@11 884 }
yading@11 885
yading@11 886 static void expand_timestamps(void *log, struct sbg_script *s)
yading@11 887 {
yading@11 888 int i, nb_rel = 0;
yading@11 889 int64_t now, cur_ts, delta = 0;
yading@11 890
yading@11 891 for (i = 0; i < s->nb_tseq; i++)
yading@11 892 nb_rel += s->tseq[i].ts.type == 'N';
yading@11 893 if (nb_rel == s->nb_tseq) {
yading@11 894 /* All ts are relative to NOW: consider NOW = 0 */
yading@11 895 now = 0;
yading@11 896 if (s->start_ts != AV_NOPTS_VALUE)
yading@11 897 av_log(log, AV_LOG_WARNING,
yading@11 898 "Start time ignored in a purely relative script.\n");
yading@11 899 } else if (nb_rel == 0 && s->start_ts != AV_NOPTS_VALUE ||
yading@11 900 s->opt_start_at_first) {
yading@11 901 /* All ts are absolute and start time is specified */
yading@11 902 if (s->start_ts == AV_NOPTS_VALUE)
yading@11 903 s->start_ts = s->tseq[0].ts.t;
yading@11 904 now = s->start_ts;
yading@11 905 } else {
yading@11 906 /* Mixed relative/absolute ts: expand */
yading@11 907 time_t now0;
yading@11 908 struct tm *tm;
yading@11 909
yading@11 910 av_log(log, AV_LOG_WARNING,
yading@11 911 "Scripts with mixed absolute and relative timestamps can give "
yading@11 912 "unexpected results (pause, seeking, time zone change).\n");
yading@11 913 #undef time
yading@11 914 time(&now0);
yading@11 915 tm = localtime(&now0);
yading@11 916 now = tm ? tm->tm_hour * 3600 + tm->tm_min * 60 + tm->tm_sec :
yading@11 917 now0 % DAY;
yading@11 918 av_log(log, AV_LOG_INFO, "Using %02d:%02d:%02d as NOW.\n",
yading@11 919 (int)(now / 3600), (int)(now / 60) % 60, (int)now % 60);
yading@11 920 now *= AV_TIME_BASE;
yading@11 921 for (i = 0; i < s->nb_tseq; i++) {
yading@11 922 if (s->tseq[i].ts.type == 'N') {
yading@11 923 s->tseq[i].ts.t += now;
yading@11 924 s->tseq[i].ts.type = 'T'; /* not necessary */
yading@11 925 }
yading@11 926 }
yading@11 927 }
yading@11 928 if (s->start_ts == AV_NOPTS_VALUE)
yading@11 929 s->start_ts = s->opt_start_at_first ? s->tseq[0].ts.t : now;
yading@11 930 s->end_ts = s->opt_duration ? s->start_ts + s->opt_duration :
yading@11 931 AV_NOPTS_VALUE; /* may be overridden later by -E option */
yading@11 932 cur_ts = now;
yading@11 933 for (i = 0; i < s->nb_tseq; i++) {
yading@11 934 if (s->tseq[i].ts.t + delta < cur_ts)
yading@11 935 delta += DAY_TS;
yading@11 936 cur_ts = s->tseq[i].ts.t += delta;
yading@11 937 }
yading@11 938 }
yading@11 939
yading@11 940 static int expand_tseq(void *log, struct sbg_script *s, int *nb_ev_max,
yading@11 941 int64_t t0, struct sbg_script_tseq *tseq)
yading@11 942 {
yading@11 943 int i, r;
yading@11 944 struct sbg_script_definition *def;
yading@11 945 struct sbg_script_tseq *be;
yading@11 946 struct sbg_script_event *ev;
yading@11 947
yading@11 948 if (tseq->lock++) {
yading@11 949 av_log(log, AV_LOG_ERROR, "Recursion loop on \"%.*s\"\n",
yading@11 950 tseq->name_len, tseq->name);
yading@11 951 return AVERROR(EINVAL);
yading@11 952 }
yading@11 953 t0 += tseq->ts.t;
yading@11 954 for (i = 0; i < s->nb_def; i++) {
yading@11 955 if (s->def[i].name_len == tseq->name_len &&
yading@11 956 !memcmp(s->def[i].name, tseq->name, tseq->name_len))
yading@11 957 break;
yading@11 958 }
yading@11 959 if (i >= s->nb_def) {
yading@11 960 av_log(log, AV_LOG_ERROR, "Tone-set \"%.*s\" not defined\n",
yading@11 961 tseq->name_len, tseq->name);
yading@11 962 return AVERROR(EINVAL);
yading@11 963 }
yading@11 964 def = &s->def[i];
yading@11 965 if (def->type == 'B') {
yading@11 966 be = s->block_tseq + def->elements;
yading@11 967 for (i = 0; i < def->nb_elements; i++) {
yading@11 968 r = expand_tseq(log, s, nb_ev_max, t0, &be[i]);
yading@11 969 if (r < 0)
yading@11 970 return r;
yading@11 971 }
yading@11 972 } else {
yading@11 973 ev = alloc_array_elem((void **)&s->events, sizeof(*ev),
yading@11 974 &s->nb_events, nb_ev_max);
yading@11 975 ev->ts = tseq->ts.t;
yading@11 976 ev->elements = def->elements;
yading@11 977 ev->nb_elements = def->nb_elements;
yading@11 978 ev->fade = tseq->fade;
yading@11 979 }
yading@11 980 tseq->lock--;
yading@11 981 return 0;
yading@11 982 }
yading@11 983
yading@11 984 static int expand_script(void *log, struct sbg_script *s)
yading@11 985 {
yading@11 986 int i, r, nb_events_max = 0;
yading@11 987
yading@11 988 expand_timestamps(log, s);
yading@11 989 for (i = 0; i < s->nb_tseq; i++) {
yading@11 990 r = expand_tseq(log, s, &nb_events_max, 0, &s->tseq[i]);
yading@11 991 if (r < 0)
yading@11 992 return r;
yading@11 993 }
yading@11 994 if (!s->nb_events) {
yading@11 995 av_log(log, AV_LOG_ERROR, "No events in script\n");
yading@11 996 return AVERROR_INVALIDDATA;
yading@11 997 }
yading@11 998 if (s->opt_end_at_last)
yading@11 999 s->end_ts = s->events[s->nb_events - 1].ts;
yading@11 1000 return 0;
yading@11 1001 }
yading@11 1002
yading@11 1003 static int add_interval(struct ws_intervals *inter,
yading@11 1004 enum ws_interval_type type, uint32_t channels, int ref,
yading@11 1005 int64_t ts1, int32_t f1, int32_t a1,
yading@11 1006 int64_t ts2, int32_t f2, int32_t a2)
yading@11 1007 {
yading@11 1008 struct ws_interval *i, *ri;
yading@11 1009
yading@11 1010 if (ref >= 0) {
yading@11 1011 ri = &inter->inter[ref];
yading@11 1012 /* ref and new intervals are constant, identical and adjacent */
yading@11 1013 if (ri->type == type && ri->channels == channels &&
yading@11 1014 ri->f1 == ri->f2 && ri->f2 == f1 && f1 == f2 &&
yading@11 1015 ri->a1 == ri->a2 && ri->a2 == a1 && a1 == a2 &&
yading@11 1016 ri->ts2 == ts1) {
yading@11 1017 ri->ts2 = ts2;
yading@11 1018 return ref;
yading@11 1019 }
yading@11 1020 }
yading@11 1021 i = alloc_array_elem((void **)&inter->inter, sizeof(*i),
yading@11 1022 &inter->nb_inter, &inter->max_inter);
yading@11 1023 if (!i)
yading@11 1024 return AVERROR(ENOMEM);
yading@11 1025 i->ts1 = ts1;
yading@11 1026 i->ts2 = ts2;
yading@11 1027 i->type = type;
yading@11 1028 i->channels = channels;
yading@11 1029 i->f1 = f1;
yading@11 1030 i->f2 = f2;
yading@11 1031 i->a1 = a1;
yading@11 1032 i->a2 = a2;
yading@11 1033 i->phi = ref >= 0 ? ref | 0x80000000 : 0;
yading@11 1034 return i - inter->inter;
yading@11 1035 }
yading@11 1036
yading@11 1037 static int add_bell(struct ws_intervals *inter, struct sbg_script *s,
yading@11 1038 int64_t ts1, int64_t ts2, int32_t f, int32_t a)
yading@11 1039 {
yading@11 1040 /* SBaGen uses an exponential decrease every 50ms.
yading@11 1041 We approximate it with piecewise affine segments. */
yading@11 1042 int32_t cpoints[][2] = {
yading@11 1043 { 2, a },
yading@11 1044 { 4, a - a / 4 },
yading@11 1045 { 8, a / 2 },
yading@11 1046 { 16, a / 4 },
yading@11 1047 { 25, a / 10 },
yading@11 1048 { 50, a / 80 },
yading@11 1049 { 75, 0 },
yading@11 1050 };
yading@11 1051 int i, r;
yading@11 1052 int64_t dt = s->sample_rate / 20, ts3 = ts1, ts4;
yading@11 1053 for (i = 0; i < FF_ARRAY_ELEMS(cpoints); i++) {
yading@11 1054 ts4 = FFMIN(ts2, ts1 + cpoints[i][0] * dt);
yading@11 1055 r = add_interval(inter, WS_SINE, 3, -1,
yading@11 1056 ts3, f, a, ts4, f, cpoints[i][1]);
yading@11 1057 if (r < 0)
yading@11 1058 return r;
yading@11 1059 ts3 = ts4;
yading@11 1060 a = cpoints[i][1];
yading@11 1061 }
yading@11 1062 return 0;
yading@11 1063 }
yading@11 1064
yading@11 1065 static int generate_interval(void *log, struct sbg_script *s,
yading@11 1066 struct ws_intervals *inter,
yading@11 1067 int64_t ts1, int64_t ts2,
yading@11 1068 struct sbg_script_synth *s1,
yading@11 1069 struct sbg_script_synth *s2,
yading@11 1070 int transition)
yading@11 1071 {
yading@11 1072 int r;
yading@11 1073
yading@11 1074 if (ts2 <= ts1 || (s1->vol == 0 && s2->vol == 0))
yading@11 1075 return 0;
yading@11 1076 switch (s1->type) {
yading@11 1077 case SBG_TYPE_NONE:
yading@11 1078 break;
yading@11 1079 case SBG_TYPE_SINE:
yading@11 1080 if (s1->beat == 0 && s2->beat == 0) {
yading@11 1081 r = add_interval(inter, WS_SINE, 3, s1->ref.l,
yading@11 1082 ts1, s1->carrier, s1->vol,
yading@11 1083 ts2, s2->carrier, s2->vol);
yading@11 1084 if (r < 0)
yading@11 1085 return r;
yading@11 1086 s2->ref.l = s2->ref.r = r;
yading@11 1087 } else {
yading@11 1088 r = add_interval(inter, WS_SINE, 1, s1->ref.l,
yading@11 1089 ts1, s1->carrier + s1->beat / 2, s1->vol,
yading@11 1090 ts2, s2->carrier + s2->beat / 2, s2->vol);
yading@11 1091 if (r < 0)
yading@11 1092 return r;
yading@11 1093 s2->ref.l = r;
yading@11 1094 r = add_interval(inter, WS_SINE, 2, s1->ref.r,
yading@11 1095 ts1, s1->carrier - s1->beat / 2, s1->vol,
yading@11 1096 ts2, s2->carrier - s2->beat / 2, s2->vol);
yading@11 1097 if (r < 0)
yading@11 1098 return r;
yading@11 1099 s2->ref.r = r;
yading@11 1100 }
yading@11 1101 break;
yading@11 1102
yading@11 1103 case SBG_TYPE_BELL:
yading@11 1104 if (transition == 2) {
yading@11 1105 r = add_bell(inter, s, ts1, ts2, s1->carrier, s2->vol);
yading@11 1106 if (r < 0)
yading@11 1107 return r;
yading@11 1108 }
yading@11 1109 break;
yading@11 1110
yading@11 1111 case SBG_TYPE_SPIN:
yading@11 1112 av_log(log, AV_LOG_WARNING, "Spinning noise not implemented, "
yading@11 1113 "using pink noise instead.\n");
yading@11 1114 /* fall through */
yading@11 1115 case SBG_TYPE_NOISE:
yading@11 1116 /* SBaGen's pink noise generator uses:
yading@11 1117 - 1 band of white noise, mean square: 1/3;
yading@11 1118 - 9 bands of subsampled white noise with linear
yading@11 1119 interpolation, mean square: 2/3 each;
yading@11 1120 with 1/10 weight each: the total mean square is 7/300.
yading@11 1121 Our pink noise generator uses 8 bands of white noise with
yading@11 1122 rectangular subsampling: the total mean square is 1/24.
yading@11 1123 Therefore, to match SBaGen's volume, we must multiply vol by
yading@11 1124 sqrt((7/300) / (1/24)) = sqrt(14/25) =~ 0.748
yading@11 1125 */
yading@11 1126 r = add_interval(inter, WS_NOISE, 3, s1->ref.l,
yading@11 1127 ts1, 0, s1->vol - s1->vol / 4,
yading@11 1128 ts2, 0, s2->vol - s2->vol / 4);
yading@11 1129 if (r < 0)
yading@11 1130 return r;
yading@11 1131 s2->ref.l = s2->ref.r = r;
yading@11 1132 break;
yading@11 1133
yading@11 1134 case SBG_TYPE_MIX:
yading@11 1135 /* Unimplemented: silence; warning present elsewhere */
yading@11 1136 default:
yading@11 1137 av_log(log, AV_LOG_ERROR,
yading@11 1138 "Type %d is not implemented\n", s1->type);
yading@11 1139 return AVERROR_PATCHWELCOME;
yading@11 1140 }
yading@11 1141 return 0;
yading@11 1142 }
yading@11 1143
yading@11 1144 static int generate_plateau(void *log, struct sbg_script *s,
yading@11 1145 struct ws_intervals *inter,
yading@11 1146 struct sbg_script_event *ev1)
yading@11 1147 {
yading@11 1148 int64_t ts1 = ev1->ts_int, ts2 = ev1->ts_trans;
yading@11 1149 int i, r;
yading@11 1150 struct sbg_script_synth *s1;
yading@11 1151
yading@11 1152 for (i = 0; i < ev1->nb_elements; i++) {
yading@11 1153 s1 = &s->synth[ev1->elements + i];
yading@11 1154 r = generate_interval(log, s, inter, ts1, ts2, s1, s1, 0);
yading@11 1155 if (r < 0)
yading@11 1156 return r;
yading@11 1157 }
yading@11 1158 return 0;
yading@11 1159 }
yading@11 1160
yading@11 1161 /*
yading@11 1162
yading@11 1163 ts1 ts2 ts1 tsmid ts2
yading@11 1164 | | | | |
yading@11 1165 v v v | v
yading@11 1166 ____ ____ v ____
yading@11 1167 ''''.... ''.. ..''
yading@11 1168 ''''....____ ''....''
yading@11 1169
yading@11 1170 compatible transition incompatible transition
yading@11 1171 */
yading@11 1172
yading@11 1173 static int generate_transition(void *log, struct sbg_script *s,
yading@11 1174 struct ws_intervals *inter,
yading@11 1175 struct sbg_script_event *ev1,
yading@11 1176 struct sbg_script_event *ev2)
yading@11 1177 {
yading@11 1178 int64_t ts1 = ev1->ts_trans, ts2 = ev1->ts_next;
yading@11 1179 /* (ts1 + ts2) / 2 without overflow */
yading@11 1180 int64_t tsmid = (ts1 >> 1) + (ts2 >> 1) + (ts1 & ts2 & 1);
yading@11 1181 enum sbg_fade_type type = ev1->fade.slide | (ev1->fade.out & ev2->fade.in);
yading@11 1182 int nb_elements = FFMAX(ev1->nb_elements, ev2->nb_elements);
yading@11 1183 struct sbg_script_synth *s1, *s2, s1mod, s2mod, smid;
yading@11 1184 int pass, i, r;
yading@11 1185
yading@11 1186 for (pass = 0; pass < 2; pass++) {
yading@11 1187 /* pass = 0 -> compatible and first half of incompatible
yading@11 1188 pass = 1 -> second half of incompatible
yading@11 1189 Using two passes like that ensures that the intervals are generated
yading@11 1190 in increasing order according to their start timestamp.
yading@11 1191 Otherwise it would be necessary to sort them
yading@11 1192 while keeping the mutual references.
yading@11 1193 */
yading@11 1194 for (i = 0; i < nb_elements; i++) {
yading@11 1195 s1 = i < ev1->nb_elements ? &s->synth[ev1->elements + i] : &s1mod;
yading@11 1196 s2 = i < ev2->nb_elements ? &s->synth[ev2->elements + i] : &s2mod;
yading@11 1197 s1mod = s1 != &s1mod ? *s1 : (struct sbg_script_synth){ 0 };
yading@11 1198 s2mod = s2 != &s2mod ? *s2 : (struct sbg_script_synth){ 0 };
yading@11 1199 if (ev1->fade.slide) {
yading@11 1200 /* for slides, and only for slides, silence ("-") is equivalent
yading@11 1201 to anything with volume 0 */
yading@11 1202 if (s1mod.type == SBG_TYPE_NONE) {
yading@11 1203 s1mod = s2mod;
yading@11 1204 s1mod.vol = 0;
yading@11 1205 } else if (s2mod.type == SBG_TYPE_NONE) {
yading@11 1206 s2mod = s1mod;
yading@11 1207 s2mod.vol = 0;
yading@11 1208 }
yading@11 1209 }
yading@11 1210 if (s1mod.type == s2mod.type &&
yading@11 1211 s1mod.type != SBG_TYPE_BELL &&
yading@11 1212 (type == SBG_FADE_ADAPT ||
yading@11 1213 (s1mod.carrier == s2mod.carrier &&
yading@11 1214 s1mod.beat == s2mod.beat))) {
yading@11 1215 /* compatible: single transition */
yading@11 1216 if (!pass) {
yading@11 1217 r = generate_interval(log, s, inter,
yading@11 1218 ts1, ts2, &s1mod, &s2mod, 3);
yading@11 1219 if (r < 0)
yading@11 1220 return r;
yading@11 1221 s2->ref = s2mod.ref;
yading@11 1222 }
yading@11 1223 } else {
yading@11 1224 /* incompatible: silence at midpoint */
yading@11 1225 if (!pass) {
yading@11 1226 smid = s1mod;
yading@11 1227 smid.vol = 0;
yading@11 1228 r = generate_interval(log, s, inter,
yading@11 1229 ts1, tsmid, &s1mod, &smid, 1);
yading@11 1230 if (r < 0)
yading@11 1231 return r;
yading@11 1232 } else {
yading@11 1233 smid = s2mod;
yading@11 1234 smid.vol = 0;
yading@11 1235 r = generate_interval(log, s, inter,
yading@11 1236 tsmid, ts2, &smid, &s2mod, 2);
yading@11 1237 if (r < 0)
yading@11 1238 return r;
yading@11 1239 s2->ref = s2mod.ref;
yading@11 1240 }
yading@11 1241 }
yading@11 1242 }
yading@11 1243 }
yading@11 1244 return 0;
yading@11 1245 }
yading@11 1246
yading@11 1247 /*
yading@11 1248 ev1 trats ev2 intts endts ev3
yading@11 1249 | | | | | |
yading@11 1250 v v v v v v
yading@11 1251 ________________
yading@11 1252 .... .... ....
yading@11 1253 '''....________________....''' '''...._______________
yading@11 1254
yading@11 1255 \_________/\______________/\_________/\______________/\_________/\_____________/
yading@11 1256 tr x->1 int1 tr 1->2 int2 tr 2->3 int3
yading@11 1257 */
yading@11 1258
yading@11 1259 static int generate_intervals(void *log, struct sbg_script *s, int sample_rate,
yading@11 1260 struct ws_intervals *inter)
yading@11 1261 {
yading@11 1262 int64_t trans_time = s->opt_fade_time / 2;
yading@11 1263 struct sbg_script_event ev0, *ev1, *ev2;
yading@11 1264 int64_t period;
yading@11 1265 int i, r;
yading@11 1266
yading@11 1267 /* SBaGen handles the time before and after the extremal events,
yading@11 1268 and the corresponding transitions, as if the sequence were cyclic
yading@11 1269 with a 24-hours period. */
yading@11 1270 period = s->events[s->nb_events - 1].ts - s->events[0].ts;
yading@11 1271 period = (period + (DAY_TS - 1)) / DAY_TS * DAY_TS;
yading@11 1272 period = FFMAX(period, DAY_TS);
yading@11 1273
yading@11 1274 /* Prepare timestamps for transitions */
yading@11 1275 for (i = 0; i < s->nb_events; i++) {
yading@11 1276 ev1 = &s->events[i];
yading@11 1277 ev2 = &s->events[(i + 1) % s->nb_events];
yading@11 1278 ev1->ts_int = ev1->ts;
yading@11 1279 ev1->ts_trans = ev1->fade.slide ? ev1->ts
yading@11 1280 : ev2->ts + (ev1 < ev2 ? 0 : period);
yading@11 1281 }
yading@11 1282 for (i = 0; i < s->nb_events; i++) {
yading@11 1283 ev1 = &s->events[i];
yading@11 1284 ev2 = &s->events[(i + 1) % s->nb_events];
yading@11 1285 if (!ev1->fade.slide) {
yading@11 1286 ev1->ts_trans = FFMAX(ev1->ts_int, ev1->ts_trans - trans_time);
yading@11 1287 ev2->ts_int = FFMIN(ev2->ts_trans, ev2->ts_int + trans_time);
yading@11 1288 }
yading@11 1289 ev1->ts_next = ev2->ts_int + (ev1 < ev2 ? 0 : period);
yading@11 1290 }
yading@11 1291
yading@11 1292 /* Pseudo event before the first one */
yading@11 1293 ev0 = s->events[s->nb_events - 1];
yading@11 1294 ev0.ts_int -= period;
yading@11 1295 ev0.ts_trans -= period;
yading@11 1296 ev0.ts_next -= period;
yading@11 1297
yading@11 1298 /* Convert timestamps */
yading@11 1299 for (i = -1; i < s->nb_events; i++) {
yading@11 1300 ev1 = i < 0 ? &ev0 : &s->events[i];
yading@11 1301 ev1->ts_int = av_rescale(ev1->ts_int, sample_rate, AV_TIME_BASE);
yading@11 1302 ev1->ts_trans = av_rescale(ev1->ts_trans, sample_rate, AV_TIME_BASE);
yading@11 1303 ev1->ts_next = av_rescale(ev1->ts_next, sample_rate, AV_TIME_BASE);
yading@11 1304 }
yading@11 1305
yading@11 1306 /* Generate intervals */
yading@11 1307 for (i = 0; i < s->nb_synth; i++)
yading@11 1308 s->synth[i].ref.l = s->synth[i].ref.r = -1;
yading@11 1309 for (i = -1; i < s->nb_events; i++) {
yading@11 1310 ev1 = i < 0 ? &ev0 : &s->events[i];
yading@11 1311 ev2 = &s->events[(i + 1) % s->nb_events];
yading@11 1312 r = generate_plateau(log, s, inter, ev1);
yading@11 1313 if (r < 0)
yading@11 1314 return r;
yading@11 1315 r = generate_transition(log, s, inter, ev1, ev2);
yading@11 1316 if (r < 0)
yading@11 1317 return r;
yading@11 1318 }
yading@11 1319 if (!inter->nb_inter)
yading@11 1320 av_log(log, AV_LOG_WARNING, "Completely silent script.\n");
yading@11 1321 return 0;
yading@11 1322 }
yading@11 1323
yading@11 1324 static int encode_intervals(struct sbg_script *s, AVCodecContext *avc,
yading@11 1325 struct ws_intervals *inter)
yading@11 1326 {
yading@11 1327 int i, edata_size = 4;
yading@11 1328 uint8_t *edata;
yading@11 1329
yading@11 1330 for (i = 0; i < inter->nb_inter; i++) {
yading@11 1331 edata_size += inter->inter[i].type == WS_SINE ? 44 :
yading@11 1332 inter->inter[i].type == WS_NOISE ? 32 : 0;
yading@11 1333 if (edata_size < 0)
yading@11 1334 return AVERROR(ENOMEM);
yading@11 1335 }
yading@11 1336 edata = av_malloc(edata_size);
yading@11 1337 if (!edata)
yading@11 1338 return AVERROR(ENOMEM);
yading@11 1339 avc->extradata = edata;
yading@11 1340 avc->extradata_size = edata_size;
yading@11 1341
yading@11 1342 #define ADD_EDATA32(v) do { AV_WL32(edata, (v)); edata += 4; } while(0)
yading@11 1343 #define ADD_EDATA64(v) do { AV_WL64(edata, (v)); edata += 8; } while(0)
yading@11 1344 ADD_EDATA32(inter->nb_inter);
yading@11 1345 for (i = 0; i < inter->nb_inter; i++) {
yading@11 1346 ADD_EDATA64(inter->inter[i].ts1);
yading@11 1347 ADD_EDATA64(inter->inter[i].ts2);
yading@11 1348 ADD_EDATA32(inter->inter[i].type);
yading@11 1349 ADD_EDATA32(inter->inter[i].channels);
yading@11 1350 switch (inter->inter[i].type) {
yading@11 1351 case WS_SINE:
yading@11 1352 ADD_EDATA32(inter->inter[i].f1);
yading@11 1353 ADD_EDATA32(inter->inter[i].f2);
yading@11 1354 ADD_EDATA32(inter->inter[i].a1);
yading@11 1355 ADD_EDATA32(inter->inter[i].a2);
yading@11 1356 ADD_EDATA32(inter->inter[i].phi);
yading@11 1357 break;
yading@11 1358 case WS_NOISE:
yading@11 1359 ADD_EDATA32(inter->inter[i].a1);
yading@11 1360 ADD_EDATA32(inter->inter[i].a2);
yading@11 1361 break;
yading@11 1362 }
yading@11 1363 }
yading@11 1364 if (edata != avc->extradata + edata_size)
yading@11 1365 return AVERROR_BUG;
yading@11 1366 return 0;
yading@11 1367 }
yading@11 1368
yading@11 1369 static av_cold int sbg_read_probe(AVProbeData *p)
yading@11 1370 {
yading@11 1371 int r, score;
yading@11 1372 struct sbg_script script = { 0 };
yading@11 1373
yading@11 1374 r = parse_script(NULL, p->buf, p->buf_size, &script);
yading@11 1375 score = r < 0 || !script.nb_def || !script.nb_tseq ? 0 :
yading@11 1376 AVPROBE_SCORE_MAX / 3;
yading@11 1377 free_script(&script);
yading@11 1378 return score;
yading@11 1379 }
yading@11 1380
yading@11 1381 static av_cold int sbg_read_header(AVFormatContext *avf)
yading@11 1382 {
yading@11 1383 struct sbg_demuxer *sbg = avf->priv_data;
yading@11 1384 int r;
yading@11 1385 char *buf = NULL;
yading@11 1386 struct sbg_script script = { 0 };
yading@11 1387 AVStream *st;
yading@11 1388 struct ws_intervals inter = { 0 };
yading@11 1389
yading@11 1390 r = read_whole_file(avf->pb, sbg->max_file_size, &buf);
yading@11 1391 if (r < 0)
yading@11 1392 goto fail;
yading@11 1393 r = parse_script(avf, buf, r, &script);
yading@11 1394 if (r < 0)
yading@11 1395 goto fail;
yading@11 1396 if (!sbg->sample_rate)
yading@11 1397 sbg->sample_rate = script.sample_rate;
yading@11 1398 else
yading@11 1399 script.sample_rate = sbg->sample_rate;
yading@11 1400 if (!sbg->frame_size)
yading@11 1401 sbg->frame_size = FFMAX(1, sbg->sample_rate / 10);
yading@11 1402 if (script.opt_mix)
yading@11 1403 av_log(avf, AV_LOG_WARNING, "Mix feature not implemented: "
yading@11 1404 "-m is ignored and mix channels will be silent.\n");
yading@11 1405 r = expand_script(avf, &script);
yading@11 1406 if (r < 0)
yading@11 1407 goto fail;
yading@11 1408 av_freep(&buf);
yading@11 1409 r = generate_intervals(avf, &script, sbg->sample_rate, &inter);
yading@11 1410 if (r < 0)
yading@11 1411 goto fail;
yading@11 1412
yading@11 1413 st = avformat_new_stream(avf, NULL);
yading@11 1414 if (!st)
yading@11 1415 return AVERROR(ENOMEM);
yading@11 1416 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
yading@11 1417 st->codec->codec_id = AV_CODEC_ID_FFWAVESYNTH;
yading@11 1418 st->codec->channels = 2;
yading@11 1419 st->codec->channel_layout = AV_CH_LAYOUT_STEREO;
yading@11 1420 st->codec->sample_rate = sbg->sample_rate;
yading@11 1421 st->codec->frame_size = sbg->frame_size;
yading@11 1422 avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
yading@11 1423 st->probe_packets = 0;
yading@11 1424 st->start_time = av_rescale(script.start_ts,
yading@11 1425 sbg->sample_rate, AV_TIME_BASE);
yading@11 1426 st->duration = script.end_ts == AV_NOPTS_VALUE ? AV_NOPTS_VALUE :
yading@11 1427 av_rescale(script.end_ts - script.start_ts,
yading@11 1428 sbg->sample_rate, AV_TIME_BASE);
yading@11 1429 st->cur_dts = st->start_time;
yading@11 1430 r = encode_intervals(&script, st->codec, &inter);
yading@11 1431 if (r < 0)
yading@11 1432 goto fail;
yading@11 1433
yading@11 1434 av_free(inter.inter);
yading@11 1435 free_script(&script);
yading@11 1436 return 0;
yading@11 1437
yading@11 1438 fail:
yading@11 1439 av_free(inter.inter);
yading@11 1440 free_script(&script);
yading@11 1441 av_free(buf);
yading@11 1442 return r;
yading@11 1443 }
yading@11 1444
yading@11 1445 static int sbg_read_packet(AVFormatContext *avf, AVPacket *packet)
yading@11 1446 {
yading@11 1447 int64_t ts, end_ts;
yading@11 1448
yading@11 1449 ts = avf->streams[0]->cur_dts;
yading@11 1450 end_ts = ts + avf->streams[0]->codec->frame_size;
yading@11 1451 if (avf->streams[0]->duration != AV_NOPTS_VALUE)
yading@11 1452 end_ts = FFMIN(avf->streams[0]->start_time + avf->streams[0]->duration,
yading@11 1453 end_ts);
yading@11 1454 if (end_ts <= ts)
yading@11 1455 return AVERROR_EOF;
yading@11 1456 if (av_new_packet(packet, 12) < 0)
yading@11 1457 return AVERROR(ENOMEM);
yading@11 1458 packet->dts = packet->pts = ts;
yading@11 1459 packet->duration = end_ts - ts;
yading@11 1460 AV_WL64(packet->data + 0, ts);
yading@11 1461 AV_WL32(packet->data + 8, packet->duration);
yading@11 1462 return packet->size;
yading@11 1463 }
yading@11 1464
yading@11 1465 static int sbg_read_seek2(AVFormatContext *avf, int stream_index,
yading@11 1466 int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
yading@11 1467 {
yading@11 1468 if (flags || stream_index > 0)
yading@11 1469 return AVERROR(EINVAL);
yading@11 1470 if (stream_index < 0)
yading@11 1471 ts = av_rescale_q(ts, AV_TIME_BASE_Q, avf->streams[0]->time_base);
yading@11 1472 avf->streams[0]->cur_dts = ts;
yading@11 1473 return 0;
yading@11 1474 }
yading@11 1475
yading@11 1476 static int sbg_read_seek(AVFormatContext *avf, int stream_index,
yading@11 1477 int64_t ts, int flags)
yading@11 1478 {
yading@11 1479 return sbg_read_seek2(avf, stream_index, ts, ts, ts, 0);
yading@11 1480 }
yading@11 1481
yading@11 1482 static const AVOption sbg_options[] = {
yading@11 1483 { "sample_rate", "", offsetof(struct sbg_demuxer, sample_rate),
yading@11 1484 AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
yading@11 1485 AV_OPT_FLAG_DECODING_PARAM },
yading@11 1486 { "frame_size", "", offsetof(struct sbg_demuxer, frame_size),
yading@11 1487 AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
yading@11 1488 AV_OPT_FLAG_DECODING_PARAM },
yading@11 1489 { "max_file_size", "", offsetof(struct sbg_demuxer, max_file_size),
yading@11 1490 AV_OPT_TYPE_INT, { .i64 = 5000000 }, 0, INT_MAX,
yading@11 1491 AV_OPT_FLAG_DECODING_PARAM },
yading@11 1492 { NULL },
yading@11 1493 };
yading@11 1494
yading@11 1495 static const AVClass sbg_demuxer_class = {
yading@11 1496 .class_name = "sbg_demuxer",
yading@11 1497 .item_name = av_default_item_name,
yading@11 1498 .option = sbg_options,
yading@11 1499 .version = LIBAVUTIL_VERSION_INT,
yading@11 1500 };
yading@11 1501
yading@11 1502 AVInputFormat ff_sbg_demuxer = {
yading@11 1503 .name = "sbg",
yading@11 1504 .long_name = NULL_IF_CONFIG_SMALL("SBaGen binaural beats script"),
yading@11 1505 .priv_data_size = sizeof(struct sbg_demuxer),
yading@11 1506 .read_probe = sbg_read_probe,
yading@11 1507 .read_header = sbg_read_header,
yading@11 1508 .read_packet = sbg_read_packet,
yading@11 1509 .read_seek = sbg_read_seek,
yading@11 1510 .read_seek2 = sbg_read_seek2,
yading@11 1511 .extensions = "sbg",
yading@11 1512 .priv_class = &sbg_demuxer_class,
yading@11 1513 };