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