From patchwork Tue Nov 30 14:22:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Soft Works X-Patchwork-Id: 31848 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:d206:0:0:0:0:0 with SMTP id q6csp7720081iob; Tue, 30 Nov 2021 06:22:52 -0800 (PST) X-Google-Smtp-Source: ABdhPJwdhO4tE80CLSlaOyT7UKpBGwM2BLtGyOE+IugsV9CuLDYn4CLbIVyqz0ms+M5KNV2oRYrZ X-Received: by 2002:a17:907:c0c:: with SMTP id ga12mr70966551ejc.417.1638282172079; Tue, 30 Nov 2021 06:22:52 -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 lf8si23305118ejb.635.2021.11.30.06.22.51; Tue, 30 Nov 2021 06:22:52 -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=UzbRrQe0; 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 CAB68689A1E; Tue, 30 Nov 2021 16:22:47 +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-co1nam11olkn2029.outbound.protection.outlook.com [40.92.18.29]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 13955689A1E for ; Tue, 30 Nov 2021 16:22:41 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QBx1K/7rrPt3j044HgiEzFGOLLo04jBynlGkVd4tbhyPp7xEZSesHbGUjvhRyWX8uOb8dMnmbM9Zj3NFfCYKkUAip0c/Hcg/vA5THO+iM6WpMYh6ck1fxv9yjgPCc7Dt4gfJkpLutrt8s63Z+cpSDl5MGEJJL+NYzS5jvKlCRnClzOTxUyip5X4s4K5Lp/XTwbOq15zMAfPs7BV2VBTfygGYYsGxEgyM6JofBxYXuKkAEYRWku3vccMYmUd7ndzQWzNybhWzYc9OWwfjF4XvEjUpkX3zR1rXtiiyrZR46U+M1/QbE7Tu2b1aFT7oH4goZph4YBfzDUGcFEZShKcoEA== 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=jGKKInRDm1jIIabeqTTYQgQsnsg2yojnap3hQnPK1M0=; b=eaakLjaMvYhBVYESWmFjxbida6ope3hdl6v3k2kAFOfB+249+quo98FLelsk/KK6tMDAGviL55IkbAYM0O6x8D8XmOuDSfglCL8I7rNkxDTd1G2E28jeBGco77s440qoOR8ch+ibRxdStLFUMEajjqDAh5grFAsgSCtaXMPDk6JB7dXMf9OgOsk4Ll1Mz275QhoMftLS3zIc2aEqv0zVF/XC/O5YLuXHj6ov9xec5KFgBQB0Bfj9+SdkjH1hhWyn9MpqaZ6NGRfyz+a3HWKJ/QGcfOrekhLi6C725baXLbC5uTnZFwzJ+HeUvQ3NnP1aMj02TNZ+DUgt6Niaaeko7Q== 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=jGKKInRDm1jIIabeqTTYQgQsnsg2yojnap3hQnPK1M0=; b=UzbRrQe0ZmNastyYlWYzLy1qusgTOVeYUnDATLkhzb9n6Cys96QbBfInR9EEOSGFFIQeRCWD3Xh9P4XfYTpd9Z0i4WqBbw/r/QNbIVfaua7pjvliezfEd4vQfcRZCBZEEY60bAsm+aHi892OSmJEqjfOqYTP6H8jQFGDIvpUUkaazloFS5BLw1J6Kv6QjVTw7Zoe6nhyiBiKDeW4k3LQcieWT4WJD8Qo3CDmr2ch0WC2/Q/f+v9PfumH/RiZeaK8dMGDIm9gSkavbvbU2kjd9FhWrYHyqTj1KptbL9tWRcihCTRCmpTKDKoFUMP7kO5Zgf8LOrHZuzi0qNUGAz2jNg== Received: from DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM (2603:10b6:8:b::20) by DM8P223MB0336.NAMP223.PROD.OUTLOOK.COM (2603:10b6:5:316::18) 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 14:22:38 +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 14:22:38 +0000 From: Soft Works To: "ffmpeg-devel@ffmpeg.org" Thread-Topic: [PATCH v2 1/1] avcodec/vpp_qsv: Copy side data from input to output frame Thread-Index: AQG/W8r9ztqBtE6bUcPBwVA17ThtaQGMG+Ds Date: Tue, 30 Nov 2021 14:22:38 +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: [dD1i33xfbb2jHdL8JAjXeq/SSfxO/gVl] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 2e474407-adb5-41d5-d0c6-08d9b40cdcac x-ms-traffictypediagnostic: DM8P223MB0336: x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: X54Fg6OzYgwV0qS1MAl6enyBW+ycRfd0vuQGW63Mrf9ZFWgWwwQR2an2bnRzQ+2kmM1GWhlOVmlq2dTv5IJmUR3op9VOi96j5BMiQfl5/yEdEpKUS8cVlybjXs+x4akFMC8dKLvYVxg1vJJQN+9oVLUpnR0B9KBKwfQzilMe99fkMQgh4dQfhHmve7SxIKGVW20FG4aJX7woq0bc4Hpx4cDwMD9k8ED5Ec73w2sIpreZna5/h0E4d1Ls4FfiVJRgSjQA9bb8zycn2nD8VpJBi70cGpD/ju0MCDpwb+oiJlh/UQkurre9ZTueVus62wyQ3Xvgv0CURVHkz10IvJKjMB72nbSiVQWIT8g+PD4NC1fWNkaaDFJaFt4NCDuh2AedbOrY6XL0zARFjo9GIGGmUcQi1kz2e/JW+QaMgCRWkPYyaKvoXdczzVeRXC/KZ88dfcLukKW/+CDyTVfXE4CR0zhWKZOjFpMDSW0Gzpw4x2MrcnHpHdphr9zZYgD6IQMDn9BCykWKgjPouNryvM0yTnG3Rxo5b7u76htgfXC9LULQIi5jgzfbrBkfNROAXRsNyWkPSUwrvDp9iJNA8xvvUg== x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: /rndUC0a5zTnw47ysS2NQe3V/GTqxhxVaS59y41N4KVnWoBnRLKoYjb1VZGEDzyKcjtcc/R8xlwxGdn/lb8K1soi0+AnK3ZBN+99IIXPyWY3N6mMbnQhzSZIdobl8wtMquBUXbpAMLICUvjOZakkJbXM1o0OfZK/U6AyZsc3cGWOy4V9tTEMUD5RtVZW8YmnJWpgbdGBunY+rgTTYOqLG/cIEcMpYn+p6vZIG1K/+KvydOr+PYnPJOOByXndUud7jA4kBJWwECmb5YBDUe/bViP9KekzKxmGNA7qM2Xmlh7X0Mk9iJm4JhJFf6Q5XZmqytU0KB99NnXRbEYgb+vJVym1EBFvoVpNfmd0A189s1G+3L71EIaBWQ4gmoDkq2HEAC1fytAHXRUrno8H6o730ebBBFAu85lbXkMTzkydvTKfq1hMJ0peW72GR0AiQeeSIupyApXbcZxRyvQxTT5KiNDqJnBfn1EcN+/o6bm9zUWc6+SPBBnIt3QaxdDt9PySNLImsY0DzzE4tKuAKqqPtGlui71mshqF3AOQifQOsyI7BaraZN2FIM0kyBHdEnpBh6vVUecJ7nJjCeS8tgyc0t9eMsKNYOmapcdpXzRfxXkNl91nL3RS4vrx64R3gMjV8vImSgW5SD7T/ajZTDg8w98DekV9TozMtf2g4gRExTdGFsh6aHT8zCniS75grewQY39iI/PUxf+4Kxq3OcuSFA== 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: 2e474407-adb5-41d5-d0c6-08d9b40cdcac X-MS-Exchange-CrossTenant-originalarrivaltime: 30 Nov 2021 14:22:38.3859 (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: DM8P223MB0336 Subject: [FFmpeg-devel] [PATCH v2 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: fl1E+tdwXoLk Signed-off-by: softworkz --- V2: Add public method av_frame_copy_side_data() instead to copying the implementation. libavfilter/qsvvpp.c | 5 ++++ libavfilter/vf_overlay_qsv.c | 19 +++++++++--- libavutil/frame.c | 57 ++++++++++++++++++++---------------- libavutil/frame.h | 12 ++++++++ 4 files changed, 64 insertions(+), 29 deletions(-) diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index d1218355c7..b291216292 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -849,6 +849,11 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr return AVERROR(EAGAIN); break; } + + ret = av_frame_copy_side_data(out_frame->frame, in_frame->frame, 0); + if (ret < 0) + return ret; + out_frame->frame->pts = av_rescale_q(out_frame->surface.Data.TimeStamp, default_tb, outlink->time_base); diff --git a/libavfilter/vf_overlay_qsv.c b/libavfilter/vf_overlay_qsv.c index 7e76b39aa9..02518e020c 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 = av_frame_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; } diff --git a/libavutil/frame.c b/libavutil/frame.c index 1f1f573407..7a19245ea4 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -296,6 +296,36 @@ int av_frame_get_buffer2(AVFrame *frame, int align) } } +int av_frame_copy_side_data(AVFrame* dst, const AVFrame* src, int force_copy) +{ + for (unsigned 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); + } + return 0; +} + static int frame_copy_props(AVFrame *dst, const AVFrame *src, int force_copy) { int ret, i; @@ -340,31 +370,8 @@ static int frame_copy_props(AVFrame *dst, const AVFrame *src, int force_copy) av_dict_copy(&dst->metadata, src->metadata, 0); - 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); - } + if (ret = av_frame_copy_side_data(dst, src, force_copy) < 0) + return ret; ret = av_buffer_replace(&dst->opaque_ref, src->opaque_ref); ret |= av_buffer_replace(&dst->private_ref, src->private_ref); diff --git a/libavutil/frame.h b/libavutil/frame.h index 9dfd5a886a..6dec040ce8 100644 --- a/libavutil/frame.h +++ b/libavutil/frame.h @@ -885,6 +885,18 @@ int av_frame_copy(AVFrame *dst, const AVFrame *src); */ int av_frame_copy_props(AVFrame *dst, const AVFrame *src); +/** + * Copy only side-data from src to dst. + * + * @param dst a frame to which the side data should be copied. + * @param src a frame from which to copy the side data. + * @param force_copy determines whether to copy the actual data or only just + * create references to the buffers. + * + * @return >= 0 on success, a negative AVERROR on error. + */ +int av_frame_copy_side_data(AVFrame* dst, const AVFrame* src, int force_copy); + /** * Get the buffer reference a given data plane is stored in. *