From patchwork Thu Mar 1 12:32:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rostislav Pehlivanov X-Patchwork-Id: 7773 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.181.170 with SMTP id m39csp4987577jaj; Thu, 1 Mar 2018 04:38:14 -0800 (PST) X-Google-Smtp-Source: AG47ELvCKDimCOhezXR4oq0WYEzOJskSxZKt9Gsk2lNSLbUL92FFr8rdld2siNKlOiXKugHOB6Sc X-Received: by 10.28.211.195 with SMTP id k186mr1540783wmg.106.1519907894193; Thu, 01 Mar 2018 04:38:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519907894; cv=none; d=google.com; s=arc-20160816; b=dyYssd+3943fPe1KZlGtdTbX8k/jM8+TRPTYpVDAiVSlAyXE0fqBYuwpF+EtVAJtez A6lM+kMRVB4qFQl74ZnOlStw6giha5unkJBc8picR7aRSDJ3mph8GkPCsmEMbFWWLSpL LDfieYE9Nr0JWmrJko0ig46MHGNTNKLnQQmq0GfmAGT1RIZOyc78clZz0b3U19DEDKLZ d8B6vhh0bIT7P1TDsj2t2zi2dDYO+RD93e/w0rgnA4bhQNKrokMP/2JtpubhgehyWXbJ mUZ0Dtvxv8lb2LwWfd3L8lXnGhFwTrfh1L3FGFyv0I1dX5AGnfAHOEdEg+wqtNKsV8yr 3K8A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=w5jakTVK6FhnSukRl9tgkFDlLAV8bbPyFh1fXa5m5Pw=; b=g5NhKVU+2AlCrv7jSuDBI7Lm1x+lecVu3AS0f8wMaL+EnIxOTmKkwjFI0NuHakXK3Q tkeKgDiXc+lQCwwKj8LAu4z3G5qUdieoHhu07wVdaF0fj8lh9AmqEQTdWVyixj7a21qY MQMxOL8NJKQI3Cloimfn1RNmpmjrLXHmgqZVQQui5VbeTOI4WIi2pcijQx//3z4oijyu 6BDZG8n3cs9sYjJeaHNgMOykKgU+wWNlRUGNRw2/kSjE2Usi1RBgufBal7GegYIyPdSK EW4pQ751FhXag0bPhfqfwxaIGrSphFgQkAsuDFXjR+Z1s/Y2OUgBtvEqGf1ILtX20oxj Y0ZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=UtfELvDs; 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 42si2978048wrt.156.2018.03.01.04.38.13; Thu, 01 Mar 2018 04:38:14 -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=@gmail.com header.s=20161025 header.b=UtfELvDs; 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 67152689DC0; Thu, 1 Mar 2018 14:38:06 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr0-f196.google.com (mail-wr0-f196.google.com [209.85.128.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8B63D689C61 for ; Thu, 1 Mar 2018 14:38:00 +0200 (EET) Received: by mail-wr0-f196.google.com with SMTP id f14so5938251wre.8 for ; Thu, 01 Mar 2018 04:38:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+pVqIG1bbqVJ22brHxzWULz3TEPoZCiAfy4PcONDlUc=; b=UtfELvDszhOX5LHwcJJ3pFrickM6HtOsOJwS43ZDLu3TIdMn6dIKVVzmYvmTkn9Pqa s+b1ybMREg51ja4qFHjRA35vk0zECFFTlPxvtpt5qwE9bgCIkjeFNDrVHTPKdtvj5c6N UjGVGdhNXBfJTTsYYz7TH8VgJagnf/+9b5KGp7dmrhkV3msqv9pkmbge4QhkenPstzVa yt7nH4P9XddIih1+fbm8WnRByvS807O0JJQq20tgiOzOZ43TGW7qYG5gbWTkE4CkbLOc pO4VJ/5bYh4VQd4yr1xKUyJkCOost3TBm4DnGqWVbSW1i3DbWkbB7lnTexP1Xfub1jfh 12ww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=+pVqIG1bbqVJ22brHxzWULz3TEPoZCiAfy4PcONDlUc=; b=bykumf2TV6ElLsYnl9FFmpuMXSUR5bFkT4m2XwgHLw3cBpz32IK6UzV9AUsKhLPGGR qijAmlf5Iw3796zzgmn8ZxG0ASSnQx3dJ+D+DXYnwbkv4MjcAcvoK9ZCtdN3CuOZer/l 14MK7Nsqx2uOocm9ib2wWvWVtN5vmndcb/QWR/5TFPMi3nQctYJFqitOpTvnWw/UVjxF FLJF9aK1LG6BXrtXvvSmuEim1pdYE7aqZDajHyO0AGKeAC08J9SmW/ltQCysbDvqxAib +MEDvgoPVcKUl/14rSQlhANlUPpdcUddZzRx+jyxuqOQojRk5uqrKMgQ4r5SAwgYGIYh zJdg== X-Gm-Message-State: APf1xPCo+kiCT4UXR1vRQFginkTL1S31m8sMllFHjxaMGMI4DRnNRtZ0 rnZ8LX4NvAqJOKgj6SEWnmgpYuSC X-Received: by 10.223.199.137 with SMTP id l9mr1763500wrg.6.1519907537820; Thu, 01 Mar 2018 04:32:17 -0800 (PST) Received: from moonbase.pars.ee ([2a00:23c4:7c88:af00:6dc9:fcdb:ae53:674a]) by smtp.gmail.com with ESMTPSA id 63sm3532443wmd.17.2018.03.01.04.32.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 01 Mar 2018 04:32:16 -0800 (PST) From: Rostislav Pehlivanov To: ffmpeg-devel@ffmpeg.org Date: Thu, 1 Mar 2018 12:32:14 +0000 Message-Id: <20180301123214.12284-1-atomnuker@gmail.com> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20171227020244.GZ4926@michaelspb> References: <20171227020244.GZ4926@michaelspb> Subject: [FFmpeg-devel] [PATCH] frame: add an av_frame_new_side_data_from_buf function X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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 Cc: Rostislav Pehlivanov MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Rostislav Pehlivanov --- libavutil/frame.c | 39 ++++++++++++++++++++++++--------------- libavutil/frame.h | 13 +++++++++++++ 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/libavutil/frame.c b/libavutil/frame.c index 662a7e5ab5..601906fcc2 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -356,8 +356,10 @@ FF_ENABLE_DEPRECATION_WARNINGS } memcpy(sd_dst->data, sd_src->data, sd_src->size); } else { - sd_dst = frame_new_side_data(dst, sd_src->type, av_buffer_ref(sd_src->buf)); + AVBufferRef *buf = av_buffer_ref(sd_src->buf); + sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, buf); if (!sd_dst) { + av_buffer_unref(&buf); wipe_side_data(dst); return AVERROR(ENOMEM); } @@ -642,9 +644,9 @@ AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane) return NULL; } -static AVFrameSideData *frame_new_side_data(AVFrame *frame, - enum AVFrameSideDataType type, - AVBufferRef *buf) +AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame, + enum AVFrameSideDataType type, + AVBufferRef *buf) { AVFrameSideData *ret, **tmp; @@ -652,18 +654,20 @@ static AVFrameSideData *frame_new_side_data(AVFrame *frame, return NULL; if (frame->nb_side_data > INT_MAX / sizeof(*frame->side_data) - 1) - goto fail; + return NULL; + + ret = av_mallocz(sizeof(*ret)); + if (!ret) + return NULL; tmp = av_realloc(frame->side_data, (frame->nb_side_data + 1) * sizeof(*frame->side_data)); - if (!tmp) - goto fail; + if (!tmp) { + av_free(ret); + return NULL; + } frame->side_data = tmp; - ret = av_mallocz(sizeof(*ret)); - if (!ret) - goto fail; - ret->buf = buf; ret->data = ret->buf->data; ret->size = buf->size; @@ -672,17 +676,22 @@ static AVFrameSideData *frame_new_side_data(AVFrame *frame, frame->side_data[frame->nb_side_data++] = ret; return ret; -fail: - av_buffer_unref(&buf); - return NULL; } AVFrameSideData *av_frame_new_side_data(AVFrame *frame, enum AVFrameSideDataType type, int size) { + AVBufferRef *buf = av_buffer_alloc(size); + if (!buf) + return NULL; - return frame_new_side_data(frame, type, av_buffer_alloc(size)); + AVFrameSideData *ret = av_frame_new_side_data_from_buf(frame, type, buf); + if (!ref) { + av_buffer_unref(&buf); + return NULL; + } + return ret; } AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, diff --git a/libavutil/frame.h b/libavutil/frame.h index d54bd9a354..1e3c40a30e 100644 --- a/libavutil/frame.h +++ b/libavutil/frame.h @@ -800,6 +800,19 @@ AVFrameSideData *av_frame_new_side_data(AVFrame *frame, enum AVFrameSideDataType type, int size); +/** + * Add a new side data to a frame from an existing AVBufferRef + * + * @param frame a frame to which the side data should be added + * @param type type of the added side data + * @param buf the AVBufferRef to add as side data + * + * @return newly added side data on success, NULL on error + */ +AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame, + enum AVFrameSideDataType type, + AVBufferRef *buf); + /** * @return a pointer to the side data of a given type on success, NULL if there * is no side data with such type in this frame.