FFmpeg
thread_queue.h
Go to the documentation of this file.
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 #ifndef FFTOOLS_THREAD_QUEUE_H
20 #define FFTOOLS_THREAD_QUEUE_H
21 
22 #include <string.h>
23 
24 #include "objpool.h"
25 
26 typedef struct ThreadQueue ThreadQueue;
27 
28 /**
29  * Allocate a queue for sending data between threads.
30  *
31  * @param nb_streams number of streams for which a distinct EOF state is
32  * maintained
33  * @param queue_size number of items that can be stored in the queue without
34  * blocking
35  * @param obj_pool object pool that will be used to allocate items stored in the
36  * queue; the pool becomes owned by the queue
37  * @param callback that moves the contents between two data pointers
38  */
39 ThreadQueue *tq_alloc(unsigned int nb_streams, size_t queue_size,
40  ObjPool *obj_pool, void (*obj_move)(void *dst, void *src));
41 void tq_free(ThreadQueue **tq);
42 
43 /**
44  * Send an item for the given stream to the queue.
45  *
46  * @param data the item to send, its contents will be moved using the callback
47  * provided to tq_alloc(); on failure the item will be left
48  * untouched
49  * @return
50  * - 0 the item was successfully sent
51  * - AVERROR(ENOMEM) could not allocate an item for writing to the FIFO
52  * - AVERROR(EINVAL) the sending side has previously been marked as finished
53  * - AVERROR_EOF the receiving side has marked the given stream as finished
54  */
55 int tq_send(ThreadQueue *tq, unsigned int stream_idx, void *data);
56 /**
57  * Mark the given stream finished from the sending side.
58  */
59 void tq_send_finish(ThreadQueue *tq, unsigned int stream_idx);
60 
61 /**
62  * Read the next item from the queue.
63  *
64  * @param stream_idx the index of the stream that was processed or -1 will be
65  * written here
66  * @param data the data item will be written here on success using the
67  * callback provided to tq_alloc()
68  * @return
69  * - 0 a data item was successfully read; *stream_idx contains a non-negative
70  * stream index
71  * - AVERROR_EOF When *stream_idx is non-negative, this signals that the sending
72  * side has marked the given stream as finished. This will happen at most once
73  * for each stream. When *stream_idx is -1, all streams are done.
74  */
75 int tq_receive(ThreadQueue *tq, int *stream_idx, void *data);
76 /**
77  * Mark the given stream finished from the receiving side.
78  */
79 void tq_receive_finish(ThreadQueue *tq, unsigned int stream_idx);
80 
81 #endif // FFTOOLS_THREAD_QUEUE_H
ThreadQueue::obj_move
void(* obj_move)(void *dst, void *src)
Definition: thread_queue.c:49
data
const char data[16]
Definition: mxf.c:148
tq_send
int tq_send(ThreadQueue *tq, unsigned int stream_idx, void *data)
Send an item for the given stream to the queue.
Definition: thread_queue.c:120
tq_send_finish
void tq_send_finish(ThreadQueue *tq, unsigned int stream_idx)
Mark the given stream finished from the sending side.
Definition: thread_queue.c:226
objpool.h
tq_receive_finish
void tq_receive_finish(ThreadQueue *tq, unsigned int stream_idx)
Mark the given stream finished from the receiving side.
Definition: thread_queue.c:241
nb_streams
static int nb_streams
Definition: ffprobe.c:384
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
tq_alloc
ThreadQueue * tq_alloc(unsigned int nb_streams, size_t queue_size, ObjPool *obj_pool, void(*obj_move)(void *dst, void *src))
Allocate a queue for sending data between threads.
Definition: thread_queue.c:79
ObjPool
Definition: objpool.c:30
ThreadQueue::obj_pool
ObjPool * obj_pool
Definition: thread_queue.c:48
tq_free
void tq_free(ThreadQueue **tq)
Definition: thread_queue.c:55
ThreadQueue
Definition: thread_queue.c:42
tq_receive
int tq_receive(ThreadQueue *tq, int *stream_idx, void *data)
Read the next item from the queue.
Definition: thread_queue.c:196
src
#define src
Definition: vp8dsp.c:248