summaryrefslogtreecommitdiff
path: root/libavcodec/mjpegdec.c
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2018-11-11 16:16:54 +0000
committerMark Thompson <sw@jkqxz.net>2018-11-18 17:40:24 +0000
commit7ba63695b78c13bb6e6a734c55ad9e829c738b42 (patch)
tree905ec5e77852c1d9b549385bc83f476e47889cdc /libavcodec/mjpegdec.c
parent7a20656474217cc84632b0738fa22fbaa13d1937 (diff)
mjpegdec: Fill raw huffman tables with default values too
These may be used by hwaccel decoders when the standard tables are not otherwise available. At the same time, clean up that code into an array so it's a little less repetitive.
Diffstat (limited to 'libavcodec/mjpegdec.c')
-rw-r--r--libavcodec/mjpegdec.c67
1 files changed, 39 insertions, 28 deletions
diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
index 96c425515a..2f1635838a 100644
--- a/libavcodec/mjpegdec.c
+++ b/libavcodec/mjpegdec.c
@@ -73,34 +73,45 @@ static int build_vlc(VLC *vlc, const uint8_t *bits_table,
huff_code, 2, 2, huff_sym, 2, 2, use_static);
}
-static int build_basic_mjpeg_vlc(MJpegDecodeContext *s)
+static int init_default_huffman_tables(MJpegDecodeContext *s)
{
- int ret;
-
- if ((ret = build_vlc(&s->vlcs[0][0], avpriv_mjpeg_bits_dc_luminance,
- avpriv_mjpeg_val_dc, 12, 0, 0)) < 0)
- return ret;
-
- if ((ret = build_vlc(&s->vlcs[0][1], avpriv_mjpeg_bits_dc_chrominance,
- avpriv_mjpeg_val_dc, 12, 0, 0)) < 0)
- return ret;
-
- if ((ret = build_vlc(&s->vlcs[1][0], avpriv_mjpeg_bits_ac_luminance,
- avpriv_mjpeg_val_ac_luminance, 251, 0, 1)) < 0)
- return ret;
-
- if ((ret = build_vlc(&s->vlcs[1][1], avpriv_mjpeg_bits_ac_chrominance,
- avpriv_mjpeg_val_ac_chrominance, 251, 0, 1)) < 0)
- return ret;
-
- if ((ret = build_vlc(&s->vlcs[2][0], avpriv_mjpeg_bits_ac_luminance,
- avpriv_mjpeg_val_ac_luminance, 251, 0, 0)) < 0)
- return ret;
-
- if ((ret = build_vlc(&s->vlcs[2][1], avpriv_mjpeg_bits_ac_chrominance,
- avpriv_mjpeg_val_ac_chrominance, 251, 0, 0)) < 0)
- return ret;
+ static const struct {
+ int class;
+ int index;
+ const uint8_t *bits;
+ const uint8_t *values;
+ int codes;
+ int length;
+ } ht[] = {
+ { 0, 0, avpriv_mjpeg_bits_dc_luminance,
+ avpriv_mjpeg_val_dc, 12, 12 },
+ { 0, 1, avpriv_mjpeg_bits_dc_chrominance,
+ avpriv_mjpeg_val_dc, 12, 12 },
+ { 1, 0, avpriv_mjpeg_bits_ac_luminance,
+ avpriv_mjpeg_val_ac_luminance, 251, 162 },
+ { 1, 1, avpriv_mjpeg_bits_ac_chrominance,
+ avpriv_mjpeg_val_ac_chrominance, 251, 162 },
+ { 2, 0, avpriv_mjpeg_bits_ac_luminance,
+ avpriv_mjpeg_val_ac_luminance, 251, 162 },
+ { 2, 1, avpriv_mjpeg_bits_ac_chrominance,
+ avpriv_mjpeg_val_ac_chrominance, 251, 162 },
+ };
+ int i, ret;
+
+ for (i = 0; i < FF_ARRAY_ELEMS(ht); i++) {
+ ret = build_vlc(&s->vlcs[ht[i].class][ht[i].index],
+ ht[i].bits, ht[i].values, ht[i].codes,
+ 0, ht[i].class == 1);
+ if (ret < 0)
+ return ret;
+ if (ht[i].class < 2) {
+ memcpy(s->raw_huffman_lengths[ht[i].class][ht[i].index],
+ ht[i].bits + 1, 16);
+ memcpy(s->raw_huffman_values[ht[i].class][ht[i].index],
+ ht[i].values, ht[i].length);
+ }
+ }
return 0;
}
@@ -151,7 +162,7 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
avctx->colorspace = AVCOL_SPC_BT470BG;
s->hwaccel_pix_fmt = s->hwaccel_sw_pix_fmt = AV_PIX_FMT_NONE;
- if ((ret = build_basic_mjpeg_vlc(s)) < 0)
+ if ((ret = init_default_huffman_tables(s)) < 0)
return ret;
if (s->extern_huff) {
@@ -161,7 +172,7 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
if (ff_mjpeg_decode_dht(s)) {
av_log(avctx, AV_LOG_ERROR,
"error using external huffman table, switching back to internal\n");
- build_basic_mjpeg_vlc(s);
+ init_default_huffman_tables(s);
}
}
if (avctx->field_order == AV_FIELD_BB) { /* quicktime icefloe 019 */