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.
#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).
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Init a print buffer.
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 **)
Buffer to print data progressively.
unsigned len
length so far
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)