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