aboutsummaryrefslogtreecommitdiffstats
path: root/libavfilter
diff options
context:
space:
mode:
authorHaihao Xiang <haihao.xiang@intel.com>2023-06-12 16:14:46 +0800
committerHaihao Xiang <haihao.xiang@intel.com>2023-06-20 09:52:43 +0800
commitcf21ca9efbcafeb0a885ef1979258c9e4f10c63f (patch)
tree5491714c1cd0acae43e7fac8050978ec18eea4fb /libavfilter
parent579711c2ccbaf5dc0e521980869be5bde54c437c (diff)
downloadffmpeg-cf21ca9efbcafeb0a885ef1979258c9e4f10c63f.tar.gz
lavfi/qsvvpp: store a copy of the sequence parameters
We will postpone the vpp session initialization to when input and output frames are ready, this copy of the sequence parameters will be used to initialize vpp session. Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/qsvvpp.c42
-rw-r--r--libavfilter/qsvvpp.h7
2 files changed, 32 insertions, 17 deletions
diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c
index 8683a4f217..d168ab5d1d 100644
--- a/libavfilter/qsvvpp.c
+++ b/libavfilter/qsvvpp.c
@@ -767,28 +767,39 @@ int ff_qsvvpp_init(AVFilterContext *avctx, QSVVPPParam *param)
goto failed;
}
+ s->nb_seq_buffers = param->num_ext_buf;
#if QSV_HAVE_OPAQUE
- if (IS_OPAQUE_MEMORY(s->in_mem_mode) || IS_OPAQUE_MEMORY(s->out_mem_mode)) {
- s->nb_ext_buffers = param->num_ext_buf + 1;
+ if (IS_OPAQUE_MEMORY(s->in_mem_mode) || IS_OPAQUE_MEMORY(s->out_mem_mode))
+ s->nb_seq_buffers++;
+#endif
+
+ if (s->nb_seq_buffers) {
+ s->seq_buffers = av_calloc(s->nb_seq_buffers, sizeof(*s->seq_buffers));
+ if (!s->seq_buffers) {
+ ret = AVERROR(ENOMEM);
+ goto failed;
+ }
+
+ for (i = 0; i < param->num_ext_buf; i++)
+ s->seq_buffers[i] = param->ext_buf[i];
+
+#if QSV_HAVE_OPAQUE
+ if (IS_OPAQUE_MEMORY(s->in_mem_mode) || IS_OPAQUE_MEMORY(s->out_mem_mode))
+ s->seq_buffers[i] = (mfxExtBuffer *)&s->opaque_alloc;
+#endif
+
+ s->nb_ext_buffers = s->nb_seq_buffers;
s->ext_buffers = av_calloc(s->nb_ext_buffers, sizeof(*s->ext_buffers));
if (!s->ext_buffers) {
ret = AVERROR(ENOMEM);
goto failed;
}
- s->ext_buffers[0] = (mfxExtBuffer *)&s->opaque_alloc;
- for (i = 1; i < param->num_ext_buf; i++)
- s->ext_buffers[i] = param->ext_buf[i - 1];
- s->vpp_param.ExtParam = s->ext_buffers;
- s->vpp_param.NumExtParam = s->nb_ext_buffers;
- } else {
- s->vpp_param.NumExtParam = param->num_ext_buf;
- s->vpp_param.ExtParam = param->ext_buf;
+ memcpy(s->ext_buffers, s->seq_buffers, s->nb_seq_buffers * sizeof(*s->seq_buffers));
}
-#else
- s->vpp_param.NumExtParam = param->num_ext_buf;
- s->vpp_param.ExtParam = param->ext_buf;
-#endif
+
+ s->vpp_param.ExtParam = s->ext_buffers;
+ s->vpp_param.NumExtParam = s->nb_ext_buffers;
s->got_frame = 0;
@@ -861,9 +872,8 @@ int ff_qsvvpp_close(AVFilterContext *avctx)
clear_frame_list(&s->out_frame_list);
av_freep(&s->surface_ptrs_in);
av_freep(&s->surface_ptrs_out);
-#if QSV_HAVE_OPAQUE
+ av_freep(&s->seq_buffers);
av_freep(&s->ext_buffers);
-#endif
av_freep(&s->frame_infos);
av_fifo_freep2(&s->async_fifo);
diff --git a/libavfilter/qsvvpp.h b/libavfilter/qsvvpp.h
index 8851185ff3..073c89fe70 100644
--- a/libavfilter/qsvvpp.h
+++ b/libavfilter/qsvvpp.h
@@ -74,9 +74,14 @@ typedef struct QSVVPPContext {
#if QSV_HAVE_OPAQUE
/** MFXVPP extern parameters */
mfxExtOpaqueSurfaceAlloc opaque_alloc;
+#endif
+ /** store sequence parameters */
+ mfxExtBuffer **seq_buffers;
+ int nb_seq_buffers;
+
+ /** store all parameters for vpp execution, including parameters per frame */
mfxExtBuffer **ext_buffers;
int nb_ext_buffers;
-#endif
int got_frame;
int async_depth;