89 const char *value1,
const char *value2);
95 #define OFFSET(x) offsetof(MetadataContext, x)
96 #define DEFINE_OPTIONS(filt_name, FLAGS) \
97 static const AVOption filt_name##_options[] = { \
98 { "mode", "set a mode of operation", OFFSET(mode), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, METADATA_NB-1, FLAGS, "mode" }, \
99 { "select", "select frame", 0, AV_OPT_TYPE_CONST, {.i64 = METADATA_SELECT }, 0, 0, FLAGS, "mode" }, \
100 { "add", "add new metadata", 0, AV_OPT_TYPE_CONST, {.i64 = METADATA_ADD }, 0, 0, FLAGS, "mode" }, \
101 { "modify", "modify metadata", 0, AV_OPT_TYPE_CONST, {.i64 = METADATA_MODIFY }, 0, 0, FLAGS, "mode" }, \
102 { "delete", "delete metadata", 0, AV_OPT_TYPE_CONST, {.i64 = METADATA_DELETE }, 0, 0, FLAGS, "mode" }, \
103 { "print", "print metadata", 0, AV_OPT_TYPE_CONST, {.i64 = METADATA_PRINT }, 0, 0, FLAGS, "mode" }, \
104 { "key", "set metadata key", OFFSET(key), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, FLAGS }, \
105 { "value", "set metadata value", OFFSET(value), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, FLAGS }, \
106 { "function", "function for comparing values", OFFSET(function), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, METADATAF_NB-1, FLAGS, "function" }, \
107 { "same_str", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = METADATAF_SAME_STR }, 0, 3, FLAGS, "function" }, \
108 { "starts_with", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = METADATAF_STARTS_WITH }, 0, 0, FLAGS, "function" }, \
109 { "less", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = METADATAF_LESS }, 0, 3, FLAGS, "function" }, \
110 { "equal", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = METADATAF_EQUAL }, 0, 3, FLAGS, "function" }, \
111 { "greater", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = METADATAF_GREATER }, 0, 3, FLAGS, "function" }, \
112 { "expr", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = METADATAF_EXPR }, 0, 3, FLAGS, "function" }, \
113 { "ends_with", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = METADATAF_ENDS_WITH }, 0, 0, FLAGS, "function" }, \
114 { "expr", "set expression for expr function", OFFSET(expr_str), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, FLAGS }, \
115 { "file", "set file where to print metadata information", OFFSET(file_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS }, \
116 { "direct", "reduce buffering when printing to user-set file or pipe", OFFSET(direct), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS }, \
122 return !strcmp(value1, value2);
127 return !strncmp(value1, value2, strlen(value2));
132 const int len1 = strlen(value1);
133 const int len2 = strlen(value2);
135 return !strncmp(value1 +
FFMAX(len1 - len2, 0), value2, len2);
142 if (sscanf(value1,
"%f", &f1) + sscanf(value2,
"%f", &f2) != 2)
145 return fabsf(f1 - f2) < FLT_EPSILON;
152 if (sscanf(value1,
"%f", &f1) + sscanf(value2,
"%f", &f2) != 2)
155 return (f1 - f2) < FLT_EPSILON;
162 if (sscanf(value1,
"%f", &f1) + sscanf(value2,
"%f", &f2) != 2)
165 return (f2 - f1) < FLT_EPSILON;
172 if (sscanf(value1,
"%lf", &f1) + sscanf(value2,
"%lf", &f2) != 2)
183 va_list argument_list;
185 va_start(argument_list, msg);
188 va_end(argument_list);
194 va_list argument_list;
196 va_start(argument_list, msg);
199 vsnprintf(buf,
sizeof(buf), msg, argument_list);
202 va_end(argument_list);
221 switch (
s->function) {
265 s->avio_context =
NULL;
267 if (!strcmp(
"-",
s->file_str)) {
294 if (
s->avio_context) {
312 if (!
s->value && e && e->
value) {
314 }
else if (
s->value && e && e->
value &&
315 s->compare(
s, e->
value,
s->value)) {
333 s->print(
ctx,
"frame:%-4"PRId64
" pts:%-7s pts_time:%s\n",
339 }
else if (e && e->
value && (!
s->value || (e->
value &&
s->compare(
s, e->
value,
s->value)))) {
340 s->print(
ctx,
"frame:%-4"PRId64
" pts:%-7s pts_time:%s\n",
348 }
else if (e && e->
value && (!
s->value ||
s->compare(
s, e->
value,
s->value))) {
361 #if CONFIG_AMETADATA_FILTER
387 .priv_class = &ametadata_class,
396 #if CONFIG_METADATA_FILTER
422 .priv_class = &metadata_class,
static const AVFilterPad inputs[]
static const AVFilterPad outputs[]
#define av_printf_format(fmtpos, attrpos)
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Main libavfilter public API header.
int avio_open(AVIOContext **s, const char *url, int flags)
Create and initialize a AVIOContext for accessing the resource indicated by url.
#define AVIO_FLAG_WRITE
write-only
#define AVIO_FLAG_DIRECT
Use direct mode.
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
int avio_closep(AVIOContext **s)
Close the resource accessed by the AVIOContext *s, free it and set the pointer pointing to it to NULL...
#define flags(name, subs,...)
static __device__ float fabsf(float a)
void av_expr_free(AVExpr *e)
Free a parsed expression previously created with av_expr_parse().
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
Evaluate a previously parsed expression.
int av_expr_parse(AVExpr **expr, const char *s, const char *const *const_names, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), int log_offset, void *log_ctx)
Parse an expression.
simple arithmetic expression evaluator
#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
Some filters support a generic "enable" expression option that can be used to enable or disable a fil...
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
#define AV_DICT_IGNORE_SUFFIX
Return first entry in a dictionary whose first part corresponds to the search key,...
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
int av_strerror(int errnum, char *errbuf, size_t errbuf_size)
Put a description of the AVERROR code errnum in errbuf.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#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.
void av_vlog(void *avcl, int level, const char *fmt, va_list vl)
Send the specified message to the log if the level is less than or equal to the current av_log_level.
size_t static size_t av_strnlen(const char *s, size_t len)
Get the count of continuous non zero chars starting from the beginning.
#define AVFILTER_DEFINE_CLASS(fname)
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
#define AV_OPT_FLAG_FILTERING_PARAM
a generic parameter which can be set by the user for filtering
#define AV_OPT_FLAG_AUDIO_PARAM
#define AV_OPT_FLAG_VIDEO_PARAM
typedef void(RENAME(mix_any_func_type))
Describe the class of an AVClass context structure.
A link between two filters.
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link.
AVFilterContext * dst
dest filter
A filter pad used for either input or output.
const char * name
Pad name.
const char * name
Filter name.
This structure describes decoded (raw) audio or video data.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
AVDictionary * metadata
metadata.
void(* print)(AVFilterContext *ctx, const char *msg,...) av_printf_format(2
double var_values[VAR_VARS_NB]
int(* compare)(struct MetadataContext *s, const char *value1, const char *value2)
AVIOContext * avio_context
timestamp utils, mostly useful for debugging/logging purposes
#define av_ts2str(ts)
Convenience macro, the return value should be used only directly in function arguments but never stan...
#define av_ts2timestr(ts, tb)
Convenience macro, the return value should be used only directly in function arguments but never stan...