xref: /third_party/ffmpeg/libavformat/sbgdec.c (revision cabdff1a)
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