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@gmail.com>
This commit is contained in:
Andreas Rheinhardt 2019-11-27 13:22:08 +01:00 committed by James Almer
parent a31f68fb44
commit c36a3df676

View File

@ -25,6 +25,7 @@
#include "avformat.h" #include "avformat.h"
#include "avio.h" #include "avio.h"
#include "avc.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) 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; AVIOContext *sps_pb = NULL, *pps_pb = NULL;
uint8_t *buf = NULL, *end, *start = 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; uint32_t sps_size = 0, pps_size = 0;
int ret, nb_sps = 0, nb_pps = 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; buf += size;
} }
sps_size = avio_close_dyn_buf(sps_pb, &sps); sps_size = avio_get_dyn_buf(sps_pb, &sps);
pps_size = avio_close_dyn_buf(pps_pb, &pps); pps_size = avio_get_dyn_buf(pps_pb, &pps);
if (sps_size < 6 || !pps_size) { if (sps_size < 6 || !pps_size) {
ret = AVERROR_INVALIDDATA; 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); avio_write(pb, pps, pps_size);
fail: fail:
if (!sps) ffio_free_dyn_buf(&sps_pb);
avio_close_dyn_buf(sps_pb, &sps); ffio_free_dyn_buf(&pps_pb);
if (!pps)
avio_close_dyn_buf(pps_pb, &pps);
av_free(sps);
av_free(pps);
av_free(start); av_free(start);
return ret; return ret;