Revision 46b4feec libavcodec/h263.c

View differences:

libavcodec/h263.c
2760 2760
                    if(dc_pred_dir) dir|=1;
2761 2761
                }
2762 2762
                s->pred_dir_table[xy]= dir;
2763
                
2764
                s->error_status_table[xy]= AC_ERROR;
2765 2763
            }else{ /* P/S_TYPE */
2766 2764
                int mx, my, pred_x, pred_y, bits;
2767 2765
                int16_t * const mot_val= s->motion_val[s->block_index[0]];
......
2790 2788

  
2791 2789
                    if(s->mbintra_table[xy])
2792 2790
                        ff_clean_intra_table_entries(s);
2793

  
2794
                    s->error_status_table[xy]= AC_ERROR;
2795 2791
                    continue;
2796 2792
                }
2797 2793
                cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
......
2815 2811
                    mot_val[0+stride]= mot_val[2+stride]= 0;
2816 2812
                    mot_val[1       ]= mot_val[3       ]=
2817 2813
                    mot_val[1+stride]= mot_val[3+stride]= 0;
2818
                    s->error_status_table[xy]= DC_ERROR|AC_ERROR;
2819 2814
                }else{
2820 2815
                    if(s->mbintra_table[xy])
2821 2816
                        ff_clean_intra_table_entries(s);
......
2864 2859
                            mot_val[1] = my;
2865 2860
                        }
2866 2861
                    }
2867
                    s->error_status_table[xy]= AC_ERROR;
2868 2862
                }
2869 2863
            }
2870 2864
        }
......
2933 2927
                    s->cbp_table[xy]&= 3; //remove dquant
2934 2928
                    s->cbp_table[xy]|= cbpy<<2;
2935 2929
                    s->pred_dir_table[xy]= dir | (ac_pred<<7);
2936
                    s->error_status_table[xy]&= ~DC_ERROR;
2937 2930
                }else if(s->mb_type[xy]&MB_TYPE_SKIPED){
2938 2931
                    s->current_picture.qscale_table[xy]= s->qscale;
2939 2932
                    s->cbp_table[xy]= 0;
......
2968 2961
int ff_mpeg4_decode_partitions(MpegEncContext *s)
2969 2962
{
2970 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 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 2970
        return -1;
2971
    }
2975 2972
    
2976 2973
    if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
2977 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 2976
        return -1;
2979 2977
    }
2980 2978

  
......
2984 2982
        if(get_bits(&s->gb, 19)!=DC_MARKER){
2985 2983
            fprintf(stderr, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
2986 2984
            return -1;
2987
        }else
2988
            s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= MV_END|DC_END;
2985
        }
2989 2986
    }else{
2990 2987
        if(get_bits(&s->gb, 17)!=MOTION_MARKER){
2991 2988
            fprintf(stderr, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
2992 2989
            return -1;
2993
        }else
2994
            s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= MV_END;
2990
        }
2995 2991
    }
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 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 2997
        return -1;
2998
    }else{
2999
        if(s->pict_type==P_TYPE)
3000
            ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
2999 3001
    }
3000
    
3001
    s->error_status_table[s->mb_x + s->mb_y*s->mb_width-1]|= DC_END;
3002 3002

  
3003 3003
    return 0;        
3004 3004
}
......
3071 3071
        }
3072 3072
    }
3073 3073

  
3074
    s->error_status_table[xy]&= ~AC_ERROR;
3075

  
3076 3074
    /* per-MB end of slice check */
3077 3075

  
3078 3076
    if(--s->mb_num_left <= 0){
......
3096 3094
    int16_t *mot_val;
3097 3095
    static int8_t quant_tab[4] = { -1, -2, 1, 2 };
3098 3096

  
3099
    s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0;
3100

  
3101 3097
    if(s->mb_x==0) PRINT_MB_TYPE("\n");
3102 3098

  
3103 3099
    if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {

Also available in: Unified diff