Browse code

avcodec/huffyuv: support AV_PIX_FMT_YUV(A)4XYP16 and GRAY16

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>

Michael Niedermayer authored on 2014/01/23 09:41:39
Showing 3 changed files
... ...
@@ -39,8 +39,9 @@
39 39
 
40 40
 #define VLC_BITS 11
41 41
 
42
-#define MAX_BITS 14
42
+#define MAX_BITS 16
43 43
 #define MAX_N (1<<MAX_BITS)
44
+#define MAX_VLC_N 16384
44 45
 
45 46
 #if HAVE_BIGENDIAN
46 47
 #define B 3
... ...
@@ -73,6 +74,7 @@ typedef struct HYuvContext {
73 73
     int bgr32;                              //use bgr32 instead of bgr24
74 74
     int bps;
75 75
     int n;                                  // 1<<bps
76
+    int vlc_n;                              // number of vlc codes (FFMIN(1<<bps, MAX_VLC_N))
76 77
     int alpha;
77 78
     int chroma;
78 79
     int yuv;
... ...
@@ -85,9 +87,9 @@ typedef struct HYuvContext {
85 85
     int last_slice_end;
86 86
     uint8_t *temp[3];
87 87
     uint16_t *temp16[3];                    ///< identical to temp but 16bit type
88
-    uint64_t stats[4][MAX_N];
89
-    uint8_t len[4][MAX_N];
90
-    uint32_t bits[4][MAX_N];
88
+    uint64_t stats[4][MAX_VLC_N];
89
+    uint8_t len[4][MAX_VLC_N];
90
+    uint32_t bits[4][MAX_VLC_N];
91 91
     uint32_t pix_bgr_map[1<<VLC_BITS];
92 92
     VLC vlc[8];                             //Y,U,V,A,YY,YU,YV,AA
93 93
     uint8_t *bitstream_buffer;
... ...
@@ -120,12 +120,12 @@ static int generate_joint_tables(HYuvContext *s)
120 120
         int p, i, y, u;
121 121
         for (p = 0; p < 4; p++) {
122 122
             int p0 = s->version > 2 ? p : 0;
123
-            for (i = y = 0; y < s->n; y++) {
123
+            for (i = y = 0; y < s->vlc_n; y++) {
124 124
                 int len0 = s->len[p0][y];
125 125
                 int limit = VLC_BITS - len0;
126 126
                 if(limit <= 0 || !len0)
127 127
                     continue;
128
-                for (u = 0; u < s->n; u++) {
128
+                for (u = 0; u < s->vlc_n; u++) {
129 129
                     int len1 = s->len[p][u];
130 130
                     if (len1 > limit || !len1)
131 131
                         continue;
... ...
@@ -201,13 +201,13 @@ static int read_huffman_tables(HYuvContext *s, const uint8_t *src, int length)
201 201
         count = 1 + s->alpha + 2*s->chroma;
202 202
 
203 203
     for (i = 0; i < count; i++) {
204
-        if (read_len_table(s->len[i], &gb, s->n) < 0)
204
+        if (read_len_table(s->len[i], &gb, s->vlc_n) < 0)
205 205
             return -1;
206
-        if (ff_huffyuv_generate_bits_table(s->bits[i], s->len[i], s->n) < 0) {
206
+        if (ff_huffyuv_generate_bits_table(s->bits[i], s->len[i], s->vlc_n) < 0) {
207 207
             return -1;
208 208
         }
209 209
         ff_free_vlc(&s->vlc[i]);
210
-        if ((ret = init_vlc(&s->vlc[i], VLC_BITS, s->n, s->len[i], 1, 1,
210
+        if ((ret = init_vlc(&s->vlc[i], VLC_BITS, s->vlc_n, s->len[i], 1, 1,
211 211
                            s->bits[i], 4, 4, 0)) < 0)
212 212
             return ret;
213 213
     }
... ...
@@ -280,6 +280,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
280 280
 
281 281
     s->bps = 8;
282 282
     s->n = 1<<s->bps;
283
+    s->vlc_n = FFMIN(s->n, MAX_VLC_N);
283 284
     s->chroma = 1;
284 285
     if (s->version >= 2) {
285 286
         int method, interlace;
... ...
@@ -297,6 +298,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
297 297
         } else {
298 298
             s->bps = (avctx->extradata[1] >> 4) + 1;
299 299
             s->n = 1<<s->bps;
300
+            s->vlc_n = FFMIN(s->n, MAX_VLC_N);
300 301
             s->chroma_h_shift = avctx->extradata[1] & 3;
301 302
             s->chroma_v_shift = (avctx->extradata[1] >> 2) & 3;
302 303
             s->yuv   = !!(((uint8_t*)avctx->extradata)[2] & 1);
... ...
@@ -374,6 +376,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
374 374
         case 0x070:
375 375
             avctx->pix_fmt = AV_PIX_FMT_GRAY8;
376 376
             break;
377
+        case 0x0F0:
378
+            avctx->pix_fmt = AV_PIX_FMT_GRAY16;
379
+            break;
377 380
         case 0x170:
378 381
             avctx->pix_fmt = AV_PIX_FMT_GRAY8A;
379 382
             break;
... ...
@@ -398,6 +403,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
398 398
         case 0x6D0:
399 399
             avctx->pix_fmt = AV_PIX_FMT_YUV444P14;
400 400
             break;
401
+        case 0x6F0:
402
+            avctx->pix_fmt = AV_PIX_FMT_YUV444P16;
403
+            break;
401 404
         case 0x671:
402 405
             avctx->pix_fmt = AV_PIX_FMT_YUV422P;
403 406
             break;
... ...
@@ -413,6 +421,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
413 413
         case 0x6D1:
414 414
             avctx->pix_fmt = AV_PIX_FMT_YUV422P14;
415 415
             break;
416
+        case 0x6F1:
417
+            avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
418
+            break;
416 419
         case 0x672:
417 420
             avctx->pix_fmt = AV_PIX_FMT_YUV411P;
418 421
             break;
... ...
@@ -434,6 +445,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
434 434
         case 0x6D5:
435 435
             avctx->pix_fmt = AV_PIX_FMT_YUV420P14;
436 436
             break;
437
+        case 0x6F5:
438
+            avctx->pix_fmt = AV_PIX_FMT_YUV420P16;
439
+            break;
437 440
         case 0x67A:
438 441
             avctx->pix_fmt = AV_PIX_FMT_YUV410P;
439 442
             break;
... ...
@@ -446,6 +460,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
446 446
         case 0x790:
447 447
             avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
448 448
             break;
449
+        case 0x7F0:
450
+            avctx->pix_fmt = AV_PIX_FMT_YUVA444P16;
451
+            break;
449 452
         case 0x771:
450 453
             avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
451 454
             break;
... ...
@@ -455,6 +472,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
455 455
         case 0x791:
456 456
             avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
457 457
             break;
458
+        case 0x7F1:
459
+            avctx->pix_fmt = AV_PIX_FMT_YUVA422P16;
460
+            break;
458 461
         case 0x775:
459 462
             avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
460 463
             break;
... ...
@@ -464,6 +484,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
464 464
         case 0x795:
465 465
             avctx->pix_fmt = AV_PIX_FMT_YUVA420P10;
466 466
             break;
467
+        case 0x7F5:
468
+            avctx->pix_fmt = AV_PIX_FMT_YUVA420P16;
469
+            break;
467 470
         default:
468 471
             return AVERROR_INVALIDDATA;
469 472
         }
... ...
@@ -557,10 +580,17 @@ static void decode_422_bitstream(HYuvContext *s, int count)
557 557
         dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3);\
558 558
     }\
559 559
 }
560
-#define READ_2PIX_PLANE16(dst0, dst1, plane){\
560
+#define READ_2PIX_PLANE14(dst0, dst1, plane){\
561 561
     dst0 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3);\
562 562
     dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3);\
563 563
 }
564
+
565
+#define READ_2PIX_PLANE16(dst0, dst1, plane){\
566
+    dst0 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)<<2;\
567
+    dst0 += get_bits(&s->gb, 2);\
568
+    dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)<<2;\
569
+    dst1 += get_bits(&s->gb, 2);\
570
+}
564 571
 static void decode_plane_bitstream(HYuvContext *s, int count, int plane)
565 572
 {
566 573
     int i;
... ...
@@ -577,6 +607,16 @@ static void decode_plane_bitstream(HYuvContext *s, int count, int plane)
577 577
                 READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane);
578 578
             }
579 579
         }
