Browse Source

latmenc: replace per-frame malloc/free by constant size buffer.

Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
tags/n0.11
Reimar Döffinger 13 years ago
parent
commit
b44a5ec76e
1 changed files with 4 additions and 10 deletions
  1. +4
    -10
      libavformat/latmenc.c

+ 4
- 10
libavformat/latmenc.c View File

@@ -36,6 +36,7 @@ typedef struct {
int object_type; int object_type;
int counter; int counter;
int mod; int mod;
uint8_t buffer[0x1fff + MAX_EXTRADATA_SIZE + 1024];
} LATMContext; } LATMContext;


static const AVOption options[] = { 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) static int latm_write_packet(AVFormatContext *s, AVPacket *pkt)
{ {
LATMContext *ctx = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
PutBitContext bs; PutBitContext bs;
int i, len; int i, len;
uint8_t loas_header[] = "\x56\xe0\x00"; uint8_t loas_header[] = "\x56\xe0\x00";
uint8_t *buf = NULL;


if (s->streams[0]->codec->codec_id == CODEC_ID_AAC_LATM) if (s->streams[0]->codec->codec_id == CODEC_ID_AAC_LATM)
return ff_raw_write_packet(s, pkt); return ff_raw_write_packet(s, pkt);
@@ -158,11 +159,7 @@ static int latm_write_packet(AVFormatContext *s, AVPacket *pkt)
if (pkt->size > 0x1fff) if (pkt->size > 0x1fff)
goto too_large; 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); latm_write_frame_header(s, &bs);


@@ -201,15 +198,12 @@ static int latm_write_packet(AVFormatContext *s, AVPacket *pkt)
loas_header[2] |= len & 0xff; loas_header[2] |= len & 0xff;


avio_write(pb, loas_header, 3); avio_write(pb, loas_header, 3);
avio_write(pb, buf, len);

av_free(buf);
avio_write(pb, ctx->buffer, len);


return 0; return 0;


too_large: too_large:
av_log(s, AV_LOG_ERROR, "LATM packet size larger than maximum size 0x1fff\n"); av_log(s, AV_LOG_ERROR, "LATM packet size larger than maximum size 0x1fff\n");
av_free(buf);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }




Loading…
Cancel
Save