comparison error_resilience.c @ 1668:30746f429df6 libavcodec

move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>) cleanups & fixes by me
author michael
date Tue, 09 Dec 2003 01:49:56 +0000
parents 932d306bf1dc
children 8bccf5eda14b
comparison
equal deleted inserted replaced
1667:720c073661a1 1668:30746f429df6
207 int left_intra= IS_INTRA(s->current_picture.mb_type [( b_x >>is_luma) + (b_y>>is_luma)*s->mb_stride]); 207 int left_intra= IS_INTRA(s->current_picture.mb_type [( b_x >>is_luma) + (b_y>>is_luma)*s->mb_stride]);
208 int right_intra= IS_INTRA(s->current_picture.mb_type [((b_x+1)>>is_luma) + (b_y>>is_luma)*s->mb_stride]); 208 int right_intra= IS_INTRA(s->current_picture.mb_type [((b_x+1)>>is_luma) + (b_y>>is_luma)*s->mb_stride]);
209 int left_damage = left_status&(DC_ERROR|AC_ERROR|MV_ERROR); 209 int left_damage = left_status&(DC_ERROR|AC_ERROR|MV_ERROR);
210 int right_damage= right_status&(DC_ERROR|AC_ERROR|MV_ERROR); 210 int right_damage= right_status&(DC_ERROR|AC_ERROR|MV_ERROR);
211 int offset= b_x*8 + b_y*stride*8; 211 int offset= b_x*8 + b_y*stride*8;
212 int16_t *left_mv= s->motion_val[s->block_wrap[0]*((b_y<<(1-is_luma)) + 1) + ( b_x <<(1-is_luma))]; 212 int16_t *left_mv= s->current_picture.motion_val[0][s->block_wrap[0]*((b_y<<(1-is_luma)) + 1) + ( b_x <<(1-is_luma))];
213 int16_t *right_mv= s->motion_val[s->block_wrap[0]*((b_y<<(1-is_luma)) + 1) + ((b_x+1)<<(1-is_luma))]; 213 int16_t *right_mv= s->current_picture.motion_val[0][s->block_wrap[0]*((b_y<<(1-is_luma)) + 1) + ((b_x+1)<<(1-is_luma))];
214 214
215 if(!(left_damage||right_damage)) continue; // both undamaged 215 if(!(left_damage||right_damage)) continue; // both undamaged
216 216
217 if( (!left_intra) && (!right_intra) 217 if( (!left_intra) && (!right_intra)
218 && ABS(left_mv[0]-right_mv[0]) + ABS(left_mv[1]+right_mv[1]) < 2) continue; 218 && ABS(left_mv[0]-right_mv[0]) + ABS(left_mv[1]+right_mv[1]) < 2) continue;
267 int top_intra= IS_INTRA(s->current_picture.mb_type [(b_x>>is_luma) + ( b_y >>is_luma)*s->mb_stride]); 267 int top_intra= IS_INTRA(s->current_picture.mb_type [(b_x>>is_luma) + ( b_y >>is_luma)*s->mb_stride]);
268 int bottom_intra= IS_INTRA(s->current_picture.mb_type [(b_x>>is_luma) + ((b_y+1)>>is_luma)*s->mb_stride]); 268 int bottom_intra= IS_INTRA(s->current_picture.mb_type [(b_x>>is_luma) + ((b_y+1)>>is_luma)*s->mb_stride]);
269 int top_damage = top_status&(DC_ERROR|AC_ERROR|MV_ERROR); 269 int top_damage = top_status&(DC_ERROR|AC_ERROR|MV_ERROR);
270 int bottom_damage= bottom_status&(DC_ERROR|AC_ERROR|MV_ERROR); 270 int bottom_damage= bottom_status&(DC_ERROR|AC_ERROR|MV_ERROR);
271 int offset= b_x*8 + b_y*stride*8; 271 int offset= b_x*8 + b_y*stride*8;
272 int16_t *top_mv= s->motion_val[s->block_wrap[0]*(( b_y <<(1-is_luma)) + 1) + (b_x<<(1-is_luma))]; 272 int16_t *top_mv= s->current_picture.motion_val[0][s->block_wrap[0]*(( b_y <<(1-is_luma)) + 1) + (b_x<<(1-is_luma))];
273 int16_t *bottom_mv= s->motion_val[s->block_wrap[0]*(((b_y+1)<<(1-is_luma)) + 1) + (b_x<<(1-is_luma))]; 273 int16_t *bottom_mv= s->current_picture.motion_val[0][s->block_wrap[0]*(((b_y+1)<<(1-is_luma)) + 1) + (b_x<<(1-is_luma))];
274 274
275 if(!(top_damage||bottom_damage)) continue; // both undamaged 275 if(!(top_damage||bottom_damage)) continue; // both undamaged
276 276
277 if( (!top_intra) && (!bottom_intra) 277 if( (!top_intra) && (!bottom_intra)
278 && ABS(top_mv[0]-bottom_mv[0]) + ABS(top_mv[1]+bottom_mv[1]) < 2) continue; 278 && ABS(top_mv[0]-bottom_mv[0]) + ABS(top_mv[1]+bottom_mv[1]) < 2) continue;
378 int j; 378 int j;
379 int best_score=256*256*256*64; 379 int best_score=256*256*256*64;
380 int best_pred=0; 380 int best_pred=0;
381 const int mot_stride= mb_width*2+2; 381 const int mot_stride= mb_width*2+2;
382 const int mot_index= mb_x*2 + 1 + (mb_y*2+1)*mot_stride; 382 const int mot_index= mb_x*2 + 1 + (mb_y*2+1)*mot_stride;
383 int prev_x= s->motion_val[mot_index][0]; 383 int prev_x= s->current_picture.motion_val[0][mot_index][0];
384 int prev_y= s->motion_val[mot_index][1]; 384 int prev_y= s->current_picture.motion_val[0][mot_index][1];
385 385
386 if((mb_x^mb_y^pass)&1) continue; 386 if((mb_x^mb_y^pass)&1) continue;
387 387
388 if(fixed[mb_xy]==MV_FROZEN) continue; 388 if(fixed[mb_xy]==MV_FROZEN) continue;
389 assert(!IS_INTRA(s->current_picture.mb_type[mb_xy])); 389 assert(!IS_INTRA(s->current_picture.mb_type[mb_xy]));
404 if(j==0 && pass>1) continue; 404 if(j==0 && pass>1) continue;
405 405
406 none_left=0; 406 none_left=0;
407 407
408 if(mb_x>0 && fixed[mb_xy-1]){ 408 if(mb_x>0 && fixed[mb_xy-1]){
409 mv_predictor[pred_count][0]= s->motion_val[mot_index - 2][0]; 409 mv_predictor[pred_count][0]= s->current_picture.motion_val[0][mot_index - 2][0];
410 mv_predictor[pred_count][1]= s->motion_val[mot_index - 2][1]; 410 mv_predictor[pred_count][1]= s->current_picture.motion_val[0][mot_index - 2][1];
411 pred_count++; 411 pred_count++;
412 } 412 }
413 if(mb_x+1<mb_width && fixed[mb_xy+1]){ 413 if(mb_x+1<mb_width && fixed[mb_xy+1]){
414 mv_predictor[pred_count][0]= s->motion_val[mot_index + 2][0]; 414 mv_predictor[pred_count][0]= s->current_picture.motion_val[0][mot_index + 2][0];
415 mv_predictor[pred_count][1]= s->motion_val[mot_index + 2][1]; 415 mv_predictor[pred_count][1]= s->current_picture.motion_val[0][mot_index + 2][1];
416 pred_count++; 416 pred_count++;
417 } 417 }
418 if(mb_y>0 && fixed[mb_xy-mb_stride]){ 418 if(mb_y>0 && fixed[mb_xy-mb_stride]){
419 mv_predictor[pred_count][0]= s->motion_val[mot_index - mot_stride*2][0]; 419 mv_predictor[pred_count][0]= s->current_picture.motion_val[0][mot_index - mot_stride*2][0];
420 mv_predictor[pred_count][1]= s->motion_val[mot_index - mot_stride*2][1]; 420 mv_predictor[pred_count][1]= s->current_picture.motion_val[0][mot_index - mot_stride*2][1];
421 pred_count++; 421 pred_count++;
422 } 422 }
423 if(mb_y+1<mb_height && fixed[mb_xy+mb_stride]){ 423 if(mb_y+1<mb_height && fixed[mb_xy+mb_stride]){
424 mv_predictor[pred_count][0]= s->motion_val[mot_index + mot_stride*2][0]; 424 mv_predictor[pred_count][0]= s->current_picture.motion_val[0][mot_index + mot_stride*2][0];
425 mv_predictor[pred_count][1]= s->motion_val[mot_index + mot_stride*2][1]; 425 mv_predictor[pred_count][1]= s->current_picture.motion_val[0][mot_index + mot_stride*2][1];
426 pred_count++; 426 pred_count++;
427 } 427 }
428 if(pred_count==0) continue; 428 if(pred_count==0) continue;
429 429
430 if(pred_count>1){ 430 if(pred_count>1){
465 465
466 /* zero MV */ 466 /* zero MV */
467 pred_count++; 467 pred_count++;
468 468
469 /* last MV */ 469 /* last MV */
470 mv_predictor[pred_count][0]= s->motion_val[mot_index][0]; 470 mv_predictor[pred_count][0]= s->current_picture.motion_val[0][mot_index][0];
471 mv_predictor[pred_count][1]= s->motion_val[mot_index][1]; 471 mv_predictor[pred_count][1]= s->current_picture.motion_val[0][mot_index][1];
472 pred_count++; 472 pred_count++;
473 473
474 s->mv_dir = MV_DIR_FORWARD; 474 s->mv_dir = MV_DIR_FORWARD;
475 s->mb_intra=0; 475 s->mb_intra=0;
476 s->mv_type = MV_TYPE_16X16; 476 s->mv_type = MV_TYPE_16X16;
483 483
484 for(j=0; j<pred_count; j++){ 484 for(j=0; j<pred_count; j++){
485 int score=0; 485 int score=0;
486 uint8_t *src= s->current_picture.data[0] + mb_x*16 + mb_y*16*s->linesize; 486 uint8_t *src= s->current_picture.data[0] + mb_x*16 + mb_y*16*s->linesize;
487 487
488 s->motion_val[mot_index][0]= s->mv[0][0][0]= mv_predictor[j][0]; 488 s->current_picture.motion_val[0][mot_index][0]= s->mv[0][0][0]= mv_predictor[j][0];
489 s->motion_val[mot_index][1]= s->mv[0][0][1]= mv_predictor[j][1]; 489 s->current_picture.motion_val[0][mot_index][1]= s->mv[0][0][1]= mv_predictor[j][1];
490 490
491 decode_mb(s); 491 decode_mb(s);
492 492
493 if(mb_x>0 && fixed[mb_xy-1]){ 493 if(mb_x>0 && fixed[mb_xy-1]){
494 int k; 494 int k;
515 best_score= score; 515 best_score= score;
516 best_pred= j; 516 best_pred= j;
517 } 517 }
518 } 518 }
519 score_sum+= best_score; 519 score_sum+= best_score;
520 //FIXME no need to set s->motion_val[mot_index][0] explicit 520 //FIXME no need to set s->current_picture.motion_val[0][mot_index][0] explicit
521 s->motion_val[mot_index][0]= s->mv[0][0][0]= mv_predictor[best_pred][0]; 521 s->current_picture.motion_val[0][mot_index][0]= s->mv[0][0][0]= mv_predictor[best_pred][0];
522 s->motion_val[mot_index][1]= s->mv[0][0][1]= mv_predictor[best_pred][1]; 522 s->current_picture.motion_val[0][mot_index][1]= s->mv[0][0][1]= mv_predictor[best_pred][1];
523 523
524 decode_mb(s); 524 decode_mb(s);
525 525
526 526
527 if(s->mv[0][0][0] != prev_x || s->mv[0][0][1] != prev_y){ 527 if(s->mv[0][0][0] != prev_x || s->mv[0][0][1] != prev_y){
669 669
670 if(!s->error_resilience || s->error_count==0) return; 670 if(!s->error_resilience || s->error_count==0) return;
671 671
672 av_log(s->avctx, AV_LOG_INFO, "concealing errors\n"); 672 av_log(s->avctx, AV_LOG_INFO, "concealing errors\n");
673 673
674 if(s->motion_val == NULL){ 674 if(s->current_picture.motion_val[0] == NULL){
675 int size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2); 675 int size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
676 676
677 av_log(s->avctx, AV_LOG_ERROR, "Warning MVs not available\n"); 677 av_log(s->avctx, AV_LOG_ERROR, "Warning MVs not available\n");
678 678
679 s->motion_val= av_mallocz(size * 2 * sizeof(int16_t)); 679 s->current_picture.motion_val[0]= av_mallocz(size * 2 * sizeof(int16_t)); //FIXME
680 } 680 }
681 681
682 if(s->avctx->debug&FF_DEBUG_ER){ 682 if(s->avctx->debug&FF_DEBUG_ER){
683 for(mb_y=0; mb_y<s->mb_height; mb_y++){ 683 for(mb_y=0; mb_y<s->mb_height; mb_y++){
684 for(mb_x=0; mb_x<s->mb_width; mb_x++){ 684 for(mb_x=0; mb_x<s->mb_width; mb_x++){
841 if(IS_8X8(mb_type)){ 841 if(IS_8X8(mb_type)){
842 int mb_index= mb_x*2+1 + (mb_y*2+1)*s->block_wrap[0]; 842 int mb_index= mb_x*2+1 + (mb_y*2+1)*s->block_wrap[0];
843 int j; 843 int j;
844 s->mv_type = MV_TYPE_8X8; 844 s->mv_type = MV_TYPE_8X8;
845 for(j=0; j<4; j++){ 845 for(j=0; j<4; j++){
846 s->mv[0][j][0] = s->motion_val[ mb_index + (j&1) + (j>>1)*s->block_wrap[0] ][0]; 846 s->mv[0][j][0] = s->current_picture.motion_val[0][ mb_index + (j&1) + (j>>1)*s->block_wrap[0] ][0];
847 s->mv[0][j][1] = s->motion_val[ mb_index + (j&1) + (j>>1)*s->block_wrap[0] ][1]; 847 s->mv[0][j][1] = s->current_picture.motion_val[0][ mb_index + (j&1) + (j>>1)*s->block_wrap[0] ][1];
848 } 848 }
849 }else{ 849 }else{
850 s->mv_type = MV_TYPE_16X16; 850 s->mv_type = MV_TYPE_16X16;
851 s->mv[0][0][0] = s->motion_val[ mb_x*2+1 + (mb_y*2+1)*s->block_wrap[0] ][0]; 851 s->mv[0][0][0] = s->current_picture.motion_val[0][ mb_x*2+1 + (mb_y*2+1)*s->block_wrap[0] ][0];
852 s->mv[0][0][1] = s->motion_val[ mb_x*2+1 + (mb_y*2+1)*s->block_wrap[0] ][1]; 852 s->mv[0][0][1] = s->current_picture.motion_val[0][ mb_x*2+1 + (mb_y*2+1)*s->block_wrap[0] ][1];
853 } 853 }
854 854
855 s->dsp.clear_blocks(s->block[0]); 855 s->dsp.clear_blocks(s->block[0]);
856 856
857 s->mb_x= mb_x; 857 s->mb_x= mb_x;
880 880
881 if(s->pp_time){ 881 if(s->pp_time){
882 int time_pp= s->pp_time; 882 int time_pp= s->pp_time;
883 int time_pb= s->pb_time; 883 int time_pb= s->pb_time;
884 884
885 s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp; 885 s->mv[0][0][0] = s->next_picture.motion_val[0][xy][0]*time_pb/time_pp;
886 s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp; 886 s->mv[0][0][1] = s->next_picture.motion_val[0][xy][1]*time_pb/time_pp;
887 s->mv[1][0][0] = s->motion_val[xy][0]*(time_pb - time_pp)/time_pp; 887 s->mv[1][0][0] = s->next_picture.motion_val[0][xy][0]*(time_pb - time_pp)/time_pp;
888 s->mv[1][0][1] = s->motion_val[xy][1]*(time_pb - time_pp)/time_pp; 888 s->mv[1][0][1] = s->next_picture.motion_val[0][xy][1]*(time_pb - time_pp)/time_pp;
889 }else{ 889 }else{
890 s->mv[0][0][0]= 0; 890 s->mv[0][0][0]= 0;
891 s->mv[0][0][1]= 0; 891 s->mv[0][0][1]= 0;
892 s->mv[1][0][0]= 0; 892 s->mv[1][0][0]= 0;
893 s->mv[1][0][1]= 0; 893 s->mv[1][0][1]= 0;