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.
34 #define INT64_MAX 9223372036854775807LL
39 typedef enum Predictor{
45 typedef struct HYuvContext{
46 AVCodecContext *avctx;
54 int yuy2; //use yuy2 instead of 422P
55 int bgr32; //use bgr32 instead of bgr24
60 uint8_t __align8 temp[3][2500];
61 uint64_t stats[3][256];
63 uint32_t bits[3][256];
66 uint8_t __align8 bitstream_buffer[1024*1024*3]; //FIXME dynamic alloc or some other solution
70 static const unsigned char classic_shift_luma[] = {
71 34,36,35,69,135,232,9,16,10,24,11,23,12,16,13,10,14,8,15,8,
72 16,8,17,20,16,10,207,206,205,236,11,8,10,21,9,23,8,8,199,70,
76 static const unsigned char classic_shift_chroma[] = {
77 66,36,37,38,39,40,41,75,76,77,110,239,144,81,82,83,84,85,118,183,
78 56,57,88,89,56,89,154,57,58,57,26,141,57,56,58,57,58,57,184,119,
79 214,245,116,83,82,49,80,79,78,77,44,75,41,40,39,38,37,36,34, 0
82 static const unsigned char classic_add_luma[256] = {
83 3, 9, 5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37,
84 73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36,
85 68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36,
86 35, 33, 32, 30, 29, 27, 26, 25, 48, 47, 46, 44, 43, 41, 40, 39,
87 37, 36, 35, 34, 32, 31, 30, 28, 27, 26, 24, 23, 22, 20, 19, 37,
88 35, 34, 33, 31, 30, 29, 27, 26, 24, 23, 21, 20, 18, 17, 15, 29,
89 27, 26, 24, 22, 21, 19, 17, 16, 14, 26, 25, 23, 21, 19, 18, 16,
90 15, 27, 25, 23, 21, 19, 17, 16, 14, 26, 25, 23, 21, 18, 17, 14,
91 12, 17, 19, 13, 4, 9, 2, 11, 1, 7, 8, 0, 16, 3, 14, 6,
92 12, 10, 5, 15, 18, 11, 10, 13, 15, 16, 19, 20, 22, 24, 27, 15,
93 18, 20, 22, 24, 26, 14, 17, 20, 22, 24, 27, 15, 18, 20, 23, 25,
94 28, 16, 19, 22, 25, 28, 32, 36, 21, 25, 29, 33, 38, 42, 45, 49,
95 28, 31, 34, 37, 40, 42, 44, 47, 49, 50, 52, 54, 56, 57, 59, 60,
96 62, 64, 66, 67, 69, 35, 37, 39, 40, 42, 43, 45, 47, 48, 51, 52,
97 54, 55, 57, 59, 60, 62, 63, 66, 67, 69, 71, 72, 38, 40, 42, 43,
98 46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13, 7, 8,
101 static const unsigned char classic_add_chroma[256] = {
102 3, 1, 2, 2, 2, 2, 3, 3, 7, 5, 7, 5, 8, 6, 11, 9,
103 7, 13, 11, 10, 9, 8, 7, 5, 9, 7, 6, 4, 7, 5, 8, 7,
104 11, 8, 13, 11, 19, 15, 22, 23, 20, 33, 32, 28, 27, 29, 51, 77,
105 43, 45, 76, 81, 46, 82, 75, 55, 56,144, 58, 80, 60, 74,147, 63,
106 143, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
107 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 27, 30, 21, 22,
108 17, 14, 5, 6,100, 54, 47, 50, 51, 53,106,107,108,109,110,111,
109 112,113,114,115, 4,117,118, 92, 94,121,122, 3,124,103, 2, 1,
110 0,129,130,131,120,119,126,125,136,137,138,139,140,141,142,134,
111 135,132,133,104, 64,101, 62, 57,102, 95, 93, 59, 61, 28, 97, 96,
112 52, 49, 48, 29, 32, 25, 24, 46, 23, 98, 45, 44, 43, 20, 42, 41,
113 19, 18, 99, 40, 15, 39, 38, 16, 13, 12, 11, 37, 10, 9, 8, 36,
114 7,128,127,105,123,116, 35, 34, 33,145, 31, 79, 42,146, 78, 26,
115 83, 48, 49, 50, 44, 47, 26, 31, 30, 18, 17, 19, 21, 24, 25, 13,
116 14, 16, 17, 18, 20, 21, 12, 14, 15, 9, 10, 6, 9, 6, 5, 8,
117 6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
120 static inline void bswap_buf(uint32_t *dst, uint32_t *src, int w){
123 for(i=0; i+8<=w; i+=8){
124 dst[i+0]= bswap_32(src[i+0]);
125 dst[i+1]= bswap_32(src[i+1]);
126 dst[i+2]= bswap_32(src[i+2]);
127 dst[i+3]= bswap_32(src[i+3]);
128 dst[i+4]= bswap_32(src[i+4]);
129 dst[i+5]= bswap_32(src[i+5]);
130 dst[i+6]= bswap_32(src[i+6]);
131 dst[i+7]= bswap_32(src[i+7]);
134 dst[i+0]= bswap_32(src[i+0]);
138 static inline int add_left_prediction(uint8_t *dst, uint8_t *src, int w, int acc){
141 for(i=0; i<w-1; i++){
157 static inline void add_median_prediction(uint8_t *dst, uint8_t *src1, uint8_t *diff, int w, int *left, int *left_top){
165 l= mid_pred(l, src1[i], (l + src1[i] - lt)&0xFF) + diff[i];
174 static inline void sub_median_prediction(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w, int *left, int *left_top){
182 const int pred= mid_pred(l, src1[i], (l + src1[i] - lt)&0xFF);
193 static inline void add_left_prediction_bgr32(uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue){
215 static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst, uint8_t *src, int w, int left){
219 const int temp= src[i];
226 const int temp= src[i];
230 s->dsp.diff_bytes(dst+16, src+16, src+15, w-16);
235 static void read_len_table(uint8_t *dst, GetBitContext *gb){
239 repeat= get_bits(gb, 3);
240 val = get_bits(gb, 5);
242 repeat= get_bits(gb, 8);
243 //printf("%d %d\n", val, repeat);
249 static int generate_bits_table(uint32_t *dst, uint8_t *len_table){
253 for(len=32; len>0; len--){
254 int bit= 1<<(32-len);
255 for(index=0; index<256; index++){
256 if(len_table[index]==len){
258 fprintf(stderr, "Error generating huffman table\n");
261 dst[index]= bits>>(32-len);
269 static void generate_len_table(uint8_t *dst, uint64_t *stats, int size){
270 uint64_t counts[2*size];
274 for(offset=1; ; offset<<=1){
275 for(i=0; i<size; i++){
276 counts[i]= stats[i] + offset - 1;
279 for(next=size; next<size*2; next++){
283 min1=min2= INT64_MAX;
286 for(i=0; i<next; i++){
287 if(min2 > counts[i]){
288 if(min1 > counts[i]){
300 if(min2==INT64_MAX) break;
302 counts[next]= min1 + min2;
304 counts[min2_i]= INT64_MAX;
310 for(i=0; i<size; i++){
314 for(len=0; up[index] != -1; len++)
325 static int read_huffman_tables(HYuvContext *s, uint8_t *src, int length){
329 init_get_bits(&gb, src, length*8);
332 read_len_table(s->len[i], &gb);
334 if(generate_bits_table(s->bits[i], s->len[i])<0){
338 for(j=0; j<256; j++){
339 printf("%6X, %2d, %3d\n", s->bits[i][j], s->len[i][j], j);
342 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4);
348 static int read_old_huffman_tables(HYuvContext *s){
353 init_get_bits(&gb, classic_shift_luma, sizeof(classic_shift_luma)*8);
354 read_len_table(s->len[0], &gb);
355 init_get_bits(&gb, classic_shift_chroma, sizeof(classic_shift_chroma)*8);
356 read_len_table(s->len[1], &gb);
358 for(i=0; i<256; i++) s->bits[0][i] = classic_add_luma [i];
359 for(i=0; i<256; i++) s->bits[1][i] = classic_add_chroma[i];
361 if(s->bitstream_bpp >= 24){
362 memcpy(s->bits[1], s->bits[0], 256*sizeof(uint32_t));
363 memcpy(s->len[1] , s->len [0], 256*sizeof(uint8_t));
365 memcpy(s->bits[2], s->bits[1], 256*sizeof(uint32_t));
366 memcpy(s->len[2] , s->len [1], 256*sizeof(uint8_t));
369 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4);
373 fprintf(stderr, "v1 huffyuv is not supported \n");
378 static int decode_init(AVCodecContext *avctx)
380 HYuvContext *s = avctx->priv_data;
384 s->flags= avctx->flags;
386 dsputil_init(&s->dsp, avctx);
388 width= s->width= avctx->width;
389 height= s->height= avctx->height;
390 avctx->coded_frame= &s->picture;
393 assert(width && height);
394 //if(avctx->extradata)
395 // printf("extradata:%X, extradata_size:%d\n", *(uint32_t*)avctx->extradata, avctx->extradata_size);
396 if(avctx->extradata_size){
397 if((avctx->bits_per_sample&7) && avctx->bits_per_sample != 12)
398 s->version=1; // do such files exist at all?
407 method= ((uint8_t*)avctx->extradata)[0];
408 s->decorrelate= method&64 ? 1 : 0;
409 s->predictor= method&63;
410 s->bitstream_bpp= ((uint8_t*)avctx->extradata)[1];
411 if(s->bitstream_bpp==0)
412 s->bitstream_bpp= avctx->bits_per_sample&~7;
414 if(read_huffman_tables(s, ((uint8_t*)avctx->extradata)+4, avctx->extradata_size) < 0)
417 switch(avctx->bits_per_sample&7){
428 s->decorrelate= avctx->bits_per_sample >= 24;
431 s->predictor= MEDIAN;
435 s->predictor= LEFT; //OLD
439 s->bitstream_bpp= avctx->bits_per_sample & ~7;
441 if(read_old_huffman_tables(s) < 0)
445 s->interlaced= height > 288;
447 switch(s->bitstream_bpp){
449 avctx->pix_fmt = PIX_FMT_YUV420P;
453 avctx->pix_fmt = PIX_FMT_YUV422;
455 avctx->pix_fmt = PIX_FMT_YUV422P;
461 avctx->pix_fmt = PIX_FMT_RGBA32;
463 avctx->pix_fmt = PIX_FMT_BGR24;
470 // printf("pred:%d bpp:%d hbpp:%d il:%d\n", s->predictor, s->bitstream_bpp, avctx->bits_per_sample, s->interlaced);
475 static void store_table(HYuvContext *s, uint8_t *len){
477 int index= s->avctx->extradata_size;
484 for(; i<256 && len[i]==val; i++);
489 ((uint8_t*)s->avctx->extradata)[index++]= val;
490 ((uint8_t*)s->avctx->extradata)[index++]= repeat;
492 ((uint8_t*)s->avctx->extradata)[index++]= val | (repeat<<5);
496 s->avctx->extradata_size= index;
499 static int encode_init(AVCodecContext *avctx)
501 HYuvContext *s = avctx->priv_data;
502 int i, j, width, height;
505 s->flags= avctx->flags;
507 dsputil_init(&s->dsp, avctx);
509 width= s->width= avctx->width;
510 height= s->height= avctx->height;
512 assert(width && height);
514 avctx->extradata= av_mallocz(1024*10);
515 avctx->stats_out= av_mallocz(1024*10);
518 avctx->coded_frame= &s->picture;
520 switch(avctx->pix_fmt){
521 case PIX_FMT_YUV420P:
522 if(avctx->strict_std_compliance>=0){
523 fprintf(stderr, "YV12-huffyuv is experimental, there WILL be no compatbility! (use (v)strict=-1)\n");
526 s->bitstream_bpp= 12;
528 case PIX_FMT_YUV422P:
529 s->bitstream_bpp= 16;
532 fprintf(stderr, "format not supported\n");
535 avctx->bits_per_sample= s->bitstream_bpp;
536 s->decorrelate= s->bitstream_bpp >= 24;
537 s->predictor= avctx->prediction_method;
539 ((uint8_t*)avctx->extradata)[0]= s->predictor;
540 ((uint8_t*)avctx->extradata)[1]= s->bitstream_bpp;
541 ((uint8_t*)avctx->extradata)[2]=
542 ((uint8_t*)avctx->extradata)[3]= 0;
543 s->avctx->extradata_size= 4;
546 char *p= avctx->stats_in;
556 for(j=0; j<256; j++){
557 s->stats[i][j]+= strtol(p, &next, 0);
558 if(next==p) return -1;
562 if(p[0]==0 || p[1]==0 || p[2]==0) break;
566 for(j=0; j<256; j++){
567 int d= FFMIN(j, 256-j);
569 s->stats[i][j]= 100000000/(d+1);
574 generate_len_table(s->len[i], s->stats[i], 256);
576 if(generate_bits_table(s->bits[i], s->len[i])<0){
580 store_table(s, s->len[i]);
587 s->interlaced= height > 288;
589 // printf("pred:%d bpp:%d hbpp:%d il:%d\n", s->predictor, s->bitstream_bpp, avctx->bits_per_sample, s->interlaced);
596 static void decode_422_bitstream(HYuvContext *s, int count){
601 for(i=0; i<count; i++){
602 s->temp[0][2*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
603 s->temp[1][ i ]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
604 s->temp[0][2*i+1]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
605 s->temp[2][ i ]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
609 static void decode_gray_bitstream(HYuvContext *s, int count){
614 for(i=0; i<count; i++){
615 s->temp[0][2*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
616 s->temp[0][2*i+1]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
620 static void encode_422_bitstream(HYuvContext *s, int count){
624 if(s->flags&CODEC_FLAG_PASS1){
625 for(i=0; i<count; i++){
626 s->stats[0][ s->temp[0][2*i ] ]++;
627 s->stats[1][ s->temp[1][ i ] ]++;
628 s->stats[0][ s->temp[0][2*i+1] ]++;
629 s->stats[2][ s->temp[2][ i ] ]++;
632 for(i=0; i<count; i++){
633 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
634 put_bits(&s->pb, s->len[1][ s->temp[1][ i ] ], s->bits[1][ s->temp[1][ i ] ]);
635 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
636 put_bits(&s->pb, s->len[2][ s->temp[2][ i ] ], s->bits[2][ s->temp[2][ i ] ]);
641 static void encode_gray_bitstream(HYuvContext *s, int count){
645 if(s->flags&CODEC_FLAG_PASS1){
646 for(i=0; i<count; i++){
647 s->stats[0][ s->temp[0][2*i ] ]++;
648 s->stats[0][ s->temp[0][2*i+1] ]++;
651 for(i=0; i<count; i++){
652 put_bits(&s->pb, s->len[0][ s->temp[0][2*i ] ], s->bits[0][ s->temp[0][2*i ] ]);
653 put_bits(&s->pb, s->len[0][ s->temp[0][2*i+1] ], s->bits[0][ s->temp[0][2*i+1] ]);
658 static void decode_bgr_bitstream(HYuvContext *s, int count){
662 if(s->bitstream_bpp==24){
663 for(i=0; i<count; i++){
664 s->temp[0][4*i+1]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
665 s->temp[0][4*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3) + s->temp[0][4*i+1];
666 s->temp[0][4*i+2]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3) + s->temp[0][4*i+1];
669 for(i=0; i<count; i++){
670 s->temp[0][4*i+1]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
671 s->temp[0][4*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3) + s->temp[0][4*i+1];
672 s->temp[0][4*i+2]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3) + s->temp[0][4*i+1];
673 get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); //?!
677 if(s->bitstream_bpp==24){
678 for(i=0; i<count; i++){
679 s->temp[0][4*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
680 s->temp[0][4*i+1]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
681 s->temp[0][4*i+2]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
684 for(i=0; i<count; i++){
685 s->temp[0][4*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
686 s->temp[0][4*i+1]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3);
687 s->temp[0][4*i+2]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
688 get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); //?!
694 static void draw_slice(HYuvContext *s, int y){
698 if(s->avctx->draw_horiz_band==NULL)
701 h= y - s->last_slice_end;
704 if(s->bitstream_bpp==12){
710 src_ptr[0] = s->picture.data[0] + s->picture.linesize[0]*y;
711 src_ptr[1] = s->picture.data[1] + s->picture.linesize[1]*cy;
712 src_ptr[2] = s->picture.data[2] + s->picture.linesize[2]*cy;
715 s->avctx->draw_horiz_band(s->avctx, src_ptr, s->picture.linesize[0], y, s->width, h);
717 s->last_slice_end= y + h;
720 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
721 HYuvContext *s = avctx->priv_data;
722 const int width= s->width;
723 const int width2= s->width>>1;
724 const int height= s->height;
725 int fake_ystride, fake_ustride, fake_vstride;
726 AVFrame * const p= &s->picture;
728 AVFrame *picture = data;
732 /* no supplementary picture */
736 bswap_buf((uint32_t*)s->bitstream_buffer, (uint32_t*)buf, buf_size/4);
738 init_get_bits(&s->gb, s->bitstream_buffer, buf_size*8);
741 if(avctx->get_buffer(avctx, p) < 0){
742 fprintf(stderr, "get_buffer() failed\n");
746 fake_ystride= s->interlaced ? p->linesize[0]*2 : p->linesize[0];
747 fake_ustride= s->interlaced ? p->linesize[1]*2 : p->linesize[1];
748 fake_vstride= s->interlaced ? p->linesize[2]*2 : p->linesize[2];
750 s->last_slice_end= 0;
752 if(s->bitstream_bpp<24){
754 int lefty, leftu, leftv;
755 int lefttopy, lefttopu, lefttopv;
758 p->data[0][3]= get_bits(&s->gb, 8);
759 p->data[0][2]= get_bits(&s->gb, 8);
760 p->data[0][1]= get_bits(&s->gb, 8);
761 p->data[0][0]= get_bits(&s->gb, 8);
763 fprintf(stderr, "YUY2 output isnt implemenetd yet\n");
767 leftv= p->data[2][0]= get_bits(&s->gb, 8);
768 lefty= p->data[0][1]= get_bits(&s->gb, 8);
769 leftu= p->data[1][0]= get_bits(&s->gb, 8);
770 p->data[0][0]= get_bits(&s->gb, 8);
772 switch(s->predictor){
775 decode_422_bitstream(s, width-2);
776 lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty);
777 if(!(s->flags&CODEC_FLAG_GRAY)){
778 leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu);
779 leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv);
782 for(cy=y=1; y<s->height; y++,cy++){
783 uint8_t *ydst, *udst, *vdst;
785 if(s->bitstream_bpp==12){
786 decode_gray_bitstream(s, width);
788 ydst= p->data[0] + p->linesize[0]*y;
790 lefty= add_left_prediction(ydst, s->temp[0], width, lefty);
791 if(s->predictor == PLANE){
793 s->dsp.add_bytes(ydst, ydst - fake_ystride, width);
796 if(y>=s->height) break;
801 ydst= p->data[0] + p->linesize[0]*y;
802 udst= p->data[1] + p->linesize[1]*cy;
803 vdst= p->data[2] + p->linesize[2]*cy;
805 decode_422_bitstream(s, width);
806 lefty= add_left_prediction(ydst, s->temp[0], width, lefty);
807 if(!(s->flags&CODEC_FLAG_GRAY)){
808 leftu= add_left_prediction(udst, s->temp[1], width2, leftu);
809 leftv= add_left_prediction(vdst, s->temp[2], width2, leftv);
811 if(s->predictor == PLANE){
812 if(cy>s->interlaced){
813 s->dsp.add_bytes(ydst, ydst - fake_ystride, width);
814 if(!(s->flags&CODEC_FLAG_GRAY)){
815 s->dsp.add_bytes(udst, udst - fake_ustride, width2);
816 s->dsp.add_bytes(vdst, vdst - fake_vstride, width2);
821 draw_slice(s, height);
825 /* first line except first 2 pixels is left predicted */
826 decode_422_bitstream(s, width-2);
827 lefty= add_left_prediction(p->data[0] + 2, s->temp[0], width-2, lefty);
828 if(!(s->flags&CODEC_FLAG_GRAY)){
829 leftu= add_left_prediction(p->data[1] + 1, s->temp[1], width2-1, leftu);
830 leftv= add_left_prediction(p->data[2] + 1, s->temp[2], width2-1, leftv);
835 /* second line is left predicted for interlaced case */
837 decode_422_bitstream(s, width);
838 lefty= add_left_prediction(p->data[0] + p->linesize[0], s->temp[0], width, lefty);
839 if(!(s->flags&CODEC_FLAG_GRAY)){
840 leftu= add_left_prediction(p->data[1] + p->linesize[2], s->temp[1], width2, leftu);
841 leftv= add_left_prediction(p->data[2] + p->linesize[1], s->temp[2], width2, leftv);
846 /* next 4 pixels are left predicted too */
847 decode_422_bitstream(s, 4);
848 lefty= add_left_prediction(p->data[0] + fake_ystride, s->temp[0], 4, lefty);
849 if(!(s->flags&CODEC_FLAG_GRAY)){
850 leftu= add_left_prediction(p->data[1] + fake_ustride, s->temp[1], 2, leftu);
851 leftv= add_left_prediction(p->data[2] + fake_vstride, s->temp[2], 2, leftv);
854 /* next line except the first 4 pixels is median predicted */
855 lefttopy= p->data[0][3];
856 decode_422_bitstream(s, width-4);
857 add_median_prediction(p->data[0] + fake_ystride+4, p->data[0]+4, s->temp[0], width-4, &lefty, &lefttopy);
858 if(!(s->flags&CODEC_FLAG_GRAY)){
859 lefttopu= p->data[1][1];
860 lefttopv= p->data[2][1];
861 add_median_prediction(p->data[1] + fake_ustride+2, p->data[1]+2, s->temp[1], width2-2, &leftu, &lefttopu);
862 add_median_prediction(p->data[2] + fake_vstride+2, p->data[2]+2, s->temp[2], width2-2, &leftv, &lefttopv);
866 for(; y<height; y++,cy++){
867 uint8_t *ydst, *udst, *vdst;
869 if(s->bitstream_bpp==12){
871 decode_gray_bitstream(s, width);
872 ydst= p->data[0] + p->linesize[0]*y;
873 add_median_prediction(ydst, ydst - fake_ystride, s->temp[0], width, &lefty, &lefttopy);
880 decode_422_bitstream(s, width);
882 ydst= p->data[0] + p->linesize[0]*y;
883 udst= p->data[1] + p->linesize[1]*cy;
884 vdst= p->data[2] + p->linesize[2]*cy;
886 add_median_prediction(ydst, ydst - fake_ystride, s->temp[0], width, &lefty, &lefttopy);
887 if(!(s->flags&CODEC_FLAG_GRAY)){
888 add_median_prediction(udst, udst - fake_ustride, s->temp[1], width2, &leftu, &lefttopu);
889 add_median_prediction(vdst, vdst - fake_vstride, s->temp[2], width2, &leftv, &lefttopv);
893 draw_slice(s, height);
899 int leftr, leftg, leftb;
900 const int last_line= (height-1)*p->linesize[0];
902 if(s->bitstream_bpp==32){
903 p->data[0][last_line+3]= get_bits(&s->gb, 8);
904 leftr= p->data[0][last_line+2]= get_bits(&s->gb, 8);
905 leftg= p->data[0][last_line+1]= get_bits(&s->gb, 8);
906 leftb= p->data[0][last_line+0]= get_bits(&s->gb, 8);
908 leftr= p->data[0][last_line+2]= get_bits(&s->gb, 8);
909 leftg= p->data[0][last_line+1]= get_bits(&s->gb, 8);
910 leftb= p->data[0][last_line+0]= get_bits(&s->gb, 8);
911 skip_bits(&s->gb, 8);
915 switch(s->predictor){
918 decode_bgr_bitstream(s, width-1);
919 add_left_prediction_bgr32(p->data[0] + last_line+4, s->temp[0], width-1, &leftr, &leftg, &leftb);
921 for(y=s->height-2; y>=0; y--){ //yes its stored upside down
922 decode_bgr_bitstream(s, width);
924 add_left_prediction_bgr32(p->data[0] + p->linesize[0]*y, s->temp[0], width, &leftr, &leftg, &leftb);
925 if(s->predictor == PLANE){
926 if((y&s->interlaced)==0){
927 s->dsp.add_bytes(p->data[0] + p->linesize[0]*y,
928 p->data[0] + p->linesize[0]*y + fake_ystride, fake_ystride);
932 draw_slice(s, height); // just 1 large slice as this isnt possible in reverse order
935 fprintf(stderr, "prediction type not supported!\n");
939 fprintf(stderr, "BGR24 output isnt implemenetd yet\n");
947 avctx->release_buffer(avctx, p);
949 *data_size = sizeof(AVFrame);
951 return (get_bits_count(&s->gb)+31)/32*4;
954 static int decode_end(AVCodecContext *avctx)
956 HYuvContext *s = avctx->priv_data;
960 free_vlc(&s->vlc[i]);
963 if(avctx->get_buffer == avcodec_default_get_buffer){
965 av_freep(&s->picture.base[i]);
966 s->picture.data[i]= NULL;
968 av_freep(&s->picture.opaque);
974 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
975 HYuvContext *s = avctx->priv_data;
976 AVFrame *pict = data;
977 const int width= s->width;
978 const int width2= s->width>>1;
979 const int height= s->height;
980 const int fake_ystride= s->interlaced ? pict->linesize[0]*2 : pict->linesize[0];
981 const int fake_ustride= s->interlaced ? pict->linesize[1]*2 : pict->linesize[1];
982 const int fake_vstride= s->interlaced ? pict->linesize[2]*2 : pict->linesize[2];
983 AVFrame * const p= &s->picture;
986 init_put_bits(&s->pb, buf, buf_size, NULL, NULL);
989 p->pict_type= FF_I_TYPE;
992 if(avctx->pix_fmt == PIX_FMT_YUV422P || avctx->pix_fmt == PIX_FMT_YUV420P){
993 int lefty, leftu, leftv, y, cy;
995 put_bits(&s->pb, 8, leftv= p->data[2][0]);
996 put_bits(&s->pb, 8, lefty= p->data[0][1]);
997 put_bits(&s->pb, 8, leftu= p->data[1][0]);
998 put_bits(&s->pb, 8, p->data[0][0]);
1000 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+2, width-2 , lefty);
1001 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+1, width2-1, leftu);
1002 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+1, width2-1, leftv);
1004 encode_422_bitstream(s, width-2);
1006 if(s->predictor==MEDIAN){
1007 int lefttopy, lefttopu, lefttopv;
1010 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+p->linesize[0], width , lefty);
1011 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+p->linesize[1], width2, leftu);
1012 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+p->linesize[2], width2, leftv);
1014 encode_422_bitstream(s, width);
1018 lefty= sub_left_prediction(s, s->temp[0], p->data[0]+fake_ystride, 4, lefty);
1019 leftu= sub_left_prediction(s, s->temp[1], p->data[1]+fake_ystride, 2, leftu);
1020 leftv= sub_left_prediction(s, s->temp[2], p->data[2]+fake_ystride, 2, leftv);
1022 encode_422_bitstream(s, 4);
1024 lefttopy= p->data[0][3];
1025 lefttopu= p->data[1][1];
1026 lefttopv= p->data[2][1];
1027 sub_median_prediction(s->temp[0], p->data[0]+4, p->data[0] + fake_ystride+4, width-4 , &lefty, &lefttopy);
1028 sub_median_prediction(s->temp[1], p->data[1]+2, p->data[1] + fake_ustride+2, width2-2, &leftu, &lefttopu);
1029 sub_median_prediction(s->temp[2], p->data[2]+2, p->data[2] + fake_vstride+2, width2-2, &leftv, &lefttopv);
1030 encode_422_bitstream(s, width-4);
1033 for(; y<height; y++,cy++){
1034 uint8_t *ydst, *udst, *vdst;
1036 if(s->bitstream_bpp==12){
1038 ydst= p->data[0] + p->linesize[0]*y;
1039 sub_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
1040 encode_gray_bitstream(s, width);
1043 if(y>=height) break;
1045 ydst= p->data[0] + p->linesize[0]*y;
1046 udst= p->data[1] + p->linesize[1]*cy;
1047 vdst= p->data[2] + p->linesize[2]*cy;
1049 sub_median_prediction(s->temp[0], ydst - fake_ystride, ydst, width , &lefty, &lefttopy);
1050 sub_median_prediction(s->temp[1], udst - fake_ustride, udst, width2, &leftu, &lefttopu);
1051 sub_median_prediction(s->temp[2], vdst - fake_vstride, vdst, width2, &leftv, &lefttopv);
1053 encode_422_bitstream(s, width);
1056 for(cy=y=1; y<height; y++,cy++){
1057 uint8_t *ydst, *udst, *vdst;
1059 /* encode a luma only line & y++ */
1060 if(s->bitstream_bpp==12){
1061 ydst= p->data[0] + p->linesize[0]*y;
1063 if(s->predictor == PLANE && s->interlaced < y){
1064 s->dsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
1066 lefty= sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
1068 lefty= sub_left_prediction(s, s->temp[0], ydst, width , lefty);
1070 encode_gray_bitstream(s, width);
1072 if(y>=height) break;
1075 ydst= p->data[0] + p->linesize[0]*y;
1076 udst= p->data[1] + p->linesize[1]*cy;
1077 vdst= p->data[2] + p->linesize[2]*cy;
1079 if(s->predictor == PLANE && s->interlaced < cy){
1080 s->dsp.diff_bytes(s->temp[1], ydst, ydst - fake_ystride, width);
1081 s->dsp.diff_bytes(s->temp[2], udst, udst - fake_ustride, width2);
1082 s->dsp.diff_bytes(s->temp[3], vdst, vdst - fake_vstride, width2);
1084 lefty= sub_left_prediction(s, s->temp[0], s->temp[1], width , lefty);
1085 leftu= sub_left_prediction(s, s->temp[1], s->temp[2], width2, leftu);
1086 leftv= sub_left_prediction(s, s->temp[2], s->temp[3], width2, leftv);
1088 lefty= sub_left_prediction(s, s->temp[0], ydst, width , lefty);
1089 leftu= sub_left_prediction(s, s->temp[1], udst, width2, leftu);
1090 leftv= sub_left_prediction(s, s->temp[2], vdst, width2, leftv);
1093 encode_422_bitstream(s, width);
1097 fprintf(stderr, "Format not supported!\n");
1101 size= (get_bit_count(&s->pb)+31)/32;
1103 if((s->flags&CODEC_FLAG_PASS1) && (s->picture_number&31)==0){
1105 char *p= avctx->stats_out;
1107 for(j=0; j<256; j++){
1108 sprintf(p, "%Ld ", s->stats[i][j]);
1116 flush_put_bits(&s->pb);
1117 bswap_buf((uint32_t*)buf, (uint32_t*)buf, size);
1120 s->picture_number++;
1125 static int encode_end(AVCodecContext *avctx)
1127 // HYuvContext *s = avctx->priv_data;
1129 av_freep(&avctx->extradata);
1130 av_freep(&avctx->stats_out);
1135 AVCodec huffyuv_decoder = {
1139 sizeof(HYuvContext),
1144 CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND,
1148 AVCodec huffyuv_encoder = {
1152 sizeof(HYuvContext),