Mercurial > libavcodec.hg
comparison h264.c @ 10857:b20434143fd5 libavcodec
Split direct mode (macro)block decoding off h264.c.
No speedloss meassured (its slightly faster here but that may be random fluctuations)
author | michael |
---|---|
date | Tue, 12 Jan 2010 14:32:58 +0000 |
parents | f6fc6ace95e3 |
children | 31645cf81fcb |
comparison
equal
deleted
inserted
replaced
10856:d1ddb9a28c47 | 10857:b20434143fd5 |
---|---|
722 } | 722 } |
723 | 723 |
724 pred_motion(h, 0, 4, 0, 0, mx, my); | 724 pred_motion(h, 0, 4, 0, 0, mx, my); |
725 | 725 |
726 return; | 726 return; |
727 } | |
728 | |
729 static int get_scale_factor(H264Context * const h, int poc, int poc1, int i){ | |
730 int poc0 = h->ref_list[0][i].poc; | |
731 int td = av_clip(poc1 - poc0, -128, 127); | |
732 if(td == 0 || h->ref_list[0][i].long_ref){ | |
733 return 256; | |
734 }else{ | |
735 int tb = av_clip(poc - poc0, -128, 127); | |
736 int tx = (16384 + (FFABS(td) >> 1)) / td; | |
737 return av_clip((tb*tx + 32) >> 6, -1024, 1023); | |
738 } | |
739 } | |
740 | |
741 static inline void direct_dist_scale_factor(H264Context * const h){ | |
742 MpegEncContext * const s = &h->s; | |
743 const int poc = h->s.current_picture_ptr->field_poc[ s->picture_structure == PICT_BOTTOM_FIELD ]; | |
744 const int poc1 = h->ref_list[1][0].poc; | |
745 int i, field; | |
746 for(field=0; field<2; field++){ | |
747 const int poc = h->s.current_picture_ptr->field_poc[field]; | |
748 const int poc1 = h->ref_list[1][0].field_poc[field]; | |
749 for(i=0; i < 2*h->ref_count[0]; i++) | |
750 h->dist_scale_factor_field[field][i^field] = get_scale_factor(h, poc, poc1, i+16); | |
751 } | |
752 | |
753 for(i=0; i<h->ref_count[0]; i++){ | |
754 h->dist_scale_factor[i] = get_scale_factor(h, poc, poc1, i); | |
755 } | |
756 } | |
757 | |
758 static void fill_colmap(H264Context *h, int map[2][16+32], int list, int field, int colfield, int mbafi){ | |
759 MpegEncContext * const s = &h->s; | |
760 Picture * const ref1 = &h->ref_list[1][0]; | |
761 int j, old_ref, rfield; | |
762 int start= mbafi ? 16 : 0; | |
763 int end = mbafi ? 16+2*h->ref_count[list] : h->ref_count[list]; | |
764 int interl= mbafi || s->picture_structure != PICT_FRAME; | |
765 | |
766 /* bogus; fills in for missing frames */ | |
767 memset(map[list], 0, sizeof(map[list])); | |
768 | |
769 for(rfield=0; rfield<2; rfield++){ | |
770 for(old_ref=0; old_ref<ref1->ref_count[colfield][list]; old_ref++){ | |
771 int poc = ref1->ref_poc[colfield][list][old_ref]; | |
772 | |
773 if (!interl) | |
774 poc |= 3; | |
775 else if( interl && (poc&3) == 3) //FIXME store all MBAFF references so this isnt needed | |
776 poc= (poc&~3) + rfield + 1; | |
777 | |
778 for(j=start; j<end; j++){ | |
779 if(4*h->ref_list[list][j].frame_num + (h->ref_list[list][j].reference&3) == poc){ | |
780 int cur_ref= mbafi ? (j-16)^field : j; | |
781 map[list][2*old_ref + (rfield^field) + 16] = cur_ref; | |
782 if(rfield == field) | |
783 map[list][old_ref] = cur_ref; | |
784 break; | |
785 } | |
786 } | |
787 } | |
788 } | |
789 } | |
790 | |
791 static inline void direct_ref_list_init(H264Context * const h){ | |
792 MpegEncContext * const s = &h->s; | |
793 Picture * const ref1 = &h->ref_list[1][0]; | |
794 Picture * const cur = s->current_picture_ptr; | |
795 int list, j, field; | |
796 int sidx= (s->picture_structure&1)^1; | |
797 int ref1sidx= (ref1->reference&1)^1; | |
798 | |
799 for(list=0; list<2; list++){ | |
800 cur->ref_count[sidx][list] = h->ref_count[list]; | |
801 for(j=0; j<h->ref_count[list]; j++) | |
802 cur->ref_poc[sidx][list][j] = 4*h->ref_list[list][j].frame_num + (h->ref_list[list][j].reference&3); | |
803 } | |
804 | |
805 if(s->picture_structure == PICT_FRAME){ | |
806 memcpy(cur->ref_count[1], cur->ref_count[0], sizeof(cur->ref_count[0])); | |
807 memcpy(cur->ref_poc [1], cur->ref_poc [0], sizeof(cur->ref_poc [0])); | |
808 } | |
809 | |
810 cur->mbaff= FRAME_MBAFF; | |
811 | |
812 if(cur->pict_type != FF_B_TYPE || h->direct_spatial_mv_pred) | |
813 return; | |
814 | |
815 for(list=0; list<2; list++){ | |
816 fill_colmap(h, h->map_col_to_list0, list, sidx, ref1sidx, 0); | |
817 for(field=0; field<2; field++) | |
818 fill_colmap(h, h->map_col_to_list0_field[field], list, field, field, 1); | |
819 } | |
820 } | |
821 | |
822 static inline void pred_direct_motion(H264Context * const h, int *mb_type){ | |
823 MpegEncContext * const s = &h->s; | |
824 int b8_stride = h->b8_stride; | |
825 int b4_stride = h->b_stride; | |
826 int mb_xy = h->mb_xy; | |
827 int mb_type_col[2]; | |
828 const int16_t (*l1mv0)[2], (*l1mv1)[2]; | |
829 const int8_t *l1ref0, *l1ref1; | |
830 const int is_b8x8 = IS_8X8(*mb_type); | |
831 unsigned int sub_mb_type; | |
832 int i8, i4; | |
833 | |
834 assert(h->ref_list[1][0].reference&3); | |
835 | |
836 #define MB_TYPE_16x16_OR_INTRA (MB_TYPE_16x16|MB_TYPE_INTRA4x4|MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM) | |
837 | |
838 if(IS_INTERLACED(h->ref_list[1][0].mb_type[mb_xy])){ // AFL/AFR/FR/FL -> AFL/FL | |
839 if(!IS_INTERLACED(*mb_type)){ // AFR/FR -> AFL/FL | |
840 int cur_poc = s->current_picture_ptr->poc; | |
841 int *col_poc = h->ref_list[1]->field_poc; | |
842 int col_parity = FFABS(col_poc[0] - cur_poc) >= FFABS(col_poc[1] - cur_poc); | |
843 mb_xy= s->mb_x + ((s->mb_y&~1) + col_parity)*s->mb_stride; | |
844 b8_stride = 0; | |
845 }else if(!(s->picture_structure & h->ref_list[1][0].reference) && !h->ref_list[1][0].mbaff){// FL -> FL & differ parity | |
846 int fieldoff= 2*(h->ref_list[1][0].reference)-3; | |
847 mb_xy += s->mb_stride*fieldoff; | |
848 } | |
849 goto single_col; | |
850 }else{ // AFL/AFR/FR/FL -> AFR/FR | |
851 if(IS_INTERLACED(*mb_type)){ // AFL /FL -> AFR/FR | |
852 mb_xy= s->mb_x + (s->mb_y&~1)*s->mb_stride; | |
853 mb_type_col[0] = h->ref_list[1][0].mb_type[mb_xy]; | |
854 mb_type_col[1] = h->ref_list[1][0].mb_type[mb_xy + s->mb_stride]; | |
855 b8_stride *= 3; | |
856 b4_stride *= 6; | |
857 //FIXME IS_8X8(mb_type_col[0]) && !h->sps.direct_8x8_inference_flag | |
858 if( (mb_type_col[0] & MB_TYPE_16x16_OR_INTRA) | |
859 && (mb_type_col[1] & MB_TYPE_16x16_OR_INTRA) | |
860 && !is_b8x8){ | |
861 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ | |
862 *mb_type |= MB_TYPE_16x8 |MB_TYPE_L0L1|MB_TYPE_DIRECT2; /* B_16x8 */ | |
863 }else{ | |
864 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ | |
865 *mb_type |= MB_TYPE_8x8|MB_TYPE_L0L1; | |
866 } | |
867 }else{ // AFR/FR -> AFR/FR | |
868 single_col: | |
869 mb_type_col[0] = | |
870 mb_type_col[1] = h->ref_list[1][0].mb_type[mb_xy]; | |
871 if(IS_8X8(mb_type_col[0]) && !h->sps.direct_8x8_inference_flag){ | |
872 /* FIXME save sub mb types from previous frames (or derive from MVs) | |
873 * so we know exactly what block size to use */ | |
874 sub_mb_type = MB_TYPE_8x8|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_4x4 */ | |
875 *mb_type |= MB_TYPE_8x8|MB_TYPE_L0L1; | |
876 }else if(!is_b8x8 && (mb_type_col[0] & MB_TYPE_16x16_OR_INTRA)){ | |
877 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ | |
878 *mb_type |= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_16x16 */ | |
879 }else{ | |
880 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ | |
881 *mb_type |= MB_TYPE_8x8|MB_TYPE_L0L1; | |
882 } | |
883 } | |
884 } | |
885 | |
886 l1mv0 = &h->ref_list[1][0].motion_val[0][h->mb2b_xy [mb_xy]]; | |
887 l1mv1 = &h->ref_list[1][0].motion_val[1][h->mb2b_xy [mb_xy]]; | |
888 l1ref0 = &h->ref_list[1][0].ref_index [0][h->mb2b8_xy[mb_xy]]; | |
889 l1ref1 = &h->ref_list[1][0].ref_index [1][h->mb2b8_xy[mb_xy]]; | |
890 if(!b8_stride){ | |
891 if(s->mb_y&1){ | |
892 l1ref0 += h->b8_stride; | |
893 l1ref1 += h->b8_stride; | |
894 l1mv0 += 2*b4_stride; | |
895 l1mv1 += 2*b4_stride; | |
896 } | |
897 } | |
898 | |
899 if(h->direct_spatial_mv_pred){ | |
900 int ref[2]; | |
901 int mv[2][2]; | |
902 int list; | |
903 | |
904 /* FIXME interlacing + spatial direct uses wrong colocated block positions */ | |
905 | |
906 /* ref = min(neighbors) */ | |
907 for(list=0; list<2; list++){ | |
908 int refa = h->ref_cache[list][scan8[0] - 1]; | |
909 int refb = h->ref_cache[list][scan8[0] - 8]; | |
910 int refc = h->ref_cache[list][scan8[0] - 8 + 4]; | |
911 if(refc == PART_NOT_AVAILABLE) | |
912 refc = h->ref_cache[list][scan8[0] - 8 - 1]; | |
913 ref[list] = FFMIN3((unsigned)refa, (unsigned)refb, (unsigned)refc); | |
914 if(ref[list] < 0) | |
915 ref[list] = -1; | |
916 } | |
917 | |
918 if(ref[0] < 0 && ref[1] < 0){ | |
919 ref[0] = ref[1] = 0; | |
920 mv[0][0] = mv[0][1] = | |
921 mv[1][0] = mv[1][1] = 0; | |
922 }else{ | |
923 for(list=0; list<2; list++){ | |
924 if(ref[list] >= 0) | |
925 pred_motion(h, 0, 4, list, ref[list], &mv[list][0], &mv[list][1]); | |
926 else | |
927 mv[list][0] = mv[list][1] = 0; | |
928 } | |
929 } | |
930 | |
931 if(ref[1] < 0){ | |
932 if(!is_b8x8) | |
933 *mb_type &= ~MB_TYPE_L1; | |
934 sub_mb_type &= ~MB_TYPE_L1; | |
935 }else if(ref[0] < 0){ | |
936 if(!is_b8x8) | |
937 *mb_type &= ~MB_TYPE_L0; | |
938 sub_mb_type &= ~MB_TYPE_L0; | |
939 } | |
940 | |
941 if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col[0])){ | |
942 for(i8=0; i8<4; i8++){ | |
943 int x8 = i8&1; | |
944 int y8 = i8>>1; | |
945 int xy8 = x8+y8*b8_stride; | |
946 int xy4 = 3*x8+y8*b4_stride; | |
947 int a=0, b=0; | |
948 | |
949 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) | |
950 continue; | |
951 h->sub_mb_type[i8] = sub_mb_type; | |
952 | |
953 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[0], 1); | |
954 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[1], 1); | |
955 if(!IS_INTRA(mb_type_col[y8]) | |
956 && ( (l1ref0[xy8] == 0 && FFABS(l1mv0[xy4][0]) <= 1 && FFABS(l1mv0[xy4][1]) <= 1) | |
957 || (l1ref0[xy8] < 0 && l1ref1[xy8] == 0 && FFABS(l1mv1[xy4][0]) <= 1 && FFABS(l1mv1[xy4][1]) <= 1))){ | |
958 if(ref[0] > 0) | |
959 a= pack16to32(mv[0][0],mv[0][1]); | |
960 if(ref[1] > 0) | |
961 b= pack16to32(mv[1][0],mv[1][1]); | |
962 }else{ | |
963 a= pack16to32(mv[0][0],mv[0][1]); | |
964 b= pack16to32(mv[1][0],mv[1][1]); | |
965 } | |
966 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, a, 4); | |
967 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, b, 4); | |
968 } | |
969 }else if(IS_16X16(*mb_type)){ | |
970 int a=0, b=0; | |
971 | |
972 fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, (uint8_t)ref[0], 1); | |
973 fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, (uint8_t)ref[1], 1); | |
974 if(!IS_INTRA(mb_type_col[0]) | |
975 && ( (l1ref0[0] == 0 && FFABS(l1mv0[0][0]) <= 1 && FFABS(l1mv0[0][1]) <= 1) | |
976 || (l1ref0[0] < 0 && l1ref1[0] == 0 && FFABS(l1mv1[0][0]) <= 1 && FFABS(l1mv1[0][1]) <= 1 | |
977 && (h->x264_build>33 || !h->x264_build)))){ | |
978 if(ref[0] > 0) | |
979 a= pack16to32(mv[0][0],mv[0][1]); | |
980 if(ref[1] > 0) | |
981 b= pack16to32(mv[1][0],mv[1][1]); | |
982 }else{ | |
983 a= pack16to32(mv[0][0],mv[0][1]); | |
984 b= pack16to32(mv[1][0],mv[1][1]); | |
985 } | |
986 fill_rectangle(&h->mv_cache[0][scan8[0]], 4, 4, 8, a, 4); | |
987 fill_rectangle(&h->mv_cache[1][scan8[0]], 4, 4, 8, b, 4); | |
988 }else{ | |
989 for(i8=0; i8<4; i8++){ | |
990 const int x8 = i8&1; | |
991 const int y8 = i8>>1; | |
992 | |
993 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) | |
994 continue; | |
995 h->sub_mb_type[i8] = sub_mb_type; | |
996 | |
997 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mv[0][0],mv[0][1]), 4); | |
998 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mv[1][0],mv[1][1]), 4); | |
999 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[0], 1); | |
1000 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[1], 1); | |
1001 | |
1002 /* col_zero_flag */ | |
1003 if(!IS_INTRA(mb_type_col[0]) && ( l1ref0[x8 + y8*b8_stride] == 0 | |
1004 || (l1ref0[x8 + y8*b8_stride] < 0 && l1ref1[x8 + y8*b8_stride] == 0 | |
1005 && (h->x264_build>33 || !h->x264_build)))){ | |
1006 const int16_t (*l1mv)[2]= l1ref0[x8 + y8*b8_stride] == 0 ? l1mv0 : l1mv1; | |
1007 if(IS_SUB_8X8(sub_mb_type)){ | |
1008 const int16_t *mv_col = l1mv[x8*3 + y8*3*b4_stride]; | |
1009 if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){ | |
1010 if(ref[0] == 0) | |
1011 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1012 if(ref[1] == 0) | |
1013 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1014 } | |
1015 }else | |
1016 for(i4=0; i4<4; i4++){ | |
1017 const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*b4_stride]; | |
1018 if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){ | |
1019 if(ref[0] == 0) | |
1020 *(uint32_t*)h->mv_cache[0][scan8[i8*4+i4]] = 0; | |
1021 if(ref[1] == 0) | |
1022 *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] = 0; | |
1023 } | |
1024 } | |
1025 } | |
1026 } | |
1027 } | |
1028 }else{ /* direct temporal mv pred */ | |
1029 const int *map_col_to_list0[2] = {h->map_col_to_list0[0], h->map_col_to_list0[1]}; | |
1030 const int *dist_scale_factor = h->dist_scale_factor; | |
1031 int ref_offset= 0; | |
1032 | |
1033 if(FRAME_MBAFF && IS_INTERLACED(*mb_type)){ | |
1034 map_col_to_list0[0] = h->map_col_to_list0_field[s->mb_y&1][0]; | |
1035 map_col_to_list0[1] = h->map_col_to_list0_field[s->mb_y&1][1]; | |
1036 dist_scale_factor =h->dist_scale_factor_field[s->mb_y&1]; | |
1037 } | |
1038 if(h->ref_list[1][0].mbaff && IS_INTERLACED(mb_type_col[0])) | |
1039 ref_offset += 16; | |
1040 | |
1041 if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col[0])){ | |
1042 /* FIXME assumes direct_8x8_inference == 1 */ | |
1043 int y_shift = 2*!IS_INTERLACED(*mb_type); | |
1044 | |
1045 for(i8=0; i8<4; i8++){ | |
1046 const int x8 = i8&1; | |
1047 const int y8 = i8>>1; | |
1048 int ref0, scale; | |
1049 const int16_t (*l1mv)[2]= l1mv0; | |
1050 | |
1051 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) | |
1052 continue; | |
1053 h->sub_mb_type[i8] = sub_mb_type; | |
1054 | |
1055 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1); | |
1056 if(IS_INTRA(mb_type_col[y8])){ | |
1057 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1); | |
1058 fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1059 fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1060 continue; | |
1061 } | |
1062 | |
1063 ref0 = l1ref0[x8 + y8*b8_stride]; | |
1064 if(ref0 >= 0) | |
1065 ref0 = map_col_to_list0[0][ref0 + ref_offset]; | |
1066 else{ | |
1067 ref0 = map_col_to_list0[1][l1ref1[x8 + y8*b8_stride] + ref_offset]; | |
1068 l1mv= l1mv1; | |
1069 } | |
1070 scale = dist_scale_factor[ref0]; | |
1071 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1); | |
1072 | |
1073 { | |
1074 const int16_t *mv_col = l1mv[x8*3 + y8*b4_stride]; | |
1075 int my_col = (mv_col[1]<<y_shift)/2; | |
1076 int mx = (scale * mv_col[0] + 128) >> 8; | |
1077 int my = (scale * my_col + 128) >> 8; | |
1078 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4); | |
1079 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-my_col), 4); | |
1080 } | |
1081 } | |
1082 return; | |
1083 } | |
1084 | |
1085 /* one-to-one mv scaling */ | |
1086 | |
1087 if(IS_16X16(*mb_type)){ | |
1088 int ref, mv0, mv1; | |
1089 | |
1090 fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, 0, 1); | |
1091 if(IS_INTRA(mb_type_col[0])){ | |
1092 ref=mv0=mv1=0; | |
1093 }else{ | |
1094 const int ref0 = l1ref0[0] >= 0 ? map_col_to_list0[0][l1ref0[0] + ref_offset] | |
1095 : map_col_to_list0[1][l1ref1[0] + ref_offset]; | |
1096 const int scale = dist_scale_factor[ref0]; | |
1097 const int16_t *mv_col = l1ref0[0] >= 0 ? l1mv0[0] : l1mv1[0]; | |
1098 int mv_l0[2]; | |
1099 mv_l0[0] = (scale * mv_col[0] + 128) >> 8; | |
1100 mv_l0[1] = (scale * mv_col[1] + 128) >> 8; | |
1101 ref= ref0; | |
1102 mv0= pack16to32(mv_l0[0],mv_l0[1]); | |
1103 mv1= pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]); | |
1104 } | |
1105 fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, ref, 1); | |
1106 fill_rectangle(&h-> mv_cache[0][scan8[0]], 4, 4, 8, mv0, 4); | |
1107 fill_rectangle(&h-> mv_cache[1][scan8[0]], 4, 4, 8, mv1, 4); | |
1108 }else{ | |
1109 for(i8=0; i8<4; i8++){ | |
1110 const int x8 = i8&1; | |
1111 const int y8 = i8>>1; | |
1112 int ref0, scale; | |
1113 const int16_t (*l1mv)[2]= l1mv0; | |
1114 | |
1115 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) | |
1116 continue; | |
1117 h->sub_mb_type[i8] = sub_mb_type; | |
1118 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1); | |
1119 if(IS_INTRA(mb_type_col[0])){ | |
1120 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1); | |
1121 fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1122 fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4); | |
1123 continue; | |
1124 } | |
1125 | |
1126 ref0 = l1ref0[x8 + y8*b8_stride] + ref_offset; | |
1127 if(ref0 >= 0) | |
1128 ref0 = map_col_to_list0[0][ref0]; | |
1129 else{ | |
1130 ref0 = map_col_to_list0[1][l1ref1[x8 + y8*b8_stride] + ref_offset]; | |
1131 l1mv= l1mv1; | |
1132 } | |
1133 scale = dist_scale_factor[ref0]; | |
1134 | |
1135 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1); | |
1136 if(IS_SUB_8X8(sub_mb_type)){ | |
1137 const int16_t *mv_col = l1mv[x8*3 + y8*3*b4_stride]; | |
1138 int mx = (scale * mv_col[0] + 128) >> 8; | |
1139 int my = (scale * mv_col[1] + 128) >> 8; | |
1140 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4); | |
1141 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-mv_col[1]), 4); | |
1142 }else | |
1143 for(i4=0; i4<4; i4++){ | |
1144 const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*b4_stride]; | |
1145 int16_t *mv_l0 = h->mv_cache[0][scan8[i8*4+i4]]; | |
1146 mv_l0[0] = (scale * mv_col[0] + 128) >> 8; | |
1147 mv_l0[1] = (scale * mv_col[1] + 128) >> 8; | |
1148 *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] = | |
1149 pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]); | |
1150 } | |
1151 } | |
1152 } | |
1153 } | |
1154 } | 727 } |
1155 | 728 |
1156 static inline void write_back_motion(H264Context *h, int mb_type){ | 729 static inline void write_back_motion(H264Context *h, int mb_type){ |
1157 MpegEncContext * const s = &h->s; | 730 MpegEncContext * const s = &h->s; |
1158 const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride; | 731 const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride; |
3869 | 3442 |
3870 if(FRAME_MBAFF) | 3443 if(FRAME_MBAFF) |
3871 fill_mbaff_ref_list(h); | 3444 fill_mbaff_ref_list(h); |
3872 | 3445 |
3873 if(h->slice_type_nos==FF_B_TYPE && !h->direct_spatial_mv_pred) | 3446 if(h->slice_type_nos==FF_B_TYPE && !h->direct_spatial_mv_pred) |
3874 direct_dist_scale_factor(h); | 3447 ff_h264_direct_dist_scale_factor(h); |
3875 direct_ref_list_init(h); | 3448 ff_h264_direct_ref_list_init(h); |
3876 | 3449 |
3877 if( h->slice_type_nos != FF_I_TYPE && h->pps.cabac ){ | 3450 if( h->slice_type_nos != FF_I_TYPE && h->pps.cabac ){ |
3878 tmp = get_ue_golomb_31(&s->gb); | 3451 tmp = get_ue_golomb_31(&s->gb); |
3879 if(tmp > 2){ | 3452 if(tmp > 2){ |
3880 av_log(s->avctx, AV_LOG_ERROR, "cabac_init_idc overflow\n"); | 3453 av_log(s->avctx, AV_LOG_ERROR, "cabac_init_idc overflow\n"); |
4237 { | 3810 { |
4238 // just for fill_caches. pred_direct_motion will set the real mb_type | 3811 // just for fill_caches. pred_direct_motion will set the real mb_type |
4239 mb_type|= MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2|MB_TYPE_SKIP; | 3812 mb_type|= MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2|MB_TYPE_SKIP; |
4240 | 3813 |
4241 fill_caches(h, mb_type, 0); //FIXME check what is needed and what not ... | 3814 fill_caches(h, mb_type, 0); //FIXME check what is needed and what not ... |
4242 pred_direct_motion(h, &mb_type); | 3815 ff_h264_pred_direct_motion(h, &mb_type); |
4243 mb_type|= MB_TYPE_SKIP; | 3816 mb_type|= MB_TYPE_SKIP; |
4244 } | 3817 } |
4245 else | 3818 else |
4246 { | 3819 { |
4247 int mx, my; | 3820 int mx, my; |
4415 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; | 3988 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; |
4416 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type; | 3989 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type; |
4417 } | 3990 } |
4418 if( IS_DIRECT(h->sub_mb_type[0]) || IS_DIRECT(h->sub_mb_type[1]) | 3991 if( IS_DIRECT(h->sub_mb_type[0]) || IS_DIRECT(h->sub_mb_type[1]) |
4419 || IS_DIRECT(h->sub_mb_type[2]) || IS_DIRECT(h->sub_mb_type[3])) { | 3992 || IS_DIRECT(h->sub_mb_type[2]) || IS_DIRECT(h->sub_mb_type[3])) { |
4420 pred_direct_motion(h, &mb_type); | 3993 ff_h264_pred_direct_motion(h, &mb_type); |
4421 h->ref_cache[0][scan8[4]] = | 3994 h->ref_cache[0][scan8[4]] = |
4422 h->ref_cache[1][scan8[4]] = | 3995 h->ref_cache[1][scan8[4]] = |
4423 h->ref_cache[0][scan8[12]] = | 3996 h->ref_cache[0][scan8[12]] = |
4424 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE; | 3997 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE; |
4425 } | 3998 } |
4506 p[8] = p[9]= 0; | 4079 p[8] = p[9]= 0; |
4507 } | 4080 } |
4508 } | 4081 } |
4509 } | 4082 } |
4510 }else if(IS_DIRECT(mb_type)){ | 4083 }else if(IS_DIRECT(mb_type)){ |
4511 pred_direct_motion(h, &mb_type); | 4084 ff_h264_pred_direct_motion(h, &mb_type); |
4512 dct8x8_allowed &= h->sps.direct_8x8_inference_flag; | 4085 dct8x8_allowed &= h->sps.direct_8x8_inference_flag; |
4513 }else{ | 4086 }else{ |
4514 int list, mx, my, i; | 4087 int list, mx, my, i; |
4515 //FIXME we should set ref_idx_l? to 0 if we use that later ... | 4088 //FIXME we should set ref_idx_l? to 0 if we use that later ... |
4516 if(IS_16X16(mb_type)){ | 4089 if(IS_16X16(mb_type)){ |
5512 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; | 5085 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count; |
5513 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type; | 5086 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type; |
5514 } | 5087 } |
5515 if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] | | 5088 if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] | |
5516 h->sub_mb_type[2] | h->sub_mb_type[3]) ) { | 5089 h->sub_mb_type[2] | h->sub_mb_type[3]) ) { |
5517 pred_direct_motion(h, &mb_type); | 5090 ff_h264_pred_direct_motion(h, &mb_type); |
5518 h->ref_cache[0][scan8[4]] = | 5091 h->ref_cache[0][scan8[4]] = |
5519 h->ref_cache[1][scan8[4]] = | 5092 h->ref_cache[1][scan8[4]] = |
5520 h->ref_cache[0][scan8[12]] = | 5093 h->ref_cache[0][scan8[12]] = |
5521 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE; | 5094 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE; |
5522 if( h->ref_count[0] > 1 || h->ref_count[1] > 1 ) { | 5095 if( h->ref_count[0] > 1 || h->ref_count[1] > 1 ) { |
5615 pd[0]= pd[1]= pd[8]= pd[9]= 0; | 5188 pd[0]= pd[1]= pd[8]= pd[9]= 0; |
5616 } | 5189 } |
5617 } | 5190 } |
5618 } | 5191 } |
5619 } else if( IS_DIRECT(mb_type) ) { | 5192 } else if( IS_DIRECT(mb_type) ) { |
5620 pred_direct_motion(h, &mb_type); | 5193 ff_h264_pred_direct_motion(h, &mb_type); |
5621 fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 4); | 5194 fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 4); |
5622 fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 4); | 5195 fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 4); |
5623 dct8x8_allowed &= h->sps.direct_8x8_inference_flag; | 5196 dct8x8_allowed &= h->sps.direct_8x8_inference_flag; |
5624 } else { | 5197 } else { |
5625 int list, mx, my, i, mpx, mpy; | 5198 int list, mx, my, i, mpx, mpy; |