37 #define COMMAND_FLAG_ENTER 1 
   38 #define COMMAND_FLAG_LEAVE 2 
   42     static const char * 
const flag_strings[] = { 
"enter", 
"leave" };
 
   82 #define OFFSET(x) offsetof(SendCmdContext, x) 
   83 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_VIDEO_PARAM 
   92 #define SPACES " \f\t\n\r" 
   98         *buf += strspn(*buf, 
SPACES);
 
  105         *buf += strcspn(*buf, 
"\n");
 
  111 #define COMMAND_DELIMS " \f\t\n\r,;" 
  114                          const char **
buf, 
void *log_ctx)
 
  118     memset(cmd, 0, 
sizeof(
Command));
 
  119     cmd->
index = cmd_count;
 
  122     *buf += strspn(*buf, 
SPACES);
 
  129             int len = strcspn(*buf, 
"|+]");
 
  137                        "Unknown flag '%s' in interval #%d, command #%d\n",
 
  138                        flag_buf, interval_count, cmd_count);
 
  144             if (!strspn(*buf, 
"+|")) {
 
  146                        "Invalid flags char '%c' in interval #%d, command #%d\n",
 
  147                        **buf, interval_count, cmd_count);
 
  156                    "Missing flag terminator or extraneous data found at the end of flags " 
  157                    "in interval #%d, command #%d\n", interval_count, cmd_count);
 
  165     *buf += strspn(*buf, 
SPACES);
 
  169                "No target specified in interval #%d, command #%d\n",
 
  170                interval_count, cmd_count);
 
  175     *buf += strspn(*buf, 
SPACES);
 
  179                "No command specified in interval #%d, command #%d\n",
 
  180                interval_count, cmd_count);
 
  185     *buf += strspn(*buf, 
SPACES);
 
  198                           const char **
buf, 
void *log_ctx)
 
  210         if ((ret = 
parse_command(&cmd, cmd_count, interval_count, buf, log_ctx)) < 0)
 
  220                        "Could not (re)allocate command array\n");
 
  225         (*cmds)[(*nb_cmds)++] = cmd;
 
  227         *buf += strspn(*buf, 
SPACES);
 
  228         if (**buf && **buf != 
';' && **buf != 
',') {
 
  230                    "Missing separator or extraneous data found at the end of " 
  231                    "interval #%d, in command #%d\n",
 
  232                    interval_count, cmd_count);
 
  234                    "Command was parsed as: flags:[%s] target:%s command:%s arg:%s\n",
 
  247 #define DELIMS " \f\t\n\r,;" 
  250                           const char **
buf, 
void *log_ctx)
 
  255     *buf += strspn(*buf, 
SPACES);
 
  260     memset(interval, 0, 
sizeof(
Interval));
 
  261     interval->
index = interval_count;
 
  267     if (intervalstr && intervalstr[0]) {
 
  270         start = 
av_strtok(intervalstr, 
"-", &end);
 
  273                    "Invalid start time specification '%s' in interval #%d\n",
 
  274                    start, interval_count);
 
  281                        "Invalid end time specification '%s' in interval #%d\n",
 
  282                        end, interval_count);
 
  286             interval->
end_ts = INT64_MAX;
 
  290                    "Invalid end time '%s' in interval #%d: " 
  291                    "cannot be lesser than start time '%s'\n",
 
  292                    end, interval_count, start);
 
  298                "No interval specified for interval #%d\n", interval_count);
 
  305                          interval_count, buf, log_ctx);
 
  313                            const char *