580
+    } else if (s->bps <= 14) {
581
+        if (count >= (get_bits_left(&s->gb)) / (31 * 2)) {
582
+            for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
583
+                READ_2PIX_PLANE14(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane);
584
+            }
585
+        } else {
586
+            for(i=0; i<count; i++){
587
+                READ_2PIX_PLANE14(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane);
588
+            }
589
+        }
580 590
     } else {
581 591
         if (count >= (get_bits_left(&s->gb)) / (31 * 2)) {
582 592
             for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
... ...
@@ -164,7 +164,7 @@ static int store_table(HYuvContext *s, const uint8_t *len, uint8_t *buf)
164 164
 {
165 165
     int i;
166 166
     int index = 0;
167
-    int n = s->n;
167
+    int n = s->vlc_n;
168 168
 
169 169
     for (i = 0; i < n;) {
170 170
         int val = len[i];
... ...
@@ -195,10 +195,10 @@ static int store_huffman_tables(HYuvContext *s, uint8_t *buf)
195 195
         count = 1 + s->alpha + 2*s->chroma;
196 196
 
197 197
     for (i = 0; i < count; i++) {
198
-        if ((ret = ff_huff_gen_len_table(s->len[i], s->stats[i], s->n)) < 0)
198
+        if ((ret = ff_huff_gen_len_table(s->len[i], s->stats[i], s->vlc_n)) < 0)
199 199
             return ret;
200 200
 
201
-        if (ff_huffyuv_generate_bits_table(s->bits[i], s->len[i], s->n) < 0) {
201
+        if (ff_huffyuv_generate_bits_table(s->bits[i], s->len[i], s->vlc_n) < 0) {
202 202
             return -1;
203 203
         }
204 204
 
... ...
@@ -254,6 +254,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
254 254
     case AV_PIX_FMT_YUV440P:
255 255
     case AV_PIX_FMT_GBRP:
256 256
     case AV_PIX_FMT_GRAY8:
257
+    case AV_PIX_FMT_GRAY16:
257 258
     case AV_PIX_FMT_YUVA444P:
258 259
     case AV_PIX_FMT_YUVA420P:
259 260
     case AV_PIX_FMT_YUVA422P:
... ...
@@ -263,20 +264,26 @@ static av_cold int encode_init(AVCodecContext *avctx)
263 263
     case AV_PIX_FMT_YUV420P10:
264 264
     case AV_PIX_FMT_YUV420P12:
265 265
     case AV_PIX_FMT_YUV420P14:
266
+    case AV_PIX_FMT_YUV420P16:
266 267
     case AV_PIX_FMT_YUV422P9:
267 268
     case AV_PIX_FMT_YUV422P10:
268 269
     case AV_PIX_FMT_YUV422P12:
269 270
     case AV_PIX_FMT_YUV422P14:
271
+    case AV_PIX_FMT_YUV422P16:
270 272
     case AV_PIX_FMT_YUV444P9:
271 273
     case AV_PIX_FMT_YUV444P10:
272 274
     case AV_PIX_FMT_YUV444P12:
273 275
     case AV_PIX_FMT_YUV444P14:
276
+    case AV_PIX_FMT_YUV444P16:
274 277
     case AV_PIX_FMT_YUVA420P9:
275 278
     case AV_PIX_FMT_YUVA420P10:
279
+    case AV_PIX_FMT_YUVA420P16:
276 280
     case AV_PIX_FMT_YUVA422P9:
277 281
     case AV_PIX_FMT_YUVA422P10:
282
+    case AV_PIX_FMT_YUVA422P16:
278 283
     case AV_PIX_FMT_YUVA444P9:
279 284
     case AV_PIX_FMT_YUVA444P10:
285
+    case AV_PIX_FMT_YUVA444P16:
280 286
         s->version = 3;
281 287
         break;
282 288
     case AV_PIX_FMT_RGB32:
... ...
@@ -290,6 +297,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
290 290
         return AVERROR(EINVAL);
291 291
     }
292 292
     s->n = 1<<s->bps;
293
+    s->vlc_n = FFMIN(s->n, MAX_VLC_N);
293 294
 
294 295
     avctx->bits_per_coded_sample = s->bitstream_bpp;
295 296
     s->decorrelate = s->bitstream_bpp >= 24 && !s->yuv && avctx->pix_fmt != AV_PIX_FMT_GBRP;
... ...
@@ -362,14 +370,14 @@ static av_cold int encode_init(AVCodecContext *avctx)
362 362
         char *p = avctx->stats_in;
363 363
 
364 364
         for (i = 0; i < 4; i++)
365
-            for (j = 0; j < s->n; j++)
365
+            for (j = 0; j < s->vlc_n; j++)
366 366
                 s->stats[i][j] = 1;
367 367
 
368 368
         for (;;) {
369 369
             for (i = 0; i < 4; i++) {
370 370
                 char *next;
371 371
 
372
-                for (j = 0; j < s->n; j++) {
372
+                for (j = 0; j < s->vlc_n; j++) {
373 373
                     s->stats[i][j] += strtol(p, &next, 0);
374 374
                     if (next == p) return -1;
375 375
                     p = next;
... ...
@@ -379,8 +387,8 @@ static av_cold int encode_init(AVCodecContext *avctx)
379 379
         }
380 380
     } else {
381 381
         for (i = 0; i < 4; i++)
382
-            for (j = 0; j < s->n; j++) {
383
-                int d = FFMIN(j, s->n - j);
382
+            for (j = 0; j < s->vlc_n; j++) {
383
+                int d = FFMIN(j, s->vlc_n - j);
384 384
 
385 385
                 s->stats[i][j] = 100000000 / (d + 1);
386 386
             }
... ...
@@ -394,14 +402,14 @@ static av_cold int encode_init(AVCodecContext *avctx)
394 394
     if (s->context) {
395 395
         for (i = 0; i < 4; i++) {
396 396
             int pels = s->width * s->height / (i ? 40 : 10);
397
-            for (j = 0; j < s->n; j++) {
398
-                int d = FFMIN(j, s->n - j);
397
+            for (j = 0; j < s->vlc_n; j++) {
398
+                int d = FFMIN(j, s->vlc_n - j);
399 399
                 s->stats[i][j] = pels/(d + 1);
400 400
             }
401 401
         }
402 402
     } else {
403 403
         for (i = 0; i < 4; i++)
404
-            for (j = 0; j < s->n; j++)
404
+            for (j = 0; j < s->vlc_n; j++)
405 405
                 s->stats[i][j]= 0;
406 406
     }
407 407
 
... ...
@@ -481,15 +489,26 @@ static int encode_plane_bitstream(HYuvContext *s, int count, int plane)
481 481
 #define LOAD2\
482 482
             int y0 = s->temp[0][2 * i];\
483 483
             int y1 = s->temp[0][2 * i + 1];
484
-#define LOAD2_16\
484
+#define LOAD2_14\
485 485
             int y0 = s->temp16[0][2 * i] & mask;\
486 486
             int y1 = s->temp16[0][2 * i + 1] & mask;
487
+#define LOAD2_16\
488
+            int y0 = s->temp16[0][2 * i];\
489
+            int y1 = s->temp16[0][2 * i + 1];
487 490
 #define STAT2\
488 491
             s->stats[plane][y0]++;\
489 492
             s->stats[plane][y1]++;
493
+#define STAT2_16\
494
+            s->stats[plane][y0>>2]++;\
495
+            s->stats[plane][y1>>2]++;
490 496
 #define WRITE2\
491 497
             put_bits(&s->pb, s->len[plane][y0], s->bits[plane][y0]);\
492 498
             put_bits(&s->pb, s->len[plane][y1], s->bits[plane][y1]);
499
+#define WRITE2_16\
500
+            put_bits(&s->pb, s->len[plane][y0>>2], s->bits[plane][y0>>2]);\
501
+            put_bits(&s->pb, 2, y0&3);\
502
+            put_bits(&s->pb, s->len[plane][y1>>2], s->bits[plane][y1>>2]);\
503
+            put_bits(&s->pb, 2, y1&3);
493 504
 
494 505
     count /= 2;
495 506
 
... ...
@@ -515,11 +534,11 @@ static int encode_plane_bitstream(HYuvContext *s, int count, int plane)
515 515
             WRITE2;
516 516
         }
517 517
     }
518
-    } else {
518
+    } else if (s->bps <= 14) {
519 519
         int mask = s->n - 1;
520 520
         if (s->flags & CODEC_FLAG_PASS1) {
521 521
             for (i = 0; i < count; i++) {
522
-                LOAD2_16;
522
+                LOAD2_14;
523 523
                 STAT2;
524 524
             }
525 525
         }
... ...
@@ -528,16 +547,38 @@ static int encode_plane_bitstream(HYuvContext *s, int count, int plane)
528 528
 
529 529
         if (s->context) {
530 530
             for (i = 0; i < count; i++) {
531
-                LOAD2_16;
531
+                LOAD2_14;
532 532
                 STAT2;
533 533
                 WRITE2;
534 534
             }
535 535
         } else {
536 536
             for (i = 0; i < count; i++) {
537
-                LOAD2_16;
537
+                LOAD2_14;
538 538
                 WRITE2;
539 539
             }
540 540
         }
541
+    } else {
542
+        if (s->flags & CODEC_FLAG_PASS1) {
543
+            for (i = 0; i < count; i++) {
544
+                LOAD2_16;
545
+                STAT2_16;
546
+            }
547
+        }
548
+        if (s->avctx->flags2 & CODEC_FLAG2_NO_OUTPUT)
549
+            return 0;
550
+
551
+        if (s->context) {
552
+            for (i = 0; i < count; i++) {
553
+                LOAD2_16;
554
+                STAT2_16;
555
+                WRITE2_16;
556
+            }
557
+        } else {
558
+            for (i = 0; i < count; i++) {
559
+                LOAD2_16;
560
+                WRITE2_16;
561
+            }
562
+        }
541 563
     }
542 564
 #undef LOAD2
543 565
 #undef STAT2
... ...
@@ -663,7 +704,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
663 663
             return size;
664 664
 
665 665
         for (i = 0; i < 4; i++)
666
-            for (j = 0; j < s->n; j++)
666
+            for (j = 0; j < s->vlc_n; j++)
667 667
                 s->stats[i][j] >>= 1;
668 668
     }
669 669
 
... ...
@@ -899,7 +940,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
899 899
         char *p = avctx->stats_out;
900 900
         char *end = p + 1024*30;
901 901
         for (i = 0; i < 4; i++) {
902
-            for (j = 0; j < s->n; j++) {
902
+            for (j = 0; j < s->vlc_n; j++) {
903 903
                 snprintf(p, end-p, "%"PRIu64" ", s->stats[i][j]);
904 904
                 p += strlen(p);
905 905
                 s->stats[i][j]= 0;
... ...
@@ -968,16 +1009,16 @@ AVCodec ff_ffvhuff_encoder = {
968 968
         AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV411P,
969 969
         AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P,
970 970
         AV_PIX_FMT_GBRP,
971
-        AV_PIX_FMT_GRAY8,
971
+        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY16,
972 972
         AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P,
973 973
         AV_PIX_FMT_GBRAP,
974 974
         AV_PIX_FMT_GRAY8A,
975
-        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV420P14,
976
-        AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV422P14,
977
-        AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV444P14,
978
-        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10,
979
-        AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10,
980
-        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10,
975
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV420P16,
976
+        AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV422P16,
977
+        AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV444P16,
978
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
979
+        AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P16,
980
+        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P16,
981 981
         AV_PIX_FMT_RGB24,
982 982
         AV_PIX_FMT_RGB32, AV_PIX_FMT_NONE
983 983
     },