From patchwork Sat Nov 2 16:16:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 16081 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id C8FF544AB50 for ; Sat, 2 Nov 2019 18:16:51 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A32DA68B048; Sat, 2 Nov 2019 18:16:51 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from smtpbgbr2.qq.com (smtpbgbr2.qq.com [54.207.22.56]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A8A2B68AFEB for ; Sat, 2 Nov 2019 18:16:44 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1572711398; bh=T6ixV6ssAcW4GVkb2Af+SvRn+2DJAaz7uYRkKPJJEhk=; h=From:To:Subject:Date:Message-Id; b=bK+OeynqiCeV+4u9KE32siDMw8Zz94GMFpPqzrOrbKmdo3w5+fVAmpFTHkmQaRzYC tFbipcsjgeKEHge7OBHTSwjyBXoARK6wsKucrlLAEGl/NB4xvwx1bLAuNhtIXxCibG uUobl5Sx5ywqSbgfIiJGeFgBfH/cxtLlcSTl5gnM= X-QQ-mid: esmtp4t1572711397tokoeq2fx Received: from localhost.localdomain (unknown [58.250.252.76]) by esmtp4.qq.com (ESMTP) with id ; Sun, 03 Nov 2019 00:16:36 +0800 (CST) X-QQ-SSF: 01000000000000N0UF2000000000002 X-QQ-FEAT: +4gtwFOpQ7Y/7knZQnoIvjzOsBiGvqWeSlme2uLd3hDiVX1ScSWrYLcfEbHmJ wGRTKNdXDQhitz/JKt1Yf7nEj+/j12LDmpi5+irHQwqWz8hXQ/ce+PYHMSKMvKkeV1Ja0l4 nCF40ESbngatlKYK5q6erGt9mon+jZynp/mc1QvT8FpOOy+QuggPst+EN3w0bXm7emrl8O6 A0ceeIagh/gpEuKTPVdPeunyptb8AwzK4iTmG7SurJJ796cc0IBrRYlrg107+g1j7LMArdr Y+Lt5Tp2OxmfOjMEudDgt55z4= X-QQ-GoodBg: 0 From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 Nov 2019 00:16:30 +0800 Message-Id: <20191102161630.2102-1-quinkblack@foxmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: X-QQ-SENDSIZE: 520 Feedback-ID: esmtp:foxmail.com:bgforeign:bgforeign2 X-QQ-Bgrelay: 1 Subject: [FFmpeg-devel] [RFC PATCH] avutil/frame: fix remove_side_data 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: Zhao Zhili MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Zhao Zhili remove_side_data is supposed to remove a single instance by design. Since new_side_data() doesn't forbid add multiple instance of the same type, remove_side_data should deal with that. --- libavutil/frame.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/libavutil/frame.c b/libavutil/frame.c index dcf1fc3d17..10d06dd29f 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -805,15 +805,20 @@ int av_frame_copy(AVFrame *dst, const AVFrame *src) void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type) { int i; - - for (i = 0; i < frame->nb_side_data; i++) { - AVFrameSideData *sd = frame->side_data[i]; - if (sd->type == type) { - free_side_data(&frame->side_data[i]); - frame->side_data[i] = frame->side_data[frame->nb_side_data - 1]; - frame->nb_side_data--; + int found; + + do { + found = 0; + for (i = 0; i < frame->nb_side_data; i++) { + AVFrameSideData *sd = frame->side_data[i]; + if (sd->type == type) { + free_side_data(&frame->side_data[i]); + frame->side_data[i] = frame->side_data[frame->nb_side_data - 1]; + frame->nb_side_data--; + found = 1; + } } - } + } while (found); } const char *av_frame_side_data_name(enum AVFrameSideDataType type)