On Tue, 8 Sep 2020, James Almer wrote:

This helper removes a side data entry from the packet, maintaining the
integrity and order of the remaining entries, if any.

Signed-off-by: James Almer <jamr...@gmail.com>
---
Missing APIChanges entry and version bump.

Couldn't find a place in the tree where it could be used right now, but
it makes the API be more in line with the AVFrame one, so i decided to
write it.

libavcodec/avpacket.c | 24 ++++++++++++++++++++++++
libavcodec/packet.h   |  8 ++++++++
2 files changed, 32 insertions(+)

diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index 4801163227..61ea81698c 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -367,6 +367,30 @@ uint8_t *av_packet_get_side_data(const AVPacket *pkt, enum 
AVPacketSideDataType
    return NULL;
}

+void av_packet_remove_side_data(AVPacket *pkt, enum AVPacketSideDataType type)
+{
+    int i, elems;
+
+    for (i = 0; i < pkt->side_data_elems; i++) {
+        if (pkt->side_data[i].type != type)
+            continue;
+
+        elems = pkt->side_data_elems - 1;
+        av_freep(&pkt->side_data[i].data);
+        pkt->side_data[i].size = 0;
+
+        if (i < elems) {
+            memmove(&pkt->side_data[i], &pkt->side_data[i + 1],
+                    (elems - i) * sizeof(*pkt->side_data));
+        }
+        if (!elems)
+            av_freep(&pkt->side_data);
+        pkt->side_data_elems = elems;
+
+        break;
+    }
+}

Why not use the same algorightm that is used in av_frame_remove_side_data?
Shorter and does not need memmove...

Thanks,
Marton

+
const char *av_packet_side_data_name(enum AVPacketSideDataType type)
{
    switch(type) {
diff --git a/libavcodec/packet.h b/libavcodec/packet.h
index 0a19a0eff3..6ce3c91c07 100644
--- a/libavcodec/packet.h
+++ b/libavcodec/packet.h
@@ -595,6 +595,14 @@ int av_packet_shrink_side_data(AVPacket *pkt, enum 
AVPacketSideDataType type,
uint8_t* av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType 
type,
                                 int *size);

+/**
+ * Remove and free a side data entry of the given type.
+ *
+ * @param pkt packet
+ * @param type side data type to be removed
+ */
+void av_packet_remove_side_data(AVPacket *pkt, enum AVPacketSideDataType type);
+
#if FF_API_MERGE_SD_API
attribute_deprecated
int av_packet_merge_side_data(AVPacket *pkt);
--
2.27.0

_______________________________________________
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