Logo Search packages:      
Sourcecode: blender version File versions

void ff_er_add_slice ( MpegEncContext s,
int  startx,
int  starty,
int  endx,
int  endy,
int  status 
)

adds a slice.

Parameters:
endx x component of the last macroblock, can be -1 for the last of the previous line
status the status at the end (MV_END, AC_ERROR, ...), it is assumed that no earlier end or error of the same type occured

Definition at line 612 of file error_resilience.c.

References MpegEncContext::avctx, MpegEncContext::error_count, MpegEncContext::error_resilience, MpegEncContext::error_status_table, MpegEncContext::mb_index2xy, MpegEncContext::mb_num, MpegEncContext::mb_width, AVCodecContext::skip_top, AVCodecContext::thread_count, and VP_START.

Referenced by ff_mpeg4_decode_partitions().

                                                                                               {
    const int start_i= clip(startx + starty * s->mb_width    , 0, s->mb_num-1);
    const int end_i  = clip(endx   + endy   * s->mb_width    , 0, s->mb_num);
    const int start_xy= s->mb_index2xy[start_i];
    const int end_xy  = s->mb_index2xy[end_i];
    int mask= -1;

    if(!s->error_resilience) return;

    mask &= ~VP_START;
    if(status & (AC_ERROR|AC_END)){
        mask &= ~(AC_ERROR|AC_END);
        s->error_count -= end_i - start_i + 1;
    }
    if(status & (DC_ERROR|DC_END)){
        mask &= ~(DC_ERROR|DC_END);
        s->error_count -= end_i - start_i + 1;
    }
    if(status & (MV_ERROR|MV_END)){
        mask &= ~(MV_ERROR|MV_END);
        s->error_count -= end_i - start_i + 1;
    }

    if(status & (AC_ERROR|DC_ERROR|MV_ERROR)) s->error_count= INT_MAX;

    if(mask == ~0x7F){
        memset(&s->error_status_table[start_xy], 0, (end_xy - start_xy) * sizeof(uint8_t));
    }else{
        int i;
        for(i=start_xy; i<end_xy; i++){
            s->error_status_table[ i ] &= mask;
        }
    }

    if(end_i == s->mb_num)
        s->error_count= INT_MAX;
    else{
        s->error_status_table[end_xy] &= mask;
        s->error_status_table[end_xy] |= status;
    }

    s->error_status_table[start_xy] |= VP_START;

    if(start_xy > 0 && s->avctx->thread_count <= 1 && s->avctx->skip_top*s->mb_width < start_i){
        int prev_status= s->error_status_table[ s->mb_index2xy[start_i - 1] ];

        prev_status &= ~ VP_START;
        if(prev_status != (MV_END|DC_END|AC_END)) s->error_count= INT_MAX;
    }
}


Generated by  Doxygen 1.6.0   Back to index