Mercurial > libavcodec.hg
comparison error_resilience.c @ 1938:e2501e6e7ff7 libavcodec
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
minor +-1 bugfix
author | michael |
---|---|
date | Fri, 16 Apr 2004 01:01:45 +0000 |
parents | fcbf31baa1af |
children | 2ede7cc1fe4e |
comparison
equal
deleted
inserted
replaced
1937:4d91a9342d95 | 1938:e2501e6e7ff7 |
---|---|
43 */ | 43 */ |
44 static void put_dc(MpegEncContext *s, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int mb_x, int mb_y) | 44 static void put_dc(MpegEncContext *s, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int mb_x, int mb_y) |
45 { | 45 { |
46 int dc, dcu, dcv, y, i; | 46 int dc, dcu, dcv, y, i; |
47 for(i=0; i<4; i++){ | 47 for(i=0; i<4; i++){ |
48 dc= s->dc_val[0][mb_x*2+1 + (i&1) + (mb_y*2+1 + (i>>1))*(s->mb_width*2+2)]; | 48 dc= s->dc_val[0][mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*s->b8_stride]; |
49 if(dc<0) dc=0; | 49 if(dc<0) dc=0; |
50 else if(dc>2040) dc=2040; | 50 else if(dc>2040) dc=2040; |
51 for(y=0; y<8; y++){ | 51 for(y=0; y<8; y++){ |
52 int x; | 52 int x; |
53 for(x=0; x<8; x++){ | 53 for(x=0; x<8; x++){ |
54 dest_y[x + (i&1)*8 + (y + (i>>1)*8)*s->linesize]= dc/8; | 54 dest_y[x + (i&1)*8 + (y + (i>>1)*8)*s->linesize]= dc/8; |
55 } | 55 } |
56 } | 56 } |
57 } | 57 } |
58 dcu = s->dc_val[1][mb_x+1 + (mb_y+1)*(s->mb_width+2)]; | 58 dcu = s->dc_val[1][mb_x + mb_y*s->mb_stride]; |
59 dcv = s->dc_val[2][mb_x+1 + (mb_y+1)*(s->mb_width+2)]; | 59 dcv = s->dc_val[2][mb_x + mb_y*s->mb_stride]; |
60 if (dcu<0 ) dcu=0; | 60 if (dcu<0 ) dcu=0; |
61 else if(dcu>2040) dcu=2040; | 61 else if(dcu>2040) dcu=2040; |
62 if (dcv<0 ) dcv=0; | 62 if (dcv<0 ) dcv=0; |
63 else if(dcv>2040) dcv=2040; | 63 else if(dcv>2040) dcv=2040; |
64 for(y=0; y<8; y++){ | 64 for(y=0; y<8; y++){ |
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->current_picture.motion_val[0][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->b8_stride*(b_y<<(1-is_luma)) + ( b_x <<(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))]; | 213 int16_t *right_mv= s->current_picture.motion_val[0][s->b8_stride*(b_y<<(1-is_luma)) + ((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->current_picture.motion_val[0][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->b8_stride*( b_y <<(1-is_luma)) + (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))]; | 273 int16_t *bottom_mv= s->current_picture.motion_val[0][s->b8_stride*((b_y+1)<<(1-is_luma)) + (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; |
376 int mv_predictor[8][2]={{0}}; | 376 int mv_predictor[8][2]={{0}}; |
377 int pred_count=0; | 377 int pred_count=0; |
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= s->b8_stride; |
382 const int mot_index= mb_x*2 + 1 + (mb_y*2+1)*mot_stride; | 382 const int mot_index= mb_x*2 + mb_y*2*mot_stride; |
383 int prev_x= s->current_picture.motion_val[0][mot_index][0]; | 383 int prev_x= s->current_picture.motion_val[0][mot_index][0]; |
384 int prev_y= s->current_picture.motion_val[0][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 |
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->current_picture.motion_val[0] == 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 = s->b8_stride * 2 * s->mb_height; |
676 Picture *pic= s->current_picture_ptr; | 676 Picture *pic= s->current_picture_ptr; |
677 | 677 |
678 av_log(s->avctx, AV_LOG_ERROR, "Warning MVs not available\n"); | 678 av_log(s->avctx, AV_LOG_ERROR, "Warning MVs not available\n"); |
679 | 679 |
680 for(i=0; i<2; i++){ | 680 for(i=0; i<2; i++){ |
681 pic->motion_val_base[i]= av_mallocz((size+1) * 2 * sizeof(uint16_t)); //FIXME size | 681 pic->motion_val_base[i]= av_mallocz((size+2) * 2 * sizeof(uint16_t)); |
682 pic->motion_val[i]= pic->motion_val_base[i]+1; | 682 pic->motion_val[i]= pic->motion_val_base[i]+2; |
683 } | 683 } |
684 pic->motion_subsample_log2= 3; | 684 pic->motion_subsample_log2= 3; |
685 s->current_picture= *s->current_picture_ptr; | 685 s->current_picture= *s->current_picture_ptr; |
686 } | 686 } |
687 | 687 |
843 | 843 |
844 s->mv_dir = MV_DIR_FORWARD; | 844 s->mv_dir = MV_DIR_FORWARD; |
845 s->mb_intra=0; | 845 s->mb_intra=0; |
846 s->mb_skiped=0; | 846 s->mb_skiped=0; |
847 if(IS_8X8(mb_type)){ | 847 if(IS_8X8(mb_type)){ |
848 int mb_index= mb_x*2+1 + (mb_y*2+1)*s->block_wrap[0]; | 848 int mb_index= mb_x*2 + mb_y*2*s->b8_stride; |
849 int j; | 849 int j; |
850 s->mv_type = MV_TYPE_8X8; | 850 s->mv_type = MV_TYPE_8X8; |
851 for(j=0; j<4; j++){ | 851 for(j=0; j<4; j++){ |
852 s->mv[0][j][0] = s->current_picture.motion_val[0][ mb_index + (j&1) + (j>>1)*s->block_wrap[0] ][0]; | 852 s->mv[0][j][0] = s->current_picture.motion_val[0][ mb_index + (j&1) + (j>>1)*s->b8_stride ][0]; |
853 s->mv[0][j][1] = s->current_picture.motion_val[0][ mb_index + (j&1) + (j>>1)*s->block_wrap[0] ][1]; | 853 s->mv[0][j][1] = s->current_picture.motion_val[0][ mb_index + (j&1) + (j>>1)*s->b8_stride ][1]; |
854 } | 854 } |
855 }else{ | 855 }else{ |
856 s->mv_type = MV_TYPE_16X16; | 856 s->mv_type = MV_TYPE_16X16; |
857 s->mv[0][0][0] = s->current_picture.motion_val[0][ mb_x*2+1 + (mb_y*2+1)*s->block_wrap[0] ][0]; | 857 s->mv[0][0][0] = s->current_picture.motion_val[0][ mb_x*2 + mb_y*2*s->b8_stride ][0]; |
858 s->mv[0][0][1] = s->current_picture.motion_val[0][ mb_x*2+1 + (mb_y*2+1)*s->block_wrap[0] ][1]; | 858 s->mv[0][0][1] = s->current_picture.motion_val[0][ mb_x*2 + mb_y*2*s->b8_stride ][1]; |
859 } | 859 } |
860 | 860 |
861 s->dsp.clear_blocks(s->block[0]); | 861 s->dsp.clear_blocks(s->block[0]); |
862 | 862 |
863 s->mb_x= mb_x; | 863 s->mb_x= mb_x; |
868 | 868 |
869 /* guess MVs */ | 869 /* guess MVs */ |
870 if(s->pict_type==B_TYPE){ | 870 if(s->pict_type==B_TYPE){ |
871 for(mb_y=0; mb_y<s->mb_height; mb_y++){ | 871 for(mb_y=0; mb_y<s->mb_height; mb_y++){ |
872 for(mb_x=0; mb_x<s->mb_width; mb_x++){ | 872 for(mb_x=0; mb_x<s->mb_width; mb_x++){ |
873 int xy= mb_x*2+1 + (mb_y*2+1)*s->block_wrap[0]; | 873 int xy= mb_x*2 + mb_y*2*s->b8_stride; |
874 const int mb_xy= mb_x + mb_y * s->mb_stride; | 874 const int mb_xy= mb_x + mb_y * s->mb_stride; |
875 const int mb_type= s->current_picture.mb_type[mb_xy]; | 875 const int mb_type= s->current_picture.mb_type[mb_xy]; |
876 error= s->error_status_table[mb_xy]; | 876 error= s->error_status_table[mb_xy]; |
877 | 877 |
878 if(IS_INTRA(mb_type)) continue; | 878 if(IS_INTRA(mb_type)) continue; |
928 | 928 |
929 dest_y = s->current_picture.data[0] + mb_x*16 + mb_y*16*s->linesize; | 929 dest_y = s->current_picture.data[0] + mb_x*16 + mb_y*16*s->linesize; |
930 dest_cb= s->current_picture.data[1] + mb_x*8 + mb_y*8 *s->uvlinesize; | 930 dest_cb= s->current_picture.data[1] + mb_x*8 + mb_y*8 *s->uvlinesize; |
931 dest_cr= s->current_picture.data[2] + mb_x*8 + mb_y*8 *s->uvlinesize; | 931 dest_cr= s->current_picture.data[2] + mb_x*8 + mb_y*8 *s->uvlinesize; |
932 | 932 |
933 dc_ptr= &s->dc_val[0][mb_x*2+1 + (mb_y*2+1)*(s->mb_width*2+2)]; | 933 dc_ptr= &s->dc_val[0][mb_x*2 + mb_y*2*s->b8_stride]; |
934 for(n=0; n<4; n++){ | 934 for(n=0; n<4; n++){ |
935 dc=0; | 935 dc=0; |
936 for(y=0; y<8; y++){ | 936 for(y=0; y<8; y++){ |
937 int x; | 937 int x; |
938 for(x=0; x<8; x++){ | 938 for(x=0; x<8; x++){ |
939 dc+= dest_y[x + (n&1)*8 + (y + (n>>1)*8)*s->linesize]; | 939 dc+= dest_y[x + (n&1)*8 + (y + (n>>1)*8)*s->linesize]; |
940 } | 940 } |
941 } | 941 } |
942 dc_ptr[(n&1) + (n>>1)*(s->mb_width*2+2)]= (dc+4)>>3; | 942 dc_ptr[(n&1) + (n>>1)*s->b8_stride]= (dc+4)>>3; |
943 } | 943 } |
944 | 944 |
945 dcu=dcv=0; | 945 dcu=dcv=0; |
946 for(y=0; y<8; y++){ | 946 for(y=0; y<8; y++){ |
947 int x; | 947 int x; |
948 for(x=0; x<8; x++){ | 948 for(x=0; x<8; x++){ |
949 dcu+=dest_cb[x + y*(s->uvlinesize)]; | 949 dcu+=dest_cb[x + y*(s->uvlinesize)]; |
950 dcv+=dest_cr[x + y*(s->uvlinesize)]; | 950 dcv+=dest_cr[x + y*(s->uvlinesize)]; |
951 } | 951 } |
952 } | 952 } |
953 s->dc_val[1][mb_x+1 + (mb_y+1)*(s->mb_width+2)]= (dcu+4)>>3; | 953 s->dc_val[1][mb_x + mb_y*s->mb_stride]= (dcu+4)>>3; |
954 s->dc_val[2][mb_x+1 + (mb_y+1)*(s->mb_width+2)]= (dcv+4)>>3; | 954 s->dc_val[2][mb_x + mb_y*s->mb_stride]= (dcv+4)>>3; |
955 } | 955 } |
956 } | 956 } |
957 #if 1 | 957 #if 1 |
958 /* guess DC for damaged blocks */ | 958 /* guess DC for damaged blocks */ |
959 guess_dc(s, s->dc_val[0] + s->mb_width*2+3, s->mb_width*2, s->mb_height*2, s->mb_width*2+2, 1); | 959 guess_dc(s, s->dc_val[0], s->mb_width*2, s->mb_height*2, s->b8_stride, 1); |
960 guess_dc(s, s->dc_val[1] + s->mb_width +3, s->mb_width , s->mb_height , s->mb_width +2, 0); | 960 guess_dc(s, s->dc_val[1], s->mb_width , s->mb_height , s->mb_stride, 0); |
961 guess_dc(s, s->dc_val[2] + s->mb_width +3, s->mb_width , s->mb_height , s->mb_width +2, 0); | 961 guess_dc(s, s->dc_val[2], s->mb_width , s->mb_height , s->mb_stride, 0); |
962 #endif | 962 #endif |
963 /* filter luma DC */ | 963 /* filter luma DC */ |
964 filter181(s->dc_val[0] + s->mb_width*2+3, s->mb_width*2, s->mb_height*2, s->mb_width*2+2); | 964 filter181(s->dc_val[0], s->mb_width*2, s->mb_height*2, s->b8_stride); |
965 | 965 |
966 #if 1 | 966 #if 1 |
967 /* render DC only intra */ | 967 /* render DC only intra */ |
968 for(mb_y=0; mb_y<s->mb_height; mb_y++){ | 968 for(mb_y=0; mb_y<s->mb_height; mb_y++){ |
969 for(mb_x=0; mb_x<s->mb_width; mb_x++){ | 969 for(mb_x=0; mb_x<s->mb_width; mb_x++){ |