FFmpeg
Data Structures | Enumerations | Functions
thread_queue.c File Reference
#include <stdint.h>
#include <string.h>
#include "libavutil/avassert.h"
#include "libavutil/error.h"
#include "libavutil/fifo.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/mem.h"
#include "libavutil/thread.h"
#include "objpool.h"
#include "thread_queue.h"

Go to the source code of this file.

Data Structures

struct  FifoElem
 
struct  ThreadQueue
 

Enumerations

enum  { FINISHED_SEND = (1 << 0), FINISHED_RECV = (1 << 1) }
 

Functions

void tq_free (ThreadQueue **ptq)
 
ThreadQueuetq_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. More...
 
int tq_send (ThreadQueue *tq, unsigned int stream_idx, void *data)
 Send an item for the given stream to the queue. More...
 
static int receive_locked (ThreadQueue *tq, int *stream_idx, void *data)
 
int tq_receive (ThreadQueue *tq, int *stream_idx, void *data)
 Read the next item from the queue. More...
 
void tq_send_finish (ThreadQueue *tq, unsigned int stream_idx)
 Mark the given stream finished from the sending side. More...
 
void tq_receive_finish (ThreadQueue *tq, unsigned int stream_idx)
 Mark the given stream finished from the receiving side. More...
 

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
FINISHED_SEND 
FINISHED_RECV 

Definition at line 32 of file thread_queue.c.

Function Documentation

◆ tq_free()

void tq_free ( ThreadQueue **  ptq)

Definition at line 55 of file thread_queue.c.

Referenced by sch_free(), and tq_alloc().

◆ tq_alloc()

ThreadQueue* tq_alloc ( unsigned int  nb_streams,
size_t  queue_size,
ObjPool obj_pool,
void(*)(void *dst, void *src obj_move 
)

Allocate a queue for sending data between threads.

Parameters
nb_streamsnumber of streams for which a distinct EOF state is maintained
queue_sizenumber of items that can be stored in the queue without blocking
obj_poolobject pool that will be used to allocate items stored in the queue; the pool becomes owned by the queue
callbackthat moves the contents between two data pointers

Definition at line 79 of file thread_queue.c.

Referenced by queue_alloc().

◆ tq_send()

int tq_send ( ThreadQueue tq,
unsigned int  stream_idx,
void *  data 
)

Send an item for the given stream to the queue.

Parameters
datathe item to send, its contents will be moved using the callback provided to tq_alloc(); on failure the item will be left untouched
Returns
  • 0 the item was successfully sent
  • AVERROR(ENOMEM) could not allocate an item for writing to the FIFO
  • AVERROR(EINVAL) the sending side has previously been marked as finished
  • AVERROR_EOF the receiving side has marked the given stream as finished

Definition at line 120 of file thread_queue.c.

Referenced by demux_flush(), demux_stream_send_to_dst(), mux_task_start(), sch_mux_sub_heartbeat(), send_to_enc_thread(), send_to_filter(), and send_to_mux().

◆ receive_locked()

static int receive_locked ( ThreadQueue tq,
int stream_idx,
void *  data 
)
static

Definition at line 161 of file thread_queue.c.

Referenced by tq_receive().

◆ tq_receive()

int tq_receive ( ThreadQueue tq,
int stream_idx,
void *  data 
)

Read the next item from the queue.

Parameters
stream_idxthe index of the stream that was processed or -1 will be written here
datathe data item will be written here on success using the callback provided to tq_alloc()
Returns
  • 0 a data item was successfully read; *stream_idx contains a non-negative stream index
  • AVERROR_EOF When *stream_idx is non-negative, this signals that the sending side has marked the given stream as finished. This will happen at most once for each stream. When *stream_idx is -1, all streams are done.

Definition at line 196 of file thread_queue.c.

Referenced by sch_dec_receive(), sch_enc_receive(), sch_filter_receive(), and sch_mux_receive().

◆ tq_send_finish()

void tq_send_finish ( ThreadQueue tq,
unsigned int  stream_idx 
)

Mark the given stream finished from the sending side.

Definition at line 226 of file thread_queue.c.

Referenced by demux_stream_send_to_dst(), mux_task_start(), send_to_enc_thread(), send_to_filter(), and send_to_mux().

◆ tq_receive_finish()

void tq_receive_finish ( ThreadQueue tq,
unsigned int  stream_idx 
)

Mark the given stream finished from the receiving side.

Definition at line 241 of file thread_queue.c.

Referenced by dec_done(), enc_done(), filter_done(), mux_done(), sch_filter_receive_finish(), and sch_mux_receive_finish().