[FFmpeg-cvslog] avformat/avc: Avoid allocation for small SPS/PPS arrays

Andreas Rheinhardt git at videolan.org
Thu Nov 28 20:23:15 EET 2019


ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at gmail.com> | Wed Nov 27 13:22:08 2019 +0100| [c36a3df67692113af15f7accb006f02956882817] | committer: James Almer

avformat/avc: Avoid allocation for small SPS/PPS arrays

By using avio_get_dyn_buf() + ffio_free_dyn_buf() instead of
avio_close_dyn_buf() + av_free() one can avoid an allocation + copy for
small extradata. Furthermore, it simplifies freeing.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=c36a3df67692113af15f7accb006f02956882817
---

 libavformat/avc.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/libavformat/avc.c b/libavformat/avc.c
index a041e84357..7f9d81825b 100644
--- a/libavformat/avc.c
+++ b/libavformat/avc.c
@@ -25,6 +25,7 @@
 #include "avformat.h"
 #include "avio.h"
 #include "avc.h"
+#include "avio_internal.h"
 
 static const uint8_t *ff_avc_find_startcode_internal(const uint8_t *p, const uint8_t *end)
 {
@@ -109,7 +110,7 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len)
 {
     AVIOContext *sps_pb = NULL, *pps_pb = NULL;
     uint8_t *buf = NULL, *end, *start = NULL;
-    uint8_t *sps = NULL, *pps = NULL;
+    uint8_t *sps, *pps;
     uint32_t sps_size = 0, pps_size = 0;
     int ret, nb_sps = 0, nb_pps = 0;
 
@@ -164,8 +165,8 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len)
 
         buf += size;
     }
-    sps_size = avio_close_dyn_buf(sps_pb, &sps);
-    pps_size = avio_close_dyn_buf(pps_pb, &pps);
+    sps_size = avio_get_dyn_buf(sps_pb, &sps);
+    pps_size = avio_get_dyn_buf(pps_pb, &pps);
 
     if (sps_size < 6 || !pps_size) {
         ret = AVERROR_INVALIDDATA;
@@ -184,12 +185,8 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len)
     avio_write(pb, pps, pps_size);
 
 fail:
-    if (!sps)
-        avio_close_dyn_buf(sps_pb, &sps);
-    if (!pps)
-        avio_close_dyn_buf(pps_pb, &pps);
-    av_free(sps);
-    av_free(pps);
+    ffio_free_dyn_buf(&sps_pb);
+    ffio_free_dyn_buf(&pps_pb);
     av_free(start);
 
     return ret;



More information about the ffmpeg-cvslog mailing list