[FFmpeg-devel] [PATCH 07/13] lavc/jpeg2000*: Use ff_fast_recalloc() to eliminate lots of allocations
Andreas Rheinhardt
andreas.rheinhardt at outlook.com
Tue Jun 14 18:23:41 EEST 2022
Tomas Härdin:
>
>
> @@ -2166,12 +2163,13 @@ static int jpeg2000_mct_write_frame(AVCodecContext *avctx, void *td,
> return 0;
> }
>
> -static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s)
> +static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s, int close)
> {
> int tileno, compno;
> - for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
> + if (close) {
> + for (tileno = 0; tileno < s->tile_size/sizeof(*s->tile); tileno++) {
> if (s->tile[tileno].comp) {
> - for (compno = 0; compno < s->ncomponents; compno++) {
> + for (compno = 0; compno < s->tile[tileno].comp_size/sizeof(*s->tile[tileno].comp); compno++) {
> Jpeg2000Component *comp = s->tile[tileno].comp + compno;
> Jpeg2000CodingStyle *codsty = s->tile[tileno].codsty + compno;
>
> @@ -2182,10 +2180,11 @@ static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s)
> s->tile[tileno].packed_headers_size = 0;
> }
> }
> + av_freep(&s->tile);
> + }
> av_freep(&s->packed_headers);
> s->packed_headers_size = 0;
> memset(&s->packed_headers_stream, 0, sizeof(s->packed_headers_stream));
> - av_freep(&s->tile);
> memset(s->codsty, 0, sizeof(s->codsty));
> memset(s->qntsty, 0, sizeof(s->qntsty));
> memset(s->properties, 0, sizeof(s->properties));
> @@ -2689,7 +2688,7 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, AVFrame *picture,
>
> avctx->execute2(avctx, jpeg2000_mct_write_frame, picture, NULL, s->numXtiles * s->numYtiles);
>
> - jpeg2000_dec_cleanup(s);
> + jpeg2000_dec_cleanup(s, 0);
>
> *got_frame = 1;
>
> @@ -2702,7 +2701,7 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, AVFrame *picture,
> return bytestream2_tell(&s->g);
>
> end:
> - jpeg2000_dec_cleanup(s);
> + jpeg2000_dec_cleanup(s, 0);
> return ret;
> }
>
> @@ -2712,6 +2711,7 @@ static av_cold int jpeg2000_decode_close(AVCodecContext *avctx)
>
> av_freep(&s->idwt);
> av_freep(&s->cb);
> + jpeg2000_dec_cleanup(s, 1);
>
> return 0;
> }
Why don't you just move the part of jpeg2000_dec_cleanup() that you
intend to be only executed in jpeg2000_decode_close() to
jpeg2000_decode_close()?
- Andreas
More information about the ffmpeg-devel
mailing list