You've already forked FFmpeg
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:
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user