1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-11-23 21:54:53 +02:00
Files
FFmpeg/libavcodec/mpeg4videoenc.h
Andreas Rheinhardt 295abb1fdc avcodec/mpegvideo_enc: Reduce stack usage
Multiple PutBitContexts are used when encoding partitioned
frames. When there are multiple candidates for macroblock types,
multiple states (namely the state before encoding the current MB,
the best state among the ones already tried and the current one)
need to be kept; duplicates of the PutBitContexts are among this
state. The temporary buffers for them are kept on the stack
in encode_thread() and their size is quite generous (MAX_MB_SIZE
- 3000 bytes). This commit uses tighter bounds, bringing the
size of the pb2 buffer down to 15 bytes.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
2025-05-26 04:02:58 +02:00

53 lines
1.9 KiB
C

/*
* MPEG-4 encoder internal header.
* Copyright (c) 2000,2001 Fabrice Bellard
* Copyright (c) 2002-2010 Michael Niedermayer <michaelni@gmx.at>
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_MPEG4VIDEOENC_H
#define AVCODEC_MPEG4VIDEOENC_H
#include <stdint.h>
#include "put_bits.h"
enum {
MAX_PB2_INTRA_SIZE = 1 /* ac_pred */ + 5 /* max cbpy len */ +
2 /* dquant */ + 1 /* interlaced dct */
+ 4 * (8 /* longest luma dct_dc_size */ +
9 /* longest dc diff */ + 1 /* marker */)
+ 2 * (9 + 9 + 1),
MAX_PB2_INTER_SIZE = 5 /* max cbpy len */ +
2 /* dquant */ + 1 /* interlaced_dct */ + 1,
MAX_PB2_MB_SIZE = (FFMAX(MAX_PB2_INTER_SIZE, MAX_PB2_INTRA_SIZE) + 7) / 8,
MAX_AC_TEX_MB_SIZE = 64 * 6 * 30 /* longest escape code */ / 8,
};
typedef struct MPVEncContext MPVEncContext;
void ff_set_mpeg4_time(MPVEncContext *s);
void ff_mpeg4_encode_video_packet_header(MPVEncContext *s);
void ff_mpeg4_stuffing(PutBitContext *pbc);
void ff_mpeg4_init_partitions(MPVEncContext *s);
void ff_mpeg4_merge_partitions(MPVEncContext *s);
void ff_clean_mpeg4_qscales(MPVEncContext *s);
#endif