From patchwork Tue Aug 10 21:59:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 29405 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:8e8b:0:0:0:0:0 with SMTP id q133csp836107iod; Tue, 10 Aug 2021 15:00:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz+L8dogU20+EvchV1TfOzbA/2b/gmRi62YefZjDveJy6qQAucn6LpxnTjG4KxdX+twot6d X-Received: by 2002:a17:906:f190:: with SMTP id gs16mr571844ejb.439.1628632829646; Tue, 10 Aug 2021 15:00:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628632829; cv=none; d=google.com; s=arc-20160816; b=dawnq/sGd1dPQJ0nF67yjKU8AfRfWZcpc5Z3gK4g5+el9Lb+7nh52A94rIuDr7OQOM 54estQqn7SWHRS4uqpF3rYJ60ccBXyV0GGpaeG/hV3URb0Fqf7NlSmYEQGLuUF2p3icv Xw7IfPm4OAz7rFfuR6epp/nzEI1udk/WPVRrq+5tWxcy0IE4mLTjhZfT2s8oOENgIRWX 9oqMCPysxdiDygR0v5KgDKVbc+FEOlM4RWX2XpoI1oGTYKM+/LvpQ3plyiApxo8VCfWi qID6yuqgdWJSGgndV77v6Kuw5oRK+Z97oWFjbXaxljRUKRRzZXeGggl6DD9X79+cUE+h FDDw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=NgZ+I6QJSv851HD+pJcXju+QP3D9y2BWgDDG3zirlPI=; b=lz5XTQ8J3KzXrVdVukIsOGnG0DoeXik1jxwpVTSlZ+w7Lnn9Ak9sqJ14VNk6y5QQFD tpFdI4MeGmZnx3Wl2B8x6Alvtw2CulXSqD3cV7UXNppD05TKObHXDo4LZQkejXuW3l+a 7EcdVVJPVvQIamzBVY3ic+PNAZXkWho0F7bspJjtLtb+hCvWNbnhmeRs1HupZ8nbJG5W OjUTcD7Sf3HiUeib3d24rG/aEQsFzn7eNgqt4U/2bwB7D+TiSQTfz85s3k1bzm39RwfI Lyg1mI94n/bgQNb2r6UE3UD4B3INTfzx+dyUw9rOPIMVJJAx0GNsSQVBZ3gvOdzrNQrc WZTw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=VAqXCdLJ; 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=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id t2si22666377ejf.408.2021.08.10.15.00.28; Tue, 10 Aug 2021 15:00:29 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b=VAqXCdLJ; 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=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E48BC68A273; Wed, 11 Aug 2021 01:00:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 538A46802FF for ; Wed, 11 Aug 2021 01:00:18 +0300 (EEST) Received: by mail-pj1-f41.google.com with SMTP id s22-20020a17090a1c16b0290177caeba067so6467598pjs.0 for ; Tue, 10 Aug 2021 15:00:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=I5CutZRPGZCbl86Krz3JpdJmmeMlWCYA2y4xJGlzEyQ=; b=VAqXCdLJ0SEYwigRx7FcO+aKffGlkJim1qEzdVknO75Cp7UxxdrInmvmVkL4aibUJ/ /JtyqGGWgbEbfJJxFHQfD5H/0FmbB0SN9fOD1Io4Q6CoExY3tc7fGhl8UImkbowfibO5 43VppxcYKU8o9bABEIpUMzM9WnAWD2tCM2hIvc7zL2kfQjU0qCox8kBr5sCMrfIke2/G qx1pM2uAKsjvaXSPyrD1nZPWv/XAjOBRmFjYxG4ngAHdw8KFXWtSzNvt3b/mRSIKPyof np6HJZLsjVplyISxA66/+9ZI3tmn/TO9ePcCl4Reg9zKAvpfN+RrRXWsDAUD05jtgwi+ zczw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=I5CutZRPGZCbl86Krz3JpdJmmeMlWCYA2y4xJGlzEyQ=; b=alfiwa6PmEcCOok8JJJmfGa4zFReXdGaRyP+icvwR6An/uiZETLEw3uFoFEbfjN7p3 BqIGZX75ybsqkwZwz6hUv6Uaej5bkeWvnrFBiHHEy1iWahEWq/f4u+pmMtiRkk+5RHyy 6TTiAqK9FdDOOcW4vOkicP+5dTKeKe7HfX+vAY+zmB2lRzJ3yHNYdw7hSo9MfaVzYQmd 3ncm/rBcK1JQj7ABI8axPX6z7J1g/+2ijxA6fzZkTCeL4EQALCRJXbDY/FroMEzxjesZ ozzQCoqIWWaNosyag3xlpWWn4bbiKCf/Sk7napRaLNmcLk8Vdc8hqaY40Qb6aulVOn5w Rl2w== X-Gm-Message-State: AOAM5315gnGbPrMhV6QE/284DOgZzMfyGdQOz3CS5XYNAw10o12tT3sB iHVfUI105HcFiXfOyCyxmNXBnY+Gm7A= X-Received: by 2002:a17:902:6ac1:b029:12c:e955:c9f9 with SMTP id i1-20020a1709026ac1b029012ce955c9f9mr24916945plt.32.1628632816124; Tue, 10 Aug 2021 15:00:16 -0700 (PDT) Received: from localhost.localdomain ([191.84.233.71]) by smtp.gmail.com with ESMTPSA id nv11sm4340998pjb.48.2021.08.10.15.00.14 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Aug 2021 15:00:15 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 10 Aug 2021 18:59:59 -0300 Message-Id: <20210810220001.13494-1-jamrial@gmail.com> X-Mailer: git-send-email 2.32.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/3] avutil/frame: add av_frame_replace 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: VtFMOpP01IQA Signed-off-by: James Almer --- Not going to bother with implementing replace for side data, since it's IMO not worth it, but patches are welcome of course. Missing version bump and APIchanges entry. libavutil/frame.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++ libavutil/frame.h | 18 +++++++++ 2 files changed, 116 insertions(+) diff --git a/libavutil/frame.c b/libavutil/frame.c index b0ceaf7145..035a48eb48 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -421,6 +421,104 @@ fail: return ret; } +int av_frame_replace(AVFrame *dst, const AVFrame *src) +{ + int i, ret = 0; + + if (!src->buf[0]) { + if ((src->extended_data && src->extended_data[0]) || src->data[0]) + ret = AVERROR(EINVAL); + + goto fail; + } + + dst->format = src->format; + dst->width = src->width; + dst->height = src->height; + dst->channels = src->channels; + dst->channel_layout = src->channel_layout; + dst->nb_samples = src->nb_samples; + + wipe_side_data(dst); + av_dict_free(&dst->metadata); + ret = frame_copy_props(dst, src, 0); + if (ret < 0) + goto fail; + + /* replace the buffers */ + for (i = 0; i < FF_ARRAY_ELEMS(src->buf); i++) { + ret = av_buffer_replace(&dst->buf[i], src->buf[i]); + if (ret < 0) + goto fail; + } + + if (src->extended_buf) { + if (dst->nb_extended_buf != src->nb_extended_buf) { + int nb_extended_buf = FFMIN(dst->nb_extended_buf, src->nb_extended_buf); + void *tmp; + + for (i = nb_extended_buf; i < dst->nb_extended_buf; i++) + av_buffer_unref(&dst->extended_buf[i]); + + tmp = av_realloc_array(dst->extended_buf, sizeof(*dst->extended_buf), + src->nb_extended_buf); + if (!tmp) { + ret = AVERROR(ENOMEM); + goto fail; + } + dst->extended_buf = tmp; + dst->nb_extended_buf = src->nb_extended_buf; + + memset(&dst->extended_buf[nb_extended_buf], 0, + (src->nb_extended_buf - nb_extended_buf) * sizeof(*dst->extended_buf)); + } + + for (i = 0; i < src->nb_extended_buf; i++) { + ret = av_buffer_replace(&dst->extended_buf[i], src->extended_buf[i]); + if (ret < 0) + goto fail; + } + } else if (dst->extended_buf) { + for (i = 0; i < dst->nb_extended_buf; i++) + av_buffer_unref(&dst->extended_buf[i]); + av_freep(&dst->extended_buf); + } + + ret = av_buffer_replace(&dst->hw_frames_ctx, src->hw_frames_ctx); + if (ret < 0) + goto fail; + + if (dst->extended_data != dst->data) + av_freep(&dst->extended_data); + + if (src->extended_data != src->data) { + int ch = src->channels; + + if (!ch) { + ret = AVERROR(EINVAL); + goto fail; + } + CHECK_CHANNELS_CONSISTENCY(src); + + dst->extended_data = av_malloc_array(sizeof(*dst->extended_data), ch); + if (!dst->extended_data) { + ret = AVERROR(ENOMEM); + goto fail; + } + memcpy(dst->extended_data, src->extended_data, sizeof(*src->extended_data) * ch); + } else + dst->extended_data = dst->data; + + memcpy(dst->data, src->data, sizeof(src->data)); + memcpy(dst->linesize, src->linesize, sizeof(src->linesize)); + + return 0; + +fail: + av_frame_unref(dst); + return ret; +} + AVFrame *av_frame_clone(const AVFrame *src) { AVFrame *ret = av_frame_alloc(); diff --git a/libavutil/frame.h b/libavutil/frame.h index ff2540a20f..36ed128886 100644 --- a/libavutil/frame.h +++ b/libavutil/frame.h @@ -695,6 +695,24 @@ void av_frame_free(AVFrame **frame); */ int av_frame_ref(AVFrame *dst, const AVFrame *src); +/** + * Ensure the destination frame refers to the same data described by the source + * frame. + * + * Copy frame properties from src to dst and create a new reference for each + * AVBufferRef from src if they differ from those in dst. + * + * src must be reference counted. + * + * @param src The source frame. If there's data described in it, it must be + * reference counted. + * @param dst The destination frame. + * + * @return 0 on success, a negative AVERROR on error. On error, dst is + * unreferenced. + */ +int av_frame_replace(AVFrame *dst, const AVFrame *src); + /** * Create a new frame that references the same data as src. *