2 * huffyuv codec for libavcodec
4 * Copyright (c) 2002-2003 Michael Niedermayer <michaelni@gmx.at>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * see http://www.pcisys.net/~melanson/codecs/huffyuv.txt for a description of
26 * huffyuv codec for libavcodec.
30 #include "bitstream.h"
36 #ifdef WORDS_BIGENDIAN
46 typedef enum Predictor{
52 typedef struct HYuvContext{
53 AVCodecContext *avctx;
61 int yuy2; //use yuy2 instead of 422P
62 int bgr32; //use bgr32 instead of bgr24
69 uint64_t stats[3][256];
71 uint32_t bits[3][256];
74 uint8_t *bitstream_buffer;
75 int bitstream_buffer_size;
79 static const unsigned char classic_shift_luma[] = {
80 34,36,35,69,135,232,9,16,10,24,11,23,12,16,13,10,14,8,15,8,
81 16,8,17,20,16,10,207,206,205,236,11,8,10,21,9,23,8,8,199,70,
85 static const unsigned char classic_shift_chroma[] = {
86 66,36,37,38,39,40,41,75,76,77,110,239,144,81,82,83,84,85,118,183,
87 56,57,88,89,56,89,154,57,58,57,26,141,57,56,58,57,58,57,184,119,
88 214,245,116,83,82,49,80,79,78,77,44,75,41,40,39,38,37,36,34, 0
91 static const unsigned char classic_add_luma[256] = {
92 3, 9, 5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37,
93 73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36,
94 68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36,
95 35, 33, 32, 30, 29, 27, 26, 25, 48, 47, 46, 44, 43, 41, 40, 39,
96 37, 36, 35, 34, 32, 31, 30, 28, 27, 26, 24, 23, 22, 20, 19, 37,
97 35, 34, 33, 31, 30, 29, 27, 26, 24, 23, 21, 20, 18, 17, 15, 29,
98 27, 26, 24, 22, 21, 19, 17, 16, 14, 26, 25, 23, 21, 19, 18, 16,
99 15, 27, 25, 23, 21, 19, 17, 16, 14, 26, 25, 23, 21, 18, 17, 14,
100 12, 17, 19, 13, 4, 9, 2, 11, 1, 7, 8, 0, 16, 3, 14, 6,
101 12, 10, 5, 15, 18, 11, 10, 13, 15, 16, 19, 20, 22, 24, 27, 15,
102 18, 20, 22, 24, 26, 14, 17, 20, 22, 24, 27, 15, 18, 20, 23, 25,
103 28, 16, 19, 22, 25, 28, 32, 36, 21, 25, 29, 33, 38, 42, 45, 49,
104 28, 31, 34, 37, 40, 42, 44, 47, 49, 50, 52, 54, 56, 57, 59, 60,
105 62, 64, 66, 67, 69, 35, 37, 39, 40, 42, 43, 45, 47, 48, 51, 52,
106 54, 55, 57, 59, 60, 62, 63, 66, 67, 69, 71, 72, 38, 40, 42, 43,
107 46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13, 7, 8,
110 static const unsigned char classic_add_chroma[256] = {
111 3, 1, 2, 2, 2, 2, 3, 3, 7, 5, 7, 5, 8, 6, 11, 9,
112 7, 13, 11, 10, 9, 8, 7, 5, 9, 7, 6, 4, 7, 5, 8, 7,
113 11, 8, 13, 11, 19, 15, 22, 23, 20, 33, 32, 28, 27, 29, 51, 77,
114 43, 45, 76, 81, 46, 82, 75, 55, 56,144, 58, 80, 60, 74,147, 63,
115 143, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
116 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 27, 30, 21, 22,
117 17, 14, 5, 6,100, 54, 47, 50, 51, 53,106,107,108,109,110,111,
118 112,113,114,115, 4,117,118, 92, 94,121,122, 3,124,103, 2, 1,
119 0,129,130,131,120,119,126,125,136,137,138,139,140,141,142,134,
120 135,132,133,104, 64,101, 62, 57,102, 95, 93, 59, 61, 28, 97, 96,
121 52, 49, 48, 29, 32, 25, 24, 46, 23, 98, 45, 44, 43, 20, 42, 41,
122 19, 18, 99, 40, 15, 39, 38, 16, 13, 12, 11, 37, 10, 9, 8, 36,
123 7,128,127,105,123,116, 35, 34, 33,145, 31, 79, 42,146, 78, 26,
124 83, 48, 49, 50, 44, 47, 26, 31, 30, 18, 17, 19, 21, 24, 25, 13,
125 14, 16, 17, 18, 20, 21, 12, 14, 15, 9, 10, 6, 9, 6, 5, 8,
126 6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
129 static inline int add_left_prediction(uint8_t *dst, uint8_t *src, int w, int acc){
132 for(i=0; i<w-1; i++){
148 static inline void add_median_prediction(uint8_t *dst, uint8_t *src1, uint8_t *diff, int w, int *left, int *left_top){
156 l= mid_pred(l, src1[i], (l + src1[i] - lt)&0xFF) + diff[i];
165 static inline void add_left_prediction_bgr32(uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue){
187 static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst, uint8_t *src, int w, int left){
191 const int temp= src[i];
198 const int temp= src[i];
202 s->dsp.diff_bytes(dst+16, src+16, src+15, w-16);
207 static void read_len_table(uint8_t *dst, GetBitContext *gb){
211 repeat= get_bits(gb, 3);
212 val = get_bits(gb, 5);
214 repeat= get_bits(gb, 8);
215 //printf("%d %d\n", val, repeat);
221 static int generate_bits_table(uint32_t *dst, uint8_t *len_table){
225 for(len=32; len>0; len--){
226 for(index=0; index<256; index++){
227 if(len_table[index]==len)
231 av_log(NULL, AV_LOG_ERROR, "Error generating huffman table\n");
239 static void generate_len_table(uint8_t *dst, uint64_t *stats, int size){
240 uint64_t counts[2*size];
244 for(offset=1; ; offset<<=1){
245 for(i=0; i<size; i++){
246 counts[i]= stats[i] + offset - 1;
249 for(next=size; next<size*2; next++){
253 min1=min2= INT64_MAX;
256 for(i=0; i<next; i++){
257 if(min2 > counts[i]){
258 if(min1 > counts[i]){
270 if(min2==INT64_MAX) break;
272 counts[next]= min1 + min2;
274 counts[min2_i]= INT64_MAX;
280 for(i=0; i<size; i++){
284 for(len=0; up[index] != -1; len++)
295 static int read_huffman_tables(HYuvContext *s, uint8_t *src, int length){
299 init_get_bits(&gb, src, length*8);
302 read_len_table(s->len[i], &gb);
304 if(generate_bits_table(s->bits[i], s->len[i])<0){
308 for(j=0; j<256; j++){
309 printf("%6X, %2d, %3d\n", s->bits[i][j], s->len[i][j], j);
312 free_vlc(&s->vlc[i]);
313 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0);
316 return (get_bits_count(&gb)+7)/8;
319 static int read_old_huffman_tables(HYuvContext *s){
324 init_get_bits(&gb, classic_shift_luma, sizeof(classic_shift_luma)*8);
325 read_len_table(s->len[0], &gb);
326 init_get_bits(&gb, classic_shift_chroma, sizeof(classic_shift_chroma)*8);
327 read_len_table(s->len[1], &gb);
329 for(i=0; i<256; i++) s->bits[0][i] = classic_add_luma [i];
330 for(i=0; i<256; i++) s->bits[1][i] = classic_add_chroma[i];
332 if(s->bitstream_bpp >= 24){
333 memcpy(s->bits[1], s->bits[0], 256*sizeof(uint32_t));
334 memcpy(s->len[1] , s->len [0], 256*sizeof(uint8_t));
336 memcpy(s->bits[2], s->bits[1], 256*sizeof(uint32_t));
337 memcpy(s->len[2] , s->len [1], 256*sizeof(uint8_t));
340 free_vlc(&s->vlc[i]);
341 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0);
346 fprintf(stderr, "v1 huffyuv is not supported \n");
351 static int common_init(AVCodecContext *avctx){
352 HYuvContext *s = avctx->priv_data;
356 s->flags= avctx->flags;
358 dsputil_init(&s->dsp, avctx);
360 s->width= avctx->width;
361 s->height= avctx->height;
362 assert(s->width>0 && s->height>0);
365 s->temp[i]= av_malloc(avctx->width + 16);
370 static int decode_init(AVCodecContext *avctx)
372 HYuvContext *s = avctx->priv_data;
375 memset(s->vlc, 0, 3*sizeof(VLC));
377 avctx->coded_frame= &s->picture;
378 s->interlaced= s->height > 288;
381 //if(avctx->extradata)
382 // printf("extradata:%X, extradata_size:%d\n", *(uint32_t*)avctx->extradata, avctx->extradata_size);
383 if(avctx->extradata_size){
384 if((avctx->bits_per_sample&7) && avctx->bits_per_sample != 12)
385 s->version=1; // do such files exist at all?
392 int method, interlace;
394 method= ((uint8_t*)avctx->extradata)[0];
395 s->decorrelate= method&64 ? 1 : 0;
396 s->predictor= method&63;
397 s->bitstream_bpp= ((uint8_t*)avctx->extradata)[1];
398 if(s->bitstream_bpp==0)
399 s->bitstream_bpp= avctx->bits_per_sample&~7;
400 interlace= (((uint8_t*)avctx->extradata)[2] & 0x30) >> 4;
401 s->interlaced= (interlace==1) ? 1 : (interlace==2) ? 0 : s->interlaced;
402 s->context= ((uint8_t*)avctx->extradata)[2] & 0x40 ? 1 : 0;
404 if(read_huffman_tables(s, ((uint8_t*)avctx->extradata)+4, avctx->extradata_size) < 0)
407 switch(avctx->bits_per_sample&7){
418 s->decorrelate= avctx->bits_per_sample >= 24;
421 s->predictor= MEDIAN;
425 s->predictor= LEFT; //OLD
429 s->bitstream_bpp= avctx->bits_per_sample & ~7;
432 if(read_old_huffman_tables(s) < 0)
436 switch(s->bitstream_bpp){
438 avctx->pix_fmt = PIX_FMT_YUV420P;
442 avctx->pix_fmt = PIX_FMT_YUV422;
444 avctx->pix_fmt = PIX_FMT_YUV422P;
450 avctx->pix_fmt = PIX_FMT_RGBA32;
452 avctx->pix_fmt = PIX_FMT_BGR24;
459 // av_log(NULL, AV_LOG_DEBUG, "pred:%d bpp:%d hbpp:%d il:%d\n", s->predictor, s->bitstream_bpp, avctx->bits_per_sample, s->interlaced);
464 static int store_table(HYuvContext *s, uint8_t *len, uint8_t *buf){
472 for(; i<256 && len[i]==val && repeat<255; i++)
475 assert(val < 32 && val >0 && repeat<256 && repeat>0);
478 buf[index++]= repeat;
480 buf[index++]= val | (repeat<<5);
487 static int encode_init(AVCodecContext *avctx)
489 HYuvContext *s = avctx->priv_data;
494 avctx->extradata= av_mallocz(1024*30); // 256*3+4 == 772
495 avctx->stats_out= av_mallocz(1024*30); // 21*256*3(%llu ) + 3(\n) + 1(0) = 16132
498 avctx->coded_frame= &s->picture;
500 switch(avctx->pix_fmt){
501 case PIX_FMT_YUV420P:
502 s->bitstream_bpp= 12;
504 case PIX_FMT_YUV422P:
505 s->bitstream_bpp= 16;
508 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
511 avctx->bits_per_sample= s->bitstream_bpp;
512 s->decorrelate= s->bitstream_bpp >= 24;
513 s->predictor= avctx->prediction_method;
514 s->interlaced= avctx->flags&CODEC_FLAG_INTERLACED_ME ? 1 : 0;
515 if(avctx->context_model==1){
516 s->context= avctx->context_model;
517 if(s->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)){
518 av_log(avctx, AV_LOG_ERROR, "context=1 is not compatible with 2 pass huffyuv encoding\n");
523 if(avctx->codec->id==CODEC_ID_HUFFYUV){
524 if(avctx->pix_fmt==PIX_FMT_YUV420P){
525 av_log(avctx, AV_LOG_ERROR, "Error: YV12 is not supported by huffyuv; use vcodec=ffvhuff or format=422p\n");
528 if(avctx->context_model){
529 av_log(avctx, AV_LOG_ERROR, "Error: per-frame huffman tables are not supported by huffyuv; use vcodec=ffvhuff\n");
532 if(s->interlaced != ( s->height > 288 ))
533 av_log(avctx, AV_LOG_INFO, "using huffyuv 2.2.0 or newer interlacing flag\n");
534 }else if(avctx->strict_std_compliance>=0){
535 av_log(avctx, AV_LOG_ERROR, "This codec is under development; files encoded with it may not be decodeable with future versions!!! Set vstrict=-1 to use it anyway.\n");
539 ((uint8_t*)avctx->extradata)[0]= s->predictor;
540 ((uint8_t*)avctx->extradata)[1]= s->bitstream_bpp;
541 ((uint8_t*)avctx->extradata)[2]= s->interlaced ? 0x10 : 0x20;
543 ((uint8_t*)avctx->extradata)[2]|= 0x40;
544 ((uint8_t*)avctx->extradata)[3]= 0;
545 s->avctx->extradata_size= 4;
548 char *p= avctx->stats_in;
558 for(j=0; j<256; j++){
559 s->stats[i][j]+= strtol(p, &next, 0);
560 if(next==p) return -1;
564 if(p[0]==0 || p[1]==0 || p[2]==0) break;
568 for(j=0; j<256; j++){
569 int d= FFMIN(j, 256-j);
571 s->stats[i][j]= 100000000/(d+1);
576 generate_len_table(s->len[i], s->stats[i], 256);
578 if(generate_bits_table(s->bits[i], s->len[i])<0){
582 s->avctx->extradata_size+=
583 store_table(s, s->len[i], &((uint8_t*)s->avctx->extradata)[s->avctx->extradata_size]);
588 int pels = s->width*s->height / (i?40:10);
589 for(j=0; j<256; j++){
590 int d= FFMIN(j, 256-j);
591 s->stats[i][j]= pels/(d+1);
600 // printf("pred:%d bpp:%d hbpp:%d il:%d\n", s->predictor, s->bitstream_bpp, avctx->bits_per_sample, s->interlaced);
607 static void decode_422_bitstream(HYuvContext *s, int count){
612 for(i=0; i<count; i++){
613 s->temp[0][2*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
614 s->temp[1][ i ]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
615 s->temp[0][2*i+1]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
616 s->temp[2][ i ]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
620 static void decode_gray_bitstream(HYuvContext *s, int count){
625 for(i=0; i<count; i++){
626 s->temp[0][2*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
627 s->temp[0][2*i+1]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
631 static int encode_422_bitstream(HYuvContext *s, int count){
634 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < 2*4*count){
635 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
640 if(s->flags&CODEC_FLAG_PASS1){
641 for(i=0; i<count; i++){
642 s->stats[0][ s->temp[0][2*i ] ]++;
643 s->stats[1][ s->temp[1][ i ] ]++;
644 s->stats[0][ s->temp[0][2*i+1] ]++;
645 s->stats[2][ s->temp[2][ i ] ]++;
647 }else if(s->context){
648 for(i=0; i<count; i++){
649 s->stats[0][ s->temp[0][2*i ] ]++;
650 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
651 s->stats[1][ s->temp[1][ i ] ]++;
652 put_bits(&s->pb, s->len[1][ s->temp[1][ i ] ], s->bits[1][ s->temp[1][ i ] ]);
653 s->stats[0][ s->temp[0][2*i+1] ]++;
654 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
655 s->stats[2][ s->temp[2][ i ] ]++;
656 put_bits(&s->pb, s->len[2][ s->temp[2][ i ] ], s->bits[2][ s->temp[2][ i ] ]);
659 for(i=0; i<count; i++){
660 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
661 put_bits(&s->pb, s->len[1][ s->temp[1][ i ] ], s->bits[1][ s->temp[1][ i ] ]);
662 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
663 put_bits(&s->pb, s->len[2][ s->temp[2][ i ] ], s->bits[2][ s->temp[2][ i ] ]);
669 static int encode_gray_bitstream(HYuvContext *s, int count){
672 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < 4*count){
673 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
678 if(s->flags&CODEC_FLAG_PASS1){
679 for(i=0; i<count; i++){
680 s->stats[0][ s->temp[0][2*i ] ]++;
681 s->stats[0][ s->temp[0][2*i+1] ]++;
683 }else if(s->context){
684 for(i=0; i<count; i++){
685 s->stats[0][ s->temp[0][2*i ] ]++;
686 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
687 s->stats[0][ s->temp[0][2*i+1] ]++;
688 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
691 for(i=0; i<count; i++){
692 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
693 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
699 static void decode_bgr_bitstream(HYuvContext *s, int count){
703 if(s->bitstream_bpp==24){
704 for(i=0; i<count; i++){
705 s->temp[0][4*i+G]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
706 s->temp[0][4*i+B]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3) + s->temp[0][4*i+G];
707 s->temp[0][4*i+R]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3) + s->temp[0][4*i+G];
710 for(i=0; i<count; i++){
711 s->temp[0][4*i+G]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
712 s->temp[0][4*i+B]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3) + s->temp[0][4*i+G];
713 s->temp[0][4*i+R]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3) + s->temp[0][4*i+G];
714 get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); //?!
718 if(s->bitstream_bpp==24){
719 for(i=0; i<count; i++){
720 s->temp[0][4*i+B]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
721 s->temp[0][4*i+G]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
722 s->temp[0][4*i+R]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
725 for(i=0; i<count; i++){
726 s->temp[0][4*i+B]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
727 s->temp[0][4*i+G]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
728 s->temp[0][4*i+R]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
729 get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); //?!
735 static void draw_slice(HYuvContext *s, int y){
739 if(s->avctx->draw_horiz_band==NULL)
742 h= y - s->last_slice_end;
745 if(s->bitstream_bpp==12){
751 offset[0] = s->picture.linesize[0]*y;
752 offset[1] = s->picture.linesize[1]*cy;
753 offset[2] = s->picture.linesize[2]*cy;
757 s->avctx->draw_horiz_band(s->avctx, &s->picture, offset, y, 3, h);
759 s->last_slice_end= y + h;
762 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
763 HYuvContext *s = avctx->priv_data;
764 const int width= s->width;
765 const int width2= s->width>>1;
766 const int height= s->height;
767 int fake_ystride, fake_ustride, fake_vstride;
768 AVFrame * const p= &s->picture;
771 AVFrame *picture = data;
773 /* no supplementary picture */
777 s->bitstream_buffer= av_fast_realloc(s->bitstream_buffer, &s->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
779 s->dsp.bswap_buf((uint32_t*)s->bitstream_buffer, (uint32_t*)buf, buf_size/4);
782 avctx->release_buffer(avctx, p);
785 if(avctx->get_buffer(avctx, p) < 0){
786 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
791 table_size = read_huffman_tables(s, s->bitstream_buffer, buf_size);
796 init_get_bits(&s->gb, s->bitstream_buffer+table_size, (buf_size-table_size)*8);
798 fake_ystride= s->interlaced ? p->linesize[0]*2 : p->linesize[0];
799 fake_ustride= s->interlaced ? p->linesize[1]*2 : p->linesize[1];
800 fake_vstride= s->interlaced ? p->linesize[2]*2 : p->linesize[2];
802 s->last_slice_end= 0;
804 if(s->bitstream_bpp<24){
806 int lefty, leftu, leftv;
807 int lefttopy, lefttopu, lefttopv;
810 p->data[0][3]= get_bits(&s->gb, 8);
811 p->data[0][2]= get_bits(&s->gb, 8);
812 p->data[0][1]= get_bits(&s->gb, 8);
813 p->data[0][0]= get_bits(&s->gb, 8);
815 av_log(avctx, AV_LOG_ERROR, "YUY2 output isnt implemenetd yet\n");
819 leftv= p->data[2][0]= get_bits(&s->gb, 8);
820 lefty= p->data[0][1]= get_bits(&s->gb, 8);
821 leftu= p->data[1][0]= get_bits(&s->gb, 8);
822 p->data[0][0]= get_bits(&s->gb, 8);
824 switch(s->predictor){
827 decode_422_bitstream(s, width-2);
828 lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty);
829 if(!(s->flags&CODEC_FLAG_GRAY)){
830 leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu);
831 leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv);
834 for(cy=y=1; y<s->height; y++,cy++){
835 uint8_t *ydst, *udst, *vdst;
837 if(s->bitstream_bpp==12){
838 decode_gray_bitstream(s, width);
840 ydst= p->data[0] + p->linesize[0]*y;
842 lefty= add_left_prediction(ydst, s->temp[0], width, lefty);
843 if(s->predictor == PLANE){
845 s->dsp.add_bytes(ydst, ydst - fake_ystride, width);
848 if(y>=s->height) break;
853 ydst= p->data[0] + p->linesize[0]*y;
854 udst= p->data[1] + p->linesize[1]*cy;
855 vdst= p->data[2] + p->linesize[2]*cy;
857 decode_422_bitstream(s, width);
858 lefty= add_left_prediction(ydst, s->temp[0], width, lefty);
859 if(!(s->flags&CODEC_FLAG_GRAY)){
860 leftu= add_left_prediction(udst, s->temp[1], width2, leftu);
861 leftv= add_left_prediction(vdst, s->temp[2], width2, leftv);
863 if(s->predictor == PLANE){
864 if(cy>s->interlaced){
865 s->dsp.add_bytes(ydst, ydst - fake_ystride, width);
866 if(!(s->flags&CODEC_FLAG_GRAY)){
867 s->dsp.add_bytes(udst, udst - fake_ustride, width2);
868 s->dsp.add_bytes(vdst, vdst - fake_vstride, width2);
873 draw_slice(s, height);
877 /* first line except first 2 pixels is left predicted */
878 decode_422_bitstream(s, width-2);
879 lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty);
880 if(!(s->flags&CODEC_FLAG_GRAY)){
881 leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu);
882 leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv);
887 /* second line is left predicted for interlaced case */
889 decode_422_bitstream(s, width);
890 lefty= add_left_prediction(p->data[0] + p->linesize[0], s->temp[0], width, lefty);
891 if(!(s->flags&CODEC_FLAG_GRAY)){
892 leftu= add_left_prediction(p->data[1] + p->linesize[2], s->temp[1], width2, leftu);
893 leftv= add_left_prediction(p->data[2] + p->linesize[1], s->temp[2], width2, leftv);
898 /* next 4 pixels are left predicted too */
899 decode_422_bitstream(s, 4);
900 lefty= add_left_prediction(p->data[0] + fake_ystride, s->temp[0], 4, lefty);
901 if(!(s->flags&CODEC_FLAG_GRAY)){
902 leftu= add_left_prediction(p->data[1] + fake_ustride, s->temp[1], 2, leftu);
903 leftv= add_left_prediction(p->data[2] + fake_vstride, s->temp[2], 2, leftv);
906 /* next line except the first 4 pixels is median predicted */
907 lefttopy= p->data[0][3];
908 decode_422_bitstream(s, width-4);
909 add_median_prediction(p->data[0] + fake_ystride+4, p->data[0]+4, s->temp[0], width-4, &lefty, &lefttopy);
910 if(!(s->flags&CODEC_FLAG_GRAY)){
911 lefttopu= p->data[1][1];
912 lefttopv= p->data[2][1];
913 add_median_prediction(p->data[1] + fake_ustride+2, p->data[1]+2, s->temp[1], width2-2, &leftu, &lefttopu);
914 add_median_prediction(p->data[2] + fake_vstride+2, p->data[2]+2, s->temp[2], width2-2, &leftv, &lefttopv);
918 for(; y<height; y++,cy++){
919 uint8_t *ydst, *udst, *vdst;
921 if(s->bitstream_bpp==12){
923 decode_gray_bitstream(s, width);
924 ydst= p->data[0] + p->linesize[0]*y;
925 add_median_prediction(ydst, ydst - fake_ystride, s->temp[0], width, &lefty, &lefttopy);
932 decode_422_bitstream(s, width);
934 ydst= p->data[0] + p->linesize[0]*y;
935 udst= p->data[1] + p->linesize[1]*cy;
936 vdst= p->data[2] + p->linesize[2]*cy;
938 add_median_prediction(ydst, ydst - fake_ystride, s->temp[0], width, &lefty, &lefttopy);
939 if(!(s->flags&CODEC_FLAG_GRAY)){
940 add_median_prediction(udst, udst - fake_ustride, s->temp[1], width2, &leftu, &lefttopu);
941 add_median_prediction(vdst, vdst - fake_vstride, s->temp[2], width2, &leftv, &lefttopv);
945 draw_slice(s, height);
951 int leftr, leftg, leftb;
952 const int last_line= (height-1)*p->linesize[0];
954 if(s->bitstream_bpp==32){
955 skip_bits(&s->gb, 8);
956 leftr= p->data[0][last_line+R]= get_bits(&s->gb, 8);
957 leftg= p->data[0][last_line+G]= get_bits(&s->gb, 8);
958 leftb= p->data[0][last_line+B]= get_bits(&s->gb, 8);
960 leftr= p->data[0][last_line+R]= get_bits(&s->gb, 8);
961 leftg= p->data[0][last_line+G]= get_bits(&s->gb, 8);
962 leftb= p->data[0][last_line+B]= get_bits(&s->gb, 8);
963 skip_bits(&s->gb, 8);
967 switch(s->predictor){
970 decode_bgr_bitstream(s, width-1);
971 add_left_prediction_bgr32(p->data[0] + last_line+4, s->temp[0], width-1, &leftr, &leftg, &leftb);
973 for(y=s->height-2; y>=0; y--){ //yes its stored upside down
974 decode_bgr_bitstream(s, width);
976 add_left_prediction_bgr32(p->data[0] + p->linesize[0]*y, s->temp[0], width, &leftr, &leftg, &leftb);
977 if(s->predictor == PLANE){
978 if((y&s->interlaced)==0 && y<s->height-1-s->interlaced){
979 s->dsp.add_bytes(p->data[0] + p->linesize[0]*y,
980 p->data[0] + p->linesize[0]*y + fake_ystride, fake_ystride);
984 draw_slice(s, height); // just 1 large slice as this isnt possible in reverse order
987 av_log(avctx, AV_LOG_ERROR, "prediction type not supported!\n");
991 av_log(avctx, AV_LOG_ERROR, "BGR24 output isnt implemenetd yet\n");
998 *data_size = sizeof(AVFrame);
1000 return (get_bits_count(&s->gb)+31)/32*4;
1003 static int common_end(HYuvContext *s){
1007 av_freep(&s->temp[i]);
1012 static int decode_end(AVCodecContext *avctx)
1014 HYuvContext *s = avctx->priv_data;
1018 av_freep(&s->bitstream_buffer);
1021 free_vlc(&s->vlc[i]);
1027 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
1028 HYuvContext *s = avctx->priv_data;
1029 AVFrame *pict = data;
1030 const int width= s->width;
1031 const int width2= s->width>>1;
1032 const int height= s->height;
1033 const int fake_ystride= s->interlaced ? pict->linesize[0]*2 : pict->linesize[0];
1034 const int fake_ustride= s->interlaced ? pict->linesize[1]*2 : pict->linesize[1];
1035 const int fake_vstride= s->interlaced ? pict->linesize[2]*2 : pict->linesize[2];
1036 AVFrame * const p= &s->picture;
1040 p->pict_type= FF_I_TYPE;
1045 generate_len_table(s->len[i], s->stats[i], 256);
1046 if(generate_bits_table(s->bits[i], s->len[i])<0)
1048 size+= store_table(s, s->len[i], &buf[size]);
1052 for(j=0; j<256; j++)
1053 s->stats[i][j] >>= 1;
1056 init_put_bits(&s->pb, buf+size, buf_size-size);
1058 if(avctx->pix_fmt == PIX_FMT_YUV422P || avctx->pix_fmt == PIX_FMT_YUV420P){
1059 int lefty, leftu, leftv, y, cy;
1061 put_bits(&s->pb, 8, leftv= p->data[2][0]);
1062 put_bits(&s->pb, 8, lefty= p->data[0][1]);
1063 put_bits(&s->pb, 8, leftu= p->data[1][0]);
1064 put_bits(&s->pb, 8, p->data[0][0]);
1066 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+2, width-2 , lefty);
1067 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+1, width2-1, leftu);
1068 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+1, width2-1, leftv);
1070 encode_422_bitstream(s, width-2);
1072 if(s->predictor==MEDIAN){
1073 int lefttopy, lefttopu, lefttopv;
1076 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+p->linesize[0], width , lefty);
1077 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+p->linesize[1], width2, leftu);
1078 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+p->linesize[2], width2, leftv);
1080 encode_422_bitstream(s, width);
1084 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+fake_ystride, 4, lefty);
1085 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+fake_ustride, 2, leftu);
1086 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+fake_vstride, 2, leftv);
1088 encode_422_bitstream(s, 4);
1090 lefttopy= p->data[0][3];
1091 lefttopu= p->data[1][1];
1092 lefttopv= p->data[2][1];
1093 s->dsp.sub_hfyu_median_prediction(s->temp[0], p->data[0]+4, p->data[0] + fake_ystride+4, width-4 , &lefty, &lefttopy);
1094 s->dsp.sub_hfyu_median_prediction(s->temp[1], p->data[1]+2, p->data[1] + fake_ustride+2, width2-2, &leftu, &lefttopu);
1095 s->dsp.sub_hfyu_median_prediction(s->temp[2], p->data[2]+2, p->data[2] + fake_vstride+2, width2-2, &leftv, &lefttopv);
1096 encode_422_bitstream(s, width-4);
1099 for(; y<height; y++,cy++){
1100 uint8_t *ydst, *udst, *vdst;
1102 if(s->bitstream_bpp==12){
1104 ydst= p->data[0] + p->linesize[0]*y;
1105 s->dsp.sub_hfyu_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
1106 encode_gray_bitstream(s, width);
1109 if(y>=height) break;
1111 ydst= p->data[0] + p->linesize[0]*y;
1112 udst= p->data[1] + p->linesize[1]*cy;
1113 vdst= p->data[2] + p->linesize[2]*cy;
1115 s->dsp.sub_hfyu_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
1116 s->dsp.sub_hfyu_median_prediction(s->temp[1], udst - fake_ustride, udst, width2, &leftu, &lefttopu);
1117 s->dsp.sub_hfyu_median_prediction(s->temp[2], vdst - fake_vstride, vdst, width2, &leftv, &lefttopv);
1119 encode_422_bitstream(s, width);
1122 for(cy=y=1; y<height; y++,cy++){
1123 uint8_t *ydst, *udst, *vdst;
1125 /* encode a luma only line & y++ */
1126 if(s->bitstream_bpp==12){
1127 ydst= p->data[0] + p->linesize[0]*y;
1129 if(s->predictor == PLANE && s->interlaced < y){
1130 s->dsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
1132 lefty= sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
1134 lefty= sub_left_prediction(s, s->temp[0], ydst, width , lefty);
1136 encode_gray_bitstream(s, width);
1138 if(y>=height) break;
1141 ydst= p->data[0] + p->linesize[0]*y;
1142 udst= p->data[1] + p->linesize[1]*cy;
1143 vdst= p->data[2] + p->linesize[2]*cy;
1145 if(s->predictor == PLANE && s->interlaced < cy){
1146 s->dsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
1147 s->dsp.diff_bytes(s->temp[2], udst, udst - fake_ustride, width2);
1148 s->dsp.diff_bytes(s->temp[2] + 1250, vdst, vdst - fake_vstride, width2);
1150 lefty= sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
1151 leftu= sub_left_prediction(s, s->temp[1], s->temp[2], width2, leftu);
1152 leftv= sub_left_prediction(s, s->temp[2], s->temp[2] + 1250, width2, leftv);
1154 lefty= sub_left_prediction(s, s->temp[0], ydst, width , lefty);
1155 leftu= sub_left_prediction(s, s->temp[1], udst, width2, leftu);
1156 leftv= sub_left_prediction(s, s->temp[2], vdst, width2, leftv);
1159 encode_422_bitstream(s, width);
1163 av_log(avctx, AV_LOG_ERROR, "Format not supported!\n");
1167 size+= (put_bits_count(&s->pb)+31)/8;
1170 if((s->flags&CODEC_FLAG_PASS1) && (s->picture_number&31)==0){
1172 char *p= avctx->stats_out;
1173 char *end= p + 1024*30;
1175 for(j=0; j<256; j++){
1176 snprintf(p, end-p, "%llu ", s->stats[i][j]);
1180 snprintf(p, end-p, "\n");
1184 flush_put_bits(&s->pb);
1185 s->dsp.bswap_buf((uint32_t*)buf, (uint32_t*)buf, size);
1186 avctx->stats_out[0] = '\0';
1189 s->picture_number++;
1194 static int encode_end(AVCodecContext *avctx)
1196 HYuvContext *s = avctx->priv_data;
1200 av_freep(&avctx->extradata);
1201 av_freep(&avctx->stats_out);
1206 static const AVOption huffyuv_options[] =
1208 AVOPTION_CODEC_INT("prediction_method", "prediction_method", prediction_method, 0, 2, 0),
1212 static const AVOption ffvhuff_options[] =
1214 AVOPTION_CODEC_INT("prediction_method", "prediction_method", prediction_method, 0, 2, 0),
1215 AVOPTION_CODEC_INT("context_model", "context_model", context_model, 0, 2, 0),
1220 AVCodec huffyuv_decoder = {
1224 sizeof(HYuvContext),
1229 CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND,
1233 AVCodec ffvhuff_decoder = {
1237 sizeof(HYuvContext),
1242 CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND,
1246 #ifdef CONFIG_ENCODERS
1248 AVCodec huffyuv_encoder = {
1252 sizeof(HYuvContext),
1256 .options = huffyuv_options,
1259 AVCodec ffvhuff_encoder = {
1263 sizeof(HYuvContext),
1267 .options = ffvhuff_options,
1270 #endif //CONFIG_ENCODERS