[FFmpeg-devel] [PATCH] libavcodec/avpacket: add av_packet_remove_side_data

Zhao Zhili quinkblack at foxmail.com
Mon Oct 11 10:41:48 EEST 2021


---
 doc/APIchanges              |  3 +++
 libavcodec/avpacket.c       | 15 +++++++++++++++
 libavcodec/packet.h         |  5 +++++
 libavcodec/tests/avpacket.c |  9 +++++++++
 libavcodec/version.h        |  2 +-
 5 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 7b267a79ac..2c6b369ea9 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -14,6 +14,9 @@ libavutil:     2021-04-27
 
 API changes, most recent first:
 
+2021-10-11 - xxxxxxxxxx - lavc 59.13.100 - packet.h
+  Add av_packet_remove_side_data()
+
 2021-09-21 - xxxxxxxxxx - lavu 57.7.100 - pixfmt.h
   Add AV_PIX_FMT_X2BGR10.
 
diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index d8d8fef3b9..2a9123e5fa 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -179,6 +179,21 @@ int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size)
     return 0;
 }
 
+void av_packet_remove_side_data(AVPacket *pkt, enum AVPacketSideDataType type)
+{
+    for (int i = 0; i < pkt->side_data_elems; i++) {
+        if (pkt->side_data[i].type == type) {
+            av_freep(&pkt->side_data[i].data);
+            pkt->side_data[i] = pkt->side_data[pkt->side_data_elems - 1];
+            pkt->side_data_elems--;
+            /* Better keep side_data sync to side_data_elems */
+            if (!pkt->side_data_elems)
+                av_freep(&pkt->side_data);
+            break;
+        }
+    }
+}
+
 void av_packet_free_side_data(AVPacket *pkt)
 {
     int i;
diff --git a/libavcodec/packet.h b/libavcodec/packet.h
index 9baff24635..85edf87211 100644
--- a/libavcodec/packet.h
+++ b/libavcodec/packet.h
@@ -571,6 +571,11 @@ uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
 int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
                             uint8_t *data, size_t size);
 
+/**
+ * Remove and free side data instances of the given type.
+ */
+void av_packet_remove_side_data(AVPacket *pkt, enum AVPacketSideDataType type);
+
 /**
  * Shrink the already allocated side data buffer
  *
diff --git a/libavcodec/tests/avpacket.c b/libavcodec/tests/avpacket.c
index 7a70ade4c3..710a964915 100644
--- a/libavcodec/tests/avpacket.c
+++ b/libavcodec/tests/avpacket.c
@@ -124,6 +124,15 @@ int main(void)
                 "when \"size\" parameter is too large.\n" );
         ret = 1;
     }
+    /* test remove side data */
+    av_packet_remove_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA);
+    for (int i = 0; i < avpkt->side_data_elems; i++) {
+        if (avpkt->side_data[i].type == AV_PKT_DATA_NEW_EXTRADATA) {
+            printf("av_packet_remove_side_data failed to remove side data");
+            ret = 1;
+        }
+    }
+
     /*clean up*/
     av_packet_free(&avpkt_clone);
     av_packet_free(&avpkt);
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 74b8baa5f3..76af066d32 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -28,7 +28,7 @@
 #include "libavutil/version.h"
 
 #define LIBAVCODEC_VERSION_MAJOR  59
-#define LIBAVCODEC_VERSION_MINOR  12
+#define LIBAVCODEC_VERSION_MINOR  13
 #define LIBAVCODEC_VERSION_MICRO 100
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
-- 
2.31.1



More information about the ffmpeg-devel mailing list