buf, 
void *log_ctx)
 
  315     int interval_count = 0;
 
  331         if ((ret = 
parse_interval(&interval, interval_count, &buf, log_ctx)) < 0)
 
  334         buf += strspn(buf, 
SPACES);
 
  338                        "Missing terminator or extraneous data found at the end of interval #%d\n",
 
  347         if (*nb_intervals == n) {
 
  352                        "Could not (re)allocate intervals array\n");
 
  357         (*intervals)[(*nb_intervals)++] = interval;
 
  377                "One and only one of the filename or commands options must be specified\n");
 
  385                           &file_buf, &file_bufsize, 0, ctx);
 
  395         memcpy(buf, file_buf, file_bufsize);
 
  396         buf[file_bufsize] = 0;
 
  421                    "    [%s] target:%s command:%s arg:%s index:%d\n",
 
  459 #define WITHIN_INTERVAL(ts, start_ts, end_ts) ((ts) >= (start_ts) && (ts) < (end_ts)) 
  477                    "[%s] interval #%d start_ts:%f end_ts:%f ts:%f\n",
 
  479                    (
double)interval->
start_ts/1000000, (
double)interval->
end_ts/1000000,
 
  482             for (j = 0; flags && j < interval->
nb_commands; j++) {
 
  486                 if (cmd->
flags & flags) {
 
  488                            "Processing command #%d target:%s command:%s arg:%s\n",
 
  495                            "Command reply for command #%d: ret:%s res:%s\n",
 
  503     switch (inlink->
type) {
 
  512 #if CONFIG_SENDCMD_FILTER 
  514 #define sendcmd_options options 
  542     .priv_class  = &sendcmd_class,
 
  547 #if CONFIG_ASENDCMD_FILTER 
  549 #define asendcmd_options options 
  575     .
inputs      = asendcmd_inputs,
 
  577     .priv_class  = &asendcmd_class,
 
void av_bprintf(AVBPrint *buf, const char *fmt,...)
This structure describes decoded (raw) audio or video data. 
#define av_realloc_f(p, o, n)
static int cmp_intervals(const void *a, const void *b)
Main libavfilter public API header. 
int av_parse_time(int64_t *timeval, const char *timestr, int duration)
Parse timestr and return in *time a corresponding number of microseconds. 
int index
unique index for these interval commands 
static int parse_commands(Command **cmds, int *nb_cmds, int interval_count, const char **buf, void *log_ctx)
static int parse_interval(Interval *interval, int interval_count, const char **buf, void *log_ctx)
const char * name
Pad name. 
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter. 
static void skip_comments(const char **buf)
static av_cold int end(AVCodecContext *avctx)
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user). 
#define AV_LOG_VERBOSE
Detailed information. 
static int parse_intervals(Interval **intervals, int *nb_intervals, const char *buf, void *log_ctx)
A filter pad used for either input or output. 
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers. 
A link between two filters. 
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered. 
void av_file_unmap(uint8_t *bufptr, size_t size)
Unmap or free the buffer bufptr created by av_file_map(). 
int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, int log_offset, void *log_ctx)
Read the file with name filename, and put its content in a newly allocated buffer or map it with mmap...
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
void * priv
private data for use by the filter 
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers. 
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link...
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst. 
char * av_get_token(const char **buf, const char *term)
Unescape the given string until a non escaped terminating char, and return the token corresponding to...
static av_cold void uninit(AVFilterContext *ctx)
#define FFDIFFSIGN(x, y)
Comparator. 
int enabled
current time detected inside this interval 
static int parse_command(Command *cmd, int cmd_count, int interval_count, const char **buf, void *log_ctx)
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
#define COMMAND_FLAG_LEAVE
#define AVFILTER_CMD_FLAG_ONE
Stop once a filter understood the command (for target=all for example), fast filters are favored auto...
static const AVFilterPad outputs[]
#define FF_ARRAY_ELEMS(a)
static const AVFilterPad inputs[]
#define AV_BPRINT_SIZE_AUTOMATIC
#define AV_TIME_BASE_Q
Internal time base represented as fractional value. 
static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
Describe the class of an AVClass context structure. 
static av_cold int init(AVFilterContext *ctx)
#define COMMAND_FLAG_ENTER
const char * name
Filter name. 
static char * make_command_flags_str(AVBPrint *pbuf, int flags)
int64_t end_ts
end timestamp expressed as microseconds units 
AVFilterLink ** outputs
array of pointers to output links 
enum AVMediaType type
filter media type 
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok()...
struct AVFilterGraph * graph
Graph the filter belongs to. 
static int ref[MAX_W *MAX_W]
int64_t start_ts
start timestamp expressed as microseconds units 
int avfilter_graph_send_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, char *res, int res_len, int flags)
Send a command to one or more filter instances. 
AVFilterContext * dst
dest filter 
#define AVFILTER_DEFINE_CLASS(fname)
#define WITHIN_INTERVAL(ts, start_ts, end_ts)
static int filter_frame(AVFilterLink *inlink, AVFrame *ref)
#define AV_NOPTS_VALUE
Undefined timestamp value. 
static const AVOption options[]
void av_bprint_chars(AVBPrint *buf, char c, unsigned n)
Append char c n times to a print buffer.