avcodec/magicyuv: Reuse array instead of using multiple arrays

The lengths of the VLC codes are implicitly contained in the VLC tables
itself; apart from that they are not used lateron. So it is unnecessary
to store them and the very same array can be reused to parse the Huffman
table for the next plane.

Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
Andreas Rheinhardt 2020-08-31 19:55:28 +02:00
parent 7f452c099a
commit aae499f77a

View File

@ -68,7 +68,7 @@ typedef struct MagicYUVContext {
int vshift[4]; int vshift[4];
Slice *slices[4]; // slice bitstream positions for each plane Slice *slices[4]; // slice bitstream positions for each plane
unsigned int slices_size[4]; // slice sizes for each plane unsigned int slices_size[4]; // slice sizes for each plane
uint8_t len[4][4096]; // table of code lengths for each plane uint8_t len[4096]; // scratch table of code lengths
VLC vlc[4]; // VLC for each plane VLC vlc[4]; // VLC for each plane
int (*huff_build)(VLC *vlc, uint8_t *len); int (*huff_build)(VLC *vlc, uint8_t *len);
int (*magy_decode_slice)(AVCodecContext *avctx, void *tdata, int (*magy_decode_slice)(AVCodecContext *avctx, void *tdata,
@ -465,11 +465,11 @@ static int build_huffman(AVCodecContext *avctx, GetBitContext *gbit, int max)
} }
for (; j < k; j++) for (; j < k; j++)
s->len[i][j] = x; s->len[j] = x;
if (j == max) { if (j == max) {
j = 0; j = 0;
if (s->huff_build(&s->vlc[i], s->len[i])) { if (s->huff_build(&s->vlc[i], s->len)) {
av_log(avctx, AV_LOG_ERROR, "Cannot build Huffman codes\n"); av_log(avctx, AV_LOG_ERROR, "Cannot build Huffman codes\n");
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }