latmenc: replace per-frame malloc/free by constant size buffer.
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>
Wed, 11 Apr 2012 22:23:28 +0000 (00:23 +0200)
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>
Sat, 14 Apr 2012 16:21:19 +0000 (18:21 +0200)
Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
libavformat/latmenc.c

index 914c632..ebd60c0 100644 (file)
@@ -36,6 +36,7 @@ typedef struct {
     int object_type;
     int counter;
     int mod;
+    uint8_t buffer[0x1fff + MAX_EXTRADATA_SIZE + 1024];
 } LATMContext;
 
 static const AVOption options[] = {
@@ -142,11 +143,11 @@ static void latm_write_frame_header(AVFormatContext *s, PutBitContext *bs)
 
 static int latm_write_packet(AVFormatContext *s, AVPacket *pkt)
 {
+    LATMContext *ctx = s->priv_data;
     AVIOContext *pb = s->pb;
     PutBitContext bs;
     int i, len;
     uint8_t loas_header[] = "\x56\xe0\x00";
-    uint8_t *buf = NULL;
 
     if (s->streams[0]->codec->codec_id == CODEC_ID_AAC_LATM)
         return ff_raw_write_packet(s, pkt);
@@ -158,11 +159,7 @@ static int latm_write_packet(AVFormatContext *s, AVPacket *pkt)
     if (pkt->size > 0x1fff)
         goto too_large;
 
-    buf = av_malloc(pkt->size+1024+MAX_EXTRADATA_SIZE);
-    if (!buf)
-        return AVERROR(ENOMEM);
-
-    init_put_bits(&bs, buf, pkt->size+1024+MAX_EXTRADATA_SIZE);
+    init_put_bits(&bs, ctx->buffer, pkt->size+1024+MAX_EXTRADATA_SIZE);
 
     latm_write_frame_header(s, &bs);
 
@@ -201,15 +198,12 @@ static int latm_write_packet(AVFormatContext *s, AVPacket *pkt)
     loas_header[2] |= len & 0xff;
 
     avio_write(pb, loas_header, 3);
-    avio_write(pb, buf, len);
-
-    av_free(buf);
+    avio_write(pb, ctx->buffer, len);
 
     return 0;
 
 too_large:
     av_log(s, AV_LOG_ERROR, "LATM packet size larger than maximum size 0x1fff\n");
-    av_free(buf);
     return AVERROR_INVALIDDATA;
 }