comparison h263.c @ 1144:21c85c4ab2f0 libavcodec

error resilience cleanup (its faster too...)
author michaelni
date Thu, 20 Mar 2003 01:00:57 +0000
parents 7fb0b38ab5a3
children 79e8ed620b17
comparison
equal deleted inserted replaced
1143:a4facfd78935 1144:21c85c4ab2f0
2758 } 2758 }
2759 dir<<=1; 2759 dir<<=1;
2760 if(dc_pred_dir) dir|=1; 2760 if(dc_pred_dir) dir|=1;
2761 } 2761 }
2762 s->pred_dir_table[xy]= dir; 2762 s->pred_dir_table[xy]= dir;
2763
2764 s->error_status_table[xy]= AC_ERROR;
2765 }else{ /* P/S_TYPE */ 2763 }else{ /* P/S_TYPE */
2766 int mx, my, pred_x, pred_y, bits; 2764 int mx, my, pred_x, pred_y, bits;
2767 int16_t * const mot_val= s->motion_val[s->block_index[0]]; 2765 int16_t * const mot_val= s->motion_val[s->block_index[0]];
2768 const int stride= s->block_wrap[0]*2; 2766 const int stride= s->block_wrap[0]*2;
2769 2767
2788 mot_val[1 ]= mot_val[3 ]= 2786 mot_val[1 ]= mot_val[3 ]=
2789 mot_val[1+stride]= mot_val[3+stride]= my; 2787 mot_val[1+stride]= mot_val[3+stride]= my;
2790 2788
2791 if(s->mbintra_table[xy]) 2789 if(s->mbintra_table[xy])
2792 ff_clean_intra_table_entries(s); 2790 ff_clean_intra_table_entries(s);
2793
2794 s->error_status_table[xy]= AC_ERROR;
2795 continue; 2791 continue;
2796 } 2792 }
2797 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); 2793 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
2798 if (cbpc < 0){ 2794 if (cbpc < 0){
2799 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y); 2795 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
2813 s->mb_type[xy]= MB_TYPE_INTRA; 2809 s->mb_type[xy]= MB_TYPE_INTRA;
2814 mot_val[0 ]= mot_val[2 ]= 2810 mot_val[0 ]= mot_val[2 ]=
2815 mot_val[0+stride]= mot_val[2+stride]= 0; 2811 mot_val[0+stride]= mot_val[2+stride]= 0;
2816 mot_val[1 ]= mot_val[3 ]= 2812 mot_val[1 ]= mot_val[3 ]=
2817 mot_val[1+stride]= mot_val[3+stride]= 0; 2813 mot_val[1+stride]= mot_val[3+stride]= 0;
2818 s->error_status_table[xy]= DC_ERROR|AC_ERROR;
2819 }else{ 2814 }else{
2820 if(s->mbintra_table[xy]) 2815 if(s->mbintra_table[xy])
2821 ff_clean_intra_table_entries(s); 2816 ff_clean_intra_table_entries(s);
2822 2817
2823 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0) 2818 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
2862 return -1; 2857 return -1;
2863 mot_val[0] = mx; 2858 mot_val[0] = mx;
2864 mot_val[1] = my; 2859 mot_val[1] = my;
2865 } 2860 }
2866 } 2861 }
2867 s->error_status_table[xy]= AC_ERROR;
2868 } 2862 }
2869 } 2863 }
2870 } 2864 }
2871 s->mb_x= 0; 2865 s->mb_x= 0;
2872 } 2866 }
2931 if(dc_pred_dir) dir|=1; 2925 if(dc_pred_dir) dir|=1;
2932 } 2926 }
2933 s->cbp_table[xy]&= 3; //remove dquant 2927 s->cbp_table[xy]&= 3; //remove dquant
2934 s->cbp_table[xy]|= cbpy<<2; 2928 s->cbp_table[xy]|= cbpy<<2;
2935 s->pred_dir_table[xy]= dir | (ac_pred<<7); 2929 s->pred_dir_table[xy]= dir | (ac_pred<<7);
2936 s->error_status_table[xy]&= ~DC_ERROR;
2937 }else if(s->mb_type[xy]&MB_TYPE_SKIPED){ 2930 }else if(s->mb_type[xy]&MB_TYPE_SKIPED){
2938 s->current_picture.qscale_table[xy]= s->qscale; 2931 s->current_picture.qscale_table[xy]= s->qscale;
2939 s->cbp_table[xy]= 0; 2932 s->cbp_table[xy]= 0;
2940 }else{ 2933 }else{
2941 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); 2934 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2966 * @return <0 if error (and sets error type in the error_status_table) 2959 * @return <0 if error (and sets error type in the error_status_table)
2967 */ 2960 */
2968 int ff_mpeg4_decode_partitions(MpegEncContext *s) 2961 int ff_mpeg4_decode_partitions(MpegEncContext *s)
2969 { 2962 {
2970 int mb_num; 2963 int mb_num;
2964 const int part_a_error= s->pict_type==I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
2965 const int part_a_end = s->pict_type==I_TYPE ? (DC_END |MV_END) : MV_END;
2971 2966
2972 mb_num= mpeg4_decode_partition_a(s); 2967 mb_num= mpeg4_decode_partition_a(s);
2973 if(mb_num<0) 2968 if(mb_num<0){
2969 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
2974 return -1; 2970 return -1;
2971 }
2975 2972
2976 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){ 2973 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
2977 fprintf(stderr, "slice below monitor ...\n"); 2974 fprintf(stderr, "slice below monitor ...\n");
2975 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
2978 return -1; 2976 return -1;
2979 } 2977 }
2980 2978
2981 s->mb_num_left= mb_num; 2979 s->mb_num_left= mb_num;
2982 2980
2983 if(s->pict_type==I_TYPE){ 2981 if(s->pict_type==I_TYPE){
2984 if(get_bits(&s->gb, 19)!=DC_MARKER){ 2982 if(get_bits(&s->gb, 19)!=DC_MARKER){
2985 fprintf(stderr, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y); 2983 fprintf(stderr, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
2986 return -1; 2984 return -1;
2987 }else 2985 }
2988 s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= MV_END|DC_END;
2989 }else{ 2986 }else{
2990 if(get_bits(&s->gb, 17)!=MOTION_MARKER){ 2987 if(get_bits(&s->gb, 17)!=MOTION_MARKER){
2991 fprintf(stderr, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y); 2988 fprintf(stderr, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
2992 return -1; 2989 return -1;
2993 }else 2990 }
2994 s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= MV_END; 2991 }
2995 } 2992 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
2996 2993
2997 if( mpeg4_decode_partition_b(s, mb_num) < 0){ 2994 if( mpeg4_decode_partition_b(s, mb_num) < 0){
2995 if(s->pict_type==P_TYPE)
2996 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
2998 return -1; 2997 return -1;
2999 } 2998 }else{
3000 2999 if(s->pict_type==P_TYPE)
3001 s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= DC_END; 3000 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
3001 }
3002 3002
3003 return 0; 3003 return 0;
3004 } 3004 }
3005 3005
3006 /** 3006 /**
3069 } 3069 }
3070 cbp+=cbp; 3070 cbp+=cbp;
3071 } 3071 }
3072 } 3072 }
3073 3073
3074 s->error_status_table[xy]&= ~AC_ERROR;
3075
3076 /* per-MB end of slice check */ 3074 /* per-MB end of slice check */
3077 3075
3078 if(--s->mb_num_left <= 0){ 3076 if(--s->mb_num_left <= 0){
3079 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb)); 3077 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb));
3080 if(mpeg4_is_resync(s)) 3078 if(mpeg4_is_resync(s))
3093 DCTELEM block[6][64]) 3091 DCTELEM block[6][64])
3094 { 3092 {
3095 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; 3093 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3096 int16_t *mot_val; 3094 int16_t *mot_val;
3097 static int8_t quant_tab[4] = { -1, -2, 1, 2 }; 3095 static int8_t quant_tab[4] = { -1, -2, 1, 2 };
3098
3099 s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0;
3100 3096
3101 if(s->mb_x==0) PRINT_MB_TYPE("\n"); 3097 if(s->mb_x==0) PRINT_MB_TYPE("\n");
3102 3098
3103 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) { 3099 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
3104 if (get_bits1(&s->gb)) { 3100 if (get_bits1(&s->gb)) {