From: "Xiang, Haihao" <haihao.xiang-at-intel.com@ffmpeg.org>
To: ffmpeg-devel@ffmpeg.org
Cc: Haihao Xiang <haihao.xiang@intel.com>
Subject: [FFmpeg-devel] [PATCH v2 04/12] lavu/hwcontext_qsv: add support for dynamic frame pool in qsv_map_to
Date: Wed, 20 Dec 2023 15:10:42 +0800
Message-ID: <20231220071050.3175819-4-haihao.xiang@intel.com> (raw)
In-Reply-To: <20231220071050.3175819-1-haihao.xiang@intel.com>
From: Haihao Xiang <haihao.xiang@intel.com>
Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
---
libavutil/hwcontext_qsv.c | 131 +++++++++++++++++++++++++++++++++++++-
1 file changed, 129 insertions(+), 2 deletions(-)
diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
index 3259cd38ba..2e75f5ca0b 100644
--- a/libavutil/hwcontext_qsv.c
+++ b/libavutil/hwcontext_qsv.c
@@ -2088,8 +2088,8 @@ static int qsv_frames_derive_to(AVHWFramesContext *dst_ctx,
}
}
-static int qsv_map_to(AVHWFramesContext *dst_ctx,
- AVFrame *dst, const AVFrame *src, int flags)
+static int qsv_fixed_pool_map_to(AVHWFramesContext *dst_ctx,
+ AVFrame *dst, const AVFrame *src, int flags)
{
AVQSVFramesContext *hwctx = dst_ctx->hwctx;
int i, err, index = -1;
@@ -2148,6 +2148,133 @@ static int qsv_map_to(AVHWFramesContext *dst_ctx,
return 0;
}
+static void qsv_dynamic_pool_unmap(AVHWFramesContext *ctx, HWMapDescriptor *hwmap)
+{
+ mfxFrameSurface1 *surfaces_internal = (mfxFrameSurface1 *)hwmap->priv;
+ mfxHDLPair *handle_pairs_internal = (mfxHDLPair *)surfaces_internal->Data.MemId;
+ AVHWFramesContext *src_ctx = (AVHWFramesContext *)ctx->internal->source_frames->data;
+
+ switch (src_ctx->format) {
+#if CONFIG_VAAPI
+ case AV_PIX_FMT_VAAPI:
+ {
+ av_freep(&handle_pairs_internal->first);
+
+ break;
+ }
+#endif
+
+#if CONFIG_D3D11VA
+ case AV_PIX_FMT_D3D11:
+ {
+ /* Do nothing */
+ break;
+ }
+#endif
+ default:
+ av_log(ctx, AV_LOG_ERROR, "Should not reach here. \n");
+ break;
+ }
+
+ av_freep(&handle_pairs_internal);
+ av_freep(&surfaces_internal);
+}
+
+static int qsv_dynamic_pool_map_to(AVHWFramesContext *dst_ctx,
+ AVFrame *dst, const AVFrame *src, int flags)
+{
+ mfxFrameSurface1 *surfaces_internal = NULL;
+ mfxHDLPair *handle_pairs_internal = NULL;
+ int ret = 0;
+
+ surfaces_internal = av_calloc(1, sizeof(*surfaces_internal));
+ if (!surfaces_internal) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+
+ handle_pairs_internal = av_calloc(1, sizeof(*handle_pairs_internal));
+ if (!handle_pairs_internal) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+
+ ret = qsv_init_surface(dst_ctx, surfaces_internal);
+ if (ret < 0)
+ goto fail;
+
+ switch (src->format) {
+#if CONFIG_VAAPI
+ case AV_PIX_FMT_VAAPI:
+ {
+ VASurfaceID *surface_id_internal;
+
+ surface_id_internal = av_calloc(1, sizeof(*surface_id_internal));
+ if (!surface_id_internal) {
+ ret =AVERROR(ENOMEM);
+ goto fail;
+ }
+
+ *surface_id_internal = (VASurfaceID)(uintptr_t)src->data[3];
+ handle_pairs_internal->first = (mfxHDL)surface_id_internal;
+ handle_pairs_internal->second = (mfxMemId)MFX_INFINITE;
+
+ break;
+ }
+#endif
+
+#if CONFIG_D3D11VA
+ case AV_PIX_FMT_D3D11:
+ {
+ AVHWFramesContext *src_ctx = (AVHWFramesContext*)src->hw_frames_ctx->data;
+ AVD3D11VAFramesContext *src_hwctx = src_ctx->hwctx;
+
+ handle_pairs_internal->first = (mfxMemId)src->data[0];
+
+ if (src_hwctx->BindFlags & D3D11_BIND_RENDER_TARGET) {
+ handle_pairs_internal->second = (mfxMemId)MFX_INFINITE;
+ } else {
+ handle_pairs_internal->second = (mfxMemId)src->data[1];
+ }
+
+ break;
+ }
+#endif
+ default:
+ ret = AVERROR(ENOSYS);
+ goto fail;
+ }
+
+ surfaces_internal->Data.MemId = (mfxMemId)handle_pairs_internal;
+
+ ret = ff_hwframe_map_create(dst->hw_frames_ctx,
+ dst, src, qsv_dynamic_pool_unmap, surfaces_internal);
+ if (ret)
+ goto fail;
+
+ dst->width = src->width;
+ dst->height = src->height;
+ dst->data[3] = (uint8_t*)surfaces_internal;
+
+ return 0;
+
+fail:
+ av_freep(&handle_pairs_internal);
+ av_freep(&surfaces_internal);
+ return ret;
+}
+
+static int qsv_map_to(AVHWFramesContext *dst_ctx,
+ AVFrame *dst, const AVFrame *src, int flags)
+{
+ AVQSVFramesContext *hwctx = dst_ctx->hwctx;
+
+ if (hwctx->nb_surfaces)
+ return qsv_fixed_pool_map_to(dst_ctx, dst, src, flags);
+ else
+ return qsv_dynamic_pool_map_to(dst_ctx, dst, src, flags);
+}
+
static int qsv_frames_get_constraints(AVHWDeviceContext *ctx,
const void *hwconfig,
AVHWFramesConstraints *constraints)
--
2.34.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2023-12-20 7:11 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-20 7:10 [FFmpeg-devel] [PATCH v2 01/12] lavu/hwcontext_qsv: update AVQSVFramesContext to support dynamic frame pools Xiang, Haihao
2023-12-20 7:10 ` [FFmpeg-devel] [PATCH v2 02/12] lavu/hwcontext_qsv: create dynamic frame pool if required Xiang, Haihao
2023-12-20 7:10 ` [FFmpeg-devel] [PATCH v2 03/12] lavu/hwcontext_qsv: add support for dynamic frame pool in qsv_frames_derive_to Xiang, Haihao
2023-12-20 7:10 ` Xiang, Haihao [this message]
2023-12-20 7:10 ` [FFmpeg-devel] [PATCH v2 05/12] lavc/qsv: fix the mfx allocator to support dynamic frame pools Xiang, Haihao
2023-12-20 7:10 ` [FFmpeg-devel] [PATCH v2 06/12] lavc/qsvenc: use the right info to config encoding parameters Xiang, Haihao
2023-12-20 7:10 ` [FFmpeg-devel] [PATCH v2 07/12] lavc/qsvdec: require a dynamic frame pool if possible Xiang, Haihao
2023-12-20 7:10 ` [FFmpeg-devel] [PATCH v2 08/12] lavfi/qsvvpp: set right mfxFrameInfo for frames in dynamic frame pools Xiang, Haihao
2023-12-20 7:10 ` [FFmpeg-devel] [PATCH v2 09/12] lavfi/qsvvpp: require a dynamic frame pool for output if possible Xiang, Haihao
2023-12-20 7:10 ` [FFmpeg-devel] [PATCH v2 10/12] lavu/hwcontext_vaapi: relax the requirement when using libva2 (VAAPI 1) Xiang, Haihao
2023-12-20 7:10 ` [FFmpeg-devel] [PATCH v2 11/12] lavc/vaapi_decode: use dynamic frame pool for output frames with libva2 Xiang, Haihao
2024-01-26 7:25 ` Xiang, Haihao
2024-01-29 21:58 ` Mark Thompson
2024-01-30 6:30 ` Xiang, Haihao
2024-01-30 19:07 ` Mark Thompson
2024-01-31 2:26 ` Xiang, Haihao
2024-02-08 4:15 ` Xiang, Haihao
2023-12-20 7:10 ` [FFmpeg-devel] [PATCH v2 12/12] lavfi/vaapi_vpp: use dynamic frame pool for output link " Xiang, Haihao
2024-01-02 5:33 ` [FFmpeg-devel] [PATCH v2 01/12] lavu/hwcontext_qsv: update AVQSVFramesContext to support dynamic frame pools Xiang, Haihao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231220071050.3175819-4-haihao.xiang@intel.com \
--to=haihao.xiang-at-intel.com@ffmpeg.org \
--cc=ffmpeg-devel@ffmpeg.org \
--cc=haihao.xiang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git