Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Side by Side Diff: patched-ffmpeg-mt/libavcodec/h264_cabac.c

Issue 789004: ffmpeg roll of source to mar 9 version... (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/ffmpeg/
Patch Set: '' Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * H.26L/H.264/AVC/JVT/14496-10/... cabac decoding 2 * H.26L/H.264/AVC/JVT/14496-10/... cabac decoding
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> 3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4 * 4 *
5 * This file is part of FFmpeg. 5 * This file is part of FFmpeg.
6 * 6 *
7 * FFmpeg is free software; you can redistribute it and/or 7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public 8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version. 10 * version 2.1 of the License, or (at your option) any later version.
(...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 }, 681 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
682 { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 }, 682 { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 },
683 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 }, 683 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
684 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 }, 684 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
685 } 685 }
686 }; 686 };
687 687
688 void ff_h264_init_cabac_states(H264Context *h) { 688 void ff_h264_init_cabac_states(H264Context *h) {
689 MpegEncContext * const s = &h->s; 689 MpegEncContext * const s = &h->s;
690 int i; 690 int i;
691 const int8_t (*tab)[2];
692
693 if( h->slice_type_nos == FF_I_TYPE ) tab = cabac_context_init_I;
694 else tab = cabac_context_init_PB[h->cabac_in it_idc];
691 695
692 /* calculate pre-state */ 696 /* calculate pre-state */
693 for( i= 0; i < 460; i++ ) { 697 for( i= 0; i < 460; i++ ) {
694 int pre; 698 int pre = 2*(((tab[i][0] * s->qscale) >>4 ) + tab[i][1]) - 127;
695 if( h->slice_type_nos == FF_I_TYPE )
696 pre = av_clip( ((cabac_context_init_I[i][0] * s->qscale) >>4 ) + cab ac_context_init_I[i][1], 1, 126 );
697 else
698 pre = av_clip( ((cabac_context_init_PB[h->cabac_init_idc][i][0] * s- >qscale) >>4 ) + cabac_context_init_PB[h->cabac_init_idc][i][1], 1, 126 );
699 699
700 if( pre <= 63 ) 700 pre^= pre>>31;
701 h->cabac_state[i] = 2 * ( 63 - pre ) + 0; 701 if(pre > 124)
702 else 702 pre= 124 + (pre&1);
703 h->cabac_state[i] = 2 * ( pre - 64 ) + 1; 703
704 h->cabac_state[i] = pre;
704 } 705 }
705 } 706 }
706 707
707 static int decode_cabac_field_decoding_flag(H264Context *h) { 708 static int decode_cabac_field_decoding_flag(H264Context *h) {
708 MpegEncContext * const s = &h->s; 709 MpegEncContext * const s = &h->s;
709 const long mba_xy = h->mb_xy - 1L;
710 const long mbb_xy = h->mb_xy - 2L*s->mb_stride; 710 const long mbb_xy = h->mb_xy - 2L*s->mb_stride;
711 711
712 unsigned long ctx = 0; 712 unsigned long ctx = 0;
713 713
714 ctx += (s->current_picture.mb_type[mba_xy]>>7)&(h->slice_table[mba_xy] == h- >slice_num); 714 ctx += h->mb_field_decoding_flag & !!s->mb_x; //for FMO:(s->current_picture. mb_type[mba_xy]>>7)&(h->slice_table[mba_xy] == h->slice_num);
715 ctx += (s->current_picture.mb_type[mbb_xy]>>7)&(h->slice_table[mbb_xy] == h- >slice_num); 715 ctx += (s->current_picture.mb_type[mbb_xy]>>7)&(h->slice_table[mbb_xy] == h- >slice_num);
716 716
717 return get_cabac_noinline( &h->cabac, &(h->cabac_state+70)[ctx] ); 717 return get_cabac_noinline( &h->cabac, &(h->cabac_state+70)[ctx] );
718 } 718 }
719 719
720 static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_sl ice) { 720 static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_sl ice) {
721 uint8_t *state= &h->cabac_state[ctx_base]; 721 uint8_t *state= &h->cabac_state[ctx_base];
722 int mb_type; 722 int mb_type;
723 723
724 if(intra_slice){ 724 if(intra_slice){
725 MpegEncContext * const s = &h->s;
726 const int mba_xy = h->left_mb_xy[0];
727 const int mbb_xy = h->top_mb_xy;
728 int ctx=0; 725 int ctx=0;
729 if( h->slice_table[mba_xy] == h->slice_num && !IS_INTRA4x4( s->current_p icture.mb_type[mba_xy] ) ) 726 if( h->left_type[0] & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
730 ctx++; 727 ctx++;
731 if( h->slice_table[mbb_xy] == h->slice_num && !IS_INTRA4x4( s->current_p icture.mb_type[mbb_xy] ) ) 728 if( h->top_type & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
732 ctx++; 729 ctx++;
733 if( get_cabac_noinline( &h->cabac, &state[ctx] ) == 0 ) 730 if( get_cabac_noinline( &h->cabac, &state[ctx] ) == 0 )
734 return 0; /* I4x4 */ 731 return 0; /* I4x4 */
735 state += 2; 732 state += 2;
736 }else{ 733 }else{
737 if( get_cabac_noinline( &h->cabac, state ) == 0 ) 734 if( get_cabac_noinline( &h->cabac, state ) == 0 )
738 return 0; /* I4x4 */ 735 return 0; /* I4x4 */
739 } 736 }
740 737
741 if( get_cabac_terminate( &h->cabac ) ) 738 if( get_cabac_terminate( &h->cabac ) )
742 return 25; /* PCM */ 739 return 25; /* PCM */
743 740
744 mb_type = 1; /* I16x16 */ 741 mb_type = 1; /* I16x16 */
745 mb_type += 12 * get_cabac_noinline( &h->cabac, &state[1] ); /* cbp_luma != 0 */ 742 mb_type += 12 * get_cabac_noinline( &h->cabac, &state[1] ); /* cbp_luma != 0 */
746 if( get_cabac_noinline( &h->cabac, &state[2] ) ) /* cbp_chroma */ 743 if( get_cabac_noinline( &h->cabac, &state[2] ) ) /* cbp_chroma */
747 mb_type += 4 + 4 * get_cabac_noinline( &h->cabac, &state[2+intra_slice] ); 744 mb_type += 4 + 4 * get_cabac_noinline( &h->cabac, &state[2+intra_slice] );
748 mb_type += 2 * get_cabac_noinline( &h->cabac, &state[3+intra_slice] ); 745 mb_type += 2 * get_cabac_noinline( &h->cabac, &state[3+intra_slice] );
749 mb_type += 1 * get_cabac_noinline( &h->cabac, &state[3+2*intra_slice] ); 746 mb_type += 1 * get_cabac_noinline( &h->cabac, &state[3+2*intra_slice] );
750 return mb_type; 747 return mb_type;
751 } 748 }
752 749
753 static int decode_cabac_mb_type_b( H264Context *h ) {
754 MpegEncContext * const s = &h->s;
755
756 const int mba_xy = h->left_mb_xy[0];
757 const int mbb_xy = h->top_mb_xy;
758 int ctx = 0;
759 int bits;
760 assert(h->slice_type_nos == FF_B_TYPE);
761
762 if( h->slice_table[mba_xy] == h->slice_num && !IS_DIRECT( s->current_pic ture.mb_type[mba_xy] ) )
763 ctx++;
764 if( h->slice_table[mbb_xy] == h->slice_num && !IS_DIRECT( s->current_pic ture.mb_type[mbb_xy] ) )
765 ctx++;
766
767 if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) )
768 return 0; /* B_Direct_16x16 */
769
770 if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) {
771 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); / * B_L[01]_16x16 */
772 }
773
774 bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3;
775 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2;
776 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1;
777 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
778 if( bits < 8 )
779 return bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
780 else if( bits == 13 ) {
781 return decode_cabac_intra_mb_type(h, 32, 0) + 23;
782 } else if( bits == 14 )
783 return 11; /* B_L1_L0_8x16 */
784 else if( bits == 15 )
785 return 22; /* B_8x8 */
786
787 bits= ( bits<<1 ) | get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
788 return bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
789 }
790
791 static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) { 750 static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) {
792 MpegEncContext * const s = &h->s; 751 MpegEncContext * const s = &h->s;
793 int mba_xy, mbb_xy; 752 int mba_xy, mbb_xy;
794 int ctx = 0; 753 int ctx = 0;
795 754
796 if(FRAME_MBAFF){ //FIXME merge with the stuff in fill_caches? 755 if(FRAME_MBAFF){ //FIXME merge with the stuff in fill_caches?
797 int mb_xy = mb_x + (mb_y&~1)*s->mb_stride; 756 int mb_xy = mb_x + (mb_y&~1)*s->mb_stride;
798 mba_xy = mb_xy - 1; 757 mba_xy = mb_xy - 1;
799 if( (mb_y&1) 758 if( (mb_y&1)
800 && h->slice_table[mba_xy] == h->slice_num 759 && h->slice_table[mba_xy] == h->slice_num
(...skipping 26 matching lines...) Expand all
827 static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) { 786 static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) {
828 int mode = 0; 787 int mode = 0;
829 788
830 if( get_cabac( &h->cabac, &h->cabac_state[68] ) ) 789 if( get_cabac( &h->cabac, &h->cabac_state[68] ) )
831 return pred_mode; 790 return pred_mode;
832 791
833 mode += 1 * get_cabac( &h->cabac, &h->cabac_state[69] ); 792 mode += 1 * get_cabac( &h->cabac, &h->cabac_state[69] );
834 mode += 2 * get_cabac( &h->cabac, &h->cabac_state[69] ); 793 mode += 2 * get_cabac( &h->cabac, &h->cabac_state[69] );
835 mode += 4 * get_cabac( &h->cabac, &h->cabac_state[69] ); 794 mode += 4 * get_cabac( &h->cabac, &h->cabac_state[69] );
836 795
837 if( mode >= pred_mode ) 796 return mode + ( mode >= pred_mode );
838 return mode + 1;
839 else
840 return mode;
841 } 797 }
842 798
843 static int decode_cabac_mb_chroma_pre_mode( H264Context *h) { 799 static int decode_cabac_mb_chroma_pre_mode( H264Context *h) {
844 const int mba_xy = h->left_mb_xy[0]; 800 const int mba_xy = h->left_mb_xy[0];
845 const int mbb_xy = h->top_mb_xy; 801 const int mbb_xy = h->top_mb_xy;
846 802
847 int ctx = 0; 803 int ctx = 0;
848 804
849 /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_ mode_table to 0 */ 805 /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_ mode_table to 0 */
850 if( h->slice_table[mba_xy] == h->slice_num && h->chroma_pred_mode_table[mba_ xy] != 0 ) 806 if( h->left_type[0] && h->chroma_pred_mode_table[mba_xy] != 0 )
851 ctx++; 807 ctx++;
852 808
853 if( h->slice_table[mbb_xy] == h->slice_num && h->chroma_pred_mode_table[mbb_ xy] != 0 ) 809 if( h->top_type && h->chroma_pred_mode_table[mbb_xy] != 0 )
854 ctx++; 810 ctx++;
855 811
856 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+ctx] ) == 0 ) 812 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+ctx] ) == 0 )
857 return 0; 813 return 0;
858 814
859 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 ) 815 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
860 return 1; 816 return 1;
861 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 ) 817 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
862 return 2; 818 return 2;
863 else 819 else
864 return 3; 820 return 3;
865 } 821 }
866 822
867 static int decode_cabac_mb_cbp_luma( H264Context *h) { 823 static int decode_cabac_mb_cbp_luma( H264Context *h) {
868 int cbp_b, cbp_a, ctx, cbp = 0; 824 int cbp_b, cbp_a, ctx, cbp = 0;
869 825
870 cbp_a = h->slice_table[h->left_mb_xy[0]] == h->slice_num ? h->left_cbp : -1; 826 cbp_a = h->left_cbp;
871 cbp_b = h->slice_table[h->top_mb_xy] == h->slice_num ? h->top_cbp : -1; 827 cbp_b = h->top_cbp;
872 828
873 ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04); 829 ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
874 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]); 830 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]);
875 ctx = !(cbp & 0x01) + 2 * !(cbp_b & 0x08); 831 ctx = !(cbp & 0x01) + 2 * !(cbp_b & 0x08);
876 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 1; 832 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 1;
877 ctx = !(cbp_a & 0x08) + 2 * !(cbp & 0x01); 833 ctx = !(cbp_a & 0x08) + 2 * !(cbp & 0x01);
878 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 2; 834 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 2;
879 ctx = !(cbp & 0x04) + 2 * !(cbp & 0x02); 835 ctx = !(cbp & 0x04) + 2 * !(cbp & 0x02);
880 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 3; 836 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 3;
881 return cbp; 837 return cbp;
882 } 838 }
883 static int decode_cabac_mb_cbp_chroma( H264Context *h) { 839 static int decode_cabac_mb_cbp_chroma( H264Context *h) {
884 int ctx; 840 int ctx;
885 int cbp_a, cbp_b; 841 int cbp_a, cbp_b;
886 842
887 cbp_a = (h->left_cbp>>4)&0x03; 843 cbp_a = (h->left_cbp>>4)&0x03;
888 cbp_b = (h-> top_cbp>>4)&0x03; 844 cbp_b = (h-> top_cbp>>4)&0x03;
889 845
890 ctx = 0; 846 ctx = 0;
891 if( cbp_a > 0 ) ctx++; 847 if( cbp_a > 0 ) ctx++;
892 if( cbp_b > 0 ) ctx += 2; 848 if( cbp_b > 0 ) ctx += 2;
893 if( get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 ) 849 if( get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 )
894 return 0; 850 return 0;
895 851
896 ctx = 4; 852 ctx = 4;
897 if( cbp_a == 2 ) ctx++; 853 if( cbp_a == 2 ) ctx++;
898 if( cbp_b == 2 ) ctx += 2; 854 if( cbp_b == 2 ) ctx += 2;
899 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ); 855 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] );
900 } 856 }
901 static int decode_cabac_mb_dqp( H264Context *h) {
902 int ctx= h->last_qscale_diff != 0;
903 int val = 0;
904 857
905 while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
906 ctx= 2+(ctx>>1);
907 val++;
908 if(val > 102) //prevent infinite loop
909 return INT_MIN;
910 }
911
912 if( val&0x01 )
913 return (val + 1)>>1 ;
914 else
915 return -((val + 1)>>1);
916 }
917 static int decode_cabac_p_mb_sub_type( H264Context *h ) { 858 static int decode_cabac_p_mb_sub_type( H264Context *h ) {
918 if( get_cabac( &h->cabac, &h->cabac_state[21] ) ) 859 if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
919 return 0; /* 8x8 */ 860 return 0; /* 8x8 */
920 if( !get_cabac( &h->cabac, &h->cabac_state[22] ) ) 861 if( !get_cabac( &h->cabac, &h->cabac_state[22] ) )
921 return 1; /* 8x4 */ 862 return 1; /* 8x4 */
922 if( get_cabac( &h->cabac, &h->cabac_state[23] ) ) 863 if( get_cabac( &h->cabac, &h->cabac_state[23] ) )
923 return 2; /* 4x8 */ 864 return 2; /* 4x8 */
924 return 3; /* 4x4 */ 865 return 3; /* 4x4 */
925 } 866 }
926 static int decode_cabac_b_mb_sub_type( H264Context *h ) { 867 static int decode_cabac_b_mb_sub_type( H264Context *h ) {
927 int type; 868 int type;
928 if( !get_cabac( &h->cabac, &h->cabac_state[36] ) ) 869 if( !get_cabac( &h->cabac, &h->cabac_state[36] ) )
929 return 0; /* B_Direct_8x8 */ 870 return 0; /* B_Direct_8x8 */
930 if( !get_cabac( &h->cabac, &h->cabac_state[37] ) ) 871 if( !get_cabac( &h->cabac, &h->cabac_state[37] ) )
931 return 1 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L0_8x8, B_L 1_8x8 */ 872 return 1 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L0_8x8, B_L 1_8x8 */
932 type = 3; 873 type = 3;
933 if( get_cabac( &h->cabac, &h->cabac_state[38] ) ) { 874 if( get_cabac( &h->cabac, &h->cabac_state[38] ) ) {
934 if( get_cabac( &h->cabac, &h->cabac_state[39] ) ) 875 if( get_cabac( &h->cabac, &h->cabac_state[39] ) )
935 return 11 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L1_4x4 , B_Bi_4x4 */ 876 return 11 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L1_4x4 , B_Bi_4x4 */
936 type += 4; 877 type += 4;
937 } 878 }
938 type += 2*get_cabac( &h->cabac, &h->cabac_state[39] ); 879 type += 2*get_cabac( &h->cabac, &h->cabac_state[39] );
939 type += get_cabac( &h->cabac, &h->cabac_state[39] ); 880 type += get_cabac( &h->cabac, &h->cabac_state[39] );
940 return type; 881 return type;
941 } 882 }
942 883
943 static inline int decode_cabac_mb_transform_size( H264Context *h ) {
944 return get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_tran sform_size] );
945 }
946
947 static int decode_cabac_mb_ref( H264Context *h, int list, int n ) { 884 static int decode_cabac_mb_ref( H264Context *h, int list, int n ) {
948 int refa = h->ref_cache[list][scan8[n] - 1]; 885 int refa = h->ref_cache[list][scan8[n] - 1];
949 int refb = h->ref_cache[list][scan8[n] - 8]; 886 int refb = h->ref_cache[list][scan8[n] - 8];
950 int ref = 0; 887 int ref = 0;
951 int ctx = 0; 888 int ctx = 0;
952 889
953 if( h->slice_type_nos == FF_B_TYPE) { 890 if( h->slice_type_nos == FF_B_TYPE) {
954 if( refa > 0 && !h->direct_cache[scan8[n] - 1] ) 891 if( refa > 0 && !(h->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
955 ctx++; 892 ctx++;
956 if( refb > 0 && !h->direct_cache[scan8[n] - 8] ) 893 if( refb > 0 && !(h->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
957 ctx += 2; 894 ctx += 2;
958 } else { 895 } else {
959 if( refa > 0 ) 896 if( refa > 0 )
960 ctx++; 897 ctx++;
961 if( refb > 0 ) 898 if( refb > 0 )
962 ctx += 2; 899 ctx += 2;
963 } 900 }
964 901
965 while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) { 902 while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) {
966 ref++; 903 ref++;
967 ctx = (ctx>>2)+4; 904 ctx = (ctx>>2)+4;
968 if(ref >= 32 /*h->ref_list[list]*/){ 905 if(ref >= 32 /*h->ref_list[list]*/){
969 return -1; 906 return -1;
970 } 907 }
971 } 908 }
972 return ref; 909 return ref;
973 } 910 }
974 911
975 static int decode_cabac_mb_mvd( H264Context *h, int list, int n, int l ) { 912 static int decode_cabac_mb_mvd( H264Context *h, int ctxbase, int amvd, int *mvda ) {
976 int amvd = abs( h->mvd_cache[list][scan8[n] - 1][l] ) +
977 abs( h->mvd_cache[list][scan8[n] - 8][l] );
978 int ctxbase = (l == 0) ? 40 : 47;
979 int mvd; 913 int mvd;
980 int ctx = (amvd>2) + (amvd>32);
981 914
982 if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+ctx])) 915 if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+((amvd-3)>>(INT_BIT-1))+((a mvd-33)>>(INT_BIT-1))+2])){
916 // if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+(amvd>2)+(amvd>32)])){
917 *mvda= 0;
983 return 0; 918 return 0;
919 }
984 920
985 mvd= 1; 921 mvd= 1;
986 ctx= 3; 922 ctxbase+= 3;
987 while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase+ctx] ) ) { 923 while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase] ) ) {
924 if( mvd < 4 )
925 ctxbase++;
988 mvd++; 926 mvd++;
989 if( ctx < 6 )
990 ctx++;
991 } 927 }
992 928
993 if( mvd >= 9 ) { 929 if( mvd >= 9 ) {
994 int k = 3; 930 int k = 3;
995 while( get_cabac_bypass( &h->cabac ) ) { 931 while( get_cabac_bypass( &h->cabac ) ) {
996 mvd += 1 << k; 932 mvd += 1 << k;
997 k++; 933 k++;
998 if(k>24){ 934 if(k>24){
999 av_log(h->s.avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mv d\n"); 935 av_log(h->s.avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mv d\n");
1000 return INT_MIN; 936 return INT_MIN;
1001 } 937 }
1002 } 938 }
1003 while( k-- ) { 939 while( k-- ) {
1004 if( get_cabac_bypass( &h->cabac ) ) 940 mvd += get_cabac_bypass( &h->cabac )<<k;
1005 mvd += 1 << k;
1006 } 941 }
1007 } 942 *mvda=mvd < 70 ? mvd : 70;
943 }else
944 *mvda=mvd;
1008 return get_cabac_bypass_sign( &h->cabac, -mvd ); 945 return get_cabac_bypass_sign( &h->cabac, -mvd );
1009 } 946 }
1010 947
948 #define DECODE_CABAC_MB_MVD( h, list, n )\
949 {\
950 int amvd0 = h->mvd_cache[list][scan8[n] - 1][0] +\
951 h->mvd_cache[list][scan8[n] - 8][0];\
952 int amvd1 = h->mvd_cache[list][scan8[n] - 1][1] +\
953 h->mvd_cache[list][scan8[n] - 8][1];\
954 \
955 mx += decode_cabac_mb_mvd( h, 40, amvd0, &mpx );\
956 my += decode_cabac_mb_mvd( h, 47, amvd1, &mpy );\
957 }
958
1011 static av_always_inline int get_cabac_cbf_ctx( H264Context *h, int cat, int idx, int is_dc ) { 959 static av_always_inline int get_cabac_cbf_ctx( H264Context *h, int cat, int idx, int is_dc ) {
1012 int nza, nzb; 960 int nza, nzb;
1013 int ctx = 0; 961 int ctx = 0;
1014 962
1015 if( is_dc ) { 963 if( is_dc ) {
1016 if( cat == 0 ) { 964 if( cat == 0 ) {
1017 nza = h->left_cbp&0x100; 965 nza = h->left_cbp&0x100;
1018 nzb = h-> top_cbp&0x100; 966 nzb = h-> top_cbp&0x100;
1019 } else { 967 } else {
1020 nza = (h->left_cbp>>(6+idx))&0x01; 968 nza = (h->left_cbp>>(6+idx))&0x01;
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1235 1183
1236 static void decode_cabac_residual( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) { 1184 static void decode_cabac_residual( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) {
1237 #if CONFIG_SMALL 1185 #if CONFIG_SMALL
1238 decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, cat == 0 || cat == 3); 1186 decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, cat == 0 || cat == 3);
1239 #else 1187 #else
1240 if( cat == 0 || cat == 3 ) decode_cabac_residual_dc(h, block, cat, n, scanta ble, qmul, max_coeff); 1188 if( cat == 0 || cat == 3 ) decode_cabac_residual_dc(h, block, cat, n, scanta ble, qmul, max_coeff);
1241 else decode_cabac_residual_nondc(h, block, cat, n, scantable, qmul, max_coef f); 1189 else decode_cabac_residual_nondc(h, block, cat, n, scantable, qmul, max_coef f);
1242 #endif 1190 #endif
1243 } 1191 }
1244 1192
1245 static inline void compute_mb_neighbors(H264Context *h)
1246 {
1247 MpegEncContext * const s = &h->s;
1248 const int mb_xy = h->mb_xy;
1249 h->top_mb_xy = mb_xy - s->mb_stride;
1250 h->left_mb_xy[0] = mb_xy - 1;
1251 if(FRAME_MBAFF){
1252 const int pair_xy = s->mb_x + (s->mb_y & ~1)*s->mb_stride;
1253 const int top_pair_xy = pair_xy - s->mb_stride;
1254 const int top_mb_field_flag = IS_INTERLACED(s->current_picture.mb_type[ top_pair_xy]);
1255 const int left_mb_field_flag = IS_INTERLACED(s->current_picture.mb_type[ pair_xy-1]);
1256 const int curr_mb_field_flag = MB_FIELD;
1257 const int bottom = (s->mb_y & 1);
1258
1259 if (curr_mb_field_flag && (bottom || top_mb_field_flag)){
1260 h->top_mb_xy -= s->mb_stride;
1261 }
1262 if (!left_mb_field_flag == curr_mb_field_flag) {
1263 h->left_mb_xy[0] = pair_xy - 1;
1264 }
1265 } else if (FIELD_PICTURE) {
1266 h->top_mb_xy -= s->mb_stride;
1267 }
1268 return;
1269 }
1270
1271 /** 1193 /**
1272 * decodes a macroblock 1194 * decodes a macroblock
1273 * @returns 0 if OK, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed 1195 * @returns 0 if OK, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed
1274 */ 1196 */
1275 int ff_h264_decode_mb_cabac(H264Context *h) { 1197 int ff_h264_decode_mb_cabac(H264Context *h) {
1276 MpegEncContext * const s = &h->s; 1198 MpegEncContext * const s = &h->s;
1277 int mb_xy; 1199 int mb_xy;
1278 int mb_type, partition_count, cbp = 0; 1200 int mb_type, partition_count, cbp = 0;
1279 int dct8x8_allowed= h->pps.transform_8x8_mode; 1201 int dct8x8_allowed= h->pps.transform_8x8_mode;
1280 1202
1281 mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride; 1203 mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
1282 1204
1283 tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y); 1205 tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y);
1284 if( h->slice_type_nos != FF_I_TYPE ) { 1206 if( h->slice_type_nos != FF_I_TYPE ) {
1285 int skip; 1207 int skip;
1286 /* a skipped mb needs the aff flag from the following mb */ 1208 /* a skipped mb needs the aff flag from the following mb */
1287 if( FRAME_MBAFF && s->mb_x==0 && (s->mb_y&1)==0 )
1288 predict_field_decoding_flag(h);
1289 if( FRAME_MBAFF && (s->mb_y&1)==1 && h->prev_mb_skipped ) 1209 if( FRAME_MBAFF && (s->mb_y&1)==1 && h->prev_mb_skipped )
1290 skip = h->next_mb_skipped; 1210 skip = h->next_mb_skipped;
1291 else 1211 else
1292 skip = decode_cabac_mb_skip( h, s->mb_x, s->mb_y ); 1212 skip = decode_cabac_mb_skip( h, s->mb_x, s->mb_y );
1293 /* read skip flags */ 1213 /* read skip flags */
1294 if( skip ) { 1214 if( skip ) {
1295 if( FRAME_MBAFF && (s->mb_y&1)==0 ){ 1215 if( FRAME_MBAFF && (s->mb_y&1)==0 ){
1296 s->current_picture.mb_type[mb_xy] = MB_TYPE_SKIP; 1216 s->current_picture.mb_type[mb_xy] = MB_TYPE_SKIP;
1297 h->next_mb_skipped = decode_cabac_mb_skip( h, s->mb_x, s->mb_y+1 ); 1217 h->next_mb_skipped = decode_cabac_mb_skip( h, s->mb_x, s->mb_y+1 );
1298 if(!h->next_mb_skipped) 1218 if(!h->next_mb_skipped)
(...skipping 11 matching lines...) Expand all
1310 } 1230 }
1311 } 1231 }
1312 if(FRAME_MBAFF){ 1232 if(FRAME_MBAFF){
1313 if( (s->mb_y&1) == 0 ) 1233 if( (s->mb_y&1) == 0 )
1314 h->mb_mbaff = 1234 h->mb_mbaff =
1315 h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h); 1235 h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
1316 } 1236 }
1317 1237
1318 h->prev_mb_skipped = 0; 1238 h->prev_mb_skipped = 0;
1319 1239
1320 compute_mb_neighbors(h); 1240 fill_decode_neighbors(h, -(MB_FIELD));
1321 1241
1322 if( h->slice_type_nos == FF_B_TYPE ) { 1242 if( h->slice_type_nos == FF_B_TYPE ) {
1323 mb_type = decode_cabac_mb_type_b( h ); 1243 int ctx = 0;
1324 if( mb_type < 23 ){ 1244 assert(h->slice_type_nos == FF_B_TYPE);
1245
1246 if( !IS_DIRECT( h->left_type[0]-1 ) )
1247 ctx++;
1248 if( !IS_DIRECT( h->top_type-1 ) )
1249 ctx++;
1250
1251 if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) ){
1252 mb_type= 0; /* B_Direct_16x16 */
1253 }else if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) {
1254 mb_type= 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */
1255 }else{
1256 int bits;
1257 bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3;
1258 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2;
1259 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1;
1260 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
1261 if( bits < 8 ){
1262 mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
1263 }else if( bits == 13 ){
1264 mb_type= decode_cabac_intra_mb_type(h, 32, 0);
1265 goto decode_intra_mb;
1266 }else if( bits == 14 ){
1267 mb_type= 11; /* B_L1_L0_8x16 */
1268 }else if( bits == 15 ){
1269 mb_type= 22; /* B_8x8 */
1270 }else{
1271 bits= ( bits<<1 ) | get_cabac_noinline( &h->cabac, &h->cabac_sta te[27+5] );
1272 mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
1273 }
1274 }
1325 partition_count= b_mb_type_info[mb_type].partition_count; 1275 partition_count= b_mb_type_info[mb_type].partition_count;
1326 mb_type= b_mb_type_info[mb_type].type; 1276 mb_type= b_mb_type_info[mb_type].type;
1327 }else{
1328 mb_type -= 23;
1329 goto decode_intra_mb;
1330 }
1331 } else if( h->slice_type_nos == FF_P_TYPE ) { 1277 } else if( h->slice_type_nos == FF_P_TYPE ) {
1332 if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) { 1278 if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) {
1333 /* P-type */ 1279 /* P-type */
1334 if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) { 1280 if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) {
1335 /* P_L0_D16x16, P_8x8 */ 1281 /* P_L0_D16x16, P_8x8 */
1336 mb_type= 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] ); 1282 mb_type= 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] );
1337 } else { 1283 } else {
1338 /* P_L0_D8x16, P_L0_D16x8 */ 1284 /* P_L0_D8x16, P_L0_D16x8 */
1339 mb_type= 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] ); 1285 mb_type= 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] );
1340 } 1286 }
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1395 if(MB_MBAFF){ 1341 if(MB_MBAFF){
1396 h->ref_count[0] <<= 1; 1342 h->ref_count[0] <<= 1;
1397 h->ref_count[1] <<= 1; 1343 h->ref_count[1] <<= 1;
1398 } 1344 }
1399 1345
1400 fill_decode_caches(h, mb_type); 1346 fill_decode_caches(h, mb_type);
1401 1347
1402 if( IS_INTRA( mb_type ) ) { 1348 if( IS_INTRA( mb_type ) ) {
1403 int i, pred_mode; 1349 int i, pred_mode;
1404 if( IS_INTRA4x4( mb_type ) ) { 1350 if( IS_INTRA4x4( mb_type ) ) {
1405 if( dct8x8_allowed && decode_cabac_mb_transform_size( h ) ) { 1351 if( dct8x8_allowed && get_cabac_noinline( &h->cabac, &h->cabac_state [399 + h->neighbor_transform_size] ) ) {
1406 mb_type |= MB_TYPE_8x8DCT; 1352 mb_type |= MB_TYPE_8x8DCT;
1407 for( i = 0; i < 16; i+=4 ) { 1353 for( i = 0; i < 16; i+=4 ) {
1408 int pred = pred_intra_mode( h, i ); 1354 int pred = pred_intra_mode( h, i );
1409 int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred ); 1355 int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred );
1410 fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 ); 1356 fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 );
1411 } 1357 }
1412 } else { 1358 } else {
1413 for( i = 0; i < 16; i++ ) { 1359 for( i = 0; i < 16; i++ ) {
1414 int pred = pred_intra_mode( h, i ); 1360 int pred = pred_intra_mode( h, i );
1415 h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_in tra4x4_pred_mode( h, pred ); 1361 h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_in tra4x4_pred_mode( h, pred );
(...skipping 24 matching lines...) Expand all
1440 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ]. partition_count; 1386 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ]. partition_count;
1441 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ]. type; 1387 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ]. type;
1442 } 1388 }
1443 if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] | 1389 if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] |
1444 h->sub_mb_type[2] | h->sub_mb_type[3]) ) { 1390 h->sub_mb_type[2] | h->sub_mb_type[3]) ) {
1445 ff_h264_pred_direct_motion(h, &mb_type); 1391 ff_h264_pred_direct_motion(h, &mb_type);
1446 h->ref_cache[0][scan8[4]] = 1392 h->ref_cache[0][scan8[4]] =
1447 h->ref_cache[1][scan8[4]] = 1393 h->ref_cache[1][scan8[4]] =
1448 h->ref_cache[0][scan8[12]] = 1394 h->ref_cache[0][scan8[12]] =
1449 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE; 1395 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
1450 if( h->ref_count[0] > 1 || h->ref_count[1] > 1 ) {
1451 for( i = 0; i < 4; i++ ) 1396 for( i = 0; i < 4; i++ )
1452 if( IS_DIRECT(h->sub_mb_type[i]) ) 1397 fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, ( h->sub_mb_type[i]>>1)&0xFF, 1 );
1453 fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, 1, 1 );
1454 }
1455 } 1398 }
1456 } else { 1399 } else {
1457 for( i = 0; i < 4; i++ ) { 1400 for( i = 0; i < 4; i++ ) {
1458 h->sub_mb_type[i] = decode_cabac_p_mb_sub_type( h ); 1401 h->sub_mb_type[i] = decode_cabac_p_mb_sub_type( h );
1459 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ]. partition_count; 1402 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ]. partition_count;
1460 h->sub_mb_type[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ]. type; 1403 h->sub_mb_type[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ]. type;
1461 } 1404 }
1462 } 1405 }
1463 1406
1464 for( list = 0; list < h->list_count; list++ ) { 1407 for( list = 0; list < h->list_count; list++ ) {
(...skipping 16 matching lines...) Expand all
1481 } 1424 }
1482 } 1425 }
1483 1426
1484 if(dct8x8_allowed) 1427 if(dct8x8_allowed)
1485 dct8x8_allowed = get_dct8x8_allowed(h); 1428 dct8x8_allowed = get_dct8x8_allowed(h);
1486 1429
1487 for(list=0; list<h->list_count; list++){ 1430 for(list=0; list<h->list_count; list++){
1488 for(i=0; i<4; i++){ 1431 for(i=0; i<4; i++){
1489 h->ref_cache[list][ scan8[4*i] ]=h->ref_cache[list][ scan8[4*i ]+1 ]; 1432 h->ref_cache[list][ scan8[4*i] ]=h->ref_cache[list][ scan8[4*i ]+1 ];
1490 if(IS_DIRECT(h->sub_mb_type[i])){ 1433 if(IS_DIRECT(h->sub_mb_type[i])){
1491 fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 4 ); 1434 fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2 );
1492 continue; 1435 continue;
1493 } 1436 }
1494 1437
1495 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_ty pe[i])){ 1438 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_ty pe[i])){
1496 const int sub_mb_type= h->sub_mb_type[i]; 1439 const int sub_mb_type= h->sub_mb_type[i];
1497 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE _16x8)) ? 2 : 1; 1440 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE _16x8)) ? 2 : 1;
1498 for(j=0; j<sub_partition_count[i]; j++){ 1441 for(j=0; j<sub_partition_count[i]; j++){
1499 int mpx, mpy; 1442 int mpx, mpy;
1500 int mx, my; 1443 int mx, my;
1501 const int index= 4*i + block_width*j; 1444 const int index= 4*i + block_width*j;
1502 int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index ] ]; 1445 int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index ] ];
1503 int16_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[ind ex] ]; 1446 uint8_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[ind ex] ];
1504 pred_motion(h, index, block_width, list, h->ref_cache[li st][ scan8[index] ], &mpx, &mpy); 1447 pred_motion(h, index, block_width, list, h->ref_cache[li st][ scan8[index] ], &mx, &my);
1505 1448 DECODE_CABAC_MB_MVD( h, list, index)
1506 mx = mpx + decode_cabac_mb_mvd( h, list, index, 0 );
1507 my = mpy + decode_cabac_mb_mvd( h, list, index, 1 );
1508 tprintf(s->avctx, "final mv:%d %d\n", mx, my); 1449 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
1509 1450
1510 if(IS_SUB_8X8(sub_mb_type)){ 1451 if(IS_SUB_8X8(sub_mb_type)){
1511 mv_cache[ 1 ][0]= 1452 mv_cache[ 1 ][0]=
1512 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx; 1453 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
1513 mv_cache[ 1 ][1]= 1454 mv_cache[ 1 ][1]=
1514 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my; 1455 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
1515 1456
1516 mvd_cache[ 1 ][0]= 1457 mvd_cache[ 1 ][0]=
1517 mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mx - mpx; 1458 mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
1518 mvd_cache[ 1 ][1]= 1459 mvd_cache[ 1 ][1]=
1519 mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= my - mpy; 1460 mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
1520 }else if(IS_SUB_8X4(sub_mb_type)){ 1461 }else if(IS_SUB_8X4(sub_mb_type)){
1521 mv_cache[ 1 ][0]= mx; 1462 mv_cache[ 1 ][0]= mx;
1522 mv_cache[ 1 ][1]= my; 1463 mv_cache[ 1 ][1]= my;
1523 1464
1524 mvd_cache[ 1 ][0]= mx - mpx; 1465 mvd_cache[ 1 ][0]= mpx;
1525 mvd_cache[ 1 ][1]= my - mpy; 1466 mvd_cache[ 1 ][1]= mpy;
1526 }else if(IS_SUB_4X8(sub_mb_type)){ 1467 }else if(IS_SUB_4X8(sub_mb_type)){
1527 mv_cache[ 8 ][0]= mx; 1468 mv_cache[ 8 ][0]= mx;
1528 mv_cache[ 8 ][1]= my; 1469 mv_cache[ 8 ][1]= my;
1529 1470
1530 mvd_cache[ 8 ][0]= mx - mpx; 1471 mvd_cache[ 8 ][0]= mpx;
1531 mvd_cache[ 8 ][1]= my - mpy; 1472 mvd_cache[ 8 ][1]= mpy;
1532 } 1473 }
1533 mv_cache[ 0 ][0]= mx; 1474 mv_cache[ 0 ][0]= mx;
1534 mv_cache[ 0 ][1]= my; 1475 mv_cache[ 0 ][1]= my;
1535 1476
1536 mvd_cache[ 0 ][0]= mx - mpx; 1477 mvd_cache[ 0 ][0]= mpx;
1537 mvd_cache[ 0 ][1]= my - mpy; 1478 mvd_cache[ 0 ][1]= mpy;
1538 } 1479 }
1539 }else{ 1480 }else{
1540 uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0] ; 1481 fill_rectangle(h->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
1541 uint32_t *pd= (uint32_t *)&h->mvd_cache[list][ scan8[4*i] ][ 0]; 1482 fill_rectangle(h->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
1542 p[0] = p[1] = p[8] = p[9] = 0;
1543 pd[0]= pd[1]= pd[8]= pd[9]= 0;
1544 } 1483 }
1545 } 1484 }
1546 } 1485 }
1547 } else if( IS_DIRECT(mb_type) ) { 1486 } else if( IS_DIRECT(mb_type) ) {
1548 ff_h264_pred_direct_motion(h, &mb_type); 1487 ff_h264_pred_direct_motion(h, &mb_type);
1549 fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 4); 1488 fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
1550 fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 4); 1489 fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
1551 dct8x8_allowed &= h->sps.direct_8x8_inference_flag; 1490 dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
1552 } else { 1491 } else {
1553 int list, mx, my, i, mpx, mpy; 1492 int list, i;
1554 if(IS_16X16(mb_type)){ 1493 if(IS_16X16(mb_type)){
1555 for(list=0; list<h->list_count; list++){ 1494 for(list=0; list<h->list_count; list++){
1556 if(IS_DIR(mb_type, 0, list)){ 1495 if(IS_DIR(mb_type, 0, list)){
1557 int ref; 1496 int ref;
1558 if(h->ref_count[list] > 1){ 1497 if(h->ref_count[list] > 1){
1559 ref= decode_cabac_mb_ref(h, list, 0); 1498 ref= decode_cabac_mb_ref(h, list, 0);
1560 if(ref >= (unsigned)h->ref_count[list]){ 1499 if(ref >= (unsigned)h->ref_count[list]){
1561 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n ", ref, h->ref_count[list]); 1500 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n ", ref, h->ref_count[list]);
1562 return -1; 1501 return -1;
1563 } 1502 }
1564 }else 1503 }else
1565 ref=0; 1504 ref=0;
1566 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1); 1505 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
1567 }else 1506 }
1568 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, (ui nt8_t)LIST_NOT_USED, 1); //FIXME factorize and the other fill_rect below too
1569 } 1507 }
1570 for(list=0; list<h->list_count; list++){ 1508 for(list=0; list<h->list_count; list++){
1571 if(IS_DIR(mb_type, 0, list)){ 1509 if(IS_DIR(mb_type, 0, list)){
1572 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], & mpx, &mpy); 1510 int mx,my,mpx,mpy;
1573 1511 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], & mx, &my);
1574 mx = mpx + decode_cabac_mb_mvd( h, list, 0, 0 ); 1512 DECODE_CABAC_MB_MVD( h, list, 0)
1575 my = mpy + decode_cabac_mb_mvd( h, list, 0, 1 );
1576 tprintf(s->avctx, "final mv:%d %d\n", mx, my); 1513 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
1577 1514
1578 fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack 16to32(mx-mpx,my-mpy), 4); 1515 fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack 8to16(mpx,mpy), 2);
1579 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack1 6to32(mx,my), 4); 1516 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack1 6to32(mx,my), 4);
1580 }else 1517 }
1581 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, 0, 4) ;
1582 } 1518 }
1583 } 1519 }
1584 else if(IS_16X8(mb_type)){ 1520 else if(IS_16X8(mb_type)){
1585 for(list=0; list<h->list_count; list++){ 1521 for(list=0; list<h->list_count; list++){
1586 for(i=0; i<2; i++){ 1522 for(i=0; i<2; i++){
1587 if(IS_DIR(mb_type, i, list)){ 1523 if(IS_DIR(mb_type, i, list)){
1588 int ref; 1524 int ref;
1589 if(h->ref_count[list] > 1){ 1525 if(h->ref_count[list] > 1){
1590 ref= decode_cabac_mb_ref( h, list, 8*i ); 1526 ref= decode_cabac_mb_ref( h, list, 8*i );
1591 if(ref >= (unsigned)h->ref_count[list]){ 1527 if(ref >= (unsigned)h->ref_count[list]){
1592 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, h->ref_count[list]); 1528 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, h->ref_count[list]);
1593 return -1; 1529 return -1;
1594 } 1530 }
1595 }else 1531 }else
1596 ref=0; 1532 ref=0;
1597 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1); 1533 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
1598 }else 1534 }else
1599 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1); 1535 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
1600 } 1536 }
1601 } 1537 }
1602 for(list=0; list<h->list_count; list++){ 1538 for(list=0; list<h->list_count; list++){
1603 for(i=0; i<2; i++){ 1539 for(i=0; i<2; i++){
1604 if(IS_DIR(mb_type, i, list)){ 1540 if(IS_DIR(mb_type, i, list)){
1605 pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[ 0] + 16*i], &mpx, &mpy); 1541 int mx,my,mpx,mpy;
1606 mx = mpx + decode_cabac_mb_mvd( h, list, 8*i, 0 ); 1542 pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[ 0] + 16*i], &mx, &my);
1607 my = mpy + decode_cabac_mb_mvd( h, list, 8*i, 1 ); 1543 DECODE_CABAC_MB_MVD( h, list, 8*i)
1608 tprintf(s->avctx, "final mv:%d %d\n", mx, my); 1544 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
1609 1545
1610 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx-mpx,my-mpy), 4); 1546 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
1611 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4); 1547 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
1612 }else{ 1548 }else{
1613 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4); 1549 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
1614 fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4); 1550 fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
1615 } 1551 }
1616 } 1552 }
1617 } 1553 }
1618 }else{ 1554 }else{
1619 assert(IS_8X16(mb_type)); 1555 assert(IS_8X16(mb_type));
1620 for(list=0; list<h->list_count; list++){ 1556 for(list=0; list<h->list_count; list++){
1621 for(i=0; i<2; i++){ 1557 for(i=0; i<2; i++){
1622 if(IS_DIR(mb_type, i, list)){ //FIXME optimize 1558 if(IS_DIR(mb_type, i, list)){ //FIXME optimize
1623 int ref; 1559 int ref;
1624 if(h->ref_count[list] > 1){ 1560 if(h->ref_count[list] > 1){
1625 ref= decode_cabac_mb_ref( h, list, 4*i ); 1561 ref= decode_cabac_mb_ref( h, list, 4*i );
1626 if(ref >= (unsigned)h->ref_count[list]){ 1562 if(ref >= (unsigned)h->ref_count[list]){
1627 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, h->ref_count[list]); 1563 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, h->ref_count[list]);
1628 return -1; 1564 return -1;
1629 } 1565 }
1630 }else 1566 }else
1631 ref=0; 1567 ref=0;
1632 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ] , 2, 4, 8, ref, 1); 1568 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ] , 2, 4, 8, ref, 1);
1633 }else 1569 }else
1634 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ] , 2, 4, 8, (LIST_NOT_USED&0xFF), 1); 1570 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ] , 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
1635 } 1571 }
1636 } 1572 }
1637 for(list=0; list<h->list_count; list++){ 1573 for(list=0; list<h->list_count; list++){
1638 for(i=0; i<2; i++){ 1574 for(i=0; i<2; i++){
1639 if(IS_DIR(mb_type, i, list)){ 1575 if(IS_DIR(mb_type, i, list)){
1640 pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8 [0] + 2*i ], &mpx, &mpy); 1576 int mx,my,mpx,mpy;
1641 mx = mpx + decode_cabac_mb_mvd( h, list, 4*i, 0 ); 1577 pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8 [0] + 2*i ], &mx, &my);
1642 my = mpy + decode_cabac_mb_mvd( h, list, 4*i, 1 ); 1578 DECODE_CABAC_MB_MVD( h, list, 4*i)
1643 1579
1644 tprintf(s->avctx, "final mv:%d %d\n", mx, my); 1580 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
1645 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx-mpx,my-mpy), 4); 1581 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
1646 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4 , 8, pack16to32(mx,my), 4); 1582 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4 , 8, pack16to32(mx,my), 4);
1647 }else{ 1583 }else{
1648 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4); 1584 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
1649 fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4); 1585 fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
1650 } 1586 }
1651 } 1587 }
1652 } 1588 }
1653 } 1589 }
1654 } 1590 }
1655 1591
1656 if( IS_INTER( mb_type ) ) { 1592 if( IS_INTER( mb_type ) ) {
1657 h->chroma_pred_mode_table[mb_xy] = 0; 1593 h->chroma_pred_mode_table[mb_xy] = 0;
1658 write_back_motion( h, mb_type ); 1594 write_back_motion( h, mb_type );
1659 } 1595 }
1660 1596
1661 if( !IS_INTRA16x16( mb_type ) ) { 1597 if( !IS_INTRA16x16( mb_type ) ) {
1662 cbp = decode_cabac_mb_cbp_luma( h ); 1598 cbp = decode_cabac_mb_cbp_luma( h );
1663 if(CHROMA) 1599 if(CHROMA)
1664 cbp |= decode_cabac_mb_cbp_chroma( h ) << 4; 1600 cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
1665 } 1601 }
1666 1602
1667 h->cbp_table[mb_xy] = h->cbp = cbp; 1603 h->cbp_table[mb_xy] = h->cbp = cbp;
1668 1604
1669 if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) { 1605 if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
1670 if( decode_cabac_mb_transform_size( h ) ) 1606 mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline( &h->cabac, &h->cabac_sta te[399 + h->neighbor_transform_size] );
1671 mb_type |= MB_TYPE_8x8DCT;
1672 } 1607 }
1673 s->current_picture.mb_type[mb_xy]= mb_type; 1608 s->current_picture.mb_type[mb_xy]= mb_type;
1674 1609
1675 if( cbp || IS_INTRA16x16( mb_type ) ) { 1610 if( cbp || IS_INTRA16x16( mb_type ) ) {
1676 const uint8_t *scan, *scan8x8, *dc_scan; 1611 const uint8_t *scan, *scan8x8, *dc_scan;
1677 const uint32_t *qmul; 1612 const uint32_t *qmul;
1678 int dqp;
1679 1613
1680 if(IS_INTERLACED(mb_type)){ 1614 if(IS_INTERLACED(mb_type)){
1681 scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0; 1615 scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
1682 scan= s->qscale ? h->field_scan : h->field_scan_q0; 1616 scan= s->qscale ? h->field_scan : h->field_scan_q0;
1683 dc_scan= luma_dc_field_scan; 1617 dc_scan= luma_dc_field_scan;
1684 }else{ 1618 }else{
1685 scan8x8= s->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0; 1619 scan8x8= s->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
1686 scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0; 1620 scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
1687 dc_scan= luma_dc_zigzag_scan; 1621 dc_scan= luma_dc_zigzag_scan;
1688 } 1622 }
1689 1623
1690 h->last_qscale_diff = dqp = decode_cabac_mb_dqp( h ); 1624 // decode_cabac_mb_dqp
1691 if( dqp == INT_MIN ){ 1625 if(get_cabac_noinline( &h->cabac, &h->cabac_state[60 + (h->last_qscale_d iff != 0)])){
1692 av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y); 1626 int val = 1;
1693 return -1; 1627 int ctx= 2;
1694 } 1628
1695 s->qscale += dqp; 1629 while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
1696 if(((unsigned)s->qscale) > 51){ 1630 ctx= 3;
1697 if(s->qscale<0) s->qscale+= 52; 1631 val++;
1698 else s->qscale-= 52; 1632 if(val > 102){ //prevent infinite loop
1699 } 1633 av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale dif f failed at %d %d\n", s->mb_x, s->mb_y);
1700 h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale); 1634 return -1;
1701 h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale); 1635 }
1636 }
1637
1638 if( val&0x01 )
1639 val= (val + 1)>>1 ;
1640 else
1641 val= -((val + 1)>>1);
1642 h->last_qscale_diff = val;
1643 s->qscale += val;
1644 if(((unsigned)s->qscale) > 51){
1645 if(s->qscale<0) s->qscale+= 52;
1646 else s->qscale-= 52;
1647 }
1648 h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
1649 h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
1650 }else
1651 h->last_qscale_diff=0;
1702 1652
1703 if( IS_INTRA16x16( mb_type ) ) { 1653 if( IS_INTRA16x16( mb_type ) ) {
1704 int i; 1654 int i;
1705 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DC\n" ); 1655 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DC\n" );
1706 decode_cabac_residual( h, h->mb, 0, 0, dc_scan, NULL, 16); 1656 decode_cabac_residual( h, h->mb, 0, 0, dc_scan, NULL, 16);
1707 1657
1708 if( cbp&15 ) { 1658 if( cbp&15 ) {
1709 qmul = h->dequant4_coeff[0][s->qscale]; 1659 qmul = h->dequant4_coeff[0][s->qscale];
1710 for( i = 0; i < 16; i++ ) { 1660 for( i = 0; i < 16; i++ ) {
1711 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 AC:%d\n", i ); 1661 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 AC:%d\n", i );
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1772 s->current_picture.qscale_table[mb_xy]= s->qscale; 1722 s->current_picture.qscale_table[mb_xy]= s->qscale;
1773 write_back_non_zero_count(h); 1723 write_back_non_zero_count(h);
1774 1724
1775 if(MB_MBAFF){ 1725 if(MB_MBAFF){
1776 h->ref_count[0] >>= 1; 1726 h->ref_count[0] >>= 1;
1777 h->ref_count[1] >>= 1; 1727 h->ref_count[1] >>= 1;
1778 } 1728 }
1779 1729
1780 return 0; 1730 return 0;
1781 } 1731 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698