comparison vc1.c @ 8582:2624a270ef12 libavcodec

421l: fix loop filter for P-frames in VC-1
author kostya
date Tue, 13 Jan 2009 08:02:31 +0000
parents a683a89503eb
children d94775e24b0e
comparison
equal deleted inserted replaced
8581:c8d93b8559fe 8582:2624a270ef12
3203 int left_cbp, top_cbp; 3203 int left_cbp, top_cbp;
3204 if(i & 4){ 3204 if(i & 4){
3205 left_cbp = v->cbp[s->mb_x - 1] >> (i * 4); 3205 left_cbp = v->cbp[s->mb_x - 1] >> (i * 4);
3206 top_cbp = v->cbp[s->mb_x - s->mb_stride] >> (i * 4); 3206 top_cbp = v->cbp[s->mb_x - s->mb_stride] >> (i * 4);
3207 }else{ 3207 }else{
3208 left_cbp = (i & 1) ? (pat >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4)); 3208 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4));
3209 top_cbp = (i & 2) ? (pat >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4)); 3209 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
3210 } 3210 }
3211 if(left_cbp & 0xC) 3211 if(left_cbp & 0xC)
3212 vc1_loop_filter(s->dest[dst_idx] + off, 1, i & 4 ? s->uvlinesize : s->linesize, 8, mquant); 3212 vc1_loop_filter(s->dest[dst_idx] + off, 1, i & 4 ? s->uvlinesize : s->linesize, 8, mquant);
3213 if(top_cbp & 0xA) 3213 if(top_cbp & 0xA)
3214 vc1_loop_filter(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, 1, 8, mquant); 3214 vc1_loop_filter(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, 1, 8, mquant);
3220 filter = 1; 3220 filter = 1;
3221 if(i & 4){ 3221 if(i & 4){
3222 left_cbp = v->cbp[s->mb_x - 1] >> (i * 4); 3222 left_cbp = v->cbp[s->mb_x - 1] >> (i * 4);
3223 top_cbp = v->cbp[s->mb_x - s->mb_stride] >> (i * 4); 3223 top_cbp = v->cbp[s->mb_x - s->mb_stride] >> (i * 4);
3224 }else{ 3224 }else{
3225 left_cbp = (i & 1) ? (pat >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4)); 3225 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4));
3226 top_cbp = (i & 2) ? (pat >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4)); 3226 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
3227 } 3227 }
3228 if(left_cbp & 0xC)
3229 vc1_loop_filter(s->dest[dst_idx] + off, 1, i & 4 ? s->uvlinesize : s->linesize, 8, mquant);
3230 if(top_cbp & 0xA)
3231 vc1_loop_filter(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, 1, 8, mquant);
3228 } 3232 }
3229 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), filter, left_cbp, top_cbp); 3233 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), filter, left_cbp, top_cbp);
3230 block_cbp |= pat << (i << 2); 3234 block_cbp |= pat << (i << 2);
3231 if(!v->ttmbf && ttmb < 8) ttmb = -1; 3235 if(!v->ttmbf && ttmb < 8) ttmb = -1;
3232 first_block = 0; 3236 first_block = 0;
3330 int left_cbp, top_cbp; 3334 int left_cbp, top_cbp;
3331 if(i & 4){ 3335 if(i & 4){
3332 left_cbp = v->cbp[s->mb_x - 1] >> (i * 4); 3336 left_cbp = v->cbp[s->mb_x - 1] >> (i * 4);
3333 top_cbp = v->cbp[s->mb_x - s->mb_stride] >> (i * 4); 3337 top_cbp = v->cbp[s->mb_x - s->mb_stride] >> (i * 4);
3334 }else{ 3338 }else{
3335 left_cbp = (i & 1) ? (pat >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4)); 3339 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4));
3336 top_cbp = (i & 2) ? (pat >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4)); 3340 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
3337 } 3341 }
3338 if(left_cbp & 0xC) 3342 if(left_cbp & 0xC)
3339 vc1_loop_filter(s->dest[dst_idx] + off, 1, i & 4 ? s->uvlinesize : s->linesize, 8, mquant); 3343 vc1_loop_filter(s->dest[dst_idx] + off, 1, i & 4 ? s->uvlinesize : s->linesize, 8, mquant);
3340 if(top_cbp & 0xA) 3344 if(top_cbp & 0xA)
3341 vc1_loop_filter(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, 1, 8, mquant); 3345 vc1_loop_filter(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, 1, 8, mquant);
3347 filter = 1; 3351 filter = 1;
3348 if(i & 4){ 3352 if(i & 4){
3349 left_cbp = v->cbp[s->mb_x - 1] >> (i * 4); 3353 left_cbp = v->cbp[s->mb_x - 1] >> (i * 4);
3350 top_cbp = v->cbp[s->mb_x - s->mb_stride] >> (i * 4); 3354 top_cbp = v->cbp[s->mb_x - s->mb_stride] >> (i * 4);
3351 }else{ 3355 }else{
3352 left_cbp = (i & 1) ? (pat >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4)); 3356 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4));
3353 top_cbp = (i & 2) ? (pat >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4)); 3357 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
3354 } 3358 }
3359 if(left_cbp & 0xC)
3360 vc1_loop_filter(s->dest[dst_idx] + off, 1, i & 4 ? s->uvlinesize : s->linesize, 8, mquant);
3361 if(top_cbp & 0xA)
3362 vc1_loop_filter(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, 1, 8, mquant);
3355 } 3363 }
3356 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), filter, left_cbp, top_cbp); 3364 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), filter, left_cbp, top_cbp);
3357 block_cbp |= pat << (i << 2); 3365 block_cbp |= pat << (i << 2);
3358 if(!v->ttmbf && ttmb < 8) ttmb = -1; 3366 if(!v->ttmbf && ttmb < 8) ttmb = -1;
3359 first_block = 0; 3367 first_block = 0;