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