/src/ffmpeg/libswscale/graph.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (C) 2024 Niklas Haas |
3 | | * |
4 | | * This file is part of FFmpeg. |
5 | | * |
6 | | * FFmpeg is free software; you can redistribute it and/or |
7 | | * modify it under the terms of the GNU Lesser General Public |
8 | | * License as published by the Free Software Foundation; either |
9 | | * version 2.1 of the License, or (at your option) any later version. |
10 | | * |
11 | | * FFmpeg is distributed in the hope that it will be useful, |
12 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | | * Lesser General Public License for more details. |
15 | | * |
16 | | * You should have received a copy of the GNU Lesser General Public |
17 | | * License along with FFmpeg; if not, write to the Free Software |
18 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | | */ |
20 | | |
21 | | #ifndef SWSCALE_GRAPH_H |
22 | | #define SWSCALE_GRAPH_H |
23 | | |
24 | | #include <stdbool.h> |
25 | | |
26 | | #include "libavutil/slicethread.h" |
27 | | #include "libavutil/buffer.h" |
28 | | |
29 | | #include "swscale.h" |
30 | | #include "format.h" |
31 | | |
32 | | static av_always_inline av_const int ff_fmt_vshift(enum AVPixelFormat fmt, int plane) |
33 | 0 | { |
34 | 0 | const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt); |
35 | 0 | return (plane == 1 || plane == 2) ? desc->log2_chroma_h : 0; |
36 | 0 | } Unexecuted instantiation: swscale.c:ff_fmt_vshift Unexecuted instantiation: utils.c:ff_fmt_vshift Unexecuted instantiation: vscale.c:ff_fmt_vshift Unexecuted instantiation: yuv2rgb.c:ff_fmt_vshift Unexecuted instantiation: alphablend.c:ff_fmt_vshift Unexecuted instantiation: format.c:ff_fmt_vshift Unexecuted instantiation: graph.c:ff_fmt_vshift Unexecuted instantiation: hscale_fast_bilinear.c:ff_fmt_vshift Unexecuted instantiation: input.c:ff_fmt_vshift Unexecuted instantiation: ops.c:ff_fmt_vshift Unexecuted instantiation: ops_backend.c:ff_fmt_vshift Unexecuted instantiation: ops_chain.c:ff_fmt_vshift Unexecuted instantiation: ops_dispatch.c:ff_fmt_vshift Unexecuted instantiation: ops_memcpy.c:ff_fmt_vshift Unexecuted instantiation: ops_optimizer.c:ff_fmt_vshift Unexecuted instantiation: options.c:ff_fmt_vshift Unexecuted instantiation: output.c:ff_fmt_vshift Unexecuted instantiation: rgb2rgb.c:ff_fmt_vshift Unexecuted instantiation: slice.c:ff_fmt_vshift Unexecuted instantiation: swscale_unscaled.c:ff_fmt_vshift Unexecuted instantiation: gamma.c:ff_fmt_vshift Unexecuted instantiation: hscale.c:ff_fmt_vshift |
37 | | |
38 | | typedef struct SwsPass SwsPass; |
39 | | typedef struct SwsGraph SwsGraph; |
40 | | |
41 | | /** |
42 | | * Output `h` lines of filtered data. `out` and `in` point to the |
43 | | * start of the image buffer for this pass. |
44 | | */ |
45 | | typedef void (*SwsPassFunc)(const SwsFrame *out, const SwsFrame *in, |
46 | | int y, int h, const SwsPass *pass); |
47 | | |
48 | | /** |
49 | | * Function to run from the main thread before processing any lines. |
50 | | */ |
51 | | typedef void (*SwsPassSetup)(const SwsFrame *out, const SwsFrame *in, |
52 | | const SwsPass *pass); |
53 | | |
54 | | /** |
55 | | * Represents an allocated output buffer for a filter pass. |
56 | | */ |
57 | | typedef struct SwsPassBuffer { |
58 | | SwsFrame frame; |
59 | | |
60 | | int width, height; /* dimensions of this buffer */ |
61 | | AVFrame *avframe; /* backing storage for `frame` */ |
62 | | } SwsPassBuffer; |
63 | | |
64 | | /** |
65 | | * Represents a single filter pass in the scaling graph. Each filter will |
66 | | * read from some previous pass's output, and write to a buffer associated |
67 | | * with the pass (or into the final output image). |
68 | | */ |
69 | | struct SwsPass { |
70 | | const SwsGraph *graph; |
71 | | |
72 | | /** |
73 | | * Filter main execution function. Called from multiple threads, with |
74 | | * the granularity dictated by `slice_h`. Individual slices sent to `run` |
75 | | * are always equal to (or smaller than, for the last slice) `slice_h`. |
76 | | */ |
77 | | SwsPassFunc run; |
78 | | enum AVPixelFormat format; /* new pixel format */ |
79 | | int width, height; /* new output size */ |
80 | | int slice_h; /* filter granularity */ |
81 | | int num_slices; |
82 | | |
83 | | /** |
84 | | * Filter input. This pass's output will be resolved to form this pass's. |
85 | | * input. If NULL, the original input image is used. |
86 | | */ |
87 | | const SwsPass *input; |
88 | | |
89 | | /** |
90 | | * Filter output buffer. Allocated on demand and freed automatically. |
91 | | */ |
92 | | SwsPassBuffer *output; /* refstruct */ |
93 | | |
94 | | /** |
95 | | * Called once from the main thread before running the filter. Optional. |
96 | | */ |
97 | | SwsPassSetup setup; |
98 | | |
99 | | /** |
100 | | * Optional private state and associated free() function. |
101 | | */ |
102 | | void (*free)(void *priv); |
103 | | void *priv; |
104 | | }; |
105 | | |
106 | | /** |
107 | | * Filter graph, which represents a 'baked' pixel format conversion. |
108 | | */ |
109 | | typedef struct SwsGraph { |
110 | | SwsContext *ctx; |
111 | | AVSliceThread *slicethread; |
112 | | int num_threads; /* resolved at init() time */ |
113 | | bool incomplete; /* set during init() if formats had to be inferred */ |
114 | | bool noop; /* set during init() if the graph is a no-op */ |
115 | | |
116 | | AVBufferRef *hw_frames_ref; |
117 | | |
118 | | /** Sorted sequence of filter passes to apply */ |
119 | | SwsPass **passes; |
120 | | int num_passes; |
121 | | |
122 | | /** |
123 | | * Cached copy of the public options that were used to construct this |
124 | | * SwsGraph. Used only to detect when the graph needs to be reinitialized. |
125 | | */ |
126 | | SwsContext opts_copy; |
127 | | |
128 | | /** |
129 | | * Currently active format and processing parameters. |
130 | | */ |
131 | | SwsFormat src, dst; |
132 | | int field; |
133 | | |
134 | | /** |
135 | | * Temporary execution state inside ff_sws_graph_run(); used to pass |
136 | | * data to worker threads. |
137 | | */ |
138 | | struct { |
139 | | const SwsPass *pass; /* current filter pass */ |
140 | | const SwsFrame *input; /* current filter pass input/output */ |
141 | | const SwsFrame *output; |
142 | | } exec; |
143 | | } SwsGraph; |
144 | | |
145 | | /** |
146 | | * Allocate and initialize the filter graph. Returns 0 or a negative error. |
147 | | */ |
148 | | int ff_sws_graph_create(SwsContext *ctx, const SwsFormat *dst, const SwsFormat *src, |
149 | | int field, SwsGraph **out_graph); |
150 | | |
151 | | |
152 | | /** |
153 | | * Allocate and add a new pass to the filter graph. Takes over ownership of |
154 | | * `priv`, even on failure. |
155 | | * |
156 | | * @param graph Filter graph to add the pass to. |
157 | | * @param fmt Pixel format of the output image. |
158 | | * @param w Width of the output image. |
159 | | * @param h Height of the output image. |
160 | | * @param input Previous pass to read from, or NULL for the input image. |
161 | | * @param align Minimum slice alignment for this pass, or 0 for no threading. |
162 | | * @param run Filter function to run. |
163 | | * @param setup Optional setup function to run from the main thread. |
164 | | * @param priv Private state for the filter run function. |
165 | | * @param free Function to free the private state. |
166 | | * @param out_pass The newly added pass will be written here on success. |
167 | | * @return 0 or a negative error code |
168 | | */ |
169 | | int ff_sws_graph_add_pass(SwsGraph *graph, enum AVPixelFormat fmt, |
170 | | int width, int height, SwsPass *input, |
171 | | int align, SwsPassFunc run, SwsPassSetup setup, |
172 | | void *priv, void (*free)(void *priv), |
173 | | SwsPass **out_pass); |
174 | | |
175 | | /** |
176 | | * Uninitialize any state associate with this filter graph and free it. |
177 | | */ |
178 | | void ff_sws_graph_free(SwsGraph **graph); |
179 | | |
180 | | /** |
181 | | * Update dynamic per-frame HDR metadata without requiring a full reinit. |
182 | | */ |
183 | | void ff_sws_graph_update_metadata(SwsGraph *graph, const SwsColor *color); |
184 | | |
185 | | /** |
186 | | * Wrapper around ff_sws_graph_create() that reuses the existing graph if the |
187 | | * format is compatible. This will also update dynamic per-frame metadata. |
188 | | * Must be called after changing any of the fields in `ctx`, or else they will |
189 | | * have no effect. |
190 | | */ |
191 | | int ff_sws_graph_reinit(SwsContext *ctx, const SwsFormat *dst, const SwsFormat *src, |
192 | | int field, SwsGraph **graph); |
193 | | |
194 | | /** |
195 | | * Dispatch the filter graph on a single field of the given frames. Internally |
196 | | * threaded. |
197 | | */ |
198 | | void ff_sws_graph_run(SwsGraph *graph, const AVFrame *dst, const AVFrame *src); |
199 | | |
200 | | #endif /* SWSCALE_GRAPH_H */ |