I found small memory leak when using aac. This leak is 32 bytes per loop without MEMALIGN_HACK, and 48 bytes with MEMALIGN. Simple code: #include <iostream> extern "C" { #include "libavformat/avformat.h" #include "libavcodec/avcodec.h" } AVOutputFormat *OutFormat; AVFormatContext *FormatCtx; AVCodecContext *VideoCodecCtx, *AudioCodecCtx; AVCodec *VideoCodec, *AudioCodec; AVStream *VideoStream, *AudioStream; int main (int argc, char * const argv[]) { av_register_all(); while(1) { FormatCtx = avformat_alloc_context(); OutFormat = guess_format(NULL, "test.3gp", NULL); FormatCtx->oformat = OutFormat; strncpy(FormatCtx->filename, "test.3gp", sizeof(FormatCtx->filename)); VideoStream = av_new_stream(FormatCtx, 0); VideoCodecCtx = VideoStream->codec; VideoCodecCtx->codec_id = CODEC_ID_H263; VideoCodecCtx->codec_type = CODEC_TYPE_VIDEO; VideoCodecCtx->bit_rate = 16000; VideoCodecCtx->width = 176; VideoCodecCtx->height = 144; VideoCodecCtx->time_base.den = 10; VideoCodecCtx->time_base.num = 1; VideoCodecCtx->pix_fmt = PIX_FMT_YUV420P; VideoCodecCtx->flags |= CODEC_FLAG_QSCALE; VideoCodecCtx->gop_size = 20; VideoCodecCtx->global_quality = (float)5 * (float)FF_QP2LAMBDA; VideoStream->quality = (float)5; VideoStream->r_frame_rate.den = 10; VideoStream->r_frame_rate.num = 1; VideoCodecCtx->flags |= CODEC_FLAG_GLOBAL_HEADER; VideoCodec = avcodec_find_encoder(VideoCodecCtx->codec_id); if(avcodec_open(VideoCodecCtx, VideoCodec) < 0) { printf("Fail open video\n"); return 1; } AudioStream = av_new_stream(FormatCtx, 1); AudioCodecCtx = AudioStream->codec; AudioCodecCtx->codec_id = CODEC_ID_AAC; AudioCodecCtx->codec_type = CODEC_TYPE_AUDIO; AudioCodecCtx->bit_rate = 32000; AudioCodecCtx->sample_rate = 8000; AudioCodecCtx->channels = 1; AudioCodecCtx->time_base= (AVRational){1, 8000}; AudioCodecCtx->sample_fmt = SAMPLE_FMT_S16; AudioCodecCtx->flags |= CODEC_FLAG_GLOBAL_HEADER; AudioCodec = avcodec_find_encoder(AudioCodecCtx->codec_id); if(avcodec_open(AudioCodecCtx, AudioCodec)) { printf("Fail open audio\n"); return 2; } url_fopen(&FormatCtx->pb, "test.3gp",URL_WRONLY); av_write_header(FormatCtx); AVStream *st; av_write_trailer(FormatCtx); url_fclose(FormatCtx->pb); avcodec_close(VideoStream->codec); avcodec_close(AudioStream->codec); for(uint32_t i=0;i< FormatCtx->nb_streams;i++) { st = FormatCtx->streams[i]; if (st->parser) { av_parser_close(st->parser); av_free_packet(&st->cur_pkt); } av_metadata_free(&st->metadata); av_free(st->index_entries); av_free(st->codec->extradata); av_free(st->codec); av_free(st->priv_data); av_free(st); } av_free(FormatCtx); usleep(3000); } return 0; } I tried to understand exactly where the memory is lost, and Founded that the functions av_cold void ff_psy_preprocess_end(struct FFPsyPreprocessContext *ctx) don't free context, so if add av_free(ctx); mem leak goes away. Patch attached.