mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-09-19 21:06:42 +00:00
avcodec/utvideodec: Remove code duplication when creating Huffman tables
Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
parent
099feb9411
commit
9c8b85f5fa
@ -40,7 +40,7 @@
|
||||
#include "thread.h"
|
||||
#include "utvideo.h"
|
||||
|
||||
static int build_huff10(const uint8_t *src, VLC *vlc, int *fsym)
|
||||
static int build_huff(const uint8_t *src, VLC *vlc, int *fsym, unsigned nb_elems)
|
||||
{
|
||||
int i;
|
||||
HuffEntry he[1024];
|
||||
@ -51,18 +51,18 @@ static int build_huff10(const uint8_t *src, VLC *vlc, int *fsym)
|
||||
uint32_t code;
|
||||
|
||||
*fsym = -1;
|
||||
for (i = 0; i < 1024; i++) {
|
||||
for (i = 0; i < nb_elems; i++) {
|
||||
he[i].sym = i;
|
||||
he[i].len = *src++;
|
||||
}
|
||||
qsort(he, 1024, sizeof(*he), ff_ut10_huff_cmp_len);
|
||||
qsort(he, nb_elems, sizeof(*he), ff_ut10_huff_cmp_len);
|
||||
|
||||
if (!he[0].len) {
|
||||
*fsym = he[0].sym;
|
||||
return 0;
|
||||
}
|
||||
|
||||
last = 1023;
|
||||
last = nb_elems - 1;
|
||||
while (he[last].len == 255 && last)
|
||||
last--;
|
||||
|
||||
@ -84,49 +84,6 @@ static int build_huff10(const uint8_t *src, VLC *vlc, int *fsym)
|
||||
syms, sizeof(*syms), sizeof(*syms), 0);
|
||||
}
|
||||
|
||||
static int build_huff(const uint8_t *src, VLC *vlc, int *fsym)
|
||||
{
|
||||
int i;
|
||||
HuffEntry he[256];
|
||||
int last;
|
||||
uint32_t codes[256];
|
||||
uint8_t bits[256];
|
||||
uint8_t syms[256];
|
||||
uint32_t code;
|
||||
|
||||
*fsym = -1;
|
||||
for (i = 0; i < 256; i++) {
|
||||
he[i].sym = i;
|
||||
he[i].len = *src++;
|
||||
}
|
||||
qsort(he, 256, sizeof(*he), ff_ut_huff_cmp_len);
|
||||
|
||||
if (!he[0].len) {
|
||||
*fsym = he[0].sym;
|
||||
return 0;
|
||||
}
|
||||
|
||||
last = 255;
|
||||
while (he[last].len == 255 && last)
|
||||
last--;
|
||||
|
||||
if (he[last].len > 32)
|
||||
return -1;
|
||||
|
||||
code = 0;
|
||||
for (i = last; i >= 0; i--) {
|
||||
codes[i] = code >> (32 - he[i].len);
|
||||
bits[i] = he[i].len;
|
||||
syms[i] = he[i].sym;
|
||||
code += 0x80000000u >> (he[i].len - 1);
|
||||
}
|
||||
|
||||
return ff_init_vlc_sparse(vlc, VLC_BITS, last + 1,
|
||||
bits, sizeof(*bits), sizeof(*bits),
|
||||
codes, sizeof(*codes), sizeof(*codes),
|
||||
syms, sizeof(*syms), sizeof(*syms), 0);
|
||||
}
|
||||
|
||||
static int decode_plane10(UtvideoContext *c, int plane_no,
|
||||
uint16_t *dst, ptrdiff_t stride,
|
||||
int width, int height,
|
||||
@ -139,7 +96,7 @@ static int decode_plane10(UtvideoContext *c, int plane_no,
|
||||
GetBitContext gb;
|
||||
int prev, fsym;
|
||||
|
||||
if ((ret = build_huff10(huff, &vlc, &fsym)) < 0) {
|
||||
if ((ret = build_huff(huff, &vlc, &fsym, 1024)) < 0) {
|
||||
av_log(c->avctx, AV_LOG_ERROR, "Cannot build Huffman codes\n");
|
||||
return ret;
|
||||
}
|
||||
@ -299,7 +256,7 @@ static int decode_plane(UtvideoContext *c, int plane_no,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (build_huff(src, &vlc, &fsym)) {
|
||||
if (build_huff(src, &vlc, &fsym, 256)) {
|
||||
av_log(c->avctx, AV_LOG_ERROR, "Cannot build Huffman codes\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user