FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavfilter/framequeue.h
Date: 2025-08-19 23:55:23
Exec Total Coverage
Lines: 6 6 100.0%
Functions: 3 3 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 /*
2 * Generic frame queue
3 * Copyright (c) 2016 Nicolas George
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public License
9 * as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with FFmpeg; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #ifndef AVFILTER_FRAMEQUEUE_H
23 #define AVFILTER_FRAMEQUEUE_H
24
25 /**
26 * FFFrameQueue: simple AVFrame queue API
27 *
28 * Note: this API is not thread-safe. Concurrent access to the same queue
29 * must be protected by a mutex or any synchronization mechanism.
30 */
31
32 #include "libavutil/frame.h"
33
34 typedef struct FFFrameBucket {
35 AVFrame *frame;
36 } FFFrameBucket;
37
38 /**
39 * Structure to hold global options and statistics for frame queues.
40 *
41 * This structure is intended to allow implementing global control of the
42 * frame queues, including memory consumption caps.
43 */
44 typedef struct FFFrameQueueGlobal {
45
46 /**
47 * Maximum number of allowed frames in the queues combined.
48 */
49 size_t max_queued;
50
51 /**
52 * Total number of queued frames in the queues combined.
53 */
54 size_t queued;
55 } FFFrameQueueGlobal;
56
57 /**
58 * Queue of AVFrame pointers.
59 */
60 typedef struct FFFrameQueue {
61
62 /**
63 * Pointer to the global frame queue struct holding statistics and limits
64 */
65 FFFrameQueueGlobal *global;
66
67 /**
68 * Array of allocated buckets, used as a circular buffer.
69 */
70 FFFrameBucket *queue;
71
72 /**
73 * Size of the array of buckets.
74 */
75 size_t allocated;
76
77 /**
78 * Tail of the queue.
79 * It is the index in the array of the next frame to take.
80 */
81 size_t tail;
82
83 /**
84 * Number of currently queued frames.
85 */
86 size_t queued;
87
88 /**
89 * Pre-allocated bucket for queues of size 1.
90 */
91 FFFrameBucket first_bucket;
92
93 /**
94 * Total number of frames entered in the queue.
95 */
96 uint64_t total_frames_head;
97
98 /**
99 * Total number of frames dequeued from the queue.
100 * queued = total_frames_head - total_frames_tail
101 */
102 uint64_t total_frames_tail;
103
104 /**
105 * Total number of samples entered in the queue.
106 */
107 uint64_t total_samples_head;
108
109 /**
110 * Total number of samples dequeued from the queue.
111 * queued_samples = total_samples_head - total_samples_tail
112 */
113 uint64_t total_samples_tail;
114
115 /**
116 * Indicate that samples are skipped
117 */
118 int samples_skipped;
119
120 } FFFrameQueue;
121
122 /**
123 * Init a global structure.
124 */
125 void ff_framequeue_global_init(FFFrameQueueGlobal *fqg);
126
127 /**
128 * Init a frame queue and attach it to a global structure.
129 */
130 void ff_framequeue_init(FFFrameQueue *fq, FFFrameQueueGlobal *fqg);
131
132 /**
133 * Free the queue and all queued frames.
134 */
135 void ff_framequeue_free(FFFrameQueue *fq);
136
137 /**
138 * Add a frame.
139 * @return >=0 or an AVERROR code.
140 */
141 int ff_framequeue_add(FFFrameQueue *fq, AVFrame *frame);
142
143 /**
144 * Take the first frame in the queue.
145 * Must not be used with empty queues.
146 */
147 AVFrame *ff_framequeue_take(FFFrameQueue *fq);
148
149 /**
150 * Access a frame in the queue, without removing it.
151 * The first frame is numbered 0; the designated frame must exist.
152 */
153 AVFrame *ff_framequeue_peek(FFFrameQueue *fq, size_t idx);
154
155 /**
156 * Get the number of queued frames.
157 */
158 10864645 static inline size_t ff_framequeue_queued_frames(const FFFrameQueue *fq)
159 {
160 10864645 return fq->queued;
161 }
162
163 /**
164 * Get the number of queued samples.
165 */
166 715593 static inline uint64_t ff_framequeue_queued_samples(const FFFrameQueue *fq)
167 {
168 715593 return fq->total_samples_head - fq->total_samples_tail;
169 }
170
171 /**
172 * Update the statistics after a frame accessed using ff_framequeue_peek()
173 * was modified.
174 * Currently used only as a marker.
175 */
176 1513 static inline void ff_framequeue_update_peeked(FFFrameQueue *fq, size_t idx)
177 {
178 1513 }
179
180 /**
181 * Skip samples from the first frame in the queue.
182 *
183 * This function must be used when the first frame was accessed using
184 * ff_framequeue_peek() and samples were consumed from it.
185 * It adapts the data pointers and timestamps of the head frame to account
186 * for the skipped samples.
187 */
188 void ff_framequeue_skip_samples(FFFrameQueue *fq, size_t samples, AVRational time_base);
189
190 #endif /* AVFILTER_FRAMEQUEUE_H */
191