Also revert the related error concealment hotfix. Originally committed as revision 22640 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.6
| @@ -486,7 +486,7 @@ int score_sum=0; | |||||
| sum_x+= mv_predictor[j][0]; | sum_x+= mv_predictor[j][0]; | ||||
| sum_y+= mv_predictor[j][1]; | sum_y+= mv_predictor[j][1]; | ||||
| sum_r+= ref[j]; | sum_r+= ref[j]; | ||||
| if(j && ref[j] != ref[j-1] && s->codec_id == CODEC_ID_H264) | |||||
| if(j && ref[j] != ref[j-1]) | |||||
| goto skip_mean_and_median; | goto skip_mean_and_median; | ||||
| } | } | ||||
| @@ -549,7 +549,7 @@ skip_mean_and_median: | |||||
| s->current_picture.motion_val[0][mot_index][0]= s->mv[0][0][0]= mv_predictor[j][0]; | s->current_picture.motion_val[0][mot_index][0]= s->mv[0][0][0]= mv_predictor[j][0]; | ||||
| s->current_picture.motion_val[0][mot_index][1]= s->mv[0][0][1]= mv_predictor[j][1]; | s->current_picture.motion_val[0][mot_index][1]= s->mv[0][0][1]= mv_predictor[j][1]; | ||||
| if(ref[j]<0 && s->codec_id == CODEC_ID_H264) //predictor intra or otherwise not available | |||||
| if(ref[j]<0) //predictor intra or otherwise not available | |||||
| continue; | continue; | ||||
| decode_mb(s, ref[j]); | decode_mb(s, ref[j]); | ||||
| @@ -767,7 +767,6 @@ void ff_er_frame_end(MpegEncContext *s){ | |||||
| pic->motion_subsample_log2= 3; | pic->motion_subsample_log2= 3; | ||||
| s->current_picture= *s->current_picture_ptr; | s->current_picture= *s->current_picture_ptr; | ||||
| } | } | ||||
| pic->ref_index[0]= av_realloc(pic->ref_index[0], s->mb_stride * s->mb_height * 4 * sizeof(uint8_t)); | |||||
| if(s->avctx->debug&FF_DEBUG_ER){ | if(s->avctx->debug&FF_DEBUG_ER){ | ||||
| for(mb_y=0; mb_y<s->mb_height; mb_y++){ | for(mb_y=0; mb_y<s->mb_height; mb_y++){ | ||||
| @@ -71,10 +71,10 @@ void ff_h263_update_motion_val(MpegEncContext * s){ | |||||
| s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0]; | s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0]; | ||||
| s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1]; | s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1]; | ||||
| } | } | ||||
| s->current_picture.ref_index[0][xy ]= | |||||
| s->current_picture.ref_index[0][xy + 1]= s->field_select[0][0]; | |||||
| s->current_picture.ref_index[0][xy + wrap ]= | |||||
| s->current_picture.ref_index[0][xy + wrap + 1]= s->field_select[0][1]; | |||||
| s->current_picture.ref_index[0][4*mb_xy ]= | |||||
| s->current_picture.ref_index[0][4*mb_xy + 1]= s->field_select[0][0]; | |||||
| s->current_picture.ref_index[0][4*mb_xy + 2]= | |||||
| s->current_picture.ref_index[0][4*mb_xy + 3]= s->field_select[0][1]; | |||||
| } | } | ||||
| /* no update if 8X8 because it has been done during parsing */ | /* no update if 8X8 because it has been done during parsing */ | ||||
| @@ -850,8 +850,8 @@ static inline int check_input_motion(MpegEncContext * s, int mb_x, int mb_y, int | |||||
| } | } | ||||
| if(USES_LIST(mb_type, 0)){ | if(USES_LIST(mb_type, 0)){ | ||||
| int field_select0= p->ref_index[0][xy ]; | |||||
| int field_select1= p->ref_index[0][xy2]; | |||||
| int field_select0= p->ref_index[0][4*mb_xy ]; | |||||
| int field_select1= p->ref_index[0][4*mb_xy+2]; | |||||
| assert(field_select0==0 ||field_select0==1); | assert(field_select0==0 ||field_select0==1); | ||||
| assert(field_select1==0 ||field_select1==1); | assert(field_select1==0 ||field_select1==1); | ||||
| init_interlaced_ref(s, 0); | init_interlaced_ref(s, 0); | ||||
| @@ -878,8 +878,8 @@ static inline int check_input_motion(MpegEncContext * s, int mb_x, int mb_y, int | |||||
| d+= cmp(s, x>>shift, y>>shift, x&mask, y&mask, 0, 8, field_select1, 1, cmpf, chroma_cmpf, flags); | d+= cmp(s, x>>shift, y>>shift, x&mask, y&mask, 0, 8, field_select1, 1, cmpf, chroma_cmpf, flags); | ||||
| } | } | ||||
| if(USES_LIST(mb_type, 1)){ | if(USES_LIST(mb_type, 1)){ | ||||
| int field_select0= p->ref_index[1][xy ]; | |||||
| int field_select1= p->ref_index[1][xy2]; | |||||
| int field_select0= p->ref_index[1][4*mb_xy ]; | |||||
| int field_select1= p->ref_index[1][4*mb_xy+2]; | |||||
| assert(field_select0==0 ||field_select0==1); | assert(field_select0==0 ||field_select0==1); | ||||
| assert(field_select1==0 ||field_select1==1); | assert(field_select1==0 ||field_select1==1); | ||||
| init_interlaced_ref(s, 2); | init_interlaced_ref(s, 2); | ||||
| @@ -1760,6 +1760,7 @@ static int mpeg_decode_slice(Mpeg1Context *s1, int mb_y, | |||||
| if(s->current_picture.motion_val[0] && !s->encoding){ //note motion_val is normally NULL unless we want to extract the MVs | if(s->current_picture.motion_val[0] && !s->encoding){ //note motion_val is normally NULL unless we want to extract the MVs | ||||
| const int wrap = s->b8_stride; | const int wrap = s->b8_stride; | ||||
| int xy = s->mb_x*2 + s->mb_y*2*wrap; | int xy = s->mb_x*2 + s->mb_y*2*wrap; | ||||
| int b8_xy= 4*(s->mb_x + s->mb_y*s->mb_stride); | |||||
| int motion_x, motion_y, dir, i; | int motion_x, motion_y, dir, i; | ||||
| for(i=0; i<2; i++){ | for(i=0; i<2; i++){ | ||||
| @@ -1778,11 +1779,12 @@ static int mpeg_decode_slice(Mpeg1Context *s1, int mb_y, | |||||
| s->current_picture.motion_val[dir][xy ][1] = motion_y; | s->current_picture.motion_val[dir][xy ][1] = motion_y; | ||||
| s->current_picture.motion_val[dir][xy + 1][0] = motion_x; | s->current_picture.motion_val[dir][xy + 1][0] = motion_x; | ||||
| s->current_picture.motion_val[dir][xy + 1][1] = motion_y; | s->current_picture.motion_val[dir][xy + 1][1] = motion_y; | ||||
| s->current_picture.ref_index [dir][xy ]= | |||||
| s->current_picture.ref_index [dir][xy + 1]= s->field_select[dir][i]; | |||||
| s->current_picture.ref_index [dir][b8_xy ]= | |||||
| s->current_picture.ref_index [dir][b8_xy + 1]= s->field_select[dir][i]; | |||||
| assert(s->field_select[dir][i]==0 || s->field_select[dir][i]==1); | assert(s->field_select[dir][i]==0 || s->field_select[dir][i]==1); | ||||
| } | } | ||||
| xy += wrap; | xy += wrap; | ||||
| b8_xy +=2; | |||||
| } | } | ||||
| } | } | ||||
| @@ -137,7 +137,7 @@ int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){ | |||||
| } else if(IS_INTERLACED(colocated_mb_type)){ | } else if(IS_INTERLACED(colocated_mb_type)){ | ||||
| s->mv_type = MV_TYPE_FIELD; | s->mv_type = MV_TYPE_FIELD; | ||||
| for(i=0; i<2; i++){ | for(i=0; i<2; i++){ | ||||
| int field_select= s->next_picture.ref_index[0][s->block_index[2*i]]; | |||||
| int field_select= s->next_picture.ref_index[0][4*mb_index + 2*i]; | |||||
| s->field_select[0][i]= field_select; | s->field_select[0][i]= field_select; | ||||
| s->field_select[1][i]= i; | s->field_select[1][i]= i; | ||||
| if(s->top_field_first){ | if(s->top_field_first){ | ||||
| @@ -296,7 +296,7 @@ int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared){ | |||||
| for(i=0; i<2; i++){ | for(i=0; i<2; i++){ | ||||
| FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t), fail) | FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t), fail) | ||||
| pic->motion_val[i]= pic->motion_val_base[i]+4; | pic->motion_val[i]= pic->motion_val_base[i]+4; | ||||
| FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], b8_array_size * sizeof(uint8_t), fail) | |||||
| FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], 4*mb_array_size * sizeof(uint8_t), fail) | |||||
| } | } | ||||
| pic->motion_subsample_log2= 3; | pic->motion_subsample_log2= 3; | ||||
| } | } | ||||
| @@ -197,7 +197,7 @@ static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst, AVFrame *sr | |||||
| memcpy(dst->motion_val[i], src->motion_val[i], 2*stride*height*sizeof(int16_t)); | memcpy(dst->motion_val[i], src->motion_val[i], 2*stride*height*sizeof(int16_t)); | ||||
| } | } | ||||
| if(src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]){ | if(src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]){ | ||||
| memcpy(dst->ref_index[i], src->ref_index[i], s->b8_stride*2*s->mb_height*sizeof(int8_t)); | |||||
| memcpy(dst->ref_index[i], src->ref_index[i], s->mb_stride*4*s->mb_height*sizeof(int8_t)); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||