Mercurial > libavcodec.hg
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); |