1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

avcodec/mpegvideo_enc: Only allocate inter matrices when needed

Also allocate them jointly with intra matrices when needed.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt
2025-02-27 22:29:58 +01:00
parent a43124452f
commit 41451b4eef

View File

@ -348,18 +348,27 @@ static av_cold int me_cmp_init(MpegEncContext *s, AVCodecContext *avctx)
return 0;
}
#define ALLOCZ_ARRAYS(p, mult, numb) ((p) = av_calloc(numb, mult * sizeof(*(p))))
static av_cold int init_matrices(MpegEncContext *s, AVCodecContext *avctx)
{
const int nb_matrices = 1 + (s->out_format == FMT_MJPEG) + !s->intra_only;
const uint16_t *intra_matrix, *inter_matrix;
if (!ALLOCZ_ARRAYS(s->q_intra_matrix, 32, nb_matrices) ||
!ALLOCZ_ARRAYS(s->q_intra_matrix16, 32, nb_matrices))
return AVERROR(ENOMEM);
if (s->out_format == FMT_MJPEG) {
if (!FF_ALLOCZ_TYPED_ARRAY(s->q_chroma_intra_matrix, 32) ||
!FF_ALLOCZ_TYPED_ARRAY(s->q_chroma_intra_matrix16, 32))
return AVERROR(ENOMEM);
s->q_chroma_intra_matrix = s->q_intra_matrix + 32;
s->q_chroma_intra_matrix16 = s->q_intra_matrix16 + 32;
} else {
s->q_chroma_intra_matrix = s->q_intra_matrix;
s->q_chroma_intra_matrix16 = s->q_intra_matrix16;
}
if (!s->intra_only) {
s->q_inter_matrix = s->q_intra_matrix + 32;
s->q_inter_matrix16 = s->q_intra_matrix16 + 32;
}
if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
s->mpeg_quant) {
@ -906,10 +915,6 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
return ret;
if (!(avctx->stats_out = av_mallocz(256)) ||
!FF_ALLOCZ_TYPED_ARRAY(s->q_intra_matrix, 32) ||
!FF_ALLOCZ_TYPED_ARRAY(s->q_inter_matrix, 32) ||
!FF_ALLOCZ_TYPED_ARRAY(s->q_intra_matrix16, 32) ||
!FF_ALLOCZ_TYPED_ARRAY(s->q_inter_matrix16, 32) ||
!FF_ALLOCZ_TYPED_ARRAY(s->input_picture, MAX_B_FRAMES + 1) ||
!FF_ALLOCZ_TYPED_ARRAY(s->reordered_input_picture, MAX_B_FRAMES + 1) ||
!(s->new_pic = av_frame_alloc()) ||
@ -948,7 +953,6 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
!(s->mb_mean = av_mallocz(mb_array_size)))
return AVERROR(ENOMEM);
#define ALLOCZ_ARRAYS(p, mult, numb) ((p) = av_calloc(numb, mult * sizeof(*(p))))
if (s->codec_id == AV_CODEC_ID_MPEG4 ||
(s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME)) {
int16_t (*tmp1)[2];
@ -1019,6 +1023,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
ff_convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
s->intra_matrix, s->intra_quant_bias, avctx->qmin,
31, 1);
if (s->q_inter_matrix)
ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
s->inter_matrix, s->inter_quant_bias, avctx->qmin,
31, 0);
@ -1093,14 +1098,8 @@ av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
av_freep(&s->cplx_tab);
av_freep(&s->bits_tab);
if(s->q_chroma_intra_matrix != s->q_intra_matrix ) av_freep(&s->q_chroma_intra_matrix);
if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
s->q_chroma_intra_matrix= NULL;
s->q_chroma_intra_matrix16= NULL;
av_freep(&s->q_intra_matrix);
av_freep(&s->q_inter_matrix);
av_freep(&s->q_intra_matrix16);
av_freep(&s->q_inter_matrix16);
av_freep(&s->input_picture);
av_freep(&s->reordered_input_picture);
av_freep(&s->dct_offset);