4 * Copyright (c) 2002-2014 Michael Niedermayer <michaelni@gmx.at>
6 * see https://multimedia.cx/huffyuv.txt for a description of
9 * This file is part of FFmpeg.
11 * FFmpeg is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
16 * FFmpeg is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with FFmpeg; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * yuva, gray, 4:4:4, 4:1:1, 4:1:0 and >8 bit per sample support sponsored by NOA
33 #define UNCHECKED_BITSTREAM_READER 1
35 #include "config_components.h"
39 #include "codec_internal.h"
42 #include "huffyuvdsp.h"
43 #include "lossless_videodsp.h"
45 #include "libavutil/emms.h"
46 #include "libavutil/imgutils.h"
47 #include "libavutil/pixdesc.h"
51 typedef struct HYuvDecContext {
58 int yuy2; //use yuy2 instead of 422P
59 int bgr32; //use bgr32 instead of bgr24
62 int vlc_n; // number of vlc codes (FFMIN(1<<bps, MAX_VLC_N))
73 uint16_t *temp16[3]; ///< identical to temp but 16bit type
74 uint8_t len[4][MAX_VLC_N];
75 uint32_t bits[4][MAX_VLC_N];
76 uint32_t pix_bgr_map[1<<VLC_BITS];
77 VLC vlc[8]; //Y,U,V,A,YY,YU,YV,AA
78 uint8_t *bitstream_buffer;
79 unsigned int bitstream_buffer_size;
81 HuffYUVDSPContext hdsp;
82 LLVidDSPContext llviddsp;
86 #define classic_shift_luma_table_size 42
87 static const unsigned char classic_shift_luma[classic_shift_luma_table_size + AV_INPUT_BUFFER_PADDING_SIZE] = {
88 34, 36, 35, 69, 135, 232, 9, 16, 10, 24, 11, 23, 12, 16, 13, 10,
89 14, 8, 15, 8, 16, 8, 17, 20, 16, 10, 207, 206, 205, 236, 11, 8,
90 10, 21, 9, 23, 8, 8, 199, 70, 69, 68, 0,
94 #define classic_shift_chroma_table_size 59
95 static const unsigned char classic_shift_chroma[classic_shift_chroma_table_size + AV_INPUT_BUFFER_PADDING_SIZE] = {
96 66, 36, 37, 38, 39, 40, 41, 75, 76, 77, 110, 239, 144, 81, 82, 83,
97 84, 85, 118, 183, 56, 57, 88, 89, 56, 89, 154, 57, 58, 57, 26, 141,
98 57, 56, 58, 57, 58, 57, 184, 119, 214, 245, 116, 83, 82, 49, 80, 79,
99 78, 77, 44, 75, 41, 40, 39, 38, 37, 36, 34, 0,
103 static const unsigned char classic_add_luma[256] = {
104 3, 9, 5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37,
105 73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36,
106 68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36,
107 35, 33, 32, 30, 29, 27, 26, 25, 48, 47, 46, 44, 43, 41, 40, 39,
108 37, 36, 35, 34, 32, 31, 30, 28, 27, 26, 24, 23, 22, 20, 19, 37,
109 35, 34, 33, 31, 30, 29, 27, 26, 24, 23, 21, 20, 18, 17, 15, 29,
110 27, 26, 24, 22, 21, 19, 17, 16, 14, 26, 25, 23, 21, 19, 18, 16,
111 15, 27, 25, 23, 21, 19, 17, 16, 14, 26, 25, 23, 21, 18, 17, 14,
112 12, 17, 19, 13, 4, 9, 2, 11, 1, 7, 8, 0, 16, 3, 14, 6,
113 12, 10, 5, 15, 18, 11, 10, 13, 15, 16, 19, 20, 22, 24, 27, 15,
114 18, 20, 22, 24, 26, 14, 17, 20, 22, 24, 27, 15, 18, 20, 23, 25,
115 28, 16, 19, 22, 25, 28, 32, 36, 21, 25, 29, 33, 38, 42, 45, 49,
116 28, 31, 34, 37, 40, 42, 44, 47, 49, 50, 52, 54, 56, 57, 59, 60,
117 62, 64, 66, 67, 69, 35, 37, 39, 40, 42, 43, 45, 47, 48, 51, 52,
118 54, 55, 57, 59, 60, 62, 63, 66, 67, 69, 71, 72, 38, 40, 42, 43,
119 46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13, 7, 8,
122 static const unsigned char classic_add_chroma[256] = {
123 3, 1, 2, 2, 2, 2, 3, 3, 7, 5, 7, 5, 8, 6, 11, 9,
124 7, 13, 11, 10, 9, 8, 7, 5, 9, 7, 6, 4, 7, 5, 8, 7,
125 11, 8, 13, 11, 19, 15, 22, 23, 20, 33, 32, 28, 27, 29, 51, 77,
126 43, 45, 76, 81, 46, 82, 75, 55, 56, 144, 58, 80, 60, 74, 147, 63,
127 143, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
128 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 27, 30, 21, 22,
129 17, 14, 5, 6, 100, 54, 47, 50, 51, 53, 106, 107, 108, 109, 110, 111,
130 112, 113, 114, 115, 4, 117, 118, 92, 94, 121, 122, 3, 124, 103, 2, 1,
131 0, 129, 130, 131, 120, 119, 126, 125, 136, 137, 138, 139, 140, 141, 142, 134,
132 135, 132, 133, 104, 64, 101, 62, 57, 102, 95, 93, 59, 61, 28, 97, 96,
133 52, 49, 48, 29, 32, 25, 24, 46, 23, 98, 45, 44, 43, 20, 42, 41,
134 19, 18, 99, 40, 15, 39, 38, 16, 13, 12, 11, 37, 10, 9, 8, 36,
135 7, 128, 127, 105, 123, 116, 35, 34, 33, 145, 31, 79, 42, 146, 78, 26,
136 83, 48, 49, 50, 44, 47, 26, 31, 30, 18, 17, 19, 21, 24, 25, 13,
137 14, 16, 17, 18, 20, 21, 12, 14, 15, 9, 10, 6, 9, 6, 5, 8,
138 6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
141 static int read_len_table(uint8_t *dst, GetBitContext *gb, int n)
145 for (i = 0; i < n;) {
146 repeat = get_bits(gb, 3);
147 val = get_bits(gb, 5);
149 repeat = get_bits(gb, 8);
150 if (i + repeat > n || get_bits_left(gb) < 0) {
151 av_log(NULL, AV_LOG_ERROR, "Error reading huffman table\n");
152 return AVERROR_INVALIDDATA;
160 static int generate_joint_tables(HYuvDecContext *s)
163 uint16_t *symbols = av_mallocz(5 << VLC_BITS);
167 return AVERROR(ENOMEM);
168 bits = symbols + (1 << VLC_BITS);
169 len = (uint8_t *)(bits + (1 << VLC_BITS));
171 if (s->bitstream_bpp < 24 || s->version > 2) {
172 int count = 1 + s->alpha + 2 * s->chroma;
174 for (p = 0; p < count; p++) {
175 int p0 = s->version > 2 ? p : 0;
176 for (i = y = 0; y < s->vlc_n; y++) {
177 int len0 = s->len[p0][y];
178 int limit = VLC_BITS - len0;
179 if (limit <= 0 || !len0)
181 if ((sign_extend(y, 8) & (s->vlc_n-1)) != y)
183 for (u = 0; u < s->vlc_n; u++) {
184 int len1 = s->len[p][u];
185 if (len1 > limit || !len1)
187 if ((sign_extend(u, 8) & (s->vlc_n-1)) != u)
189 av_assert0(i < (1 << VLC_BITS));
190 len[i] = len0 + len1;
191 bits[i] = (s->bits[p0][y] << len1) + s->bits[p][u];
192 symbols[i] = (y << 8) + (u & 0xFF);
196 ff_vlc_free(&s->vlc[4 + p]);
197 if ((ret = ff_vlc_init_sparse(&s->vlc[4 + p], VLC_BITS, i, len, 1, 1,
198 bits, 2, 2, symbols, 2, 2, 0)) < 0)
202 uint8_t (*map)[4] = (uint8_t(*)[4]) s->pix_bgr_map;
203 int i, b, g, r, code;
204 int p0 = s->decorrelate;
205 int p1 = !s->decorrelate;
206 /* Restrict the range to +/-16 because that's pretty much guaranteed
207 * to cover all the combinations that fit in 11 bits total, and it
208 * does not matter if we miss a few rare codes. */
209 for (i = 0, g = -16; g < 16; g++) {
210 int len0 = s->len[p0][g & 255];
211 int limit0 = VLC_BITS - len0;
212 if (limit0 < 2 || !len0)
214 for (b = -16; b < 16; b++) {
215 int len1 = s->len[p1][b & 255];
216 int limit1 = limit0 - len1;
217 if (limit1 < 1 || !len1)
219 code = (s->bits[p0][g & 255] << len1) + s->bits[p1][b & 255];
220 for (r = -16; r < 16; r++) {
221 int len2 = s->len[2][r & 255];
222 if (len2 > limit1 || !len2)
224 av_assert0(i < (1 << VLC_BITS));
225 len[i] = len0 + len1 + len2;
226 bits[i] = (code << len2) + s->bits[2][r & 255];
227 if (s->decorrelate) {
240 ff_vlc_free(&s->vlc[4]);
241 if ((ret = vlc_init(&s->vlc[4], VLC_BITS, i, len, 1, 1,
251 static int read_huffman_tables(HYuvDecContext *s, const uint8_t *src, int length)
257 if ((ret = init_get_bits(&gb, src, length * 8)) < 0)
261 count = 1 + s->alpha + 2*s->chroma;
263 for (i = 0; i < count; i++) {
264 if ((ret = read_len_table(s->len[i], &gb, s->vlc_n)) < 0)
266 if ((ret = ff_huffyuv_generate_bits_table(s->bits[i], s->len[i], s->vlc_n)) < 0)
268 ff_vlc_free(&s->vlc[i]);
269 if ((ret = vlc_init(&s->vlc[i], VLC_BITS, s->vlc_n, s->len[i], 1, 1,
270 s->bits[i], 4, 4, 0)) < 0)
274 if ((ret = generate_joint_tables(s)) < 0)
277 return (get_bits_count(&gb) + 7) / 8;
280 static int read_old_huffman_tables(HYuvDecContext *s)
285 init_get_bits(&gb, classic_shift_luma,
286 classic_shift_luma_table_size * 8);
287 if ((ret = read_len_table(s->len[0], &gb, 256)) < 0)
290 init_get_bits(&gb, classic_shift_chroma,
291 classic_shift_chroma_table_size * 8);
292 if ((ret = read_len_table(s->len[1], &gb, 256)) < 0)
295 for (i = 0; i < 256; i++)
296 s->bits[0][i] = classic_add_luma[i];
297 for (i = 0; i < 256; i++)
298 s->bits[1][i] = classic_add_chroma[i];
300 if (s->bitstream_bpp >= 24) {
301 memcpy(s->bits[1], s->bits[0], 256 * sizeof(uint32_t));
302 memcpy(s->len[1], s->len[0], 256 * sizeof(uint8_t));
304 memcpy(s->bits[2], s->bits[1], 256 * sizeof(uint32_t));
305 memcpy(s->len[2], s->len[1], 256 * sizeof(uint8_t));
307 for (i = 0; i < 4; i++) {
308 ff_vlc_free(&s->vlc[i]);
309 if ((ret = vlc_init(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1,
310 s->bits[i], 4, 4, 0)) < 0)
314 if ((ret = generate_joint_tables(s)) < 0)
320 static av_cold int decode_end(AVCodecContext *avctx)
322 HYuvDecContext *s = avctx->priv_data;
325 ff_huffyuv_common_end(s->temp, s->temp16);
326 av_freep(&s->bitstream_buffer);
328 for (i = 0; i < 8; i++)
329 ff_vlc_free(&s->vlc[i]);
334 static av_cold int decode_init(AVCodecContext *avctx)
336 HYuvDecContext *s = avctx->priv_data;
339 ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
343 s->flags = avctx->flags;
345 ff_bswapdsp_init(&s->bdsp);
346 ff_huffyuvdsp_init(&s->hdsp, avctx->pix_fmt);
347 ff_llviddsp_init(&s->llviddsp);
348 memset(s->vlc, 0, 4 * sizeof(VLC));
350 s->interlaced = avctx->height > 288;
353 if (avctx->extradata_size) {
354 if ((avctx->bits_per_coded_sample & 7) &&
355 avctx->bits_per_coded_sample != 12)
356 s->version = 1; // do such files exist at all?
357 else if (avctx->extradata_size > 3 && avctx->extradata[3] == 0)
366 s->vlc_n = FFMIN(s->n, MAX_VLC_N);
368 if (s->version >= 2) {
369 int method, interlace;
371 if (avctx->extradata_size < 4)
372 return AVERROR_INVALIDDATA;
374 method = avctx->extradata[0];
375 s->decorrelate = method & 64 ? 1 : 0;
376 s->predictor = method & 63;
377 if (s->version == 2) {
378 s->bitstream_bpp = avctx->extradata[1];
379 if (s->bitstream_bpp == 0)
380 s->bitstream_bpp = avctx->bits_per_coded_sample & ~7;
382 s->bps = (avctx->extradata[1] >> 4) + 1;
384 s->vlc_n = FFMIN(s->n, MAX_VLC_N);
385 s->chroma_h_shift = avctx->extradata[1] & 3;
386 s->chroma_v_shift = (avctx->extradata[1] >> 2) & 3;
387 s->yuv = !!(avctx->extradata[2] & 1);
388 s->chroma= !!(avctx->extradata[2] & 3);
389 s->alpha = !!(avctx->extradata[2] & 4);
391 interlace = (avctx->extradata[2] & 0x30) >> 4;
392 s->interlaced = (interlace == 1) ? 1 : (interlace == 2) ? 0 : s->interlaced;
393 s->context = avctx->extradata[2] & 0x40 ? 1 : 0;
395 if ((ret = read_huffman_tables(s, avctx->extradata + 4,
396 avctx->extradata_size - 4)) < 0)
399 switch (avctx->bits_per_coded_sample & 7) {
409 s->predictor = PLANE;
410 s->decorrelate = avctx->bits_per_coded_sample >= 24;
413 s->predictor = MEDIAN;
417 s->predictor = LEFT; // OLD
421 s->bitstream_bpp = avctx->bits_per_coded_sample & ~7;
424 if ((ret = read_old_huffman_tables(s)) < 0)
428 if (s->version <= 2) {
429 switch (s->bitstream_bpp) {
431 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
436 avctx->pix_fmt = AV_PIX_FMT_YUYV422;
438 avctx->pix_fmt = AV_PIX_FMT_YUV422P;
443 avctx->pix_fmt = AV_PIX_FMT_0RGB32;
445 avctx->pix_fmt = AV_PIX_FMT_BGR24;
448 av_assert0(s->bgr32);
449 avctx->pix_fmt = AV_PIX_FMT_RGB32;
453 return AVERROR_INVALIDDATA;
455 av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt,
459 switch ( (s->chroma<<10) | (s->yuv<<9) | (s->alpha<<8) | ((s->bps-1)<<4) | s->chroma_h_shift | (s->chroma_v_shift<<2)) {
461 avctx->pix_fmt = AV_PIX_FMT_GRAY8;
464 avctx->pix_fmt = AV_PIX_FMT_GRAY16;
467 avctx->pix_fmt = AV_PIX_FMT_GBRP;
470 avctx->pix_fmt = AV_PIX_FMT_GBRP9;
473 avctx->pix_fmt = AV_PIX_FMT_GBRP10;
476 avctx->pix_fmt = AV_PIX_FMT_GBRP12;
479 avctx->pix_fmt = AV_PIX_FMT_GBRP14;
482 avctx->pix_fmt = AV_PIX_FMT_GBRP16;
485 avctx->pix_fmt = AV_PIX_FMT_GBRAP;
488 avctx->pix_fmt = AV_PIX_FMT_YUV444P;
491 avctx->pix_fmt = AV_PIX_FMT_YUV444P9;
494 avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
497 avctx->pix_fmt = AV_PIX_FMT_YUV444P12;
500 avctx->pix_fmt = AV_PIX_FMT_YUV444P14;
503 avctx->pix_fmt = AV_PIX_FMT_YUV444P16;
506 avctx->pix_fmt = AV_PIX_FMT_YUV422P;
509 avctx->pix_fmt = AV_PIX_FMT_YUV422P9;
512 avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
515 avctx->pix_fmt = AV_PIX_FMT_YUV422P12;
518 avctx->pix_fmt = AV_PIX_FMT_YUV422P14;
521 avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
524 avctx->pix_fmt = AV_PIX_FMT_YUV411P;
527 avctx->pix_fmt = AV_PIX_FMT_YUV440P;
530 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
533 avctx->pix_fmt = AV_PIX_FMT_YUV420P9;
536 avctx->pix_fmt = AV_PIX_FMT_YUV420P10;
539 avctx->pix_fmt = AV_PIX_FMT_YUV420P12;
542 avctx->pix_fmt = AV_PIX_FMT_YUV420P14;
545 avctx->pix_fmt = AV_PIX_FMT_YUV420P16;
548 avctx->pix_fmt = AV_PIX_FMT_YUV410P;
551 avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
554 avctx->pix_fmt = AV_PIX_FMT_YUVA444P9;
557 avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
560 avctx->pix_fmt = AV_PIX_FMT_YUVA444P16;
563 avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
566 avctx->pix_fmt = AV_PIX_FMT_YUVA422P9;
569 avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
572 avctx->pix_fmt = AV_PIX_FMT_YUVA422P16;
575 avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
578 avctx->pix_fmt = AV_PIX_FMT_YUVA420P9;
581 avctx->pix_fmt = AV_PIX_FMT_YUVA420P10;
584 avctx->pix_fmt = AV_PIX_FMT_YUVA420P16;
587 return AVERROR_INVALIDDATA;
591 if ((avctx->pix_fmt == AV_PIX_FMT_YUV422P || avctx->pix_fmt == AV_PIX_FMT_YUV420P) && avctx->width & 1) {
592 av_log(avctx, AV_LOG_ERROR, "width must be even for this colorspace\n");
593 return AVERROR_INVALIDDATA;
595 if (s->predictor == MEDIAN && avctx->pix_fmt == AV_PIX_FMT_YUV422P &&
597 av_log(avctx, AV_LOG_ERROR, "width must be a multiple of 4 "
598 "for this combination of colorspace and predictor type.\n");
599 return AVERROR_INVALIDDATA;
602 if ((ret = ff_huffyuv_alloc_temp(s->temp, s->temp16, avctx->width)) < 0)
608 /** Subset of GET_VLC for use in hand-roller VLC code */
609 #define VLC_INTERN(dst, table, gb, name, bits, max_depth) \
610 code = table[index].sym; \
611 n = table[index].len; \
612 if (max_depth > 1 && n < 0) { \
613 LAST_SKIP_BITS(name, gb, bits); \
614 UPDATE_CACHE(name, gb); \
617 index = SHOW_UBITS(name, gb, nb_bits) + code; \
618 code = table[index].sym; \
619 n = table[index].len; \
620 if (max_depth > 2 && n < 0) { \
621 LAST_SKIP_BITS(name, gb, nb_bits); \
622 UPDATE_CACHE(name, gb); \
625 index = SHOW_UBITS(name, gb, nb_bits) + code; \
626 code = table[index].sym; \
627 n = table[index].len; \
631 LAST_SKIP_BITS(name, gb, n)
634 #define GET_VLC_DUAL(dst0, dst1, name, gb, dtable, table1, table2, \
635 bits, max_depth, OP) \
637 unsigned int index = SHOW_UBITS(name, gb, bits); \
638 int code, n = dtable[index].len; \
642 VLC_INTERN(dst0, table1, gb, name, bits, max_depth); \
644 UPDATE_CACHE(re, gb); \
645 index = SHOW_UBITS(name, gb, bits); \
646 VLC_INTERN(dst1, table2, gb, name, bits, max_depth); \
648 code = dtable[index].sym; \
649 OP(dst0, dst1, code); \
650 LAST_SKIP_BITS(name, gb, n); \
654 #define OP8bits(dst0, dst1, code) dst0 = code>>8; dst1 = code
656 #define READ_2PIX(dst0, dst1, plane1) \
657 UPDATE_CACHE(re, &s->gb); \
658 GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane1].table, \
659 s->vlc[0].table, s->vlc[plane1].table, VLC_BITS, 3, OP8bits)
661 static void decode_422_bitstream(HYuvDecContext *s, int count)
664 OPEN_READER(re, &s->gb);
667 icount = get_bits_left(&s->gb) / (32 * 4);
668 if (count >= icount) {
669 for (i = 0; i < icount; i++) {
670 READ_2PIX(s->temp[0][2 * i], s->temp[1][i], 1);
671 READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
673 for (; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
674 READ_2PIX(s->temp[0][2 * i ], s->temp[1][i], 1);
675 if (BITS_LEFT(re, &s->gb) <= 0) break;
676 READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
678 for (; i < count; i++)
679 s->temp[0][2 * i ] = s->temp[1][i] =
680 s->temp[0][2 * i + 1] = s->temp[2][i] = 0;
682 for (i = 0; i < count; i++) {
683 READ_2PIX(s->temp[0][2 * i], s->temp[1][i], 1);
684 READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
687 CLOSE_READER(re, &s->gb);
690 #define READ_2PIX_PLANE(dst0, dst1, plane, OP) \
691 UPDATE_CACHE(re, &s->gb); \
692 GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane].table, \
693 s->vlc[plane].table, s->vlc[plane].table, VLC_BITS, 3, OP)
695 #define OP14bits(dst0, dst1, code) dst0 = code>>8; dst1 = sign_extend(code, 8)
697 /* TODO instead of restarting the read when the code isn't in the first level
698 * of the joint table, jump into the 2nd level of the individual table. */
699 #define READ_2PIX_PLANE16(dst0, dst1, plane){\
700 dst0 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)*4;\
701 dst0 += get_bits(&s->gb, 2);\
702 dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)*4;\
703 dst1 += get_bits(&s->gb, 2);\
705 static void decode_plane_bitstream(HYuvDecContext *s, int width, int plane)
707 int i, count = width/2;
710 OPEN_READER(re, &s->gb);
711 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
712 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
713 READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane, OP8bits);
716 for(i=0; i<count; i++){
717 READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane, OP8bits);
720 if( width&1 && BITS_LEFT(re, &s->gb)>0 ) {
722 int nb_bits, code, n;
723 UPDATE_CACHE(re, &s->gb);
724 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
725 VLC_INTERN(s->temp[0][width-1], s->vlc[plane].table,
726 &s->gb, re, VLC_BITS, 3);
728 CLOSE_READER(re, &s->gb);
729 } else if (s->bps <= 14) {
730 OPEN_READER(re, &s->gb);
731 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
732 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
733 READ_2PIX_PLANE(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane, OP14bits);
736 for(i=0; i<count; i++){
737 READ_2PIX_PLANE(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane, OP14bits);
740 if( width&1 && BITS_LEFT(re, &s->gb)>0 ) {
742 int nb_bits, code, n;
743 UPDATE_CACHE(re, &s->gb);
744 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
745 VLC_INTERN(s->temp16[0][width-1], s->vlc[plane].table,
746 &s->gb, re, VLC_BITS, 3);
748 CLOSE_READER(re, &s->gb);
750 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
751 for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
752 READ_2PIX_PLANE16(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane);
755 for(i=0; i<count; i++){
756 READ_2PIX_PLANE16(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane);
759 if( width&1 && get_bits_left(&s->gb)>0 ) {
760 int dst = (unsigned)get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)<<2;
761 s->temp16[0][width-1] = dst + get_bits(&s->gb, 2);
766 static void decode_gray_bitstream(HYuvDecContext *s, int count)
769 OPEN_READER(re, &s->gb);
772 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
773 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
774 READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0);
777 for (i = 0; i < count; i++) {
778 READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0);
781 CLOSE_READER(re, &s->gb);
784 static av_always_inline void decode_bgr_1(HYuvDecContext *s, int count,
785 int decorrelate, int alpha)
788 OPEN_READER(re, &s->gb);
790 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
792 int code, n, nb_bits;
794 UPDATE_CACHE(re, &s->gb);
795 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
796 n = s->vlc[4].table[index].len;
799 code = s->vlc[4].table[index].sym;
800 *(uint32_t *) &s->temp[0][4 * i] = s->pix_bgr_map[code];
801 LAST_SKIP_BITS(re, &s->gb, n);
804 VLC_INTERN(s->temp[0][4 * i + G], s->vlc[1].table,
805 &s->gb, re, VLC_BITS, 3);
807 UPDATE_CACHE(re, &s->gb);
808 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
809 VLC_INTERN(code, s->vlc[0].table, &s->gb, re, VLC_BITS, 3);
810 s->temp[0][4 * i + B] = code + s->temp[0][4 * i + G];
812 UPDATE_CACHE(re, &s->gb);
813 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
814 VLC_INTERN(code, s->vlc[2].table, &s->gb, re, VLC_BITS, 3);
815 s->temp[0][4 * i + R] = code + s->temp[0][4 * i + G];
817 VLC_INTERN(s->temp[0][4 * i + B], s->vlc[0].table,
818 &s->gb, re, VLC_BITS, 3);
820 UPDATE_CACHE(re, &s->gb);
821 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
822 VLC_INTERN(s->temp[0][4 * i + G], s->vlc[1].table,
823 &s->gb, re, VLC_BITS, 3);
825 UPDATE_CACHE(re, &s->gb);
826 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
827 VLC_INTERN(s->temp[0][4 * i + R], s->vlc[2].table,
828 &s->gb, re, VLC_BITS, 3);
832 UPDATE_CACHE(re, &s->gb);
833 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
834 VLC_INTERN(s->temp[0][4 * i + A], s->vlc[2].table,
835 &s->gb, re, VLC_BITS, 3);
837 s->temp[0][4 * i + A] = 0;
839 CLOSE_READER(re, &s->gb);
842 static void decode_bgr_bitstream(HYuvDecContext *s, int count)
844 if (s->decorrelate) {
845 if (s->bitstream_bpp == 24)
846 decode_bgr_1(s, count, 1, 0);
848 decode_bgr_1(s, count, 1, 1);
850 if (s->bitstream_bpp == 24)
851 decode_bgr_1(s, count, 0, 0);
853 decode_bgr_1(s, count, 0, 1);
857 static void draw_slice(HYuvDecContext *s, AVCodecContext *avctx, AVFrame *frame, int y)
860 int offset[AV_NUM_DATA_POINTERS];
862 if (!avctx->draw_horiz_band)
865 h = y - s->last_slice_end;
868 if (s->bitstream_bpp == 12)
873 offset[0] = frame->linesize[0] * y;
874 offset[1] = frame->linesize[1] * cy;
875 offset[2] = frame->linesize[2] * cy;
876 for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
880 avctx->draw_horiz_band(avctx, frame, offset, y, 3, h);
882 s->last_slice_end = y + h;
885 static int left_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, int w, int acc)
888 return s->llviddsp.add_left_pred(dst, src, w, acc);
890 return s->llviddsp.add_left_pred_int16(( uint16_t *)dst, (const uint16_t *)src, s->n-1, w, acc);
894 static void add_bytes(HYuvDecContext *s, uint8_t *dst, uint8_t *src, int w)
897 s->llviddsp.add_bytes(dst, src, w);
899 s->hdsp.add_int16((uint16_t*)dst, (const uint16_t*)src, s->n - 1, w);
903 static void add_median_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, const uint8_t *diff, int w, int *left, int *left_top)
906 s->llviddsp.add_median_pred(dst, src, diff, w, left, left_top);
908 s->hdsp.add_hfyu_median_pred_int16((uint16_t *)dst, (const uint16_t *)src, (const uint16_t *)diff, s->n-1, w, left, left_top);
912 static int decode_slice(AVCodecContext *avctx, AVFrame *p, int height,
913 int buf_size, int y_offset, int table_size)
915 HYuvDecContext *s = avctx->priv_data;
916 int fake_ystride, fake_ustride, fake_vstride;
917 const int width = avctx->width;
918 const int width2 = avctx->width >> 1;
921 if ((ret = init_get_bits8(&s->gb, s->bitstream_buffer + table_size, buf_size - table_size)) < 0)
924 fake_ystride = s->interlaced ? p->linesize[0] * 2 : p->linesize[0];
925 fake_ustride = s->interlaced ? p->linesize[1] * 2 : p->linesize[1];
926 fake_vstride = s->interlaced ? p->linesize[2] * 2 : p->linesize[2];
928 if (s->version > 2) {
930 for(plane = 0; plane < 1 + 2*s->chroma + s->alpha; plane++) {
931 int left, lefttop, y;
934 int fake_stride = fake_ystride;
936 if (s->chroma && (plane == 1 || plane == 2)) {
937 w >>= s->chroma_h_shift;
938 h >>= s->chroma_v_shift;
939 fake_stride = plane == 1 ? fake_ustride : fake_vstride;
942 switch (s->predictor) {
945 decode_plane_bitstream(s, w, plane);
946 left = left_prediction(s, p->data[plane], s->temp[0], w, 0);
948 for (y = 1; y < h; y++) {
949 uint8_t *dst = p->data[plane] + p->linesize[plane]*y;
951 decode_plane_bitstream(s, w, plane);
952 left = left_prediction(s, dst, s->temp[0], w, left);
953 if (s->predictor == PLANE) {
954 if (y > s->interlaced) {
955 add_bytes(s, dst, dst - fake_stride, w);
962 decode_plane_bitstream(s, w, plane);
963 left= left_prediction(s, p->data[plane], s->temp[0], w, 0);
969 /* second line is left predicted for interlaced case */
971 decode_plane_bitstream(s, w, plane);
972 left = left_prediction(s, p->data[plane] + p->linesize[plane], s->temp[0], w, left);
978 lefttop = p->data[plane][0];
979 decode_plane_bitstream(s, w, plane);
980 add_median_prediction(s, p->data[plane] + fake_stride, p->data[plane], s->temp[0], w, &left, &lefttop);
986 decode_plane_bitstream(s, w, plane);
988 dst = p->data[plane] + p->linesize[plane] * y;
990 add_median_prediction(s, dst, dst - fake_stride, s->temp[0], w, &left, &lefttop);
996 draw_slice(s, avctx, p, height);
997 } else if (s->bitstream_bpp < 24) {
999 int lefty, leftu, leftv;
1000 int lefttopy, lefttopu, lefttopv;
1003 p->data[0][3] = get_bits(&s->gb, 8);
1004 p->data[0][2] = get_bits(&s->gb, 8);
1005 p->data[0][1] = get_bits(&s->gb, 8);
1006 p->data[0][0] = get_bits(&s->gb, 8);
1008 av_log(avctx, AV_LOG_ERROR,
1009 "YUY2 output is not implemented yet\n");
1010 return AVERROR_PATCHWELCOME;
1013 p->data[2][0 + y_offset * p->linesize[2]] = get_bits(&s->gb, 8);
1015 p->data[0][1 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8);
1017 p->data[1][0 + y_offset * p->linesize[1]] = get_bits(&s->gb, 8);
1018 p->data[0][0 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8);
1020 switch (s->predictor) {
1023 decode_422_bitstream(s, width - 2);
1024 lefty = s->llviddsp.add_left_pred(p->data[0] + p->linesize[0] * y_offset + 2, s->temp[0],
1026 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1027 leftu = s->llviddsp.add_left_pred(p->data[1] + p->linesize[1] * y_offset + 1, s->temp[1], width2 - 1, leftu);
1028 leftv = s->llviddsp.add_left_pred(p->data[2] + p->linesize[2] * y_offset + 1, s->temp[2], width2 - 1, leftv);
1031 for (cy = y = 1; y < height; y++, cy++) {
1032 uint8_t *ydst, *udst, *vdst;
1034 if (s->bitstream_bpp == 12) {
1035 decode_gray_bitstream(s, width);
1037 ydst = p->data[0] + p->linesize[0] * (y + y_offset);
1039 lefty = s->llviddsp.add_left_pred(ydst, s->temp[0],
1041 if (s->predictor == PLANE) {
1042 if (y > s->interlaced)
1043 s->llviddsp.add_bytes(ydst, ydst - fake_ystride, width);
1050 draw_slice(s, avctx, p, y);
1052 ydst = p->data[0] + p->linesize[0] * (y + y_offset);
1053 udst = p->data[1] + p->linesize[1] * (cy + y_offset);
1054 vdst = p->data[2] + p->linesize[2] * (cy + y_offset);
1056 decode_422_bitstream(s, width);
1057 lefty = s->llviddsp.add_left_pred(ydst, s->temp[0],
1059 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1060 leftu = s->llviddsp.add_left_pred(udst, s->temp[1], width2, leftu);
1061 leftv = s->llviddsp.add_left_pred(vdst, s->temp[2], width2, leftv);
1063 if (s->predictor == PLANE) {
1064 if (cy > s->interlaced) {
1065 s->llviddsp.add_bytes(ydst, ydst - fake_ystride, width);
1066 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1067 s->llviddsp.add_bytes(udst, udst - fake_ustride, width2);
1068 s->llviddsp.add_bytes(vdst, vdst - fake_vstride, width2);
1073 draw_slice(s, avctx, p, height);
1077 /* first line except first 2 pixels is left predicted */
1078 decode_422_bitstream(s, width - 2);
1079 lefty = s->llviddsp.add_left_pred(p->data[0] + 2, s->temp[0],
1081 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1082 leftu = s->llviddsp.add_left_pred(p->data[1] + 1, s->temp[1], width2 - 1, leftu);
1083 leftv = s->llviddsp.add_left_pred(p->data[2] + 1, s->temp[2], width2 - 1, leftv);
1090 /* second line is left predicted for interlaced case */
1091 if (s->interlaced) {
1092 decode_422_bitstream(s, width);
1093 lefty = s->llviddsp.add_left_pred(p->data[0] + p->linesize[0],
1094 s->temp[0], width, lefty);
1095 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1096 leftu = s->llviddsp.add_left_pred(p->data[1] + p->linesize[2], s->temp[1], width2, leftu);
1097 leftv = s->llviddsp.add_left_pred(p->data[2] + p->linesize[1], s->temp[2], width2, leftv);
1105 /* next 4 pixels are left predicted too */
1106 decode_422_bitstream(s, 4);
1107 lefty = s->llviddsp.add_left_pred(p->data[0] + fake_ystride,
1108 s->temp[0], 4, lefty);
1109 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1110 leftu = s->llviddsp.add_left_pred(p->data[1] + fake_ustride, s->temp[1], 2, leftu);
1111 leftv = s->llviddsp.add_left_pred(p->data[2] + fake_vstride, s->temp[2], 2, leftv);
1114 /* next line except the first 4 pixels is median predicted */
1115 lefttopy = p->data[0][3];
1116 decode_422_bitstream(s, width - 4);
1117 s->llviddsp.add_median_pred(p->data[0] + fake_ystride + 4,
1118 p->data[0] + 4, s->temp[0],
1119 width - 4, &lefty, &lefttopy);
1120 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1121 lefttopu = p->data[1][1];
1122 lefttopv = p->data[2][1];
1123 s->llviddsp.add_median_pred(p->data[1] + fake_ustride + 2, p->data[1] + 2, s->temp[1], width2 - 2, &leftu, &lefttopu);
1124 s->llviddsp.add_median_pred(p->data[2] + fake_vstride + 2, p->data[2] + 2, s->temp[2], width2 - 2, &leftv, &lefttopv);
1129 for (; y < height; y++, cy++) {
1130 uint8_t *ydst, *udst, *vdst;
1132 if (s->bitstream_bpp == 12) {
1133 while (2 * cy > y) {
1134 decode_gray_bitstream(s, width);
1135 ydst = p->data[0] + p->linesize[0] * y;
1136 s->llviddsp.add_median_pred(ydst, ydst - fake_ystride,
1144 draw_slice(s, avctx, p, y);
1146 decode_422_bitstream(s, width);
1148 ydst = p->data[0] + p->linesize[0] * y;
1149 udst = p->data[1] + p->linesize[1] * cy;
1150 vdst = p->data[2] + p->linesize[2] * cy;
1152 s->llviddsp.add_median_pred(ydst, ydst - fake_ystride,
1155 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1156 s->llviddsp.add_median_pred(udst, udst - fake_ustride, s->temp[1], width2, &leftu, &lefttopu);
1157 s->llviddsp.add_median_pred(vdst, vdst - fake_vstride, s->temp[2], width2, &leftv, &lefttopv);
1161 draw_slice(s, avctx, p, height);
1168 const int last_line = (y_offset + height - 1) * p->linesize[0];
1170 if (s->bitstream_bpp == 32) {
1171 left[A] = p->data[0][last_line + A] = get_bits(&s->gb, 8);
1172 left[R] = p->data[0][last_line + R] = get_bits(&s->gb, 8);
1173 left[G] = p->data[0][last_line + G] = get_bits(&s->gb, 8);
1174 left[B] = p->data[0][last_line + B] = get_bits(&s->gb, 8);
1176 left[R] = p->data[0][last_line + R] = get_bits(&s->gb, 8);
1177 left[G] = p->data[0][last_line + G] = get_bits(&s->gb, 8);
1178 left[B] = p->data[0][last_line + B] = get_bits(&s->gb, 8);
1179 left[A] = p->data[0][last_line + A] = 255;
1180 skip_bits(&s->gb, 8);
1184 switch (s->predictor) {
1187 decode_bgr_bitstream(s, width - 1);
1188 s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + last_line + 4,
1189 s->temp[0], width - 1, left);
1191 for (y = height - 2; y >= 0; y--) { // Yes it is stored upside down.
1192 decode_bgr_bitstream(s, width);
1194 s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + p->linesize[0] * (y + y_offset),
1195 s->temp[0], width, left);
1196 if (s->predictor == PLANE) {
1197 if (s->bitstream_bpp != 32)
1199 if (y < height - 1 - s->interlaced) {
1200 s->llviddsp.add_bytes(p->data[0] + p->linesize[0] * (y + y_offset),
1201 p->data[0] + p->linesize[0] * (y + y_offset) +
1202 fake_ystride, 4 * width);
1206 // just 1 large slice as this is not possible in reverse order
1207 draw_slice(s, avctx, p, height);
1210 av_log(avctx, AV_LOG_ERROR,
1211 "prediction type not supported!\n");
1214 av_log(avctx, AV_LOG_ERROR,
1215 "BGR24 output is not implemented yet\n");
1216 return AVERROR_PATCHWELCOME;
1223 static int decode_frame(AVCodecContext *avctx, AVFrame *p,
1224 int *got_frame, AVPacket *avpkt)
1226 const uint8_t *buf = avpkt->data;
1227 int buf_size = avpkt->size;
1228 HYuvDecContext *s = avctx->priv_data;
1229 const int width = avctx->width;
1230 const int height = avctx->height;
1231 int slice, table_size = 0, ret, nb_slices;
1232 unsigned slices_info_offset;
1235 if (buf_size < (width * height + 7)/8)
1236 return AVERROR_INVALIDDATA;
1238 av_fast_padded_malloc(&s->bitstream_buffer,
1239 &s->bitstream_buffer_size,
1241 if (!s->bitstream_buffer)
1242 return AVERROR(ENOMEM);
1244 s->bdsp.bswap_buf((uint32_t *) s->bitstream_buffer,
1245 (const uint32_t *) buf, buf_size / 4);
1247 if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0)
1251 table_size = read_huffman_tables(s, s->bitstream_buffer, buf_size);
1256 if ((unsigned) (buf_size - table_size) >= INT_MAX / 8)
1257 return AVERROR_INVALIDDATA;
1259 s->last_slice_end = 0;
1261 if (avctx->codec_id == AV_CODEC_ID_HYMT &&
1262 (buf_size > 32 && AV_RL32(avpkt->data + buf_size - 16) == 0)) {
1263 slices_info_offset = AV_RL32(avpkt->data + buf_size - 4);
1264 slice_height = AV_RL32(avpkt->data + buf_size - 8);
1265 nb_slices = AV_RL32(avpkt->data + buf_size - 12);
1266 if (nb_slices * 8LL + slices_info_offset > buf_size - 16 ||
1267 s->chroma_v_shift ||
1268 slice_height <= 0 || nb_slices * (uint64_t)slice_height > height)
1269 return AVERROR_INVALIDDATA;
1271 slice_height = height;
1275 for (slice = 0; slice < nb_slices; slice++) {
1276 int y_offset, slice_offset, slice_size;
1278 if (nb_slices > 1) {
1279 slice_offset = AV_RL32(avpkt->data + slices_info_offset + slice * 8);
1280 slice_size = AV_RL32(avpkt->data + slices_info_offset + slice * 8 + 4);
1282 if (slice_offset < 0 || slice_size <= 0 || (slice_offset&3) ||
1283 slice_offset + (int64_t)slice_size > buf_size)
1284 return AVERROR_INVALIDDATA;
1286 y_offset = height - (slice + 1) * slice_height;
1287 s->bdsp.bswap_buf((uint32_t *)s->bitstream_buffer,
1288 (const uint32_t *)(buf + slice_offset), slice_size / 4);
1292 slice_size = buf_size;
1295 ret = decode_slice(avctx, p, slice_height, slice_size, y_offset, table_size);
1303 return (get_bits_count(&s->gb) + 31) / 32 * 4 + table_size;
1306 const FFCodec ff_huffyuv_decoder = {
1307 .p.name = "huffyuv",
1308 CODEC_LONG_NAME("Huffyuv / HuffYUV"),
1309 .p.type = AVMEDIA_TYPE_VIDEO,
1310 .p.id = AV_CODEC_ID_HUFFYUV,
1311 .priv_data_size = sizeof(HYuvDecContext),
1312 .init = decode_init,
1313 .close = decode_end,
1314 FF_CODEC_DECODE_CB(decode_frame),
1315 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
1316 AV_CODEC_CAP_FRAME_THREADS,
1317 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1320 #if CONFIG_FFVHUFF_DECODER
1321 const FFCodec ff_ffvhuff_decoder = {
1322 .p.name = "ffvhuff",
1323 CODEC_LONG_NAME("Huffyuv FFmpeg variant"),
1324 .p.type = AVMEDIA_TYPE_VIDEO,
1325 .p.id = AV_CODEC_ID_FFVHUFF,
1326 .priv_data_size = sizeof(HYuvDecContext),
1327 .init = decode_init,
1328 .close = decode_end,
1329 FF_CODEC_DECODE_CB(decode_frame),
1330 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
1331 AV_CODEC_CAP_FRAME_THREADS,
1332 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1334 #endif /* CONFIG_FFVHUFF_DECODER */
1336 #if CONFIG_HYMT_DECODER
1337 const FFCodec ff_hymt_decoder = {
1339 CODEC_LONG_NAME("HuffYUV MT"),
1340 .p.type = AVMEDIA_TYPE_VIDEO,
1341 .p.id = AV_CODEC_ID_HYMT,
1342 .priv_data_size = sizeof(HYuvDecContext),
1343 .init = decode_init,
1344 .close = decode_end,
1345 FF_CODEC_DECODE_CB(decode_frame),
1346 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
1347 AV_CODEC_CAP_FRAME_THREADS,
1348 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1350 #endif /* CONFIG_HYMT_DECODER */