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