From patchwork Tue Nov 30 12:28:46 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Soft Works X-Patchwork-Id: 31843 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:d206:0:0:0:0:0 with SMTP id q6csp7572904iob; Tue, 30 Nov 2021 04:29:02 -0800 (PST) X-Google-Smtp-Source: ABdhPJxlaDdymTsufAXNtphq3iBtgMoa9zBZjKUQF2KS8y2kNtyY1zrMtV78iG4ydbN9NcayMvOt X-Received: by 2002:a05:6402:5194:: with SMTP id q20mr82942211edd.123.1638275341891; Tue, 30 Nov 2021 04:29:01 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id sd30si36855777ejc.764.2021.11.30.04.29.01; Tue, 30 Nov 2021 04:29:01 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@hotmail.com header.s=selector1 header.b=c5gkNon3; arc=fail (body hash mismatch); spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=hotmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5EADD68ADAE; Tue, 30 Nov 2021 14:28:57 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11olkn2049.outbound.protection.outlook.com [40.92.18.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E72DE680AA8 for ; Tue, 30 Nov 2021 14:28:49 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ACID02D43Dt7uFm5ellP0kQPtjyBtxBDPdQJEq/rN8vso5gRey4NfsGWnfdvK1ZlYqpsuD0Q69DDnOgyIhwX3/G4OEdD6UG4HRhrJAKPYD8/PC/C+o7jyC80hT9v6o/mFrNX2ZifEDHYeYv7yUdtMKP1XtLQhc87uYWlKeKO0qQT2RX88nf5QgTLDmyFw5r9b9s7BG0Ggr7WYdF9/FduIM4frMdiuwQ/3JneBnmYytUDpqxmIs4OPfAowKwvrLMcyymMjna3n0Fqg1agCR41qs5vhCGF6P48fVAPVe2YTiffpn/HNjnVTAuJBhVK2yYX1ZGzYtedKpfLHlIk9b8CcQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=4bg544CV0fYg7jv/VBL1zLXiOxs7WVwS/oacIyH57Sk=; b=gGaXxFPKcJxqhdK+aMdfyjWA0CSMXDBDfPM6FzL4FP2MjaxHBlvby77aknlZsLgGf+16dPhr6wTqN2pfJR8AGGyQVNDFsYMGBKdanQ+62gPTt00mMa07CVsmkml6dgq7/FF4iElt5hiOdKpJbBCtgBC0fQGXhghkROIbrl5iDLsVKtGIZ/41+WTAGzgo7IQtqyMLFqmkD6o1FU6hubYAhLUKYyB0RmHPv42inEyT8pXRc4FnPS4DSckGmgYkLa0zBeG2zGSa3h309iauJoWAVB2dDgB2qjvZocskgFYaG2pt/IptnlUxWr5LxdXCgbtuTvjy2/rGj67FtYuuFpMh4A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4bg544CV0fYg7jv/VBL1zLXiOxs7WVwS/oacIyH57Sk=; b=c5gkNon3sZngXD6B1+K8/WiDqFXOr4feljU6dHMxSwEk1v8v3h3yCffvEEQR900vP39b+CUq2d51b+xZqBAdGhEZFMjk8z9ikqUfYq3eqfWqj4jy9XFXip5hEBsYQFantW9lXWKo/fOXmTIOIC0pNUQ0vOL060Ce6o+RqC99C29e6eaBoB38EALb7PLEYfTMTUoukh2930NS4HCZait5AXMArxmKvlLJ+ReN7CVOtdCtbWy85BOeXkgI4miwAPWoCdt4yNRomTPdE44MpFHS+gJ1MCZhIMCNpRnzTXbI9+2bhRG6lI8x0onEPfEviNhtufinLCmJ3D6T940bl3LEnQ== Received: from DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM (2603:10b6:8:b::20) by DM8P223MB0174.NAMP223.PROD.OUTLOOK.COM (2603:10b6:8:b::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4734.22; Tue, 30 Nov 2021 12:28:46 +0000 Received: from DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM ([fe80::9c8d:fc63:9488:9775]) by DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM ([fe80::9c8d:fc63:9488:9775%5]) with mapi id 15.20.4734.024; Tue, 30 Nov 2021 12:28:46 +0000 From: Soft Works To: "ffmpeg-devel@ffmpeg.org" Thread-Topic: [PATCH 1/1] avcodec/vpp_qsv: Copy side data from input to output frame Thread-Index: AQGW6yX3Tt1SlF0Ud9YuDBFzIWomXQFBdLsb Date: Tue, 30 Nov 2021 12:28:46 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-messagesentrepresentingtype: 1 x-tmn: [lkimrwuzmiiKuPVcYJwuwNaUeXH8cHEB] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 12dfcdd2-5eda-42cc-66c2-08d9b3fcf4be x-ms-traffictypediagnostic: DM8P223MB0174: x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: Tc9On08b1YxSe4SENapUk7kfQnBzExF2gVKyZDiYHOZ9/kXAoK2LnO3P7zATG+M8XHzVasMqj7rAu/ZjFJTYav1zAIVSwODbxZopMR6kHElUF+AWUtP77iHdMBKNPFaVgrZmdnZoDSC0+TmMSyEpypgnGBujMkRVpckTMdluJXD99ht9TrST02zEUOxsy9VPcvt7GCx9OZ/pt2aq1c6prctNda4u+Kcz01pf2fmU+OWI5WQXufT8hsgYiAIqJfwL0G6OSAuNJpPwJTPiisDslbDk/P9/tv2BYUMiVu+t+LO0g8WrusrFHE6dluFsy5vFh/oyj11ZEOcmqFlemucXGwrkviV7PO+Bkxu8U6r3K4G5z9k7IXvcDn7I022OXX4tmUVOcEvJIcCpQZhND0dxeO4qNzqRyNROKZD/Pazm7MYDRUjsx5GJj/+bCxys06P5lN6pNaWG/wxtYB3u4oOvq7rbUAnva8gB5Ugv0ipPf7pYreZWvdJ7+MxV4eIl/HcEWP+UaQVEh3j/mHJJzpVQfhLxS/NxGzzOBEWexqn/uqJcPH5AtkYACuUhORdgq8XbQuAk4X2R6nGsbVa8J3Rbrw== x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: T23bDC2rNx1QuCmMvG1UR9zltdlCKOH99w+1/3AFT8X8tkZgQbvfT22BxWoriduKbv+t8No35uc7VeX07ROKACpjg5jDpp3ojrN51ezKyGTR7u2GcEtnTdMo26d8sSHaBm2M+JP0wVm1x9lnaq4RphxFtZVIvglwPMcz3vQAIjmOCihFeBdwwyBMAuSMR/GB1sRKPMT4R++lU+CjLBbQX85OdEzzknHgr8R2MV6xvO1HhgDp3IoZX5cmkc/DP8KtZykjCtk6T7F2bx2sDjFbFSqsa1ov6zxJAl8GEFWGB5QoeFlnCN9fR6ZcjwFrNBZJn1CKzuuhMYXDXL7I4NmkCF0pEGYjEDwcwo39M1dOMtCLPTLX4bmybG9+sLFPoxTYXasqVjhBrqgaNmorE/IPFUHQ5uRLDWzWS9pcT5qZJe+puSyl7H8MmIBcImmZBx9uBh+LBUu0GjcvDpiflpWaSbUrwBMZ4I1goeZrcsmPya8Btk1tlNKIDDyxRhO8ARz9hsJWYWn641WbewDcjdQxx+1ohtki57QJvlWNAvAJaPn/WSsiSII85CiNAy7nLFvlV3u4mFnRfeRPd8ar9jqFT2uBKUQb/l9Y5y6cGT4n3XFrcCgNCH9MlPlbA5UCSmWdjBhcmLYTj5bmyQ0Q+gPp+N7HlY42zaLzAOtphYgsaVAe9Gcmy1IKeRJkxLVMWVfWxo63T5ID9Rwe0alcF+Tdzg== MIME-Version: 1.0 X-OriginatorOrg: sct-15-20-3912-16-msonline-outlook-1fc6d.templateTenant X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-CrossTenant-Network-Message-Id: 12dfcdd2-5eda-42cc-66c2-08d9b3fcf4be X-MS-Exchange-CrossTenant-originalarrivaltime: 30 Nov 2021 12:28:46.7551 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-rms-persistedconsumerorg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM8P223MB0174 Subject: [FFmpeg-devel] [PATCH 1/1] avcodec/vpp_qsv: Copy side data from input to output frame X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: RNNAOeKG4KlG Signed-off-by: softworkz --- libavfilter/qsvvpp.c | 59 ++++++++++++++++++++++++++++++++++++ libavfilter/qsvvpp.h | 2 ++ libavfilter/vf_overlay_qsv.c | 19 +++++++++--- 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index d1218355c7..c07f849fe9 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -795,6 +795,62 @@ int ff_qsvvpp_free(QSVVPPContext **vpp) return 0; } +static void free_side_data(AVFrameSideData **ptr_sd) +{ + AVFrameSideData *sd = *ptr_sd; + + av_buffer_unref(&sd->buf); + av_dict_free(&sd->metadata); + av_freep(ptr_sd); +} + +static void wipe_side_data(AVFrame *frame) +{ + int i; + + for (i = 0; i < frame->nb_side_data; i++) { + free_side_data(&frame->side_data[i]); + } + frame->nb_side_data = 0; + + av_freep(&frame->side_data); +} + +int ff_qsvvpp_copy_side_data(AVFrame *dst, const AVFrame *src, int force_copy) +{ + int ret, i; + + for (i = 0; i < src->nb_side_data; i++) { + const AVFrameSideData *sd_src = src->side_data[i]; + AVFrameSideData *sd_dst; + if (sd_src->type == AV_FRAME_DATA_PANSCAN + && (src->width != dst->width || src->height != dst->height)) + continue; + if (force_copy) { + sd_dst = av_frame_new_side_data(dst, sd_src->type, + sd_src->size); + if (!sd_dst) { + wipe_side_data(dst); + return AVERROR(ENOMEM); + } + memcpy(sd_dst->data, sd_src->data, sd_src->size); + } else { + AVBufferRef *ref = av_buffer_ref(sd_src->buf); + sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, ref); + if (!sd_dst) { + av_buffer_unref(&ref); + wipe_side_data(dst); + return AVERROR(ENOMEM); + } + } + av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0); + } + + ret = av_buffer_replace(&dst->opaque_ref, src->opaque_ref); + ret |= av_buffer_replace(&dst->private_ref, src->private_ref); + return ret; +} + int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picref) { AVFilterContext *ctx = inlink->dst; @@ -849,6 +905,9 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr return AVERROR(EAGAIN); break; } + + ff_qsvvpp_copy_side_data(out_frame->frame, in_frame->frame, 0); + out_frame->frame->pts = av_rescale_q(out_frame->surface.Data.TimeStamp, default_tb, outlink->time_base); diff --git a/libavfilter/qsvvpp.h b/libavfilter/qsvvpp.h index e0f4c8f5bb..fcd3cd892d 100644 --- a/libavfilter/qsvvpp.h +++ b/libavfilter/qsvvpp.h @@ -117,4 +117,6 @@ int ff_qsvvpp_print_error(void *log_ctx, mfxStatus err, int ff_qsvvpp_print_warning(void *log_ctx, mfxStatus err, const char *warning_string); +int ff_qsvvpp_copy_side_data(AVFrame *dst, const AVFrame *src, int force_copy); + #endif /* AVFILTER_QSVVPP_H */ diff --git a/libavfilter/vf_overlay_qsv.c b/libavfilter/vf_overlay_qsv.c index 7e76b39aa9..f654893f2c 100644 --- a/libavfilter/vf_overlay_qsv.c +++ b/libavfilter/vf_overlay_qsv.c @@ -231,13 +231,24 @@ static int process_frame(FFFrameSync *fs) { AVFilterContext *ctx = fs->parent; QSVOverlayContext *s = fs->opaque; + AVFrame *frame0 = NULL; AVFrame *frame = NULL; - int ret = 0, i; + int ret = 0; - for (i = 0; i < ctx->nb_inputs; i++) { + for (unsigned i = 0; i < ctx->nb_inputs; i++) { ret = ff_framesync_get_frame(fs, i, &frame, 0); - if (ret == 0) - ret = ff_qsvvpp_filter_frame(s->qsv, ctx->inputs[i], frame); + + if (ret == 0) { + AVFrame *temp; + + if (i == 0) + frame0 = frame; + else + ret = ff_qsvvpp_copy_side_data(frame, frame0, 0); + + ret = ret < 0 ? ret : ff_qsvvpp_filter_frame(s->qsv, ctx->inputs[i], frame); + } + if (ret < 0 && ret != AVERROR(EAGAIN)) break; }