]> git.sesse.net Git - ffmpeg/blob - libavcodec/huffyuvenc.c
avcodec/motion_est_template: Fix map cache use in qpel_motion_search()
[ffmpeg] / libavcodec / huffyuvenc.c
1 /*
2  * Copyright (c) 2002-2014 Michael Niedermayer <michaelni@gmx.at>
3  *
4  * see http://www.pcisys.net/~melanson/codecs/huffyuv.txt for a description of
5  * the algorithm used
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  *
23  * yuva, gray, 4:4:4, 4:1:1, 4:1:0 and >8 bit per sample support sponsored by NOA
24  */
25
26 /**
27  * @file
28  * huffyuv encoder
29  */
30
31 #include "avcodec.h"
32 #include "huffyuv.h"
33 #include "huffman.h"
34 #include "huffyuvencdsp.h"
35 #include "internal.h"
36 #include "put_bits.h"
37 #include "libavutil/opt.h"
38 #include "libavutil/pixdesc.h"
39
40 static inline void diff_bytes(HYuvContext *s, uint8_t *dst,
41                               const uint8_t *src0, const uint8_t *src1, int w)
42 {
43     if (s->bps <= 8) {
44         s->hencdsp.diff_bytes(dst, src0, src1, w);
45     } else {
46         s->llviddsp.diff_int16((uint16_t *)dst, (const uint16_t *)src0, (const uint16_t *)src1, s->n - 1, w);
47     }
48 }
49
50 static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst,
51                                       const uint8_t *src, int w, int left)
52 {
53     int i;
54     if (s->bps <= 8) {
55         if (w < 32) {
56             for (i = 0; i < w; i++) {
57                 const int temp = src[i];
58                 dst[i] = temp - left;
59                 left   = temp;
60             }
61             return left;
62         } else {
63             for (i = 0; i < 32; i++) {
64                 const int temp = src[i];
65                 dst[i] = temp - left;
66                 left   = temp;
67             }
68             s->hencdsp.diff_bytes(dst + 32, src + 32, src + 31, w - 32);
69             return src[w-1];
70         }
71     } else {
72         const uint16_t *src16 = (const uint16_t *)src;
73         uint16_t       *dst16 = (      uint16_t *)dst;
74         if (w < 32) {
75             for (i = 0; i < w; i++) {
76                 const int temp = src16[i];
77                 dst16[i] = temp - left;
78                 left   = temp;
79             }
80             return left;
81         } else {
82             for (i = 0; i < 16; i++) {
83                 const int temp = src16[i];
84                 dst16[i] = temp - left;
85                 left   = temp;
86             }
87             s->llviddsp.diff_int16(dst16 + 16, src16 + 16, src16 + 15, s->n - 1, w - 16);
88             return src16[w-1];
89         }
90     }
91 }
92
93 static inline void sub_left_prediction_bgr32(HYuvContext *s, uint8_t *dst,
94                                              const uint8_t *src, int w,
95                                              int *red, int *green, int *blue,
96                                              int *alpha)
97 {
98     int i;
99     int r, g, b, a;
100     r = *red;
101     g = *green;
102     b = *blue;
103     a = *alpha;
104
105     for (i = 0; i < FFMIN(w, 4); i++) {
106         const int rt = src[i * 4 + R];
107         const int gt = src[i * 4 + G];
108         const int bt = src[i * 4 + B];
109         const int at = src[i * 4 + A];
110         dst[i * 4 + R] = rt - r;
111         dst[i * 4 + G] = gt - g;
112         dst[i * 4 + B] = bt - b;
113         dst[i * 4 + A] = at - a;
114         r = rt;
115         g = gt;
116         b = bt;
117         a = at;
118     }
119
120     s->hencdsp.diff_bytes(dst + 16, src + 16, src + 12, w * 4 - 16);
121
122     *red   = src[(w - 1) * 4 + R];
123     *green = src[(w - 1) * 4 + G];
124     *blue  = src[(w - 1) * 4 + B];
125     *alpha = src[(w - 1) * 4 + A];
126 }
127
128 static inline void sub_left_prediction_rgb24(HYuvContext *s, uint8_t *dst,
129                                              uint8_t *src, int w,
130                                              int *red, int *green, int *blue)
131 {
132     int i;
133     int r, g, b;
134     r = *red;
135     g = *green;
136     b = *blue;
137     for (i = 0; i < FFMIN(w, 16); i++) {
138         const int rt = src[i * 3 + 0];
139         const int gt = src[i * 3 + 1];
140         const int bt = src[i * 3 + 2];
141         dst[i * 3 + 0] = rt - r;
142         dst[i * 3 + 1] = gt - g;
143         dst[i * 3 + 2] = bt - b;
144         r = rt;
145         g = gt;
146         b = bt;
147     }
148
149     s->hencdsp.diff_bytes(dst + 48, src + 48, src + 48 - 3, w * 3 - 48);
150
151     *red   = src[(w - 1) * 3 + 0];
152     *green = src[(w - 1) * 3 + 1];
153     *blue  = src[(w - 1) * 3 + 2];
154 }
155
156 static void sub_median_prediction(HYuvContext *s, uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int w, int *left, int *left_top)
157 {
158     if (s->bps <= 8) {
159         s->hencdsp.sub_hfyu_median_pred(dst, src1, src2, w , left, left_top);
160     } else {
161         s->llviddsp.sub_hfyu_median_pred_int16((uint16_t *)dst, (const uint16_t *)src1, (const uint16_t *)src2, s->n - 1, w , left, left_top);
162     }
163 }
164
165 static int store_table(HYuvContext *s, const uint8_t *len, uint8_t *buf)
166 {
167     int i;
168     int index = 0;
169     int n = s->vlc_n;
170
171     for (i = 0; i < n;) {
172         int val = len[i];
173         int repeat = 0;
174
175         for (; i < n && len[i] == val && repeat < 255; i++)
176             repeat++;
177
178         av_assert0(val < 32 && val >0 && repeat < 256 && repeat>0);
179         if (repeat > 7) {
180             buf[index++] = val;
181             buf[index++] = repeat;
182         } else {
183             buf[index++] = val | (repeat << 5);
184         }
185     }
186
187     return index;
188 }
189
190 static int store_huffman_tables(HYuvContext *s, uint8_t *buf)
191 {
192     int i, ret;
193     int size = 0;
194     int count = 3;
195
196     if (s->version > 2)
197         count = 1 + s->alpha + 2*s->chroma;
198
199     for (i = 0; i < count; i++) {
200         if ((ret = ff_huff_gen_len_table(s->len[i], s->stats[i], s->vlc_n, 0)) < 0)
201             return ret;
202
203         if (ff_huffyuv_generate_bits_table(s->bits[i], s->len[i], s->vlc_n) < 0) {
204             return -1;
205         }
206
207         size += store_table(s, s->len[i], buf + size);
208     }
209     return size;
210 }
211
212 static av_cold int encode_init(AVCodecContext *avctx)
213 {
214     HYuvContext *s = avctx->priv_data;
215     int i, j;
216     int ret;
217     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
218
219     ff_huffyuv_common_init(avctx);
220     ff_huffyuvencdsp_init(&s->hencdsp);
221
222     avctx->extradata = av_mallocz(3*MAX_N + 4);
223     if (s->flags&AV_CODEC_FLAG_PASS1) {
224 #define STATS_OUT_SIZE 21*MAX_N*3 + 4
225         avctx->stats_out = av_mallocz(STATS_OUT_SIZE); // 21*256*3(%llu ) + 3(\n) + 1(0) = 16132
226         if (!avctx->stats_out)
227             return AVERROR(ENOMEM);
228     }
229     s->version = 2;
230
231     if (!avctx->extradata)
232         return AVERROR(ENOMEM);
233
234 #if FF_API_CODED_FRAME
235 FF_DISABLE_DEPRECATION_WARNINGS
236     avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
237     avctx->coded_frame->key_frame = 1;
238 FF_ENABLE_DEPRECATION_WARNINGS
239 #endif
240 #if FF_API_PRIVATE_OPT
241 FF_DISABLE_DEPRECATION_WARNINGS
242     if (avctx->context_model == 1)
243         s->context = avctx->context_model;
244 FF_ENABLE_DEPRECATION_WARNINGS
245 #endif
246
247     s->bps = desc->comp[0].depth;
248     s->yuv = !(desc->flags & AV_PIX_FMT_FLAG_RGB) && desc->nb_components >= 2;
249     s->chroma = desc->nb_components > 2;
250     s->alpha = !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA);
251     av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt,
252                                      &s->chroma_h_shift,
253                                      &s->chroma_v_shift);
254
255     switch (avctx->pix_fmt) {
256     case AV_PIX_FMT_YUV420P:
257     case AV_PIX_FMT_YUV422P:
258         if (s->width & 1) {
259             av_log(avctx, AV_LOG_ERROR, "Width must be even for this colorspace.\n");
260             return AVERROR(EINVAL);
261         }
262         s->bitstream_bpp = avctx->pix_fmt == AV_PIX_FMT_YUV420P ? 12 : 16;
263         break;
264     case AV_PIX_FMT_YUV444P:
265     case AV_PIX_FMT_YUV410P:
266     case AV_PIX_FMT_YUV411P:
267     case AV_PIX_FMT_YUV440P:
268     case AV_PIX_FMT_GBRP:
269     case AV_PIX_FMT_GBRP9:
270     case AV_PIX_FMT_GBRP10:
271     case AV_PIX_FMT_GBRP12:
272     case AV_PIX_FMT_GBRP14:
273     case AV_PIX_FMT_GBRP16:
274     case AV_PIX_FMT_GRAY8:
275     case AV_PIX_FMT_GRAY16:
276     case AV_PIX_FMT_YUVA444P:
277     case AV_PIX_FMT_YUVA420P:
278     case AV_PIX_FMT_YUVA422P:
279     case AV_PIX_FMT_GBRAP:
280     case AV_PIX_FMT_GRAY8A:
281     case AV_PIX_FMT_YUV420P9:
282     case AV_PIX_FMT_YUV420P10:
283     case AV_PIX_FMT_YUV420P12:
284     case AV_PIX_FMT_YUV420P14:
285     case AV_PIX_FMT_YUV420P16:
286     case AV_PIX_FMT_YUV422P9:
287     case AV_PIX_FMT_YUV422P10:
288     case AV_PIX_FMT_YUV422P12:
289     case AV_PIX_FMT_YUV422P14:
290     case AV_PIX_FMT_YUV422P16:
291     case AV_PIX_FMT_YUV444P9:
292     case AV_PIX_FMT_YUV444P10:
293     case AV_PIX_FMT_YUV444P12:
294     case AV_PIX_FMT_YUV444P14:
295     case AV_PIX_FMT_YUV444P16:
296     case AV_PIX_FMT_YUVA420P9:
297     case AV_PIX_FMT_YUVA420P10:
298     case AV_PIX_FMT_YUVA420P16:
299     case AV_PIX_FMT_YUVA422P9:
300     case AV_PIX_FMT_YUVA422P10:
301     case AV_PIX_FMT_YUVA422P16:
302     case AV_PIX_FMT_YUVA444P9:
303     case AV_PIX_FMT_YUVA444P10:
304     case AV_PIX_FMT_YUVA444P16:
305         s->version = 3;
306         break;
307     case AV_PIX_FMT_RGB32:
308         s->bitstream_bpp = 32;
309         break;
310     case AV_PIX_FMT_RGB24:
311         s->bitstream_bpp = 24;
312         break;
313     default:
314         av_log(avctx, AV_LOG_ERROR, "format not supported\n");
315         return AVERROR(EINVAL);
316     }
317     s->n = 1<<s->bps;
318     s->vlc_n = FFMIN(s->n, MAX_VLC_N);
319
320     avctx->bits_per_coded_sample = s->bitstream_bpp;
321     s->decorrelate = s->bitstream_bpp >= 24 && !s->yuv && !(desc->flags & AV_PIX_FMT_FLAG_PLANAR);
322 #if FF_API_PRIVATE_OPT
323 FF_DISABLE_DEPRECATION_WARNINGS
324     if (avctx->prediction_method)
325         s->predictor = avctx->prediction_method;
326 FF_ENABLE_DEPRECATION_WARNINGS
327 #endif
328     s->interlaced = avctx->flags & AV_CODEC_FLAG_INTERLACED_ME ? 1 : 0;
329     if (s->context) {
330         if (s->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) {
331             av_log(avctx, AV_LOG_ERROR,
332                    "context=1 is not compatible with "
333                    "2 pass huffyuv encoding\n");
334             return AVERROR(EINVAL);
335         }
336     }
337
338     if (avctx->codec->id == AV_CODEC_ID_HUFFYUV) {
339         if (avctx->pix_fmt == AV_PIX_FMT_YUV420P) {
340             av_log(avctx, AV_LOG_ERROR,
341                    "Error: YV12 is not supported by huffyuv; use "
342                    "vcodec=ffvhuff or format=422p\n");
343             return AVERROR(EINVAL);
344         }
345 #if FF_API_PRIVATE_OPT
346         if (s->context) {
347             av_log(avctx, AV_LOG_ERROR,
348                    "Error: per-frame huffman tables are not supported "
349                    "by huffyuv; use vcodec=ffvhuff\n");
350             return AVERROR(EINVAL);
351         }
352         if (s->version > 2) {
353             av_log(avctx, AV_LOG_ERROR,
354                    "Error: ver>2 is not supported "
355                    "by huffyuv; use vcodec=ffvhuff\n");
356             return AVERROR(EINVAL);
357         }
358 #endif
359         if (s->interlaced != ( s->height > 288 ))
360             av_log(avctx, AV_LOG_INFO,
361                    "using huffyuv 2.2.0 or newer interlacing flag\n");
362     }
363
364     if (s->version > 3 && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
365         av_log(avctx, AV_LOG_ERROR, "Ver > 3 is under development, files encoded with it may not be decodable with future versions!!!\n"
366                "Use vstrict=-2 / -strict -2 to use it anyway.\n");
367         return AVERROR(EINVAL);
368     }
369
370     if (s->bitstream_bpp >= 24 && s->predictor == MEDIAN && s->version <= 2) {
371         av_log(avctx, AV_LOG_ERROR,
372                "Error: RGB is incompatible with median predictor\n");
373         return AVERROR(EINVAL);
374     }
375
376     ((uint8_t*)avctx->extradata)[0] = s->predictor | (s->decorrelate << 6);
377     ((uint8_t*)avctx->extradata)[2] = s->interlaced ? 0x10 : 0x20;
378     if (s->context)
379         ((uint8_t*)avctx->extradata)[2] |= 0x40;
380     if (s->version < 3) {
381         ((uint8_t*)avctx->extradata)[1] = s->bitstream_bpp;
382         ((uint8_t*)avctx->extradata)[3] = 0;
383     } else {
384         ((uint8_t*)avctx->extradata)[1] = ((s->bps-1)<<4) | s->chroma_h_shift | (s->chroma_v_shift<<2);
385         if (s->chroma)
386             ((uint8_t*)avctx->extradata)[2] |= s->yuv ? 1 : 2;
387         if (s->alpha)
388             ((uint8_t*)avctx->extradata)[2] |= 4;
389         ((uint8_t*)avctx->extradata)[3] = 1;
390     }
391     s->avctx->extradata_size = 4;
392
393     if (avctx->stats_in) {
394         char *p = avctx->stats_in;
395
396         for (i = 0; i < 4; i++)
397             for (j = 0; j < s->vlc_n; j++)
398                 s->stats[i][j] = 1;
399
400         for (;;) {
401             for (i = 0; i < 4; i++) {
402                 char *next;
403
404                 for (j = 0; j < s->vlc_n; j++) {
405                     s->stats[i][j] += strtol(p, &next, 0);
406                     if (next == p) return -1;
407                     p = next;
408                 }
409             }
410             if (p[0] == 0 || p[1] == 0 || p[2] == 0) break;
411         }
412     } else {
413         for (i = 0; i < 4; i++)
414             for (j = 0; j < s->vlc_n; j++) {
415                 int d = FFMIN(j, s->vlc_n - j);
416
417                 s->stats[i][j] = 100000000 / (d*d + 1);
418             }
419     }
420
421     ret = store_huffman_tables(s, s->avctx->extradata + s->avctx->extradata_size);
422     if (ret < 0)
423         return ret;
424     s->avctx->extradata_size += ret;
425
426     if (s->context) {
427         for (i = 0; i < 4; i++) {
428             int pels = s->width * s->height / (i ? 40 : 10);
429             for (j = 0; j < s->vlc_n; j++) {
430                 int d = FFMIN(j, s->vlc_n - j);
431                 s->stats[i][j] = pels/(d*d + 1);
432             }
433         }
434     } else {
435         for (i = 0; i < 4; i++)
436             for (j = 0; j < s->vlc_n; j++)
437                 s->stats[i][j]= 0;
438     }
439
440     if (ff_huffyuv_alloc_temp(s)) {
441         ff_huffyuv_common_end(s);
442         return AVERROR(ENOMEM);
443     }
444
445     s->picture_number=0;
446
447     return 0;
448 }
449 static int encode_422_bitstream(HYuvContext *s, int offset, int count)
450 {
451     int i;
452     const uint8_t *y = s->temp[0] + offset;
453     const uint8_t *u = s->temp[1] + offset / 2;
454     const uint8_t *v = s->temp[2] + offset / 2;
455
456     if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < 2 * 4 * count) {
457         av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
458         return -1;
459     }
460
461 #define LOAD4\
462             int y0 = y[2 * i];\
463             int y1 = y[2 * i + 1];\
464             int u0 = u[i];\
465             int v0 = v[i];
466
467     count /= 2;
468
469     if (s->flags & AV_CODEC_FLAG_PASS1) {
470         for(i = 0; i < count; i++) {
471             LOAD4;
472             s->stats[0][y0]++;
473             s->stats[1][u0]++;
474             s->stats[0][y1]++;
475             s->stats[2][v0]++;
476         }
477     }
478     if (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)
479         return 0;
480     if (s->context) {
481         for (i = 0; i < count; i++) {
482             LOAD4;
483             s->stats[0][y0]++;
484             put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]);
485             s->stats[1][u0]++;
486             put_bits(&s->pb, s->len[1][u0], s->bits[1][u0]);
487             s->stats[0][y1]++;
488             put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]);
489             s->stats[2][v0]++;
490             put_bits(&s->pb, s->len[2][v0], s->bits[2][v0]);
491         }
492     } else {
493         for(i = 0; i < count; i++) {
494             LOAD4;
495             put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]);
496             put_bits(&s->pb, s->len[1][u0], s->bits[1][u0]);
497             put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]);
498             put_bits(&s->pb, s->len[2][v0], s->bits[2][v0]);
499         }
500     }
501     return 0;
502 }
503
504 static int encode_plane_bitstream(HYuvContext *s, int width, int plane)
505 {
506     int i, count = width/2;
507
508     if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < count * s->bps / 2) {
509         av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
510         return -1;
511     }
512
513 #define LOADEND\
514             int y0 = s->temp[0][width-1];
515 #define LOADEND_14\
516             int y0 = s->temp16[0][width-1] & mask;
517 #define LOADEND_16\
518             int y0 = s->temp16[0][width-1];
519 #define STATEND\
520             s->stats[plane][y0]++;
521 #define STATEND_16\
522             s->stats[plane][y0>>2]++;
523 #define WRITEEND\
524             put_bits(&s->pb, s->len[plane][y0], s->bits[plane][y0]);
525 #define WRITEEND_16\
526             put_bits(&s->pb, s->len[plane][y0>>2], s->bits[plane][y0>>2]);\
527             put_bits(&s->pb, 2, y0&3);
528
529 #define LOAD2\
530             int y0 = s->temp[0][2 * i];\
531             int y1 = s->temp[0][2 * i + 1];
532 #define LOAD2_14\
533             int y0 = s->temp16[0][2 * i] & mask;\
534             int y1 = s->temp16[0][2 * i + 1] & mask;
535 #define LOAD2_16\
536             int y0 = s->temp16[0][2 * i];\
537             int y1 = s->temp16[0][2 * i + 1];
538 #define STAT2\
539             s->stats[plane][y0]++;\
540             s->stats[plane][y1]++;
541 #define STAT2_16\
542             s->stats[plane][y0>>2]++;\
543             s->stats[plane][y1>>2]++;
544 #define WRITE2\
545             put_bits(&s->pb, s->len[plane][y0], s->bits[plane][y0]);\
546             put_bits(&s->pb, s->len[plane][y1], s->bits[plane][y1]);
547 #define WRITE2_16\
548             put_bits(&s->pb, s->len[plane][y0>>2], s->bits[plane][y0>>2]);\
549             put_bits(&s->pb, 2, y0&3);\
550             put_bits(&s->pb, s->len[plane][y1>>2], s->bits[plane][y1>>2]);\
551             put_bits(&s->pb, 2, y1&3);
552
553     if (s->bps <= 8) {
554     if (s->flags & AV_CODEC_FLAG_PASS1) {
555         for (i = 0; i < count; i++) {
556             LOAD2;
557             STAT2;
558         }
559         if (width&1) {
560             LOADEND;
561             STATEND;
562         }
563     }
564     if (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)
565         return 0;
566
567     if (s->context) {
568         for (i = 0; i < count; i++) {
569             LOAD2;
570             STAT2;
571             WRITE2;
572         }
573         if (width&1) {
574             LOADEND;
575             STATEND;
576             WRITEEND;
577         }
578     } else {
579         for (i = 0; i < count; i++) {
580             LOAD2;
581             WRITE2;
582         }
583         if (width&1) {
584             LOADEND;
585             WRITEEND;
586         }
587     }
588     } else if (s->bps <= 14) {
589         int mask = s->n - 1;
590         if (s->flags & AV_CODEC_FLAG_PASS1) {
591             for (i = 0; i < count; i++) {
592                 LOAD2_14;
593                 STAT2;
594             }
595             if (width&1) {
596                 LOADEND_14;
597                 STATEND;
598             }
599         }
600         if (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)
601             return 0;
602
603         if (s->context) {
604             for (i = 0; i < count; i++) {
605                 LOAD2_14;
606                 STAT2;
607                 WRITE2;
608             }
609             if (width&1) {
610                 LOADEND_14;
611                 STATEND;
612                 WRITEEND;
613             }
614         } else {
615             for (i = 0; i < count; i++) {
616                 LOAD2_14;
617                 WRITE2;
618             }
619             if (width&1) {
620                 LOADEND_14;
621                 WRITEEND;
622             }
623         }
624     } else {
625         if (s->flags & AV_CODEC_FLAG_PASS1) {
626             for (i = 0; i < count; i++) {
627                 LOAD2_16;
628                 STAT2_16;
629             }
630             if (width&1) {
631                 LOADEND_16;
632                 STATEND_16;
633             }
634         }
635         if (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)
636             return 0;
637
638         if (s->context) {
639             for (i = 0; i < count; i++) {
640                 LOAD2_16;
641                 STAT2_16;
642                 WRITE2_16;
643             }
644             if (width&1) {
645                 LOADEND_16;
646                 STATEND_16;
647                 WRITEEND_16;
648             }
649         } else {
650             for (i = 0; i < count; i++) {
651                 LOAD2_16;
652                 WRITE2_16;
653             }
654             if (width&1) {
655                 LOADEND_16;
656                 WRITEEND_16;
657             }
658         }
659     }
660 #undef LOAD2
661 #undef STAT2
662 #undef WRITE2
663     return 0;
664 }
665
666 static int encode_gray_bitstream(HYuvContext *s, int count)
667 {
668     int i;
669
670     if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) < 4 * count) {
671         av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
672         return -1;
673     }
674
675 #define LOAD2\
676             int y0 = s->temp[0][2 * i];\
677             int y1 = s->temp[0][2 * i + 1];
678 #define STAT2\
679             s->stats[0][y0]++;\
680             s->stats[0][y1]++;
681 #define WRITE2\
682             put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]);\
683             put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]);
684
685     count /= 2;
686
687     if (s->flags & AV_CODEC_FLAG_PASS1) {
688         for (i = 0; i < count; i++) {
689             LOAD2;
690             STAT2;
691         }
692     }
693     if (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)
694         return 0;
695
696     if (s->context) {
697         for (i = 0; i < count; i++) {
698             LOAD2;
699             STAT2;
700             WRITE2;
701         }
702     } else {
703         for (i = 0; i < count; i++) {
704             LOAD2;
705             WRITE2;
706         }
707     }
708     return 0;
709 }
710
711 static inline int encode_bgra_bitstream(HYuvContext *s, int count, int planes)
712 {
713     int i;
714
715     if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb) >> 3) <
716         4 * planes * count) {
717         av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
718         return -1;
719     }
720
721 #define LOAD_GBRA                                                       \
722     int g = s->temp[0][planes == 3 ? 3 * i + 1 : 4 * i + G];            \
723     int b =(s->temp[0][planes == 3 ? 3 * i + 2 : 4 * i + B] - g) & 0xFF;\
724     int r =(s->temp[0][planes == 3 ? 3 * i + 0 : 4 * i + R] - g) & 0xFF;\
725     int a = s->temp[0][planes * i + A];
726
727 #define STAT_BGRA                                                       \
728     s->stats[0][b]++;                                                   \
729     s->stats[1][g]++;                                                   \
730     s->stats[2][r]++;                                                   \
731     if (planes == 4)                                                    \
732         s->stats[2][a]++;
733
734 #define WRITE_GBRA                                                      \
735     put_bits(&s->pb, s->len[1][g], s->bits[1][g]);                      \
736     put_bits(&s->pb, s->len[0][b], s->bits[0][b]);                      \
737     put_bits(&s->pb, s->len[2][r], s->bits[2][r]);                      \
738     if (planes == 4)                                                    \
739         put_bits(&s->pb, s->len[2][a], s->bits[2][a]);
740
741     if ((s->flags & AV_CODEC_FLAG_PASS1) &&
742         (s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)) {
743         for (i = 0; i < count; i++) {
744             LOAD_GBRA;
745             STAT_BGRA;
746         }
747     } else if (s->context || (s->flags & AV_CODEC_FLAG_PASS1)) {
748         for (i = 0; i < count; i++) {
749             LOAD_GBRA;
750             STAT_BGRA;
751             WRITE_GBRA;
752         }
753     } else {
754         for (i = 0; i < count; i++) {
755             LOAD_GBRA;
756             WRITE_GBRA;
757         }
758     }
759     return 0;
760 }
761
762 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
763                         const AVFrame *pict, int *got_packet)
764 {
765     HYuvContext *s = avctx->priv_data;
766     const int width = s->width;
767     const int width2 = s->width>>1;
768     const int height = s->height;
769     const int fake_ystride = s->interlaced ? pict->linesize[0]*2  : pict->linesize[0];
770     const int fake_ustride = s->interlaced ? pict->linesize[1]*2  : pict->linesize[1];
771     const int fake_vstride = s->interlaced ? pict->linesize[2]*2  : pict->linesize[2];
772     const AVFrame * const p = pict;
773     int i, j, size = 0, ret;
774
775     if ((ret = ff_alloc_packet2(avctx, pkt, width * height * 3 * 4 + AV_INPUT_BUFFER_MIN_SIZE, 0)) < 0)
776         return ret;
777
778     if (s->context) {
779         size = store_huffman_tables(s, pkt->data);
780         if (size < 0)
781             return size;
782
783         for (i = 0; i < 4; i++)
784             for (j = 0; j < s->vlc_n; j++)
785                 s->stats[i][j] >>= 1;
786     }
787
788     init_put_bits(&s->pb, pkt->data + size, pkt->size - size);
789
790     if (avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
791         avctx->pix_fmt == AV_PIX_FMT_YUV420P) {
792         int lefty, leftu, leftv, y, cy;
793
794         put_bits(&s->pb, 8, leftv = p->data[2][0]);
795         put_bits(&s->pb, 8, lefty = p->data[0][1]);
796         put_bits(&s->pb, 8, leftu = p->data[1][0]);
797         put_bits(&s->pb, 8,         p->data[0][0]);
798
799         lefty = sub_left_prediction(s, s->temp[0], p->data[0], width , 0);
800         leftu = sub_left_prediction(s, s->temp[1], p->data[1], width2, 0);
801         leftv = sub_left_prediction(s, s->temp[2], p->data[2], width2, 0);
802
803         encode_422_bitstream(s, 2, width-2);
804
805         if (s->predictor==MEDIAN) {
806             int lefttopy, lefttopu, lefttopv;
807             cy = y = 1;
808             if (s->interlaced) {
809                 lefty = sub_left_prediction(s, s->temp[0], p->data[0] + p->linesize[0], width , lefty);
810                 leftu = sub_left_prediction(s, s->temp[1], p->data[1] + p->linesize[1], width2, leftu);
811                 leftv = sub_left_prediction(s, s->temp[2], p->data[2] + p->linesize[2], width2, leftv);
812
813                 encode_422_bitstream(s, 0, width);
814                 y++; cy++;
815             }
816
817             lefty = sub_left_prediction(s, s->temp[0], p->data[0] + fake_ystride, 4, lefty);
818             leftu = sub_left_prediction(s, s->temp[1], p->data[1] + fake_ustride, 2, leftu);
819             leftv = sub_left_prediction(s, s->temp[2], p->data[2] + fake_vstride, 2, leftv);
820
821             encode_422_bitstream(s, 0, 4);
822
823             lefttopy = p->data[0][3];
824             lefttopu = p->data[1][1];
825             lefttopv = p->data[2][1];
826             s->hencdsp.sub_hfyu_median_pred(s->temp[0], p->data[0] + 4, p->data[0] + fake_ystride + 4, width  - 4, &lefty, &lefttopy);
827             s->hencdsp.sub_hfyu_median_pred(s->temp[1], p->data[1] + 2, p->data[1] + fake_ustride + 2, width2 - 2, &leftu, &lefttopu);
828             s->hencdsp.sub_hfyu_median_pred(s->temp[2], p->data[2] + 2, p->data[2] + fake_vstride + 2, width2 - 2, &leftv, &lefttopv);
829             encode_422_bitstream(s, 0, width - 4);
830             y++; cy++;
831
832             for (; y < height; y++,cy++) {
833                 uint8_t *ydst, *udst, *vdst;
834
835                 if (s->bitstream_bpp == 12) {
836                     while (2 * cy > y) {
837                         ydst = p->data[0] + p->linesize[0] * y;
838                         s->hencdsp.sub_hfyu_median_pred(s->temp[0], ydst - fake_ystride, ydst, width, &lefty, &lefttopy);
839                         encode_gray_bitstream(s, width);
840                         y++;
841                     }
842                     if (y >= height) break;
843                 }
844                 ydst = p->data[0] + p->linesize[0] * y;
845                 udst = p->data[1] + p->linesize[1] * cy;
846                 vdst = p->data[2] + p->linesize[2] * cy;
847
848                 s->hencdsp.sub_hfyu_median_pred(s->temp[0], ydst - fake_ystride, ydst, width,  &lefty, &lefttopy);
849                 s->hencdsp.sub_hfyu_median_pred(s->temp[1], udst - fake_ustride, udst, width2, &leftu, &lefttopu);
850                 s->hencdsp.sub_hfyu_median_pred(s->temp[2], vdst - fake_vstride, vdst, width2, &leftv, &lefttopv);
851
852                 encode_422_bitstream(s, 0, width);
853             }
854         } else {
855             for (cy = y = 1; y < height; y++, cy++) {
856                 uint8_t *ydst, *udst, *vdst;
857
858                 /* encode a luma only line & y++ */
859                 if (s->bitstream_bpp == 12) {
860                     ydst = p->data[0] + p->linesize[0] * y;
861
862                     if (s->predictor == PLANE && s->interlaced < y) {
863                         s->hencdsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
864
865                         lefty = sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
866                     } else {
867                         lefty = sub_left_prediction(s, s->temp[0], ydst, width , lefty);
868                     }
869                     encode_gray_bitstream(s, width);
870                     y++;
871                     if (y >= height) break;
872                 }
873
874                 ydst = p->data[0] + p->linesize[0] * y;
875                 udst = p->data[1] + p->linesize[1] * cy;
876                 vdst = p->data[2] + p->linesize[2] * cy;
877
878                 if (s->predictor == PLANE && s->interlaced < cy) {
879                     s->hencdsp.diff_bytes(s->temp[1],          ydst, ydst - fake_ystride, width);
880                     s->hencdsp.diff_bytes(s->temp[2],          udst, udst - fake_ustride, width2);
881                     s->hencdsp.diff_bytes(s->temp[2] + width2, vdst, vdst - fake_vstride, width2);
882
883                     lefty = sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
884                     leftu = sub_left_prediction(s, s->temp[1], s->temp[2], width2, leftu);
885                     leftv = sub_left_prediction(s, s->temp[2], s->temp[2] + width2, width2, leftv);
886                 } else {
887                     lefty = sub_left_prediction(s, s->temp[0], ydst, width , lefty);
888                     leftu = sub_left_prediction(s, s->temp[1], udst, width2, leftu);
889                     leftv = sub_left_prediction(s, s->temp[2], vdst, width2, leftv);
890                 }
891
892                 encode_422_bitstream(s, 0, width);
893             }
894         }
895     } else if(avctx->pix_fmt == AV_PIX_FMT_RGB32) {
896         uint8_t *data = p->data[0] + (height - 1) * p->linesize[0];
897         const int stride = -p->linesize[0];
898         const int fake_stride = -fake_ystride;
899         int y;
900         int leftr, leftg, leftb, lefta;
901
902         put_bits(&s->pb, 8, lefta = data[A]);
903         put_bits(&s->pb, 8, leftr = data[R]);
904         put_bits(&s->pb, 8, leftg = data[G]);
905         put_bits(&s->pb, 8, leftb = data[B]);
906
907         sub_left_prediction_bgr32(s, s->temp[0], data + 4, width - 1,
908                                   &leftr, &leftg, &leftb, &lefta);
909         encode_bgra_bitstream(s, width - 1, 4);
910
911         for (y = 1; y < s->height; y++) {
912             uint8_t *dst = data + y*stride;
913             if (s->predictor == PLANE && s->interlaced < y) {
914                 s->hencdsp.diff_bytes(s->temp[1], dst, dst - fake_stride, width * 4);
915                 sub_left_prediction_bgr32(s, s->temp[0], s->temp[1], width,
916                                           &leftr, &leftg, &leftb, &lefta);
917             } else {
918                 sub_left_prediction_bgr32(s, s->temp[0], dst, width,
919                                           &leftr, &leftg, &leftb, &lefta);
920             }
921             encode_bgra_bitstream(s, width, 4);
922         }
923     } else if (avctx->pix_fmt == AV_PIX_FMT_RGB24) {
924         uint8_t *data = p->data[0] + (height - 1) * p->linesize[0];
925         const int stride = -p->linesize[0];
926         const int fake_stride = -fake_ystride;
927         int y;
928         int leftr, leftg, leftb;
929
930         put_bits(&s->pb, 8, leftr = data[0]);
931         put_bits(&s->pb, 8, leftg = data[1]);
932         put_bits(&s->pb, 8, leftb = data[2]);
933         put_bits(&s->pb, 8, 0);
934
935         sub_left_prediction_rgb24(s, s->temp[0], data + 3, width - 1,
936                                   &leftr, &leftg, &leftb);
937         encode_bgra_bitstream(s, width-1, 3);
938
939         for (y = 1; y < s->height; y++) {
940             uint8_t *dst = data + y * stride;
941             if (s->predictor == PLANE && s->interlaced < y) {
942                 s->hencdsp.diff_bytes(s->temp[1], dst, dst - fake_stride,
943                                       width * 3);
944                 sub_left_prediction_rgb24(s, s->temp[0], s->temp[1], width,
945                                           &leftr, &leftg, &leftb);
946             } else {
947                 sub_left_prediction_rgb24(s, s->temp[0], dst, width,
948                                           &leftr, &leftg, &leftb);
949             }
950             encode_bgra_bitstream(s, width, 3);
951         }
952     } else if (s->version > 2) {
953         int plane;
954         for (plane = 0; plane < 1 + 2*s->chroma + s->alpha; plane++) {
955             int left, y;
956             int w = width;
957             int h = height;
958             int fake_stride = fake_ystride;
959
960             if (s->chroma && (plane == 1 || plane == 2)) {
961                 w >>= s->chroma_h_shift;
962                 h >>= s->chroma_v_shift;
963                 fake_stride = plane == 1 ? fake_ustride : fake_vstride;
964             }
965
966             left = sub_left_prediction(s, s->temp[0], p->data[plane], w , 0);
967
968             encode_plane_bitstream(s, w, plane);
969
970             if (s->predictor==MEDIAN) {
971                 int lefttop;
972                 y = 1;
973                 if (s->interlaced) {
974                     left = sub_left_prediction(s, s->temp[0], p->data[plane] + p->linesize[plane], w , left);
975
976                     encode_plane_bitstream(s, w, plane);
977                     y++;
978                 }
979
980                 lefttop = p->data[plane][0];
981
982                 for (; y < h; y++) {
983                     uint8_t *dst = p->data[plane] + p->linesize[plane] * y;
984
985                     sub_median_prediction(s, s->temp[0], dst - fake_stride, dst, w , &left, &lefttop);
986
987                     encode_plane_bitstream(s, w, plane);
988                 }
989             } else {
990                 for (y = 1; y < h; y++) {
991                     uint8_t *dst = p->data[plane] + p->linesize[plane] * y;
992
993                     if (s->predictor == PLANE && s->interlaced < y) {
994                         diff_bytes(s, s->temp[1], dst, dst - fake_stride, w);
995
996                         left = sub_left_prediction(s, s->temp[0], s->temp[1], w , left);
997                     } else {
998                         left = sub_left_prediction(s, s->temp[0], dst, w , left);
999                     }
1000
1001                     encode_plane_bitstream(s, w, plane);
1002                 }
1003             }
1004         }
1005     } else {
1006         av_log(avctx, AV_LOG_ERROR, "Format not supported!\n");
1007     }
1008     emms_c();
1009
1010     size += (put_bits_count(&s->pb) + 31) / 8;
1011     put_bits(&s->pb, 16, 0);
1012     put_bits(&s->pb, 15, 0);
1013     size /= 4;
1014
1015     if ((s->flags & AV_CODEC_FLAG_PASS1) && (s->picture_number & 31) == 0) {
1016         int j;
1017         char *p = avctx->stats_out;
1018         char *end = p + STATS_OUT_SIZE;
1019         for (i = 0; i < 4; i++) {
1020             for (j = 0; j < s->vlc_n; j++) {
1021                 snprintf(p, end-p, "%"PRIu64" ", s->stats[i][j]);
1022                 p += strlen(p);
1023                 s->stats[i][j]= 0;
1024             }
1025             snprintf(p, end-p, "\n");
1026             p++;
1027             if (end <= p)
1028                 return AVERROR(ENOMEM);
1029         }
1030     } else if (avctx->stats_out)
1031         avctx->stats_out[0] = '\0';
1032     if (!(s->avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT)) {
1033         flush_put_bits(&s->pb);
1034         s->bdsp.bswap_buf((uint32_t *) pkt->data, (uint32_t *) pkt->data, size);
1035     }
1036
1037     s->picture_number++;
1038
1039     pkt->size   = size * 4;
1040     pkt->flags |= AV_PKT_FLAG_KEY;
1041     *got_packet = 1;
1042
1043     return 0;
1044 }
1045
1046 static av_cold int encode_end(AVCodecContext *avctx)
1047 {
1048     HYuvContext *s = avctx->priv_data;
1049
1050     ff_huffyuv_common_end(s);
1051
1052     av_freep(&avctx->extradata);
1053     av_freep(&avctx->stats_out);
1054
1055     return 0;
1056 }
1057
1058 #define OFFSET(x) offsetof(HYuvContext, x)
1059 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1060
1061 #define COMMON_OPTIONS \
1062     { "non_deterministic", "Allow multithreading for e.g. context=1 at the expense of determinism", \
1063       OFFSET(non_determ), AV_OPT_TYPE_BOOL, { .i64 = 1 }, \
1064       0, 1, VE }, \
1065     { "pred", "Prediction method", OFFSET(predictor), AV_OPT_TYPE_INT, { .i64 = LEFT }, LEFT, MEDIAN, VE, "pred" }, \
1066         { "left",   NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LEFT },   INT_MIN, INT_MAX, VE, "pred" }, \
1067         { "plane",  NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PLANE },  INT_MIN, INT_MAX, VE, "pred" }, \
1068         { "median", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MEDIAN }, INT_MIN, INT_MAX, VE, "pred" }, \
1069
1070 static const AVOption normal_options[] = {
1071     COMMON_OPTIONS
1072     { NULL },
1073 };
1074
1075 static const AVOption ff_options[] = {
1076     COMMON_OPTIONS
1077     { "context", "Set per-frame huffman tables", OFFSET(context), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
1078     { NULL },
1079 };
1080
1081 static const AVClass normal_class = {
1082     .class_name = "huffyuv",
1083     .item_name  = av_default_item_name,
1084     .option     = normal_options,
1085     .version    = LIBAVUTIL_VERSION_INT,
1086 };
1087
1088 static const AVClass ff_class = {
1089     .class_name = "ffvhuff",
1090     .item_name  = av_default_item_name,
1091     .option     = ff_options,
1092     .version    = LIBAVUTIL_VERSION_INT,
1093 };
1094
1095 AVCodec ff_huffyuv_encoder = {
1096     .name           = "huffyuv",
1097     .long_name      = NULL_IF_CONFIG_SMALL("Huffyuv / HuffYUV"),
1098     .type           = AVMEDIA_TYPE_VIDEO,
1099     .id             = AV_CODEC_ID_HUFFYUV,
1100     .priv_data_size = sizeof(HYuvContext),
1101     .init           = encode_init,
1102     .encode2        = encode_frame,
1103     .close          = encode_end,
1104     .capabilities   = AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_INTRA_ONLY,
1105     .priv_class     = &normal_class,
1106     .pix_fmts       = (const enum AVPixelFormat[]){
1107         AV_PIX_FMT_YUV422P, AV_PIX_FMT_RGB24,
1108         AV_PIX_FMT_RGB32, AV_PIX_FMT_NONE
1109     },
1110     .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
1111                       FF_CODEC_CAP_INIT_CLEANUP,
1112 };
1113
1114 #if CONFIG_FFVHUFF_ENCODER
1115 AVCodec ff_ffvhuff_encoder = {
1116     .name           = "ffvhuff",
1117     .long_name      = NULL_IF_CONFIG_SMALL("Huffyuv FFmpeg variant"),
1118     .type           = AVMEDIA_TYPE_VIDEO,
1119     .id             = AV_CODEC_ID_FFVHUFF,
1120     .priv_data_size = sizeof(HYuvContext),
1121     .init           = encode_init,
1122     .encode2        = encode_frame,
1123     .close          = encode_end,
1124     .capabilities   = AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_INTRA_ONLY,
1125     .priv_class     = &ff_class,
1126     .pix_fmts       = (const enum AVPixelFormat[]){
1127         AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV411P,
1128         AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P,
1129         AV_PIX_FMT_GBRP,
1130         AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14,
1131         AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY16,
1132         AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P,
1133         AV_PIX_FMT_GBRAP,
1134         AV_PIX_FMT_GRAY8A,
1135         AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV420P16,
1136         AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV422P16,
1137         AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV444P16,
1138         AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
1139         AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P16,
1140         AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P16,
1141         AV_PIX_FMT_RGB24,
1142         AV_PIX_FMT_RGB32, AV_PIX_FMT_NONE
1143     },
1144     .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
1145                       FF_CODEC_CAP_INIT_CLEANUP,
1146 };
1147 #endif