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

avcodec/huffman: Combine allocations

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt
2025-06-03 19:52:18 +02:00
parent d0a27e01a6
commit 81adbd2d3d

View File

@ -39,7 +39,10 @@
#define HNODE -1 #define HNODE -1
typedef struct HeapElem { typedef struct HeapElem {
uint64_t val; union {
uint64_t val;
uint16_t dummy; // exists solely to ensure alignof(HeapElem) >= alignof(uint16_t)
};
int name; int name;
} HeapElem; } HeapElem;
@ -59,19 +62,23 @@ static void heap_sift(HeapElem *h, int root, int size)
int ff_huff_gen_len_table(uint8_t *dst, const uint64_t *stats, int stats_size, int skip0) int ff_huff_gen_len_table(uint8_t *dst, const uint64_t *stats, int stats_size, int skip0)
{ {
HeapElem *h = av_malloc_array(sizeof(*h), stats_size); int *up;
int *up = av_malloc_array(sizeof(*up) * 2, stats_size); uint16_t *map;
uint8_t *len = av_malloc_array(sizeof(*len) * 2, stats_size); uint8_t *len;
uint16_t *map= av_malloc_array(sizeof(*map), stats_size); HeapElem *h = av_malloc_array(stats_size,
sizeof(*h) + 2 * sizeof(up) + 2 * sizeof(len) + sizeof(map));
if (!h)
return AVERROR(ENOMEM);
up = (int*)(h + stats_size);
// map is suitably aligned because up uses an even number of elements
// and alignof(uint16_t) is either 1 or 2.
map = (uint16_t*)(up + 2 * stats_size);
len = (uint8_t*)(map + stats_size);
int offset, i, next; int offset, i, next;
int size = 0; int size = 0;
int ret = 0; int ret = 0;
if (!h || !up || !len || !map) {
ret = AVERROR(ENOMEM);
goto end;
}
for (i = 0; i<stats_size; i++) { for (i = 0; i<stats_size; i++) {
dst[i] = 255; dst[i] = 255;
if (stats[i] || !skip0) if (stats[i] || !skip0)
@ -107,11 +114,7 @@ int ff_huff_gen_len_table(uint8_t *dst, const uint64_t *stats, int stats_size, i
} }
if (i==size) break; if (i==size) break;
} }
end:
av_free(h); av_free(h);
av_free(up);
av_free(len);
av_free(map);
return ret; return ret;
} }