FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavfilter/f_bench.c
Date: 2024-07-17 14:05:47
Exec Total Coverage
Lines: 0 27 0.0%
Functions: 0 2 0.0%
Branches: 0 8 0.0%

Line Branch Exec Source
1 /*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 #include "config_components.h"
20
21 #include "libavutil/opt.h"
22 #include "libavutil/time.h"
23 #include "audio.h"
24 #include "avfilter.h"
25 #include "internal.h"
26 #include "video.h"
27
28 enum BenchAction {
29 ACTION_START,
30 ACTION_STOP,
31 NB_ACTION
32 };
33
34 typedef struct BenchContext {
35 const AVClass *class;
36 int action;
37 int64_t max, min;
38 int64_t sum;
39 int n;
40 } BenchContext;
41
42 #define OFFSET(x) offsetof(BenchContext, x)
43 #define DEFINE_OPTIONS(filt_name, FLAGS) \
44 static const AVOption filt_name##_options[] = { \
45 { "action", "set action", OFFSET(action), AV_OPT_TYPE_INT, {.i64=ACTION_START}, 0, NB_ACTION-1, FLAGS, .unit = "action" }, \
46 { "start", "start timer", 0, AV_OPT_TYPE_CONST, {.i64=ACTION_START}, INT_MIN, INT_MAX, FLAGS, .unit = "action" }, \
47 { "stop", "stop timer", 0, AV_OPT_TYPE_CONST, {.i64=ACTION_STOP}, INT_MIN, INT_MAX, FLAGS, .unit = "action" }, \
48 { NULL } \
49 }
50
51 #define START_TIME_KEY "lavfi.bench.start_time"
52 #define T2F(v) ((v) / 1000000.)
53
54 static av_cold int init(AVFilterContext *ctx)
55 {
56 BenchContext *s = ctx->priv;
57 s->min = INT64_MAX;
58 s->max = INT64_MIN;
59 return 0;
60 }
61
62 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
63 {
64 AVFilterContext *ctx = inlink->dst;
65 BenchContext *s = ctx->priv;
66 AVFilterLink *outlink = ctx->outputs[0];
67 const int64_t t = av_gettime();
68
69 if (t < 0)
70 return ff_filter_frame(outlink, in);
71
72 if (s->action == ACTION_START) {
73 av_dict_set_int(&in->metadata, START_TIME_KEY, t, 0);
74 } else if (s->action == ACTION_STOP) {
75 AVDictionaryEntry *e = av_dict_get(in->metadata, START_TIME_KEY, NULL, 0);
76 if (e) {
77 const int64_t start = strtoll(e->value, NULL, 0);
78 const int64_t diff = t - start;
79 s->sum += diff;
80 s->n++;
81 s->min = FFMIN(s->min, diff);
82 s->max = FFMAX(s->max, diff);
83 av_log(s, AV_LOG_INFO, "t:%f avg:%f max:%f min:%f\n",
84 T2F(diff), T2F(s->sum / s->n), T2F(s->max), T2F(s->min));
85 }
86 av_dict_set(&in->metadata, START_TIME_KEY, NULL, 0);
87 }
88
89 return ff_filter_frame(outlink, in);
90 }
91
92 #if CONFIG_BENCH_FILTER
93 DEFINE_OPTIONS(bench, AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM);
94 AVFILTER_DEFINE_CLASS(bench);
95
96 static const AVFilterPad bench_inputs[] = {
97 {
98 .name = "default",
99 .type = AVMEDIA_TYPE_VIDEO,
100 .filter_frame = filter_frame,
101 },
102 };
103
104 const AVFilter ff_vf_bench = {
105 .name = "bench",
106 .description = NULL_IF_CONFIG_SMALL("Benchmark part of a filtergraph."),
107 .priv_size = sizeof(BenchContext),
108 .init = init,
109 FILTER_INPUTS(bench_inputs),
110 FILTER_OUTPUTS(ff_video_default_filterpad),
111 .priv_class = &bench_class,
112 .flags = AVFILTER_FLAG_METADATA_ONLY,
113 };
114 #endif /* CONFIG_BENCH_FILTER */
115
116 #if CONFIG_ABENCH_FILTER
117 DEFINE_OPTIONS(abench, AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_AUDIO_PARAM);
118 AVFILTER_DEFINE_CLASS(abench);
119
120 static const AVFilterPad abench_inputs[] = {
121 {
122 .name = "default",
123 .type = AVMEDIA_TYPE_AUDIO,
124 .filter_frame = filter_frame,
125 },
126 };
127
128 const AVFilter ff_af_abench = {
129 .name = "abench",
130 .description = NULL_IF_CONFIG_SMALL("Benchmark part of a filtergraph."),
131 .priv_size = sizeof(BenchContext),
132 .init = init,
133 FILTER_INPUTS(abench_inputs),
134 FILTER_OUTPUTS(ff_audio_default_filterpad),
135 .priv_class = &abench_class,
136 .flags = AVFILTER_FLAG_METADATA_ONLY,
137 };
138 #endif /* CONFIG_ABENCH_FILTER */
139