[vlc-devel] [PATCH 1/2] qsv: replace the fifo_t with a vlc_list
Steve Lhomme
robux4 at ycbcr.xyz
Wed Sep 16 14:45:13 CEST 2020
---
modules/codec/Makefile.am | 2 +-
modules/codec/qsv.c | 27 +++++++++++++++------------
2 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/modules/codec/Makefile.am b/modules/codec/Makefile.am
index 6995119e07b..f8ff8b35bca 100644
--- a/modules/codec/Makefile.am
+++ b/modules/codec/Makefile.am
@@ -572,7 +572,7 @@ codec_LTLIBRARIES += $(LTLIBdav1d)
### Hardware encoders ###
-libqsv_plugin_la_SOURCES = codec/qsv.c codec/vlc_fifo_helper.h demux/mpeg/timestamps.h
+libqsv_plugin_la_SOURCES = codec/qsv.c demux/mpeg/timestamps.h
libqsv_plugin_la_CFLAGS = $(AM_CFLAGS) $(MFX_CFLAGS)
libqsv_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(codecdir)'
libqsv_plugin_la_LIBADD = $(MFX_LIBS)
diff --git a/modules/codec/qsv.c b/modules/codec/qsv.c
index dec2ef2668f..8f5e2aa003a 100644
--- a/modules/codec/qsv.c
+++ b/modules/codec/qsv.c
@@ -32,8 +32,8 @@
#include <vlc_picture.h>
#include <vlc_codec.h>
#include <vlc_picture_pool.h>
+#include <vlc_list.h>
-#include "vlc_fifo_helper.h"
#include <mfx/mfxvideo.h>
#include "../demux/mpeg/timestamps.h"
@@ -272,14 +272,12 @@ typedef struct _QSVFrame
typedef struct async_task_t
{
- fifo_item_t fifo;
+ struct vlc_list fifo;
mfxBitstream bs; // Intel's bitstream structure.
mfxSyncPoint *syncp; // Async Task Sync Point.
block_t *block; // VLC's block structure to be returned by Encode.
} async_task_t;
-TYPED_FIFO(async_task_t, async_task_t)
-
typedef struct
{
mfxSession session; // Intel Media SDK Session.
@@ -288,7 +286,7 @@ typedef struct
uint64_t dts_warn_counter; // DTS warning counter for rate-limiting of msg;
uint64_t busy_warn_counter; // Device Busy warning counter for rate-limiting of msg;
uint64_t async_depth; // Number of parallel encoding operations.
- fifo_t packets; // FIFO of queued packets
+ struct vlc_list packets; // FIFO of queued packets
vlc_tick_t offset_pts; // The pts of the first frame, to avoid conversion overflow.
vlc_tick_t last_dts; // The dts of the last frame, to interpolate over buggy dts
@@ -605,7 +603,7 @@ static int Open(vlc_object_t *this)
enc->fmt_out.i_extra = i_extra;
sys->async_depth = sys->params.AsyncDepth;
- async_task_t_fifo_Init(&sys->packets);
+ vlc_list_init(&sys->packets);
/* Vlc module configuration */
enc->fmt_in.i_codec = VLC_CODEC_NV12; // Intel Media SDK requirement
@@ -645,7 +643,7 @@ static void Close(vlc_object_t *this)
MFXClose(sys->session);
/* if (enc->fmt_out.p_extra) */
/* free(enc->fmt_out.p_extra); */
- async_task_t_fifo_Release(&sys->packets);
+ assert(vlc_list_is_empty(&sys->packets));
if (sys->input_pool)
picture_pool_Release(sys->input_pool);
free(sys);
@@ -863,14 +861,19 @@ static block_t *Encode(encoder_t *this, picture_t *pic)
{
task = encode_frame( enc, pic );
if (likely(task != NULL))
- async_task_t_fifo_Put(&sys->packets, task);
+ vlc_list_append(&sys->packets, &task->fifo);
}
- if ( async_task_t_fifo_GetCount(&sys->packets) == (sys->async_depth + 1) ||
- (!pic && async_task_t_fifo_GetCount(&sys->packets)))
+ size_t fifo_count = 0;
+ vlc_list_foreach( task, &sys->packets, fifo )
+ fifo_count++;
+
+ if ( fifo_count == (sys->async_depth + 1) ||
+ (!pic && fifo_count))
{
- assert(async_task_t_fifo_Show(&sys->packets)->syncp != 0);
- task = async_task_t_fifo_Get(&sys->packets);
+ task = vlc_list_first_entry_or_null(&sys->packets, async_task_t, fifo);
+ assert(task->syncp != 0);
+ vlc_list_remove(&task->fifo);
block = qsv_synchronize_block( enc, task );
free(task->syncp);
free(task);
--
2.26.2
More information about the vlc-devel
mailing list