37#define SBG_SCALE (1 << 16)
38#define DAY (24 * 60 * 60)
39#define DAY_TS ((int64_t)DAY * AV_TIME_BASE)
164 int *
size,
int *max_size)
168 if (*
size == *max_size) {
169 int m =
FFMAX(32,
FFMIN(*max_size, INT_MAX / 2) * 2);
178 memset(ret, 0, elsize);
185 const char *cur = str;
191 if (*cur <
'0' || *cur >
'9')
193 hours = strtol(cur, &end, 10);
194 if (end == cur || *end !=
':' || end[1] <
'0' || end[1] >
'9')
197 minutes = strtol(cur, &end, 10);
202 seconds =
strtod(cur + 1, &end);
213 return c ==
' ' ||
c ==
'\t' ||
c ==
'\r';
219 if (m < INT_MIN || m >= INT_MAX) {
232 while (p->cursor < p->end &&
is_space(*p->cursor))
234 return p->cursor >
c;
239 int r = p->cursor < p->end && *p->cursor ==
c;
250 if (p->cursor == p->end ||
is_space(*p->cursor) || *p->cursor ==
'\n')
252 d =
strtod(p->cursor, &end);
253 if (end > p->cursor) {
263 if (p->end - p->cursor < l || memcmp(p->cursor, t, l))
271 if (p->cursor < p->end && *p->cursor ==
'#') {
273 while (p->cursor < p->end && *p->cursor !=
'\n')
276 if (p->cursor == p->end)
279 if (*p->cursor !=
'\n')
289 char *
s = p->cursor, *
c =
s;
291 if (
s == p->end || *
s ==
'\n')
296 rs->
e = p->cursor =
c;
303 char *
s = p->cursor, *
c =
s;
305 while (
c < p->end && ((*
c >=
'a' && *
c <=
'z') || (*
c >=
'A' && *
c <=
'Z')
306 || (*
c >=
'0' && *
c <=
'9') || *
c ==
'_' || *
c ==
'-'))
311 rs->
e = p->cursor =
c;
322#define FORWARD_ERROR(c) \
326 return errcode ? errcode : AVERROR_INVALIDDATA; \
331 snprintf(p->err_msg,
sizeof(p->err_msg),
332 "immediate sequences not yet implemented");
338 snprintf(p->err_msg,
sizeof(p->err_msg),
339 "preprogrammed sequences not yet implemented");
346 snprintf(p->err_msg,
sizeof(p->err_msg),
347 "option '%c' requires an argument", o);
361 if (p->cursor == p->end || *p->cursor !=
'-')
364 for (; ostr.
s < ostr.
e; ostr.
s++) {
368 p->scs.opt_start_at_first = 1;
371 p->scs.opt_end_at_last = 1;
382 if (oarg.
e != tptr) {
383 snprintf(p->err_msg,
sizeof(p->err_msg),
384 "syntax error for option -F");
392 if (oarg.
e != oarg.
s +
r || p->scs.opt_duration < 0) {
393 snprintf(p->err_msg,
sizeof(p->err_msg),
394 "syntax error for option -L");
401 if (oarg.
e != oarg.
s +
r) {
402 snprintf(p->err_msg,
sizeof(p->err_msg),
403 "syntax error for option -T");
412 memcpy(tptr, oarg.
s, oarg.
e - oarg.
s);
413 tptr[oarg.
e - oarg.
s] = 0;
415 p->scs.opt_mix = tptr;
420 if (oarg.
e != tptr) {
421 snprintf(p->err_msg,
sizeof(p->err_msg),
422 "syntax error for option -q");
426 snprintf(p->err_msg,
sizeof(p->err_msg),
427 "speed factor other than 1 not supported");
433 r = strtol(oarg.
s, &tptr, 10);
434 if (oarg.
e != tptr) {
435 snprintf(p->err_msg,
sizeof(p->err_msg),
436 "syntax error for option -r");
440 snprintf(p->err_msg,
sizeof(p->err_msg),
441 "invalid sample rate");
444 p->scs.sample_rate =
r;
447 snprintf(p->err_msg,
sizeof(p->err_msg),
448 "unknown option: '%c'", *ostr.
s);
540 p->current_time.type =
ts.
type;
541 p->current_time.t =
ts.
t;
542 }
else if(!inblock && !p->current_time.type) {
543 snprintf(p->err_msg,
sizeof(p->err_msg),
544 "relative time without previous absolute time");
547 ts.
type = p->current_time.type;
549 if (
av_sat_add64(p->current_time.t, rel_ts) != p->current_time.t + (uint64_t)rel_ts)
551 ts.
t = p->current_time.t + rel_ts;
567 &p->nb_block_tseq, &p->nb_block_tseq_max) :
569 &p->scs.nb_tseq, &p->nb_tseq_max);
581 snprintf(p->err_msg,
sizeof(p->err_msg),
582 "waveform definitions not yet implemented");
594 tseq = p->nb_block_tseq;
631 double carrierf, beatf;
632 int carrier, beat, vol;
697 double carrierf, beatf;
698 int carrier, beat, vol;
723 &p->scs.nb_synth, &p->nb_synth_max);
748 synth = p->scs.nb_synth;
757 if (synth == p->scs.nb_synth)
769 char *cursor_save = p->cursor;
774 p->cursor = cursor_save;
777 if (
name.e -
name.s == 6 && !memcmp(
name.s,
"wave", 4) &&
778 name.s[4] >=
'0' &&
name.s[4] <=
'9' &&
779 name.s[5] >=
'0' &&
name.s[5] <=
'9') {
780 int wavenum = (
name.s[4] -
'0') * 10 + (
name.s[5] -
'0');
784 &p->scs.nb_def, &p->nb_def_max);
810 .end =
script + script_len,
817 .sample_rate = 44100,
851 int lctx = ectx -
ctx;
852 const char *quote =
"\"";
853 if (lctx > 0 &&
ctx[lctx - 1] ==
'\r')
856 ctx =
"the end of line";
887 for (
i = 0;
i <
s->nb_tseq;
i++)
888 nb_rel +=
s->tseq[
i].ts.type ==
'N';
889 if (nb_rel ==
s->nb_tseq) {
894 "Start time ignored in a purely relative script.\n");
896 s->opt_start_at_first) {
899 s->start_ts =
s->tseq[0].ts.t;
904 struct tm *tm, tmpbuf;
907 "Scripts with mixed absolute and relative timestamps can give "
908 "unexpected results (pause, seeking, time zone change).\n");
911 now = tm ? tm->tm_hour * 3600 + tm->tm_min * 60 + tm->tm_sec :
914 (
int)(now / 3600), (
int)(now / 60) % 60, (
int)now % 60);
916 for (
i = 0;
i <
s->nb_tseq;
i++) {
917 if (
s->tseq[
i].ts.type ==
'N') {
918 s->tseq[
i].ts.t += now;
919 s->tseq[
i].ts.type =
'T';
924 s->start_ts = (
s->opt_start_at_first &&
s->tseq) ?
s->tseq[0].ts.t : now;
925 if (
s->start_ts > INT64_MAX -
s->opt_duration)
928 s->end_ts =
s->opt_duration ?
s->start_ts +
s->opt_duration :
931 for (
i = 0;
i <
s->nb_tseq;
i++) {
934 if (
s->tseq[
i].ts.t +
delta < cur_ts)
936 cur_ts =
s->tseq[
i].ts.t +=
delta;
958 for (
i = 0;
i <
s->nb_def;
i++) {
963 if (
i >=
s->nb_def) {
969 if (def->
type ==
'B') {
978 &
s->nb_events, nb_ev_max);
992 int i,
r, nb_events_max = 0;
997 for (
i = 0;
i <
s->nb_tseq;
i++) {
1002 if (!
s->nb_events) {
1006 if (
s->opt_end_at_last)
1007 s->end_ts =
s->events[
s->nb_events - 1].ts;
1041 i->phi =
ref >= 0 ?
ref | 0x80000000 : 0;
1064 ts3,
f,
a, ts4,
f, cpoints[
i][1]);
1088 if (s1->
beat == 0 && s2->
beat == 0) {
1112 if (transition == 2) {
1121 "using pink noise instead.\n");
1146 "Type %d is not implemented\n", s1->
type);
1188 int64_t tsmid = (ts1 >> 1) + (ts2 >> 1) + (ts1 & ts2 & 1);
1194 for (pass = 0; pass < 2; pass++) {
1202 for (
i = 0;
i < nb_elements;
i++) {
1226 ts1, ts2, &s1mod, &s2mod, 3);
1237 ts1, tsmid, &s1mod, &smid, 1);
1244 tsmid, ts2, &smid, &s2mod, 2);
1270 int64_t trans_time =
s->opt_fade_time / 2;
1278 period =
s->events[
s->nb_events - 1].ts - (uint64_t)
s->events[0].ts;
1286 for (
i = 0;
i <
s->nb_events;
i++) {
1287 ev1 = &
s->events[
i];
1288 ev2 = &
s->events[(
i + 1) %
s->nb_events];
1291 if (!ev1->
fade.
slide && ev1 >= ev2 && ev2->
ts > INT64_MAX - period)
1295 : ev2->
ts + (ev1 < ev2 ? 0 : period);
1297 for (
i = 0;
i <
s->nb_events;
i++) {
1298 ev1 = &
s->events[
i];
1299 ev2 = &
s->events[(
i + 1) %
s->nb_events];
1308 ev0 =
s->events[
s->nb_events - 1];
1316 for (
i = -1;
i <
s->nb_events;
i++) {
1317 ev1 =
i < 0 ? &ev0 : &
s->events[
i];
1324 for (
i = 0;
i <
s->nb_synth;
i++)
1325 s->synth[
i].ref.l =
s->synth[
i].ref.r = -1;
1326 for (
i = -1;
i <
s->nb_events;
i++) {
1327 ev1 =
i < 0 ? &ev0 : &
s->events[
i];
1328 ev2 = &
s->events[(
i + 1) %
s->nb_events];
1344 int i, edata_size = 4, ret;
1357#define ADD_EDATA32(v) do { AV_WL32(edata, (v)); edata += 4; } while(0)
1358#define ADD_EDATA64(v) do { AV_WL64(edata, (v)); edata += 8; } while(0)
1379 if (edata != par->
extradata + edata_size)
1422 "-m is ignored and mix channels will be silent.\n");
1492 packet->
dts = packet->
pts = ts;
1496 return packet->
size;
1502 if (
flags || stream_index > 0)
1504 if (stream_index < 0)
1517 {
"sample_rate",
"", offsetof(
struct sbg_demuxer, sample_rate),
1523 {
"max_file_size",
"", offsetof(
struct sbg_demuxer, max_file_size),
1530 .class_name =
"sbg_demuxer",
1539 .p.extensions =
"sbg",
static AVFormatContext * ctx
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.
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
static int read_probe(const AVProbeData *p)
Public libavutil channel layout APIs header.
static const uint8_t frame_size[4]
#define AV_OPT_FLAG_DECODING_PARAM
A generic parameter which can be set by the user for demuxing or decoding.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_CODEC_ID_FFWAVESYNTH
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
#define AV_CHANNEL_LAYOUT_STEREO
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AVERROR_EOF
End of file.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
static void * av_x_if_null(const void *p, const void *x)
Return x default pointer in case p is NULL.
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define AV_TIME_BASE
Internal time base represented as integer.
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
#define LIBAVUTIL_VERSION_INT
Macro definitions for various function/variable attributes.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
#define MKTAG(a, b, c, d)
Memory handling functions.
static void free_script(struct sbg_script *s)
static int parse_synth_def(struct sbg_parser *p, struct sbg_script_definition *def)
static int parse_preprogrammed(struct sbg_parser *p)
static av_cold int sbg_read_header(AVFormatContext *avf)
static int lex_name(struct sbg_parser *p, struct sbg_string *rs)
static int parse_volume(struct sbg_parser *p, int *vol)
static int encode_intervals(struct sbg_script *s, AVCodecParameters *par, struct ws_intervals *inter)
static int parse_timestamp(struct sbg_parser *p, struct sbg_timestamp *rts, int64_t *rrel)
static int parse_synth_channel_bell(struct sbg_parser *p, struct sbg_script_synth *synth)
static int lex_wsword(struct sbg_parser *p, struct sbg_string *rs)
static int generate_transition(void *log, struct sbg_script *s, struct ws_intervals *inter, struct sbg_script_event *ev1, struct sbg_script_event *ev2)
static int lex_char(struct sbg_parser *p, char c)
static int parse_synth_channel_pink(struct sbg_parser *p, struct sbg_script_synth *synth)
static int expand_timestamps(void *log, struct sbg_script *s)
static int parse_block_def(struct sbg_parser *p, struct sbg_script_definition *def)
static int parse_options(struct sbg_parser *p)
static int str_to_time(const char *str, int64_t *rtime)
static int parse_fade(struct sbg_parser *p, struct sbg_fade *fr)
static int parse_immediate(struct sbg_parser *p)
static int scale_double(void *log, double d, double m, int *r)
static int lex_line_end(struct sbg_parser *p)
static int sbg_read_seek2(AVFormatContext *avf, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
static int generate_intervals(void *log, struct sbg_script *s, int sample_rate, struct ws_intervals *inter)
static int parse_time_sequence(struct sbg_parser *p, int inblock)
static int parse_wave_def(struct sbg_parser *p, int wavenum)
static av_cold int sbg_read_probe(const AVProbeData *p)
static int sbg_read_seek(AVFormatContext *avf, int stream_index, int64_t ts, int flags)
static int lex_fixed(struct sbg_parser *p, const char *t, int l)
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)
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)
static int lex_space(struct sbg_parser *p)
static int sbg_read_packet(AVFormatContext *avf, AVPacket *packet)
static int parse_optarg(struct sbg_parser *p, char o, struct sbg_string *r)
static int parse_synth_channel_mix(struct sbg_parser *p, struct sbg_script_synth *synth)
static int parse_synth_channel(struct sbg_parser *p)
static int lex_double(struct sbg_parser *p, double *r)
static void * alloc_array_elem(void **array, size_t elsize, int *size, int *max_size)
static int lex_time(struct sbg_parser *p, int64_t *rt)
static int read_whole_file(AVIOContext *io, int max_size, AVBPrint *rbuf)
static int add_bell(struct ws_intervals *inter, struct sbg_script *s, int64_t ts1, int64_t ts2, int32_t f, int32_t a)
static int parse_script(void *log, char *script, int script_len, struct sbg_script *rscript)
static int parse_named_def(struct sbg_parser *p)
static const AVOption sbg_options[]
static int expand_tseq(void *log, struct sbg_script *s, int *nb_ev_max, int64_t t0, struct sbg_script_tseq *tseq)
static const AVClass sbg_demuxer_class
static int is_space(char c)
static int expand_script(void *log, struct sbg_script *s)
static int parse_synth_channel_spin(struct sbg_parser *p, struct sbg_script_synth *synth)
static int generate_plateau(void *log, struct sbg_script *s, struct ws_intervals *inter, struct sbg_script_event *ev1)
static int parse_synth_channel_sine(struct sbg_parser *p, struct sbg_script_synth *synth)
#define FF_ARRAY_ELEMS(a)
double strtod(const char *, char **)
An AVChannelLayout holds information about the channel layout of audio data.
Describe the class of an AVClass context structure.
This struct describes the properties of an encoded stream.
int frame_size
Audio frame size, if known.
AVChannelLayout ch_layout
The channel layout and number of channels.
enum AVMediaType codec_type
General type of the encoded data.
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
int sample_rate
The number of audio samples per second.
AVIOContext * pb
I/O context.
void * priv_data
Format private data.
AVStream ** streams
A list of all streams in the file.
int eof_reached
true if was unable to read due to error or eof
This structure stores compressed data.
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
This structure contains the data a format has to probe a file.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int64_t duration
Decoding: duration of the stream, in stream time base.
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base.
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
int probe_packets
Number of packets to buffer for codec probing.
struct sbg_timestamp current_time
struct sbg_script_synth::@063010234066362206263163064344241116375044362047 ref
struct sbg_script_tseq * tseq
struct sbg_script_tseq * block_tseq
uint8_t opt_start_at_first
struct sbg_script_event * events
struct sbg_script_synth * synth
struct sbg_script_definition * def
enum ws_interval_type type
struct ws_interval * inter
#define av_realloc_f(p, o, n)
static int ref[MAX_W *MAX_W]
static int array[MAX_W *MAX_W]
static double a2(void *priv, double x, double y)
static double a1(void *priv, double x, double y)
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)