Mercurial > libavcodec.hg
comparison h264.c @ 2523:0fbbba9a52bc libavcodec
In-loop deblocking for B-frames.
author | lorenm |
---|---|
date | Fri, 25 Feb 2005 07:40:29 +0000 |
parents | b34f2cac6a71 |
children | e0bf024629cf |
comparison
equal
deleted
inserted
replaced
2522:e25782262d7d | 2523:0fbbba9a52bc |
---|---|
580 #if 1 | 580 #if 1 |
581 //FIXME direct mb can skip much of this | 581 //FIXME direct mb can skip much of this |
582 if(IS_INTER(mb_type) || (IS_DIRECT(mb_type) && h->direct_spatial_mv_pred)){ | 582 if(IS_INTER(mb_type) || (IS_DIRECT(mb_type) && h->direct_spatial_mv_pred)){ |
583 int list; | 583 int list; |
584 for(list=0; list<2; list++){ | 584 for(list=0; list<2; list++){ |
585 if((!IS_8X8(mb_type)) && !USES_LIST(mb_type, list) && !IS_DIRECT(mb_type)){ | 585 if((!IS_8X8(mb_type)) && !USES_LIST(mb_type, list) && !IS_DIRECT(mb_type) && !for_deblock){ |
586 /*if(!h->mv_cache_clean[list]){ | 586 /*if(!h->mv_cache_clean[list]){ |
587 memset(h->mv_cache [list], 0, 8*5*2*sizeof(int16_t)); //FIXME clean only input? clean at all? | 587 memset(h->mv_cache [list], 0, 8*5*2*sizeof(int16_t)); //FIXME clean only input? clean at all? |
588 memset(h->ref_cache[list], PART_NOT_AVAILABLE, 8*5*sizeof(int8_t)); | 588 memset(h->ref_cache[list], PART_NOT_AVAILABLE, 8*5*sizeof(int8_t)); |
589 h->mv_cache_clean[list]= 1; | 589 h->mv_cache_clean[list]= 1; |
590 }*/ | 590 }*/ |
4186 for(list=0; list<2; list++){ | 4186 for(list=0; list<2; list++){ |
4187 if(h->ref_count[list]>0){ | 4187 if(h->ref_count[list]>0){ |
4188 if(IS_DIR(mb_type, 0, list)){ | 4188 if(IS_DIR(mb_type, 0, list)){ |
4189 const int val= get_te0_golomb(&s->gb, h->ref_count[list]); | 4189 const int val= get_te0_golomb(&s->gb, h->ref_count[list]); |
4190 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1); | 4190 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1); |
4191 } | 4191 }else |
4192 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, (LIST_NOT_USED&0xFF), 1); | |
4192 } | 4193 } |
4193 } | 4194 } |
4194 for(list=0; list<2; list++){ | 4195 for(list=0; list<2; list++){ |
4195 if(IS_DIR(mb_type, 0, list)){ | 4196 if(IS_DIR(mb_type, 0, list)){ |
4196 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my); | 4197 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my); |
4197 mx += get_se_golomb(&s->gb); | 4198 mx += get_se_golomb(&s->gb); |
4198 my += get_se_golomb(&s->gb); | 4199 my += get_se_golomb(&s->gb); |
4199 tprintf("final mv:%d %d\n", mx, my); | 4200 tprintf("final mv:%d %d\n", mx, my); |
4200 | 4201 |
4201 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4); | 4202 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4); |
4202 } | 4203 }else |
4204 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, 0, 4); | |
4203 } | 4205 } |
4204 } | 4206 } |
4205 else if(IS_16X8(mb_type)){ | 4207 else if(IS_16X8(mb_type)){ |
4206 for(list=0; list<2; list++){ | 4208 for(list=0; list<2; list++){ |
4207 if(h->ref_count[list]>0){ | 4209 if(h->ref_count[list]>0){ |
4208 for(i=0; i<2; i++){ | 4210 for(i=0; i<2; i++){ |
4209 if(IS_DIR(mb_type, i, list)){ | 4211 if(IS_DIR(mb_type, i, list)){ |
4210 const int val= get_te0_golomb(&s->gb, h->ref_count[list]); | 4212 const int val= get_te0_golomb(&s->gb, h->ref_count[list]); |
4211 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1); | 4213 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1); |
4212 }else // needed only for mixed refs (e.g. B_L0_L1_16x8) | 4214 }else |
4213 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1); | 4215 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1); |
4214 } | 4216 } |
4215 } | 4217 } |
4216 } | 4218 } |
4217 for(list=0; list<2; list++){ | 4219 for(list=0; list<2; list++){ |
4233 if(h->ref_count[list]>0){ | 4235 if(h->ref_count[list]>0){ |
4234 for(i=0; i<2; i++){ | 4236 for(i=0; i<2; i++){ |
4235 if(IS_DIR(mb_type, i, list)){ //FIXME optimize | 4237 if(IS_DIR(mb_type, i, list)){ //FIXME optimize |
4236 const int val= get_te0_golomb(&s->gb, h->ref_count[list]); | 4238 const int val= get_te0_golomb(&s->gb, h->ref_count[list]); |
4237 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1); | 4239 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1); |
4238 }else // needed only for mixed refs | 4240 }else |
4239 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1); | 4241 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1); |
4240 } | 4242 } |
4241 } | 4243 } |
4242 } | 4244 } |
4243 for(list=0; list<2; list++){ | 4245 for(list=0; list<2; list++){ |
5133 if(IS_DIR(mb_type, 0, list)){ | 5135 if(IS_DIR(mb_type, 0, list)){ |
5134 if(h->ref_count[list] > 0 ){ | 5136 if(h->ref_count[list] > 0 ){ |
5135 const int ref = h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 0 ) : 0; | 5137 const int ref = h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 0 ) : 0; |
5136 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1); | 5138 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1); |
5137 } | 5139 } |
5138 } | 5140 }else |
5141 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, (uint8_t)LIST_NOT_USED, 1); | |
5139 } | 5142 } |
5140 for(list=0; list<2; list++){ | 5143 for(list=0; list<2; list++){ |
5141 if(IS_DIR(mb_type, 0, list)){ | 5144 if(IS_DIR(mb_type, 0, list)){ |
5142 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mpx, &mpy); | 5145 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mpx, &mpy); |
5143 | 5146 |
5145 my = mpy + decode_cabac_mb_mvd( h, list, 0, 1 ); | 5148 my = mpy + decode_cabac_mb_mvd( h, list, 0, 1 ); |
5146 tprintf("final mv:%d %d\n", mx, my); | 5149 tprintf("final mv:%d %d\n", mx, my); |
5147 | 5150 |
5148 fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx-mpx,my-mpy), 4); | 5151 fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx-mpx,my-mpy), 4); |
5149 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4); | 5152 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4); |
5150 } | 5153 }else |
5154 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, 0, 4); | |
5151 } | 5155 } |
5152 } | 5156 } |
5153 else if(IS_16X8(mb_type)){ | 5157 else if(IS_16X8(mb_type)){ |
5154 for(list=0; list<2; list++){ | 5158 for(list=0; list<2; list++){ |
5155 if(h->ref_count[list]>0){ | 5159 if(h->ref_count[list]>0){ |
5170 my = mpy + decode_cabac_mb_mvd( h, list, 8*i, 1 ); | 5174 my = mpy + decode_cabac_mb_mvd( h, list, 8*i, 1 ); |
5171 tprintf("final mv:%d %d\n", mx, my); | 5175 tprintf("final mv:%d %d\n", mx, my); |
5172 | 5176 |
5173 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx-mpx,my-mpy), 4); | 5177 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx-mpx,my-mpy), 4); |
5174 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4); | 5178 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4); |
5175 }else{ // needed only for mixed refs | 5179 }else{ |
5176 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4); | 5180 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4); |
5177 fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4); | 5181 fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4); |
5178 } | 5182 } |
5179 } | 5183 } |
5180 } | 5184 } |
5199 my = mpy + decode_cabac_mb_mvd( h, list, 4*i, 1 ); | 5203 my = mpy + decode_cabac_mb_mvd( h, list, 4*i, 1 ); |
5200 | 5204 |
5201 tprintf("final mv:%d %d\n", mx, my); | 5205 tprintf("final mv:%d %d\n", mx, my); |
5202 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx-mpx,my-mpy), 4); | 5206 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx-mpx,my-mpy), 4); |
5203 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4); | 5207 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4); |
5204 }else{ // needed only for mixed refs | 5208 }else{ |
5205 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4); | 5209 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4); |
5206 fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4); | 5210 fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4); |
5207 } | 5211 } |
5208 } | 5212 } |
5209 } | 5213 } |
5650 | 5654 |
5651 if( h->non_zero_count_cache[b_idx] != 0 || | 5655 if( h->non_zero_count_cache[b_idx] != 0 || |
5652 h->non_zero_count_cache[bn_idx] != 0 ) { | 5656 h->non_zero_count_cache[bn_idx] != 0 ) { |
5653 bS[i] = 2; | 5657 bS[i] = 2; |
5654 } | 5658 } |
5655 else if( h->slice_type == P_TYPE ) { | 5659 else |
5656 if( h->ref_cache[0][b_idx] != h->ref_cache[0][bn_idx] || | 5660 { |
5657 ABS( h->mv_cache[0][b_idx][0] - h->mv_cache[0][bn_idx][0] ) >= 4 || | 5661 /* FIXME: A given frame may occupy more than one position in |
5658 ABS( h->mv_cache[0][b_idx][1] - h->mv_cache[0][bn_idx][1] ) >= 4 ) | 5662 * the reference list. So we should compare the frame numbers, |
5659 bS[i] = 1; | 5663 * not the indices in the ref list. */ |
5660 else | 5664 int l; |
5661 bS[i] = 0; | 5665 bS[i] = 0; |
5662 } else { | 5666 for( l = 0; l < 1 + (h->slice_type == B_TYPE); l++ ) { |
5663 /* FIXME Add support for B frame */ | 5667 if( h->ref_cache[l][b_idx] != h->ref_cache[l][bn_idx] || |
5664 return; | 5668 ABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 || |
5669 ABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= 4 ) { | |
5670 bS[i] = 1; | |
5671 break; | |
5672 } | |
5673 } | |
5665 } | 5674 } |
5666 } | 5675 } |
5667 | 5676 |
5668 if(bS[0]+bS[1]+bS[2]+bS[3] == 0) | 5677 if(bS[0]+bS[1]+bS[2]+bS[3] == 0) |
5669 continue; | 5678 continue; |