]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/avpacket.c
aacenc: fix typo in sync extension constant in 8ae0fa2
[ffmpeg] / libavcodec / avpacket.c
index 194324713f5fd852acd3af63408517b8412ae070..82890c36760fe19143a26268803c592146c00000 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 #include "avcodec.h"
+#include "libavutil/avassert.h"
 
 
 void av_destruct_packet_nofree(AVPacket *pkt)
@@ -47,18 +48,20 @@ void av_init_packet(AVPacket *pkt)
 
 int av_new_packet(AVPacket *pkt, int size)
 {
-    uint8_t *data;
-    if((unsigned)size > (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
-        return AVERROR(ENOMEM);
-    data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
-    if (!data)
-        return AVERROR(ENOMEM);
-    memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+    uint8_t *data= NULL;
+    if((unsigned)size < (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
+        data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
+    if (data){
+        memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+    }else
+        size=0;
 
     av_init_packet(pkt);
     pkt->data = data;
     pkt->size = size;
     pkt->destruct = av_destruct_packet;
+    if(!data)
+        return AVERROR(ENOMEM);
     return 0;
 }
 
@@ -69,6 +72,23 @@ void av_shrink_packet(AVPacket *pkt, int size)
     memset(pkt->data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
 }
 
+int av_grow_packet(AVPacket *pkt, int grow_by)
+{
+    void *new_ptr;
+    av_assert0((unsigned)pkt->size <= INT_MAX - FF_INPUT_BUFFER_PADDING_SIZE);
+    if (!pkt->size)
+        return av_new_packet(pkt, grow_by);
+    if ((unsigned)grow_by > INT_MAX - (pkt->size + FF_INPUT_BUFFER_PADDING_SIZE))
+        return -1;
+    new_ptr = av_realloc(pkt->data, pkt->size + grow_by + FF_INPUT_BUFFER_PADDING_SIZE);
+    if (!new_ptr)
+        return AVERROR(ENOMEM);
+    pkt->data = new_ptr;
+    pkt->size += grow_by;
+    memset(pkt->data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+    return 0;
+}
+
 int av_dup_packet(AVPacket *pkt)
 {
     if (((pkt->destruct == av_destruct_packet_nofree) || (pkt->destruct == NULL)) && pkt->data) {
@@ -87,3 +107,11 @@ int av_dup_packet(AVPacket *pkt)
     }
     return 0;
 }
+
+void av_free_packet(AVPacket *pkt)
+{
+    if (pkt) {
+        if (pkt->destruct) pkt->destruct(pkt);
+        pkt->data = NULL; pkt->size = 0;
+    }
+}