comparison h263.c @ 350:6ebbecc10063 libavcodec

- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now. - Bug fix H.263+ AIC tables. - Warning fixes.
author pulento
date Thu, 02 May 2002 04:39:45 +0000
parents c2f789fe4945
children ac6fc4c7aecb
comparison
equal deleted inserted replaced
349:34f6c77ff01a 350:6ebbecc10063
44 static int h263p_decode_umotion(MpegEncContext * s, int pred); 44 static int h263p_decode_umotion(MpegEncContext * s, int pred);
45 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, 45 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
46 int n, int coded); 46 int n, int coded);
47 static int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, 47 static int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
48 int n, int coded); 48 int n, int coded);
49 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr);
49 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr); 50 static inline int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr);
50 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n, 51 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
51 int dir); 52 int dir);
52 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s); 53 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);
53 54
126 put_bits(&s->pb,1,0); /* Custom PCF: off */ 127 put_bits(&s->pb,1,0); /* Custom PCF: off */
127 s->umvplus = (s->pict_type == P_TYPE) && s->unrestricted_mv; 128 s->umvplus = (s->pict_type == P_TYPE) && s->unrestricted_mv;
128 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */ 129 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
129 put_bits(&s->pb,1,0); /* SAC: off */ 130 put_bits(&s->pb,1,0); /* SAC: off */
130 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */ 131 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
131 put_bits(&s->pb,1,0); /* Advanced Intra Coding: off */ 132 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
132 put_bits(&s->pb,1,0); /* Deblocking Filter: off */ 133 put_bits(&s->pb,1,0); /* Deblocking Filter: off */
133 put_bits(&s->pb,1,0); /* Slice Structured: off */ 134 put_bits(&s->pb,1,0); /* Slice Structured: off */
134 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */ 135 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
135 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */ 136 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
136 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */ 137 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
140 141
141 put_bits(&s->pb, 3, s->pict_type == P_TYPE); 142 put_bits(&s->pb, 3, s->pict_type == P_TYPE);
142 143
143 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */ 144 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
144 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */ 145 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
145 put_bits(&s->pb,1,0); /* Rounding Type */ 146 if (s->pict_type == I_TYPE)
147 s->no_rounding = 0;
148 else
149 s->no_rounding ^= 1;
150 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
146 put_bits(&s->pb,2,0); /* Reserved */ 151 put_bits(&s->pb,2,0); /* Reserved */
147 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */ 152 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
148 153
149 /* This should be here if PLUSPTYPE */ 154 /* This should be here if PLUSPTYPE */
150 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */ 155 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
537 void h263_encode_mb(MpegEncContext * s, 542 void h263_encode_mb(MpegEncContext * s,
538 DCTELEM block[6][64], 543 DCTELEM block[6][64],
539 int motion_x, int motion_y) 544 int motion_x, int motion_y)
540 { 545 {
541 int cbpc, cbpy, i, cbp, pred_x, pred_y; 546 int cbpc, cbpy, i, cbp, pred_x, pred_y;
542 547 INT16 pred_dc;
543 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); 548 INT16 rec_intradc[6];
549 UINT16 *dc_ptr[6];
550
551 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
544 if (!s->mb_intra) { 552 if (!s->mb_intra) {
545 /* compute cbp */ 553 /* compute cbp */
546 cbp = 0; 554 cbp = 0;
547 for (i = 0; i < 6; i++) { 555 for (i = 0; i < 6; i++) {
548 if (s->block_last_index[i] >= 0) 556 if (s->block_last_index[i] >= 0)
549 cbp |= 1 << (5 - i); 557 cbp |= 1 << (5 - i);
550 } 558 }
551 if ((cbp | motion_x | motion_y) == 0) { 559 if ((cbp | motion_x | motion_y) == 0) {
552 /* skip macroblock */ 560 /* skip macroblock */
553 put_bits(&s->pb, 1, 1); 561 put_bits(&s->pb, 1, 1);
554 return; 562 return;
555 } 563 }
556 put_bits(&s->pb, 1, 0); /* mb coded */ 564 put_bits(&s->pb, 1, 0); /* mb coded */
557 cbpc = cbp & 3; 565 cbpc = cbp & 3;
558 put_bits(&s->pb, 566 put_bits(&s->pb,
559 inter_MCBPC_bits[cbpc], 567 inter_MCBPC_bits[cbpc],
560 inter_MCBPC_code[cbpc]); 568 inter_MCBPC_code[cbpc]);
561 cbpy = cbp >> 2; 569 cbpy = cbp >> 2;
562 cbpy ^= 0xf; 570 cbpy ^= 0xf;
563 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); 571 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
564 572
565 /* motion vectors: 16x16 mode only now */ 573 /* motion vectors: 16x16 mode only now */
566 h263_pred_motion(s, 0, &pred_x, &pred_y); 574 h263_pred_motion(s, 0, &pred_x, &pred_y);
567 575
568 if (!s->umvplus) { 576 if (!s->umvplus) {
569 h263_encode_motion(s, motion_x - pred_x, s->f_code); 577 h263_encode_motion(s, motion_x - pred_x, s->f_code);
570 h263_encode_motion(s, motion_y - pred_y, s->f_code); 578 h263_encode_motion(s, motion_y - pred_y, s->f_code);
571 } 579 }
572 else { 580 else {
573 h263p_encode_umotion(s, motion_x - pred_x); 581 h263p_encode_umotion(s, motion_x - pred_x);
574 h263p_encode_umotion(s, motion_y - pred_y); 582 h263p_encode_umotion(s, motion_y - pred_y);
575 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1)) 583 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
576 /* To prevent Start Code emulation */ 584 /* To prevent Start Code emulation */
577 put_bits(&s->pb,1,1); 585 put_bits(&s->pb,1,1);
578 } 586 }
579 } else { 587 } else {
580 /* compute cbp */ 588 int li = s->h263_aic ? 0 : 1;
581 cbp = 0; 589
582 for (i = 0; i < 6; i++) { 590 cbp = 0;
583 if (s->block_last_index[i] >= 1) 591 for(i=0; i<6; i++) {
584 cbp |= 1 << (5 - i); 592 /* Predict DC */
585 } 593 if (s->h263_aic && s->mb_intra) {
586 594 INT16 level = block[i][0];
587 cbpc = cbp & 3; 595
588 if (s->pict_type == I_TYPE) { 596 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
589 put_bits(&s->pb, 597 level -= pred_dc;
590 intra_MCBPC_bits[cbpc], 598 /* Quant */
591 intra_MCBPC_code[cbpc]); 599 if (level < 0)
592 } else { 600 level = (level + (s->qscale >> 1))/(s->y_dc_scale);
593 put_bits(&s->pb, 1, 0); /* mb coded */ 601 else
594 put_bits(&s->pb, 602 level = (level - (s->qscale >> 1))/(s->y_dc_scale);
595 inter_MCBPC_bits[cbpc + 4], 603
596 inter_MCBPC_code[cbpc + 4]); 604 /* AIC can change CBP */
597 } 605 if (level == 0 && s->block_last_index[i] == 0)
598 if (s->h263_pred) { 606 s->block_last_index[i] = -1;
599 /* XXX: currently, we do not try to use ac prediction */ 607 else if (level < -127)
600 put_bits(&s->pb, 1, 0); /* no ac prediction */ 608 level = -127;
601 } 609 else if (level > 127)
602 cbpy = cbp >> 2; 610 level = 127;
603 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); 611
604 } 612 block[i][0] = level;
605 613 /* Reconstruction */
606 /* encode each block */ 614 rec_intradc[i] = (s->y_dc_scale*level) + pred_dc;
607 for (i = 0; i < 6; i++) { 615 /* Oddify */
616 rec_intradc[i] |= 1;
617 //if ((rec_intradc[i] % 2) == 0)
618 // rec_intradc[i]++;
619 /* Clipping */
620 if (rec_intradc[i] < 0)
621 rec_intradc[i] = 0;
622 else if (rec_intradc[i] > 2047)
623 rec_intradc[i] = 2047;
624
625 /* Update AC/DC tables */
626 *dc_ptr[i] = rec_intradc[i];
627 }
628 /* compute cbp */
629 if (s->block_last_index[i] >= li)
630 cbp |= 1 << (5 - i);
631 }
632
633 cbpc = cbp & 3;
634 if (s->pict_type == I_TYPE) {
635 put_bits(&s->pb,
636 intra_MCBPC_bits[cbpc],
637 intra_MCBPC_code[cbpc]);
638 } else {
639 put_bits(&s->pb, 1, 0); /* mb coded */
640 put_bits(&s->pb,
641 inter_MCBPC_bits[cbpc + 4],
642 inter_MCBPC_code[cbpc + 4]);
643 }
644 if (s->h263_aic) {
645 /* XXX: currently, we do not try to use ac prediction */
646 put_bits(&s->pb, 1, 0); /* no AC prediction */
647 }
648 cbpy = cbp >> 2;
649 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
650 }
651
652 for(i=0; i<6; i++) {
653 /* encode each block */
608 h263_encode_block(s, block[i], i); 654 h263_encode_block(s, block[i], i);
609 } 655
610 } 656 /* Update INTRADC for decoding */
611 657 if (s->h263_aic && s->mb_intra) {
612 void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n) 658 block[i][0] = rec_intradc[i];
613 { 659
614 int x, y, wrap, a, c, pred_dc, scale, i; 660 }
615 INT16 *dc_val, *ac_val, *ac_val1; 661 }
662 }
663
664 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
665 {
666 int x, y, wrap, a, c, pred_dc, scale;
667 INT16 *dc_val, *ac_val;
616 668
617 /* find prediction */ 669 /* find prediction */
618 if (n < 4) { 670 if (n < 4) {
619 x = 2 * s->mb_x + 1 + (n & 1); 671 x = 2 * s->mb_x + 1 + (n & 1);
620 y = 2 * s->mb_y + 1 + ((n & 2) >> 1); 672 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
628 wrap = s->mb_width + 2; 680 wrap = s->mb_width + 2;
629 dc_val = s->dc_val[n - 4 + 1]; 681 dc_val = s->dc_val[n - 4 + 1];
630 ac_val = s->ac_val[n - 4 + 1][0]; 682 ac_val = s->ac_val[n - 4 + 1][0];
631 scale = s->c_dc_scale; 683 scale = s->c_dc_scale;
632 } 684 }
685 /* B C
686 * A X
687 */
688 a = dc_val[(x - 1) + (y) * wrap];
689 c = dc_val[(x) + (y - 1) * wrap];
690
691 /* No prediction outside GOB boundary */
692 if (s->first_gob_line && ((n < 2) || (n > 3)))
693 c = 1024;
694 pred_dc = 1024;
695 /* just DC prediction */
696 if (a != 1024 && c != 1024)
697 pred_dc = (a + c) >> 1;
698 else if (a != 1024)
699 pred_dc = a;
700 else
701 pred_dc = c;
702
703 /* we assume pred is positive */
704 //pred_dc = (pred_dc + (scale >> 1)) / scale;
705 *dc_val_ptr = &dc_val[x + y * wrap];
706 return pred_dc;
707 }
708
709
710 void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n)
711 {
712 int x, y, wrap, a, c, pred_dc, scale, i;
713 INT16 *dc_val, *ac_val, *ac_val1;
714
715 /* find prediction */
716 if (n < 4) {
717 x = 2 * s->mb_x + 1 + (n & 1);
718 y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
719 wrap = s->mb_width * 2 + 2;
720 dc_val = s->dc_val[0];
721 ac_val = s->ac_val[0][0];
722 scale = s->y_dc_scale;
723 } else {
724 x = s->mb_x + 1;
725 y = s->mb_y + 1;
726 wrap = s->mb_width + 2;
727 dc_val = s->dc_val[n - 4 + 1];
728 ac_val = s->ac_val[n - 4 + 1][0];
729 scale = s->c_dc_scale;
730 }
633 731
634 ac_val += ((y) * wrap + (x)) * 16; 732 ac_val += ((y) * wrap + (x)) * 16;
635 ac_val1 = ac_val; 733 ac_val1 = ac_val;
636 734
637 /* B C 735 /* B C
638 * A X 736 * A X
639 */ 737 */
640 a = dc_val[(x - 1) + (y) * wrap]; 738 a = dc_val[(x - 1) + (y) * wrap];
641 c = dc_val[(x) + (y - 1) * wrap]; 739 c = dc_val[(x) + (y - 1) * wrap];
642 740
741 /* No prediction outside GOB boundary */
742 if (s->first_gob_line && ((n < 2) || (n > 3)))
743 c = 1024;
643 pred_dc = 1024; 744 pred_dc = 1024;
644 if (s->ac_pred) { 745 if (s->ac_pred) {
645 if (s->h263_aic_dir) { 746 if (s->h263_aic_dir) {
646 /* left prediction */ 747 /* left prediction */
647 if (a != 1024) { 748 if (a != 1024) {
896 997
897 init_uni_dc_tab(); 998 init_uni_dc_tab();
898 999
899 init_rl(&rl_inter); 1000 init_rl(&rl_inter);
900 init_rl(&rl_intra); 1001 init_rl(&rl_intra);
1002 init_rl(&rl_intra_aic);
901 1003
902 init_mv_penalty_and_fcode(s); 1004 init_mv_penalty_and_fcode(s);
903 } 1005 }
904 s->mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p 1006 s->mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
905 1007
926 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x 1028 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
927 } 1029 }
928 1030
929 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n) 1031 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
930 { 1032 {
931 int level, run, last, i, j, last_index, last_non_zero, sign, slevel; 1033 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
932 int code; 1034 RLTable *rl;
933 RLTable *rl = &rl_inter; 1035
934 1036 rl = &rl_inter;
935 if (s->mb_intra) { 1037 if (s->mb_intra && !s->h263_aic) {
936 /* DC coef */ 1038 /* DC coef */
937 level = block[0]; 1039 level = block[0];
938 /* 255 cannot be represented, so we clamp */ 1040 /* 255 cannot be represented, so we clamp */
939 if (level > 254) { 1041 if (level > 254) {
940 level = 254; 1042 level = 254;
950 else 1052 else
951 put_bits(&s->pb, 8, level & 0xff); 1053 put_bits(&s->pb, 8, level & 0xff);
952 i = 1; 1054 i = 1;
953 } else { 1055 } else {
954 i = 0; 1056 i = 0;
955 } 1057 if (s->h263_aic && s->mb_intra)
956 1058 rl = &rl_intra_aic;
1059 }
1060
957 /* AC coefs */ 1061 /* AC coefs */
958 last_index = s->block_last_index[n]; 1062 last_index = s->block_last_index[n];
959 last_non_zero = i - 1; 1063 last_non_zero = i - 1;
960 for (; i <= last_index; i++) { 1064 for (; i <= last_index; i++) {
961 j = zigzag_direct[i]; 1065 j = zigzag_direct[i];
962 level = block[j]; 1066 level = block[j];
963 if (level) { 1067 if (level) {
964 run = i - last_non_zero - 1; 1068 run = i - last_non_zero - 1;
965 last = (i == last_index); 1069 last = (i == last_index);
966 sign = 0; 1070 sign = 0;
967 slevel = level; 1071 slevel = level;
968 if (level < 0) { 1072 if (level < 0) {
969 sign = 1; 1073 sign = 1;
970 level = -level; 1074 level = -level;
971 } 1075 }
972 code = get_rl_index(rl, last, run, level); 1076 code = get_rl_index(rl, last, run, level);
973 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); 1077 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
974 if (code == rl->n) { 1078 if (code == rl->n) {
975 put_bits(&s->pb, 1, last); 1079 put_bits(&s->pb, 1, last);
976 put_bits(&s->pb, 6, run); 1080 put_bits(&s->pb, 6, run);
977 put_bits(&s->pb, 8, slevel & 0xff); 1081 put_bits(&s->pb, 8, slevel & 0xff);
978 } else { 1082 } else {
979 put_bits(&s->pb, 1, sign); 1083 put_bits(&s->pb, 1, sign);
980 } 1084 }
981 last_non_zero = i; 1085 last_non_zero = i;
982 } 1086 }
983 } 1087 }
984 } 1088 }
985 1089
986 /***************************************************/ 1090 /***************************************************/
987 1091
2626 if(s->aspect_ratio_info == EXTENDET_PAR){ 2730 if(s->aspect_ratio_info == EXTENDET_PAR){
2627 skip_bits(&s->gb, 8); //par_width 2731 skip_bits(&s->gb, 8); //par_width
2628 skip_bits(&s->gb, 8); // par_height 2732 skip_bits(&s->gb, 8); // par_height
2629 } 2733 }
2630 2734
2631 if(vol_control=get_bits1(&s->gb)){ /* vol control parameter */ 2735 if ((vol_control=get_bits1(&s->gb))) { /* vol control parameter */
2632 int chroma_format= get_bits(&s->gb, 2); 2736 int chroma_format= get_bits(&s->gb, 2);
2633 if(chroma_format!=1){ 2737 if(chroma_format!=1){
2634 printf("illegal chroma format\n"); 2738 printf("illegal chroma format\n");
2635 } 2739 }
2636 s->low_delay= get_bits1(&s->gb); 2740 s->low_delay= get_bits1(&s->gb);