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;