- if(s->pict_type==B_TYPE){
- for(mb_y=0; mb_y<s->mb_height; mb_y++){
- for(mb_x=0; mb_x<s->mb_width; mb_x++){
- int xy= mb_x*2+1 + (mb_y*2+1)*s->block_wrap[0];
- const int mb_xy= mb_x + mb_y * s->mb_stride;
- const int mb_type= s->current_picture.mb_type[mb_xy];
- error= s->error_status_table[mb_xy];
-
- if(IS_INTRA(mb_type)) continue;
- if(!(error&MV_ERROR)) continue; //inter with undamaged MV
- if(!(error&AC_ERROR)) continue; //undamaged inter
-
- s->mv_dir = MV_DIR_FORWARD|MV_DIR_BACKWARD;
- s->mb_intra=0;
- s->mv_type = MV_TYPE_16X16;
- s->mb_skiped=0;
-
- if(s->pp_time){
- int time_pp= s->pp_time;
- int time_pb= s->pb_time;
-
- s->mv[0][0][0] = s->next_picture.motion_val[0][xy][0]*time_pb/time_pp;
- s->mv[0][0][1] = s->next_picture.motion_val[0][xy][1]*time_pb/time_pp;
- s->mv[1][0][0] = s->next_picture.motion_val[0][xy][0]*(time_pb - time_pp)/time_pp;
- s->mv[1][0][1] = s->next_picture.motion_val[0][xy][1]*(time_pb - time_pp)/time_pp;
- }else{
- s->mv[0][0][0]= 0;
- s->mv[0][0][1]= 0;
- s->mv[1][0][0]= 0;
- s->mv[1][0][1]= 0;
+ if (s->pict_type == AV_PICTURE_TYPE_B) {
+ for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
+ s->mb_x = 0;
+ s->mb_y = mb_y;
+ ff_init_block_index(s);
+ for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
+ int xy = mb_x * 2 + mb_y * 2 * s->b8_stride;
+ const int mb_xy = mb_x + mb_y * s->mb_stride;
+ const int mb_type = s->current_picture.f.mb_type[mb_xy];
+
+ ff_update_block_index(s);
+
+ error = s->error_status_table[mb_xy];
+
+ if (IS_INTRA(mb_type))
+ continue;
+ if (!(error & ER_MV_ERROR))
+ continue; // inter with undamaged MV
+ if (!(error & ER_AC_ERROR))
+ continue; // undamaged inter
+
+ s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
+ if (!s->last_picture.f.data[0])
+ s->mv_dir &= ~MV_DIR_FORWARD;
+ if (!s->next_picture.f.data[0])
+ s->mv_dir &= ~MV_DIR_BACKWARD;
+ s->mb_intra = 0;
+ s->mv_type = MV_TYPE_16X16;
+ s->mb_skipped = 0;
+
+ if (s->pp_time) {
+ int time_pp = s->pp_time;
+ int time_pb = s->pb_time;
+
+ if (s->avctx->codec_id == AV_CODEC_ID_H264) {
+ // FIXME
+ } else {
+ ff_thread_await_progress(&s->next_picture_ptr->f, mb_y, 0);
+ }
+ s->mv[0][0][0] = s->next_picture.f.motion_val[0][xy][0] * time_pb / time_pp;
+ s->mv[0][0][1] = s->next_picture.f.motion_val[0][xy][1] * time_pb / time_pp;
+ s->mv[1][0][0] = s->next_picture.f.motion_val[0][xy][0] * (time_pb - time_pp) / time_pp;
+ s->mv[1][0][1] = s->next_picture.f.motion_val[0][xy][1] * (time_pb - time_pp) / time_pp;
+ } else {
+ s->mv[0][0][0] = 0;
+ s->mv[0][0][1] = 0;
+ s->mv[1][0][0] = 0;
+ s->mv[1][0][1] = 0;