This is meant for cases where av_packet_copy_props() can't be used as
only side data needs to be copied.

Signed-off-by: James Almer <[email protected]>
---
 doc/APIchanges        |  3 +++
 libavcodec/avcodec.h  | 13 +++++++++++++
 libavcodec/avpacket.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
 libavcodec/version.h  |  2 +-
 4 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index fa27007f4..205aeaeff 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,9 @@ libavutil:     2017-03-23
 
 API changes, most recent first:
 
+2017-09-xx - xxxxxxx - lavc 58.5.0 - avcodec.h
+  Add av_packet_copy_side_data().
+
 2017-xx-xx - xxxxxxx - lavu 56.6.0 - pixdesc.h
   Add av_color_range_from_name(), av_color_primaries_from_name(),
   av_color_transfer_from_name(), av_color_space_from_name(), and
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 162f1abe4..6571d5d86 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -3583,6 +3583,19 @@ 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);
 
+/**
+ * Copy packet side data from src to dst.
+ *
+ * @see av_packet_copy_props
+ * @see av_packet_free_side_data
+ *
+ * @param dst Destination packet
+ * @param src Source packet
+ *
+ * @return 0 on success, a negative AVERROR on error. On failure, dst is 
unchanged.
+ */
+int av_packet_copy_side_data(AVPacket *dst, const AVPacket *src);
+
 /**
  * Shrink the already allocated side data buffer
  *
diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index 93e9eb6ae..f20c191c1 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -312,6 +312,51 @@ int av_packet_shrink_side_data(AVPacket *pkt, enum 
AVPacketSideDataType type,
     return AVERROR(ENOENT);
 }
 
+int av_packet_copy_side_data(AVPacket *dst, const AVPacket *src)
+{
+    AVPacketSideData *side_data;
+    int i, ret, side_data_elems = 0;
+
+    if (!src->side_data_elems)
+        return 0;
+
+    side_data = av_malloc_array(src->side_data_elems, sizeof(*src->side_data));
+    if (!side_data)
+        return AVERROR(ENOMEM);
+
+    for (i = 0; i < src->side_data_elems; i++) {
+        AVPacketSideData *sd_src = &src->side_data[i];
+        AVPacketSideData *sd_dst = &side_data[i];
+
+        if ((unsigned)sd_src->size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
+            ret = AVERROR(ERANGE);
+            goto fail;
+        }
+
+        sd_dst->data = av_mallocz(sd_src->size + AV_INPUT_BUFFER_PADDING_SIZE);
+        if (!sd_dst->data) {
+            ret = AVERROR(ENOMEM);
+            goto fail;
+        }
+
+        memcpy(sd_dst->data, sd_src->data, sd_src->size);
+        sd_dst->size = sd_src->size;
+        sd_dst->type = sd_src->type;
+        side_data_elems++;
+    }
+    dst->side_data = side_data;
+    dst->side_data_elems = side_data_elems;
+
+    return 0;
+
+fail:
+    for (i = 0; i < side_data_elems; i++)
+        av_free(side_data[i].data);
+    av_free(side_data);
+
+    return ret;
+}
+
 int av_packet_copy_props(AVPacket *dst, const AVPacket *src)
 {
     int i;
diff --git a/libavcodec/version.h b/libavcodec/version.h
index bc5b8304b..aa6cdcd6b 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -28,7 +28,7 @@
 #include "libavutil/version.h"
 
 #define LIBAVCODEC_VERSION_MAJOR 58
-#define LIBAVCODEC_VERSION_MINOR  4
+#define LIBAVCODEC_VERSION_MINOR  5
 #define LIBAVCODEC_VERSION_MICRO  0
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
-- 
2.14.1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to