On Thu, 11 Mar 2021, James Almer wrote:

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.

I don't think this is a good idea, av_shrink_packet cannot fail, av_grow_packet can. By using the same function you are losing the information if the end result should be checked or not.

Regards,
Marton


Signed-off-by: James Almer <jamr...@gmail.com>
---
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 */
--
2.30.2

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to