[vlc-commits] qsv: clean the picture enqueuing code
Steve Lhomme
git at videolan.org
Wed Apr 4 18:28:28 CEST 2018
vlc | branch: master | Steve Lhomme <robux4 at videolabs.io> | Mon Nov 20 14:42:10 2017 +0100| [300800f9673dc556cebacffcf0d55677e164f89e] | committer: Steve Lhomme
qsv: clean the picture enqueuing code
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=300800f9673dc556cebacffcf0d55677e164f89e
---
modules/codec/qsv.c | 37 ++++++++++++++++++++++---------------
1 file changed, 22 insertions(+), 15 deletions(-)
diff --git a/modules/codec/qsv.c b/modules/codec/qsv.c
index 6808e578f7..0226c3a1d3 100644
--- a/modules/codec/qsv.c
+++ b/modules/codec/qsv.c
@@ -753,12 +753,14 @@ static block_t *qsv_synchronize_block(encoder_t *enc, async_task_t *task)
return block;
}
-static void qsv_queue_encode_picture(encoder_t *enc, async_task_t *task,
- picture_t *pic)
+static void qsv_queue_encode_picture(encoder_t *enc, picture_t *pic)
{
encoder_sys_t *sys = enc->p_sys;
mfxStatus sts;
mfxFrameSurface1 *frame = NULL;
+ async_task_t *task = calloc(1, sizeof(*task));
+ if (unlikely(task == NULL))
+ return;
if (!(task->syncp = calloc(1, sizeof(*task->syncp)))) {
msg_Err(enc, "Unable to allocate syncpoint for encoder output");
@@ -792,6 +794,15 @@ static void qsv_queue_encode_picture(encoder_t *enc, async_task_t *task,
task->bs.MaxLength = task->block->i_buffer;
task->bs.Data = task->block->p_buffer;
+ if (!(task->syncp = calloc(1, sizeof(*task->syncp)))) {
+ msg_Err(enc, "Unable to allocate syncpoint for encoder output");
+ goto done;
+ }
+
+ if (qsv_frame) {
+ surf = &qsv_frame->surface;
+ }
+
for (;;) {
sts = MFXVideoENCODE_EncodeFrameAsync(sys->session, 0, frame, &task->bs, task->syncp);
if (sts != MFX_WRN_DEVICE_BUSY && sts != MFX_WRN_IN_EXECUTION)
@@ -828,22 +839,18 @@ static block_t *Encode(encoder_t *this, picture_t *pic)
{
encoder_t *enc = (encoder_t *)this;
encoder_sys_t *sys = enc->p_sys;
- async_task_t *task = NULL;
block_t *block = NULL;
- task = calloc(1, sizeof(*task));
- if (likely(task != NULL))
+ qsv_queue_encode_picture( enc, pic );
+
+ if ( async_task_t_fifo_GetCount(&sys->packets) == sys->async_depth ||
+ (!pic && async_task_t_fifo_GetCount(&sys->packets)))
{
- qsv_queue_encode_picture( enc, task, pic );
-
- if ( async_task_t_fifo_GetCount(&sys->packets) == sys->async_depth ||
- (!pic && async_task_t_fifo_GetCount(&sys->packets)))
- {
- assert(async_task_t_fifo_Show(&sys->packets)->syncp != 0);
- task = async_task_t_fifo_Get(&sys->packets);
- block = qsv_synchronize_block( enc, task );
- free(task);
- }
+ assert(async_task_t_fifo_Show(&sys->packets)->syncp != 0);
+ async_task_t *task = async_task_t_fifo_Get(&sys->packets);
+ block = qsv_synchronize_block( enc, task );
+ free(task->syncp);
+ free(task);
}
return block;
More information about the vlc-commits
mailing list