From patchwork Thu Mar 11 15:50:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 26342 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 35E9A44B6B6 for ; Thu, 11 Mar 2021 17:50:37 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 13E1468AB67; Thu, 11 Mar 2021 17:50:37 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f179.google.com (mail-qt1-f179.google.com [209.85.160.179]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A8C7368AAD5 for ; Thu, 11 Mar 2021 17:50:30 +0200 (EET) Received: by mail-qt1-f179.google.com with SMTP id l13so1455476qtu.9 for ; Thu, 11 Mar 2021 07:50:30 -0800 (PST) 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=fyHA0I9v3S+ctnwROlkl8qNGjecJ1Whr4Tr5Wt5gWZA=; b=ZubsNvW1LDUb9eVRUQ7Cv5I6gf8RAEUrnZ80HxWZV+5sgTFW0EYjGgPRjkEr3KvE9h Jikg4gMl9lFul+cacbT+Pbwv6XSg00wbg3zoO7pM77Qz4zPdZoBugPEN/A56ewYCi135 sW+QylsbV+ZJtxxxf+aSJAWx2cuqleZUdHcrwo7+sAzEOK2fSvfr3+BlR2+Tlo070ZNl OZ5/p8Z3VBoCU8ODOdbNDdvvS/Kt53k1VvG1/lZrn6wWgFMVJ4BZ26gu9OGOjzfODEFx OOUOMIt0XHgxWPqXTEarwDP8GFNPkqNdM53b+6vpkF2PEiRg/3vOvvY+ikT0QIjGsvlV u29g== 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=fyHA0I9v3S+ctnwROlkl8qNGjecJ1Whr4Tr5Wt5gWZA=; b=kWialNYWHw0NaF8dI7ovVrcn5uSIvyhZnkXSAWLrWqV9nwPRVLH71NqroOVqIGJZ3G fJbFgs1TJ9x2kNN61tN6vyL5RA6fpBBJD95ppt5QhlyvTwTgcx4WayODWHi1FtmJct1O ETGh+/H9j2Co3B1rrVjdY3Ldwa+dMgn0BfNwCwxcimUs2wNY5oGiHuX5y8KR5eQezrwI ml9i9gzL5n2uf1drfdTj+Wr4iAdrw/Hs8BzaJQnoV3XjzK3E2AMYRiEDLT1+sG4MBV/T KRPGUnyYVPpKl4VOQ2tF3HNchNQfHqR7PTTOMeIlC8KjSLC5aatkp0W/6FHf1S2XXJTy Cz3Q== X-Gm-Message-State: AOAM5324MkiX4upFoCtzLUHrg99MifzefJxL8XOO+PiUBzo3iUHgfZkR T4/l3q5CfuLkLvJHwIZIzhwXnY3hhZc= X-Google-Smtp-Source: ABdhPJxNqEYFZsNa1tgJo69hbfGOaOJaWflJUx5sNfLT1U6lkXhNgz50qNWKjqF9ugyETE+1BumY6w== X-Received: by 2002:a05:622a:2d6:: with SMTP id a22mr7792480qtx.111.1615477828856; Thu, 11 Mar 2021 07:50:28 -0800 (PST) Received: from localhost.localdomain ([181.23.75.214]) by smtp.gmail.com with ESMTPSA id 85sm2307127qkf.58.2021.03.11.07.50.27 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Mar 2021 07:50:28 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 11 Mar 2021 12:50:09 -0300 Message-Id: <20210311155011.52961-1-jamrial@gmail.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/3] avcodec/avpacket: add av_packet_resize() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This function acts as a replacement for both av_grow_packet() and av_shrink_packet(), the latter which is now deprecated and will be removed as it does not correctly handle non-writable packets. Signed-off-by: James Almer --- libavcodec/avpacket.c | 19 +++++++++++++++---- libavcodec/packet.h | 16 ++++++++++++++++ libavcodec/version.h | 3 +++ 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c index 32cb71fcf0..7d0dbadbed 100644 --- a/libavcodec/avpacket.c +++ b/libavcodec/avpacket.c @@ -100,6 +100,7 @@ int av_new_packet(AVPacket *pkt, int size) return 0; } +#if FF_API_SHRINK_PACKET void av_shrink_packet(AVPacket *pkt, int size) { if (pkt->size <= size) @@ -107,16 +108,26 @@ void av_shrink_packet(AVPacket *pkt, int size) pkt->size = size; memset(pkt->data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE); } +#endif int av_grow_packet(AVPacket *pkt, int grow_by) { - int new_size; av_assert0((unsigned)pkt->size <= INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE); if ((unsigned)grow_by > INT_MAX - (pkt->size + AV_INPUT_BUFFER_PADDING_SIZE)) return AVERROR(ENOMEM); - new_size = pkt->size + grow_by + AV_INPUT_BUFFER_PADDING_SIZE; + return av_packet_resize(pkt, pkt->size + grow_by); +} + +int av_packet_resize(AVPacket *pkt, int size) +{ + int new_size; + + if (size < 0 || size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE) + return AVERROR(EINVAL); + + new_size = size + AV_INPUT_BUFFER_PADDING_SIZE; if (pkt->buf) { size_t data_offset; uint8_t *old_data = pkt->data; @@ -143,10 +154,10 @@ int av_grow_packet(AVPacket *pkt, int grow_by) if (!pkt->buf) return AVERROR(ENOMEM); if (pkt->size > 0) - memcpy(pkt->buf->data, pkt->data, pkt->size); + memcpy(pkt->buf->data, pkt->data, FFMIN(pkt->size, size)); pkt->data = pkt->buf->data; } - pkt->size += grow_by; + pkt->size = size; memset(pkt->data + pkt->size, 0, AV_INPUT_BUFFER_PADDING_SIZE); return 0; diff --git a/libavcodec/packet.h b/libavcodec/packet.h index 3d9013d783..1720d973f5 100644 --- a/libavcodec/packet.h +++ b/libavcodec/packet.h @@ -484,13 +484,29 @@ void av_init_packet(AVPacket *pkt); */ int av_new_packet(AVPacket *pkt, int size); +#if FF_API_SHRINK_PACKET /** * Reduce packet size, correctly zeroing padding * * @param pkt packet * @param size new size + * + * @deprecated Use av_packet_resize */ +attribute_deprecated void av_shrink_packet(AVPacket *pkt, int size); +#endif + +/** + * Resize the payload of a packet, correctly zeroing padding and avoiding data + * copy if possible. + * + * @param pkt packet + * @param size new size + * + * @return 0 on success, a negative AVERROR on error + */ +int av_packet_resize(AVPacket *pkt, int size); /** * Increase packet size, correctly zeroing padding diff --git a/libavcodec/version.h b/libavcodec/version.h index 3124ec8061..6c362b43e2 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -162,5 +162,8 @@ #ifndef FF_API_GET_FRAME_CLASS #define FF_API_GET_FRAME_CLASS (LIBAVCODEC_VERSION_MAJOR < 60) #endif +#ifndef FF_API_SHRINK_PACKET +#define FF_API_SHRINK_PACKET (LIBAVCODEC_VERSION_MAJOR < 60) +#endif #endif /* AVCODEC_VERSION_H */