2 * huffyuv codec for libavcodec
4 * Copyright (c) 2002-2003 Michael Niedermayer <michaelni@gmx.at>
6 * see http://www.pcisys.net/~melanson/codecs/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
28 * huffyuv codec for libavcodec.
53 typedef enum Predictor {
59 typedef struct HYuvContext {
60 AVCodecContext *avctx;
68 int yuy2; //use yuy2 instead of 422P
69 int bgr32; //use bgr32 instead of bgr24
76 uint64_t stats[3][256];
78 uint32_t bits[3][256];
79 uint32_t pix_bgr_map[1<<VLC_BITS];
80 VLC vlc[6]; //Y,U,V,YY,YU,YV
82 uint8_t *bitstream_buffer;
83 unsigned int bitstream_buffer_size;
87 #define classic_shift_luma_table_size 42
88 static const unsigned char classic_shift_luma[classic_shift_luma_table_size + FF_INPUT_BUFFER_PADDING_SIZE] = {
89 34,36,35,69,135,232,9,16,10,24,11,23,12,16,13,10,14,8,15,8,
90 16,8,17,20,16,10,207,206,205,236,11,8,10,21,9,23,8,8,199,70,
95 #define classic_shift_chroma_table_size 59
96 static const unsigned char classic_shift_chroma[classic_shift_chroma_table_size + FF_INPUT_BUFFER_PADDING_SIZE] = {
97 66,36,37,38,39,40,41,75,76,77,110,239,144,81,82,83,84,85,118,183,
98 56,57,88,89,56,89,154,57,58,57,26,141,57,56,58,57,58,57,184,119,
99 214,245,116,83,82,49,80,79,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 inline int sub_left_prediction(HYuvContext *s, uint8_t *dst,
142 const uint8_t *src, int w, int left)
146 for (i = 0; i < w; i++) {
147 const int temp = src[i];
148 dst[i] = temp - left;
153 for (i = 0; i < 16; i++) {
154 const int temp = src[i];
155 dst[i] = temp - left;
158 s->dsp.diff_bytes(dst + 16, src + 16, src + 15, w - 16);
163 static inline void sub_left_prediction_bgr32(HYuvContext *s, uint8_t *dst,
164 const uint8_t *src, int w,
165 int *red, int *green, int *blue, int *alpha)
173 for (i = 0; i < FFMIN(w, 4); i++) {
174 const int rt = src[i * 4 + R];
175 const int gt = src[i * 4 + G];
176 const int bt = src[i * 4 + B];
177 const int at = src[i * 4 + A];
178 dst[i * 4 + R] = rt - r;
179 dst[i * 4 + G] = gt - g;
180 dst[i * 4 + B] = bt - b;
181 dst[i * 4 + A] = at - a;
188 s->dsp.diff_bytes(dst + 16, src + 16, src + 12, w * 4 - 16);
190 *red = src[(w - 1) * 4 + R];
191 *green = src[(w - 1) * 4 + G];
192 *blue = src[(w - 1) * 4 + B];
193 *alpha = src[(w - 1) * 4 + A];
196 static inline void sub_left_prediction_rgb24(HYuvContext *s, uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue){
202 for (i = 0; i < FFMIN(w,16); i++) {
203 const int rt = src[i*3 + 0];
204 const int gt = src[i*3 + 1];
205 const int bt = src[i*3 + 2];
206 dst[i*3 + 0] = rt - r;
207 dst[i*3 + 1] = gt - g;
208 dst[i*3 + 2] = bt - b;
214 s->dsp.diff_bytes(dst + 48, src + 48, src + 48 - 3, w*3 - 48);
216 *red = src[(w - 1)*3 + 0];
217 *green = src[(w - 1)*3 + 1];
218 *blue = src[(w - 1)*3 + 2];
221 static int read_len_table(uint8_t *dst, GetBitContext *gb)
225 for (i = 0; i < 256;) {
226 repeat = get_bits(gb, 3);
227 val = get_bits(gb, 5);
229 repeat = get_bits(gb, 8);
230 if (i + repeat > 256 || get_bits_left(gb) < 0) {
231 av_log(NULL, AV_LOG_ERROR, "Error reading huffman table\n");
240 static int generate_bits_table(uint32_t *dst, const uint8_t *len_table)
245 for (len = 32; len > 0; len--) {
246 for (index = 0; index < 256; index++) {
247 if (len_table[index] == len)
251 av_log(NULL, AV_LOG_ERROR, "Error generating huffman table\n");
259 static void generate_joint_tables(HYuvContext *s)
261 uint16_t symbols[1 << VLC_BITS];
262 uint16_t bits[1 << VLC_BITS];
263 uint8_t len[1 << VLC_BITS];
264 if (s->bitstream_bpp < 24) {
266 for (p = 0; p < 3; p++) {
267 for (i = y = 0; y < 256; y++) {
268 int len0 = s->len[0][y];
269 int limit = VLC_BITS - len0;
272 for (u = 0; u < 256; u++) {
273 int len1 = s->len[p][u];
276 len[i] = len0 + len1;
277 bits[i] = (s->bits[0][y] << len1) + s->bits[p][u];
278 symbols[i] = (y << 8) + u;
279 if(symbols[i] != 0xffff) // reserved to mean "invalid"
283 ff_free_vlc(&s->vlc[3 + p]);
284 ff_init_vlc_sparse(&s->vlc[3 + p], VLC_BITS, i, len, 1, 1,
285 bits, 2, 2, symbols, 2, 2, 0);
288 uint8_t (*map)[4] = (uint8_t(*)[4])s->pix_bgr_map;
289 int i, b, g, r, code;
290 int p0 = s->decorrelate;
291 int p1 = !s->decorrelate;
292 // restrict the range to +/-16 because that's pretty much guaranteed to
293 // cover all the combinations that fit in 11 bits total, and it doesn't
294 // matter if we miss a few rare codes.
295 for (i = 0, g = -16; g < 16; g++) {
296 int len0 = s->len[p0][g & 255];
297 int limit0 = VLC_BITS - len0;
300 for (b = -16; b < 16; b++) {
301 int len1 = s->len[p1][b & 255];
302 int limit1 = limit0 - len1;
305 code = (s->bits[p0][g & 255] << len1) + s->bits[p1][b & 255];
306 for (r = -16; r < 16; r++) {
307 int len2 = s->len[2][r & 255];
310 len[i] = len0 + len1 + len2;
311 bits[i] = (code << len2) + s->bits[2][r & 255];
312 if (s->decorrelate) {
325 ff_free_vlc(&s->vlc[3]);
326 init_vlc(&s->vlc[3], VLC_BITS, i, len, 1, 1, bits, 2, 2, 0);
330 static int read_huffman_tables(HYuvContext *s, const uint8_t *src, int length)
335 init_get_bits(&gb, src, length * 8);
337 for (i = 0; i < 3; i++) {
338 if (read_len_table(s->len[i], &gb) < 0)
340 if (generate_bits_table(s->bits[i], s->len[i]) < 0) {
343 ff_free_vlc(&s->vlc[i]);
344 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1,
345 s->bits[i], 4, 4, 0);
348 generate_joint_tables(s);
350 return (get_bits_count(&gb) + 7) / 8;
353 static int read_old_huffman_tables(HYuvContext *s)
358 init_get_bits(&gb, classic_shift_luma,
359 classic_shift_luma_table_size * 8);
360 if (read_len_table(s->len[0], &gb) < 0)
363 init_get_bits(&gb, classic_shift_chroma,
364 classic_shift_chroma_table_size * 8);
365 if (read_len_table(s->len[1], &gb) < 0)
368 for(i=0; i<256; i++) s->bits[0][i] = classic_add_luma [i];
369 for(i=0; i<256; i++) s->bits[1][i] = classic_add_chroma[i];
371 if (s->bitstream_bpp >= 24) {
372 memcpy(s->bits[1], s->bits[0], 256 * sizeof(uint32_t));
373 memcpy(s->len[1] , s->len [0], 256 * sizeof(uint8_t));
375 memcpy(s->bits[2], s->bits[1], 256 * sizeof(uint32_t));
376 memcpy(s->len[2] , s->len [1], 256 * sizeof(uint8_t));
378 for (i = 0; i < 3; i++) {
379 ff_free_vlc(&s->vlc[i]);
380 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1,
381 s->bits[i], 4, 4, 0);
384 generate_joint_tables(s);
389 static av_cold void alloc_temp(HYuvContext *s)
393 if (s->bitstream_bpp<24) {
394 for (i=0; i<3; i++) {
395 s->temp[i]= av_malloc(s->width + 16);
398 s->temp[0]= av_mallocz(4*s->width + 16);
402 static av_cold int common_init(AVCodecContext *avctx)
404 HYuvContext *s = avctx->priv_data;
407 s->flags = avctx->flags;
409 ff_dsputil_init(&s->dsp, avctx);
411 s->width = avctx->width;
412 s->height = avctx->height;
413 av_assert1(s->width > 0 && s->height > 0);
418 #if CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER
419 static av_cold int decode_init(AVCodecContext *avctx)
421 HYuvContext *s = avctx->priv_data;
424 memset(s->vlc, 0, 3 * sizeof(VLC));
426 avctx->coded_frame = &s->picture;
427 avcodec_get_frame_defaults(&s->picture);
428 s->interlaced = s->height > 288;
432 if (avctx->extradata_size) {
433 if ((avctx->bits_per_coded_sample & 7) &&
434 avctx->bits_per_coded_sample != 12)
435 s->version = 1; // do such files exist at all?
441 if (s->version == 2) {
442 int method, interlace;
444 if (avctx->extradata_size < 4)
447 method = ((uint8_t*)avctx->extradata)[0];
448 s->decorrelate = method & 64 ? 1 : 0;
449 s->predictor = method & 63;
450 s->bitstream_bpp = ((uint8_t*)avctx->extradata)[1];
451 if (s->bitstream_bpp == 0)
452 s->bitstream_bpp = avctx->bits_per_coded_sample & ~7;
453 interlace = (((uint8_t*)avctx->extradata)[2] & 0x30) >> 4;
454 s->interlaced = (interlace == 1) ? 1 : (interlace == 2) ? 0 : s->interlaced;
455 s->context = ((uint8_t*)avctx->extradata)[2] & 0x40 ? 1 : 0;
457 if ( read_huffman_tables(s, ((uint8_t*)avctx->extradata) + 4,
458 avctx->extradata_size - 4) < 0)
461 switch (avctx->bits_per_coded_sample & 7) {
471 s->predictor = PLANE;
472 s->decorrelate = avctx->bits_per_coded_sample >= 24;
475 s->predictor = MEDIAN;
479 s->predictor = LEFT; //OLD
483 s->bitstream_bpp = avctx->bits_per_coded_sample & ~7;
486 if (read_old_huffman_tables(s) < 0)
490 switch (s->bitstream_bpp) {
492 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
496 avctx->pix_fmt = AV_PIX_FMT_YUYV422;
498 avctx->pix_fmt = AV_PIX_FMT_YUV422P;
504 avctx->pix_fmt = AV_PIX_FMT_RGB32;
506 avctx->pix_fmt = AV_PIX_FMT_BGR24;
510 return AVERROR_INVALIDDATA;
513 if ((avctx->pix_fmt == AV_PIX_FMT_YUV422P || avctx->pix_fmt == AV_PIX_FMT_YUV420P) && avctx->width & 1) {
514 av_log(avctx, AV_LOG_ERROR, "width must be even for this colorspace\n");
515 return AVERROR_INVALIDDATA;
517 if (s->predictor == MEDIAN && avctx->pix_fmt == AV_PIX_FMT_YUV422P && avctx->width%4) {
518 av_log(avctx, AV_LOG_ERROR, "width must be a multiple of 4 this colorspace and predictor\n");
519 return AVERROR_INVALIDDATA;
526 static av_cold int decode_init_thread_copy(AVCodecContext *avctx)
528 HYuvContext *s = avctx->priv_data;
531 avctx->coded_frame= &s->picture;
534 for (i = 0; i < 6; i++)
535 s->vlc[i].table = NULL;
537 if (s->version == 2) {
538 if (read_huffman_tables(s, ((uint8_t*)avctx->extradata) + 4,
539 avctx->extradata_size) < 0)
542 if (read_old_huffman_tables(s) < 0)
548 #endif /* CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER */
550 #if CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER
551 static int store_table(HYuvContext *s, const uint8_t *len, uint8_t *buf)
556 for (i = 0; i < 256;) {
560 for (; i < 256 && len[i] == val && repeat < 255; i++)
563 av_assert0(val < 32 && val >0 && repeat<256 && repeat>0);
566 buf[index++] = repeat;
568 buf[index++] = val | (repeat << 5);
575 static av_cold int encode_init(AVCodecContext *avctx)
577 HYuvContext *s = avctx->priv_data;
582 avctx->extradata = av_mallocz(1024*30); // 256*3+4 == 772
583 avctx->stats_out = av_mallocz(1024*30); // 21*256*3(%llu ) + 3(\n) + 1(0) = 16132
586 avctx->coded_frame = &s->picture;
588 switch (avctx->pix_fmt) {
589 case AV_PIX_FMT_YUV420P:
590 case AV_PIX_FMT_YUV422P:
592 av_log(avctx, AV_LOG_ERROR, "width must be even for this colorspace\n");
593 return AVERROR(EINVAL);
595 s->bitstream_bpp = avctx->pix_fmt == AV_PIX_FMT_YUV420P ? 12 : 16;
597 case AV_PIX_FMT_RGB32:
598 s->bitstream_bpp = 32;
600 case AV_PIX_FMT_RGB24:
601 s->bitstream_bpp = 24;
604 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
607 avctx->bits_per_coded_sample = s->bitstream_bpp;
608 s->decorrelate = s->bitstream_bpp >= 24;
609 s->predictor = avctx->prediction_method;
610 s->interlaced = avctx->flags&CODEC_FLAG_INTERLACED_ME ? 1 : 0;
611 if (avctx->context_model == 1) {
612 s->context = avctx->context_model;
613 if (s->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)) {
614 av_log(avctx, AV_LOG_ERROR,
615 "context=1 is not compatible with "
616 "2 pass huffyuv encoding\n");
621 if (avctx->codec->id == AV_CODEC_ID_HUFFYUV) {
622 if (avctx->pix_fmt == AV_PIX_FMT_YUV420P) {
623 av_log(avctx, AV_LOG_ERROR,
624 "Error: YV12 is not supported by huffyuv; use "
625 "vcodec=ffvhuff or format=422p\n");
628 if (avctx->context_model) {
629 av_log(avctx, AV_LOG_ERROR,
630 "Error: per-frame huffman tables are not supported "
631 "by huffyuv; use vcodec=ffvhuff\n");
634 if (s->interlaced != ( s->height > 288 ))
635 av_log(avctx, AV_LOG_INFO,
636 "using huffyuv 2.2.0 or newer interlacing flag\n");
639 if (s->bitstream_bpp >= 24 && s->predictor == MEDIAN) {
640 av_log(avctx, AV_LOG_ERROR,
641 "Error: RGB is incompatible with median predictor\n");
645 ((uint8_t*)avctx->extradata)[0] = s->predictor | (s->decorrelate << 6);
646 ((uint8_t*)avctx->extradata)[1] = s->bitstream_bpp;
647 ((uint8_t*)avctx->extradata)[2] = s->interlaced ? 0x10 : 0x20;
649 ((uint8_t*)avctx->extradata)[2] |= 0x40;
650 ((uint8_t*)avctx->extradata)[3] = 0;
651 s->avctx->extradata_size = 4;
653 if (avctx->stats_in) {
654 char *p = avctx->stats_in;
656 for (i = 0; i < 3; i++)
657 for (j = 0; j < 256; j++)
661 for (i = 0; i < 3; i++) {
664 for (j = 0; j < 256; j++) {
665 s->stats[i][j] += strtol(p, &next, 0);
666 if (next == p) return -1;
670 if (p[0] == 0 || p[1] == 0 || p[2] == 0) break;
673 for (i = 0; i < 3; i++)
674 for (j = 0; j < 256; j++) {
675 int d = FFMIN(j, 256 - j);
677 s->stats[i][j] = 100000000 / (d + 1);
681 for (i = 0; i < 3; i++) {
682 ff_huff_gen_len_table(s->len[i], s->stats[i]);
684 if (generate_bits_table(s->bits[i], s->len[i]) < 0) {
688 s->avctx->extradata_size +=
689 store_table(s, s->len[i], &((uint8_t*)s->avctx->extradata)[s->avctx->extradata_size]);
693 for (i = 0; i < 3; i++) {
694 int pels = s->width * s->height / (i ? 40 : 10);
695 for (j = 0; j < 256; j++) {
696 int d = FFMIN(j, 256 - j);
697 s->stats[i][j] = pels/(d + 1);
701 for (i = 0; i < 3; i++)
702 for (j = 0; j < 256; j++)
712 #endif /* CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER */
714 /* TODO instead of restarting the read when the code isn't in the first level
715 * of the joint table, jump into the 2nd level of the individual table. */
716 #define READ_2PIX(dst0, dst1, plane1){\
717 uint16_t code = get_vlc2(&s->gb, s->vlc[3+plane1].table, VLC_BITS, 1);\
722 dst0 = get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);\
723 dst1 = get_vlc2(&s->gb, s->vlc[plane1].table, VLC_BITS, 3);\
727 static void decode_422_bitstream(HYuvContext *s, int count)
733 if (count >= (get_bits_left(&s->gb)) / (31 * 4)) {
734 for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
735 READ_2PIX(s->temp[0][2 * i ], s->temp[1][i], 1);
736 READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
739 for (i = 0; i < count; i++) {
740 READ_2PIX(s->temp[0][2 * i ], s->temp[1][i], 1);
741 READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
746 static void decode_gray_bitstream(HYuvContext *s, int count)
752 if (count >= (get_bits_left(&s->gb)) / (31 * 2)) {
753 for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
754 READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0);
757 for(i=0; i<count; i++){
758 READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0);
763 #if CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER
764 static int encode_422_bitstream(HYuvContext *s, int offset, int count)
767 const uint8_t *y = s->temp[0] + offset;
768 const uint8_t *u = s->temp[1] + offset / 2;
769 const uint8_t *v = s->temp[2] + offset / 2;
771 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < 2 * 4 * count) {
772 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
778 int y1 = y[2 * i + 1];\
784 if (s->flags & CODEC_FLAG_PASS1) {
785 for(i = 0; i < count; i++) {
793 if (s->avctx->flags2 & CODEC_FLAG2_NO_OUTPUT)
796 for (i = 0; i < count; i++) {
799 put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]);
801 put_bits(&s->pb, s->len[1][u0], s->bits[1][u0]);
803 put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]);
805 put_bits(&s->pb, s->len[2][v0], s->bits[2][v0]);
808 for(i = 0; i < count; i++) {
810 put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]);
811 put_bits(&s->pb, s->len[1][u0], s->bits[1][u0]);
812 put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]);
813 put_bits(&s->pb, s->len[2][v0], s->bits[2][v0]);
819 static int encode_gray_bitstream(HYuvContext *s, int count)
823 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < 4 * count) {
824 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
829 int y0 = s->temp[0][2 * i];\
830 int y1 = s->temp[0][2 * i + 1];
835 put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]);\
836 put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]);
840 if (s->flags & CODEC_FLAG_PASS1) {
841 for (i = 0; i < count; i++) {
846 if (s->avctx->flags2 & CODEC_FLAG2_NO_OUTPUT)
850 for (i = 0; i < count; i++) {
856 for (i = 0; i < count; i++) {
863 #endif /* CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER */
865 static av_always_inline void decode_bgr_1(HYuvContext *s, int count,
866 int decorrelate, int alpha)
869 for (i = 0; i < count; i++) {
870 int code = get_vlc2(&s->gb, s->vlc[3].table, VLC_BITS, 1);
872 *(uint32_t*)&s->temp[0][4 * i] = s->pix_bgr_map[code];
873 } else if(decorrelate) {
874 s->temp[0][4 * i + G] = get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
875 s->temp[0][4 * i + B] = get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3) +
876 s->temp[0][4 * i + G];
877 s->temp[0][4 * i + R] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3) +
878 s->temp[0][4 * i + G];
880 s->temp[0][4 * i + B] = get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
881 s->temp[0][4 * i + G] = get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
882 s->temp[0][4 * i + R] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
885 s->temp[0][4 * i + A] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
889 static void decode_bgr_bitstream(HYuvContext *s, int count)
891 if (s->decorrelate) {
892 if (s->bitstream_bpp==24)
893 decode_bgr_1(s, count, 1, 0);
895 decode_bgr_1(s, count, 1, 1);
897 if (s->bitstream_bpp==24)
898 decode_bgr_1(s, count, 0, 0);
900 decode_bgr_1(s, count, 0, 1);
904 static inline int encode_bgra_bitstream(HYuvContext *s, int count, int planes)
908 if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < 4*planes*count) {
909 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
914 int g = s->temp[0][planes==3 ? 3*i + 1 : 4*i + G];\
915 int b = (s->temp[0][planes==3 ? 3*i + 2 : 4*i + B] - g) & 0xff;\
916 int r = (s->temp[0][planes==3 ? 3*i + 0 : 4*i + R] - g) & 0xff;\
917 int a = s->temp[0][planes*i + A];
922 if(planes==4) s->stats[2][a]++;
924 put_bits(&s->pb, s->len[1][g], s->bits[1][g]);\
925 put_bits(&s->pb, s->len[0][b], s->bits[0][b]);\
926 put_bits(&s->pb, s->len[2][r], s->bits[2][r]);\
927 if(planes==4) put_bits(&s->pb, s->len[2][a], s->bits[2][a]);
929 if ((s->flags & CODEC_FLAG_PASS1) &&
930 (s->avctx->flags2 & CODEC_FLAG2_NO_OUTPUT)) {
931 for (i = 0; i < count; i++) {
935 } else if (s->context || (s->flags & CODEC_FLAG_PASS1)) {
936 for (i = 0; i < count; i++) {
942 for (i = 0; i < count; i++) {
950 #if CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER
951 static void draw_slice(HYuvContext *s, int y)
954 int offset[AV_NUM_DATA_POINTERS];
956 if (s->avctx->draw_horiz_band==NULL)
959 h = y - s->last_slice_end;
962 if (s->bitstream_bpp == 12) {
968 offset[0] = s->picture.linesize[0]*y;
969 offset[1] = s->picture.linesize[1]*cy;
970 offset[2] = s->picture.linesize[2]*cy;
971 for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
975 s->avctx->draw_horiz_band(s->avctx, &s->picture, offset, y, 3, h);
977 s->last_slice_end = y + h;
980 static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
983 const uint8_t *buf = avpkt->data;
984 int buf_size = avpkt->size;
985 HYuvContext *s = avctx->priv_data;
986 const int width = s->width;
987 const int width2 = s->width>>1;
988 const int height = s->height;
989 int fake_ystride, fake_ustride, fake_vstride;
990 AVFrame * const p = &s->picture;
993 AVFrame *picture = data;
995 av_fast_malloc(&s->bitstream_buffer,
996 &s->bitstream_buffer_size,
997 buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
998 if (!s->bitstream_buffer)
999 return AVERROR(ENOMEM);
1001 memset(s->bitstream_buffer + buf_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
1002 s->dsp.bswap_buf((uint32_t*)s->bitstream_buffer,
1003 (const uint32_t*)buf, buf_size / 4);
1006 ff_thread_release_buffer(avctx, p);
1009 if (ff_thread_get_buffer(avctx, p) < 0) {
1010 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1015 table_size = read_huffman_tables(s, s->bitstream_buffer, buf_size);
1020 if ((unsigned)(buf_size-table_size) >= INT_MAX / 8)
1023 init_get_bits(&s->gb, s->bitstream_buffer+table_size,
1024 (buf_size-table_size) * 8);
1026 fake_ystride = s->interlaced ? p->linesize[0] * 2 : p->linesize[0];
1027 fake_ustride = s->interlaced ? p->linesize[1] * 2 : p->linesize[1];
1028 fake_vstride = s->interlaced ? p->linesize[2] * 2 : p->linesize[2];
1030 s->last_slice_end = 0;
1032 if (s->bitstream_bpp < 24) {
1034 int lefty, leftu, leftv;
1035 int lefttopy, lefttopu, lefttopv;
1038 p->data[0][3] = get_bits(&s->gb, 8);
1039 p->data[0][2] = get_bits(&s->gb, 8);
1040 p->data[0][1] = get_bits(&s->gb, 8);
1041 p->data[0][0] = get_bits(&s->gb, 8);
1043 av_log(avctx, AV_LOG_ERROR,
1044 "YUY2 output is not implemented yet\n");
1048 leftv = p->data[2][0] = get_bits(&s->gb, 8);
1049 lefty = p->data[0][1] = get_bits(&s->gb, 8);
1050 leftu = p->data[1][0] = get_bits(&s->gb, 8);
1051 p->data[0][0] = get_bits(&s->gb, 8);
1053 switch (s->predictor) {
1056 decode_422_bitstream(s, width-2);
1057 lefty = s->dsp.add_hfyu_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty);
1058 if (!(s->flags&CODEC_FLAG_GRAY)) {
1059 leftu = s->dsp.add_hfyu_left_prediction(p->data[1] + 1, s->temp[1], width2 - 1, leftu);
1060 leftv = s->dsp.add_hfyu_left_prediction(p->data[2] + 1, s->temp[2], width2 - 1, leftv);
1063 for (cy = y = 1; y < s->height; y++, cy++) {
1064 uint8_t *ydst, *udst, *vdst;
1066 if (s->bitstream_bpp == 12) {
1067 decode_gray_bitstream(s, width);
1069 ydst = p->data[0] + p->linesize[0] * y;
1071 lefty = s->dsp.add_hfyu_left_prediction(ydst, s->temp[0], width, lefty);
1072 if (s->predictor == PLANE) {
1073 if (y > s->interlaced)
1074 s->dsp.add_bytes(ydst, ydst - fake_ystride, width);
1077 if (y >= s->height) break;
1082 ydst = p->data[0] + p->linesize[0]*y;
1083 udst = p->data[1] + p->linesize[1]*cy;
1084 vdst = p->data[2] + p->linesize[2]*cy;
1086 decode_422_bitstream(s, width);
1087 lefty = s->dsp.add_hfyu_left_prediction(ydst, s->temp[0], width, lefty);
1088 if (!(s->flags & CODEC_FLAG_GRAY)) {
1089 leftu= s->dsp.add_hfyu_left_prediction(udst, s->temp[1], width2, leftu);
1090 leftv= s->dsp.add_hfyu_left_prediction(vdst, s->temp[2], width2, leftv);
1092 if (s->predictor == PLANE) {
1093 if (cy > s->interlaced) {
1094 s->dsp.add_bytes(ydst, ydst - fake_ystride, width);
1095 if (!(s->flags & CODEC_FLAG_GRAY)) {
1096 s->dsp.add_bytes(udst, udst - fake_ustride, width2);
1097 s->dsp.add_bytes(vdst, vdst - fake_vstride, width2);
1102 draw_slice(s, height);
1106 /* first line except first 2 pixels is left predicted */
1107 decode_422_bitstream(s, width - 2);
1108 lefty= s->dsp.add_hfyu_left_prediction(p->data[0] + 2, s->temp[0], width - 2, lefty);
1109 if (!(s->flags & CODEC_FLAG_GRAY)) {
1110 leftu = s->dsp.add_hfyu_left_prediction(p->data[1] + 1, s->temp[1], width2 - 1, leftu);
1111 leftv = s->dsp.add_hfyu_left_prediction(p->data[2] + 1, s->temp[2], width2 - 1, leftv);
1116 /* second line is left predicted for interlaced case */
1117 if (s->interlaced) {
1118 decode_422_bitstream(s, width);
1119 lefty = s->dsp.add_hfyu_left_prediction(p->data[0] + p->linesize[0], s->temp[0], width, lefty);
1120 if (!(s->flags & CODEC_FLAG_GRAY)) {
1121 leftu = s->dsp.add_hfyu_left_prediction(p->data[1] + p->linesize[2], s->temp[1], width2, leftu);
1122 leftv = s->dsp.add_hfyu_left_prediction(p->data[2] + p->linesize[1], s->temp[2], width2, leftv);
1127 /* next 4 pixels are left predicted too */
1128 decode_422_bitstream(s, 4);
1129 lefty = s->dsp.add_hfyu_left_prediction(p->data[0] + fake_ystride, s->temp[0], 4, lefty);
1130 if (!(s->flags&CODEC_FLAG_GRAY)) {
1131 leftu = s->dsp.add_hfyu_left_prediction(p->data[1] + fake_ustride, s->temp[1], 2, leftu);
1132 leftv = s->dsp.add_hfyu_left_prediction(p->data[2] + fake_vstride, s->temp[2], 2, leftv);
1135 /* next line except the first 4 pixels is median predicted */
1136 lefttopy = p->data[0][3];
1137 decode_422_bitstream(s, width - 4);
1138 s->dsp.add_hfyu_median_prediction(p->data[0] + fake_ystride+4, p->data[0]+4, s->temp[0], width-4, &lefty, &lefttopy);
1139 if (!(s->flags&CODEC_FLAG_GRAY)) {
1140 lefttopu = p->data[1][1];
1141 lefttopv = p->data[2][1];
1142 s->dsp.add_hfyu_median_prediction(p->data[1] + fake_ustride+2, p->data[1] + 2, s->temp[1], width2 - 2, &leftu, &lefttopu);
1143 s->dsp.add_hfyu_median_prediction(p->data[2] + fake_vstride+2, p->data[2] + 2, s->temp[2], width2 - 2, &leftv, &lefttopv);
1147 for (; y<height; y++, cy++) {
1148 uint8_t *ydst, *udst, *vdst;
1150 if (s->bitstream_bpp == 12) {
1151 while (2 * cy > y) {
1152 decode_gray_bitstream(s, width);
1153 ydst = p->data[0] + p->linesize[0] * y;
1154 s->dsp.add_hfyu_median_prediction(ydst, ydst - fake_ystride, s->temp[0], width, &lefty, &lefttopy);
1157 if (y >= height) break;
1161 decode_422_bitstream(s, width);
1163 ydst = p->data[0] + p->linesize[0] * y;
1164 udst = p->data[1] + p->linesize[1] * cy;
1165 vdst = p->data[2] + p->linesize[2] * cy;
1167 s->dsp.add_hfyu_median_prediction(ydst, ydst - fake_ystride, s->temp[0], width, &lefty, &lefttopy);
1168 if (!(s->flags & CODEC_FLAG_GRAY)) {
1169 s->dsp.add_hfyu_median_prediction(udst, udst - fake_ustride, s->temp[1], width2, &leftu, &lefttopu);
1170 s->dsp.add_hfyu_median_prediction(vdst, vdst - fake_vstride, s->temp[2], width2, &leftv, &lefttopv);
1174 draw_slice(s, height);
1180 int leftr, leftg, leftb, lefta;
1181 const int last_line = (height - 1) * p->linesize[0];
1183 if (s->bitstream_bpp == 32) {
1184 lefta = p->data[0][last_line+A] = get_bits(&s->gb, 8);
1185 leftr = p->data[0][last_line+R] = get_bits(&s->gb, 8);
1186 leftg = p->data[0][last_line+G] = get_bits(&s->gb, 8);
1187 leftb = p->data[0][last_line+B] = get_bits(&s->gb, 8);
1189 leftr = p->data[0][last_line+R] = get_bits(&s->gb, 8);
1190 leftg = p->data[0][last_line+G] = get_bits(&s->gb, 8);
1191 leftb = p->data[0][last_line+B] = get_bits(&s->gb, 8);
1192 lefta = p->data[0][last_line+A] = 255;
1193 skip_bits(&s->gb, 8);
1197 switch (s->predictor) {
1200 decode_bgr_bitstream(s, width - 1);
1201 s->dsp.add_hfyu_left_prediction_bgr32(p->data[0] + last_line+4, s->temp[0], width - 1, &leftr, &leftg, &leftb, &lefta);
1203 for (y = s->height - 2; y >= 0; y--) { //Yes it is stored upside down.
1204 decode_bgr_bitstream(s, width);
1206 s->dsp.add_hfyu_left_prediction_bgr32(p->data[0] + p->linesize[0]*y, s->temp[0], width, &leftr, &leftg, &leftb, &lefta);
1207 if (s->predictor == PLANE) {
1208 if (s->bitstream_bpp != 32) lefta = 0;
1209 if ((y & s->interlaced) == 0 &&
1210 y < s->height - 1 - s->interlaced) {
1211 s->dsp.add_bytes(p->data[0] + p->linesize[0] * y,
1212 p->data[0] + p->linesize[0] * y +
1213 fake_ystride, fake_ystride);
1217 // just 1 large slice as this is not possible in reverse order
1218 draw_slice(s, height);
1221 av_log(avctx, AV_LOG_ERROR,
1222 "prediction type not supported!\n");
1225 av_log(avctx, AV_LOG_ERROR,
1226 "BGR24 output is not implemented yet\n");
1235 return (get_bits_count(&s->gb) + 31) / 32 * 4 + table_size;
1237 #endif /* CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER */
1239 static int common_end(HYuvContext *s)
1243 for(i = 0; i < 3; i++) {
1244 av_freep(&s->temp[i]);
1249 #if CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER
1250 static av_cold int decode_end(AVCodecContext *avctx)
1252 HYuvContext *s = avctx->priv_data;
1255 if (s->picture.data[0])
1256 avctx->release_buffer(avctx, &s->picture);
1259 av_freep(&s->bitstream_buffer);
1261 for (i = 0; i < 6; i++) {
1262 ff_free_vlc(&s->vlc[i]);
1267 #endif /* CONFIG_HUFFYUV_DECODER || CONFIG_FFVHUFF_DECODER */
1269 #if CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER
1270 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
1271 const AVFrame *pict, int *got_packet)
1273 HYuvContext *s = avctx->priv_data;
1274 const int width = s->width;
1275 const int width2 = s->width>>1;
1276 const int height = s->height;
1277 const int fake_ystride = s->interlaced ? pict->linesize[0]*2 : pict->linesize[0];
1278 const int fake_ustride = s->interlaced ? pict->linesize[1]*2 : pict->linesize[1];
1279 const int fake_vstride = s->interlaced ? pict->linesize[2]*2 : pict->linesize[2];
1280 AVFrame * const p = &s->picture;
1281 int i, j, size = 0, ret;
1283 if ((ret = ff_alloc_packet2(avctx, pkt, width * height * 3 * 4 + FF_MIN_BUFFER_SIZE)) < 0)
1287 p->pict_type = AV_PICTURE_TYPE_I;
1291 for (i = 0; i < 3; i++) {
1292 ff_huff_gen_len_table(s->len[i], s->stats[i]);
1293 if (generate_bits_table(s->bits[i], s->len[i]) < 0)
1295 size += store_table(s, s->len[i], &pkt->data[size]);
1298 for (i = 0; i < 3; i++)
1299 for (j = 0; j < 256; j++)
1300 s->stats[i][j] >>= 1;
1303 init_put_bits(&s->pb, pkt->data + size, pkt->size - size);
1305 if (avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
1306 avctx->pix_fmt == AV_PIX_FMT_YUV420P) {
1307 int lefty, leftu, leftv, y, cy;
1309 put_bits(&s->pb, 8, leftv = p->data[2][0]);
1310 put_bits(&s->pb, 8, lefty = p->data[0][1]);
1311 put_bits(&s->pb, 8, leftu = p->data[1][0]);
1312 put_bits(&s->pb, 8, p->data[0][0]);
1314 lefty = sub_left_prediction(s, s->temp[0], p->data[0], width , 0);
1315 leftu = sub_left_prediction(s, s->temp[1], p->data[1], width2, 0);
1316 leftv = sub_left_prediction(s, s->temp[2], p->data[2], width2, 0);
1318 encode_422_bitstream(s, 2, width-2);
1320 if (s->predictor==MEDIAN) {
1321 int lefttopy, lefttopu, lefttopv;
1323 if (s->interlaced) {
1324 lefty = sub_left_prediction(s, s->temp[0], p->data[0] + p->linesize[0], width , lefty);
1325 leftu = sub_left_prediction(s, s->temp[1], p->data[1] + p->linesize[1], width2, leftu);
1326 leftv = sub_left_prediction(s, s->temp[2], p->data[2] + p->linesize[2], width2, leftv);
1328 encode_422_bitstream(s, 0, width);
1332 lefty = sub_left_prediction(s, s->temp[0], p->data[0] + fake_ystride, 4, lefty);
1333 leftu = sub_left_prediction(s, s->temp[1], p->data[1] + fake_ustride, 2, leftu);
1334 leftv = sub_left_prediction(s, s->temp[2], p->data[2] + fake_vstride, 2, leftv);
1336 encode_422_bitstream(s, 0, 4);
1338 lefttopy = p->data[0][3];
1339 lefttopu = p->data[1][1];
1340 lefttopv = p->data[2][1];
1341 s->dsp.sub_hfyu_median_prediction(s->temp[0], p->data[0]+4, p->data[0] + fake_ystride + 4, width - 4 , &lefty, &lefttopy);
1342 s->dsp.sub_hfyu_median_prediction(s->temp[1], p->data[1]+2, p->data[1] + fake_ustride + 2, width2 - 2, &leftu, &lefttopu);
1343 s->dsp.sub_hfyu_median_prediction(s->temp[2], p->data[2]+2, p->data[2] + fake_vstride + 2, width2 - 2, &leftv, &lefttopv);
1344 encode_422_bitstream(s, 0, width - 4);
1347 for (; y < height; y++,cy++) {
1348 uint8_t *ydst, *udst, *vdst;
1350 if (s->bitstream_bpp == 12) {
1351 while (2 * cy > y) {
1352 ydst = p->data[0] + p->linesize[0] * y;
1353 s->dsp.sub_hfyu_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
1354 encode_gray_bitstream(s, width);
1357 if (y >= height) break;
1359 ydst = p->data[0] + p->linesize[0] * y;
1360 udst = p->data[1] + p->linesize[1] * cy;
1361 vdst = p->data[2] + p->linesize[2] * cy;
1363 s->dsp.sub_hfyu_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
1364 s->dsp.sub_hfyu_median_prediction(s->temp[1], udst - fake_ustride, udst, width2, &leftu, &lefttopu);
1365 s->dsp.sub_hfyu_median_prediction(s->temp[2], vdst - fake_vstride, vdst, width2, &leftv, &lefttopv);
1367 encode_422_bitstream(s, 0, width);
1370 for (cy = y = 1; y < height; y++, cy++) {
1371 uint8_t *ydst, *udst, *vdst;
1373 /* encode a luma only line & y++ */
1374 if (s->bitstream_bpp == 12) {
1375 ydst = p->data[0] + p->linesize[0] * y;
1377 if (s->predictor == PLANE && s->interlaced < y) {
1378 s->dsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
1380 lefty = sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
1382 lefty = sub_left_prediction(s, s->temp[0], ydst, width , lefty);
1384 encode_gray_bitstream(s, width);
1386 if (y >= height) break;
1389 ydst = p->data[0] + p->linesize[0] * y;
1390 udst = p->data[1] + p->linesize[1] * cy;
1391 vdst = p->data[2] + p->linesize[2] * cy;
1393 if (s->predictor == PLANE && s->interlaced < cy) {
1394 s->dsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
1395 s->dsp.diff_bytes(s->temp[2], udst, udst - fake_ustride, width2);
1396 s->dsp.diff_bytes(s->temp[2] + width2, vdst, vdst - fake_vstride, width2);
1398 lefty = sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
1399 leftu = sub_left_prediction(s, s->temp[1], s->temp[2], width2, leftu);
1400 leftv = sub_left_prediction(s, s->temp[2], s->temp[2] + width2, width2, leftv);
1402 lefty = sub_left_prediction(s, s->temp[0], ydst, width , lefty);
1403 leftu = sub_left_prediction(s, s->temp[1], udst, width2, leftu);
1404 leftv = sub_left_prediction(s, s->temp[2], vdst, width2, leftv);
1407 encode_422_bitstream(s, 0, width);
1410 } else if(avctx->pix_fmt == AV_PIX_FMT_RGB32) {
1411 uint8_t *data = p->data[0] + (height - 1) * p->linesize[0];
1412 const int stride = -p->linesize[0];
1413 const int fake_stride = -fake_ystride;
1415 int leftr, leftg, leftb, lefta;
1417 put_bits(&s->pb, 8, lefta = data[A]);
1418 put_bits(&s->pb, 8, leftr = data[R]);
1419 put_bits(&s->pb, 8, leftg = data[G]);
1420 put_bits(&s->pb, 8, leftb = data[B]);
1422 sub_left_prediction_bgr32(s, s->temp[0], data + 4, width - 1, &leftr, &leftg, &leftb, &lefta);
1423 encode_bgra_bitstream(s, width - 1, 4);
1425 for (y = 1; y < s->height; y++) {
1426 uint8_t *dst = data + y*stride;
1427 if (s->predictor == PLANE && s->interlaced < y) {
1428 s->dsp.diff_bytes(s->temp[1], dst, dst - fake_stride, width * 4);
1429 sub_left_prediction_bgr32(s, s->temp[0], s->temp[1], width, &leftr, &leftg, &leftb, &lefta);
1431 sub_left_prediction_bgr32(s, s->temp[0], dst, width, &leftr, &leftg, &leftb, &lefta);
1433 encode_bgra_bitstream(s, width, 4);
1435 }else if(avctx->pix_fmt == AV_PIX_FMT_RGB24){
1436 uint8_t *data = p->data[0] + (height-1)*p->linesize[0];
1437 const int stride = -p->linesize[0];
1438 const int fake_stride = -fake_ystride;
1440 int leftr, leftg, leftb;
1442 put_bits(&s->pb, 8, leftr= data[0]);
1443 put_bits(&s->pb, 8, leftg= data[1]);
1444 put_bits(&s->pb, 8, leftb= data[2]);
1445 put_bits(&s->pb, 8, 0);
1447 sub_left_prediction_rgb24(s, s->temp[0], data+3, width-1, &leftr, &leftg, &leftb);
1448 encode_bgra_bitstream(s, width-1, 3);
1450 for(y=1; y<s->height; y++){
1451 uint8_t *dst = data + y*stride;
1452 if(s->predictor == PLANE && s->interlaced < y){
1453 s->dsp.diff_bytes(s->temp[1], dst, dst - fake_stride, width*3);
1454 sub_left_prediction_rgb24(s, s->temp[0], s->temp[1], width, &leftr, &leftg, &leftb);
1456 sub_left_prediction_rgb24(s, s->temp[0], dst, width, &leftr, &leftg, &leftb);
1458 encode_bgra_bitstream(s, width, 3);
1461 av_log(avctx, AV_LOG_ERROR, "Format not supported!\n");
1465 size += (put_bits_count(&s->pb) + 31) / 8;
1466 put_bits(&s->pb, 16, 0);
1467 put_bits(&s->pb, 15, 0);
1470 if ((s->flags&CODEC_FLAG_PASS1) && (s->picture_number & 31) == 0) {
1472 char *p = avctx->stats_out;
1473 char *end = p + 1024*30;
1474 for (i = 0; i < 3; i++) {
1475 for (j = 0; j < 256; j++) {
1476 snprintf(p, end-p, "%"PRIu64" ", s->stats[i][j]);
1480 snprintf(p, end-p, "\n");
1484 avctx->stats_out[0] = '\0';
1485 if (!(s->avctx->flags2 & CODEC_FLAG2_NO_OUTPUT)) {
1486 flush_put_bits(&s->pb);
1487 s->dsp.bswap_buf((uint32_t*)pkt->data, (uint32_t*)pkt->data, size);
1490 s->picture_number++;
1492 pkt->size = size * 4;
1493 pkt->flags |= AV_PKT_FLAG_KEY;
1499 static av_cold int encode_end(AVCodecContext *avctx)
1501 HYuvContext *s = avctx->priv_data;
1505 av_freep(&avctx->extradata);
1506 av_freep(&avctx->stats_out);
1510 #endif /* CONFIG_HUFFYUV_ENCODER || CONFIG_FFVHUFF_ENCODER */
1512 #if CONFIG_HUFFYUV_DECODER
1513 AVCodec ff_huffyuv_decoder = {
1515 .type = AVMEDIA_TYPE_VIDEO,
1516 .id = AV_CODEC_ID_HUFFYUV,
1517 .priv_data_size = sizeof(HYuvContext),
1518 .init = decode_init,
1519 .close = decode_end,
1520 .decode = decode_frame,
1521 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND |
1522 CODEC_CAP_FRAME_THREADS,
1523 .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
1524 .long_name = NULL_IF_CONFIG_SMALL("Huffyuv / HuffYUV"),
1528 #if CONFIG_FFVHUFF_DECODER
1529 AVCodec ff_ffvhuff_decoder = {
1531 .type = AVMEDIA_TYPE_VIDEO,
1532 .id = AV_CODEC_ID_FFVHUFF,
1533 .priv_data_size = sizeof(HYuvContext),
1534 .init = decode_init,
1535 .close = decode_end,
1536 .decode = decode_frame,
1537 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND |
1538 CODEC_CAP_FRAME_THREADS,
1539 .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
1540 .long_name = NULL_IF_CONFIG_SMALL("Huffyuv FFmpeg variant"),
1544 #if CONFIG_HUFFYUV_ENCODER
1545 AVCodec ff_huffyuv_encoder = {
1547 .type = AVMEDIA_TYPE_VIDEO,
1548 .id = AV_CODEC_ID_HUFFYUV,
1549 .priv_data_size = sizeof(HYuvContext),
1550 .init = encode_init,
1551 .encode2 = encode_frame,
1552 .close = encode_end,
1553 .pix_fmts = (const enum AVPixelFormat[]){
1554 AV_PIX_FMT_YUV422P, AV_PIX_FMT_RGB24, AV_PIX_FMT_RGB32, AV_PIX_FMT_NONE
1556 .long_name = NULL_IF_CONFIG_SMALL("Huffyuv / HuffYUV"),
1560 #if CONFIG_FFVHUFF_ENCODER
1561 AVCodec ff_ffvhuff_encoder = {
1563 .type = AVMEDIA_TYPE_VIDEO,
1564 .id = AV_CODEC_ID_FFVHUFF,
1565 .priv_data_size = sizeof(HYuvContext),
1566 .init = encode_init,
1567 .encode2 = encode_frame,
1568 .close = encode_end,
1569 .pix_fmts = (const enum AVPixelFormat[]){
1570 AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_RGB24, AV_PIX_FMT_RGB32, AV_PIX_FMT_NONE
1572 .long_name = NULL_IF_CONFIG_SMALL("Huffyuv FFmpeg variant"),