summaryrefslogtreecommitdiff
path: root/libavcodec/utvideodec.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-09-24 16:35:23 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-09-26 21:10:45 +0200
commit9c8b85f5fa5f465cfc0a88fbcbea0f4a436ece38 (patch)
treecf1853523d325187fdaaabf9886780637c1ce006 /libavcodec/utvideodec.c
parent099feb941147fbf10d1ae941b96bf94c4b4dbd1c (diff)
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>
Diffstat (limited to 'libavcodec/utvideodec.c')
-rw-r--r--libavcodec/utvideodec.c55
1 files changed, 6 insertions, 49 deletions
diff --git a/libavcodec/utvideodec.c b/libavcodec/utvideodec.c
index b3c4c3519b..f014e90606 100644
--- a/libavcodec/utvideodec.c
+++ b/libavcodec/utvideodec.c
@@ -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;
}