comparison vc1.c @ 9450:e90d0068a03f libavcodec

VC1 loop filter uses the frame quantizer not the mb quantizer
author conrad
date Thu, 16 Apr 2009 07:34:52 +0000
parents 3970fe47fea3
children d8e5002210cb
comparison
equal deleted inserted replaced
9449:0bc68f915e8e 9450:e90d0068a03f
2980 } 2980 }
2981 if(!skip_block){ 2981 if(!skip_block){
2982 s->dsp.vc1_inv_trans_8x8(block); 2982 s->dsp.vc1_inv_trans_8x8(block);
2983 s->dsp.add_pixels_clamped(block, dst, linesize); 2983 s->dsp.add_pixels_clamped(block, dst, linesize);
2984 if(apply_filter && cbp_top & 0xC) 2984 if(apply_filter && cbp_top & 0xC)
2985 s->dsp.vc1_v_loop_filter8(dst, linesize, mquant); 2985 s->dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
2986 if(apply_filter && cbp_left & 0xA) 2986 if(apply_filter && cbp_left & 0xA)
2987 s->dsp.vc1_h_loop_filter8(dst, linesize, mquant); 2987 s->dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
2988 } 2988 }
2989 break; 2989 break;
2990 case TT_4X4: 2990 case TT_4X4:
2991 pat = ~subblkpat & 0xF; 2991 pat = ~subblkpat & 0xF;
2992 for(j = 0; j < 4; j++) { 2992 for(j = 0; j < 4; j++) {
3004 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant; 3004 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
3005 } 3005 }
3006 if(!(subblkpat & (1 << (3 - j))) && !skip_block){ 3006 if(!(subblkpat & (1 << (3 - j))) && !skip_block){
3007 s->dsp.vc1_inv_trans_4x4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off); 3007 s->dsp.vc1_inv_trans_4x4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off);
3008 if(apply_filter && (j&2 ? pat & (1<<(j-2)) : (cbp_top & (1 << (j + 2))))) 3008 if(apply_filter && (j&2 ? pat & (1<<(j-2)) : (cbp_top & (1 << (j + 2)))))
3009 s->dsp.vc1_v_loop_filter4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, mquant); 3009 s->dsp.vc1_v_loop_filter4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, v->pq);
3010 if(apply_filter && (j&1 ? pat & (1<<(j-1)) : (cbp_left & (1 << (j + 1))))) 3010 if(apply_filter && (j&1 ? pat & (1<<(j-1)) : (cbp_left & (1 << (j + 1)))))
3011 s->dsp.vc1_h_loop_filter4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, mquant); 3011 s->dsp.vc1_h_loop_filter4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, v->pq);
3012 } 3012 }
3013 } 3013 }
3014 break; 3014 break;
3015 case TT_8X4: 3015 case TT_8X4:
3016 pat = ~((subblkpat & 2)*6 + (subblkpat & 1)*3) & 0xF; 3016 pat = ~((subblkpat & 2)*6 + (subblkpat & 1)*3) & 0xF;
3029 block[idx] += (block[idx] < 0) ? -mquant : mquant; 3029 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3030 } 3030 }
3031 if(!(subblkpat & (1 << (1 - j))) && !skip_block){ 3031 if(!(subblkpat & (1 << (1 - j))) && !skip_block){
3032 s->dsp.vc1_inv_trans_8x4(dst + j*4*linesize, linesize, block + off); 3032 s->dsp.vc1_inv_trans_8x4(dst + j*4*linesize, linesize, block + off);
3033 if(apply_filter && j ? pat & 0x3 : (cbp_top & 0xC)) 3033 if(apply_filter && j ? pat & 0x3 : (cbp_top & 0xC))
3034 s->dsp.vc1_v_loop_filter8(dst + j*4*linesize, linesize, mquant); 3034 s->dsp.vc1_v_loop_filter8(dst + j*4*linesize, linesize, v->pq);
3035 if(apply_filter && cbp_left & (2 << j)) 3035 if(apply_filter && cbp_left & (2 << j))
3036 s->dsp.vc1_h_loop_filter4(dst + j*4*linesize, linesize, mquant); 3036 s->dsp.vc1_h_loop_filter4(dst + j*4*linesize, linesize, v->pq);
3037 } 3037 }
3038 } 3038 }
3039 break; 3039 break;
3040 case TT_4X8: 3040 case TT_4X8:
3041 pat = ~(subblkpat*5) & 0xF; 3041 pat = ~(subblkpat*5) & 0xF;
3054 block[idx] += (block[idx] < 0) ? -mquant : mquant; 3054 block[idx] += (block[idx] < 0) ? -mquant : mquant;
3055 } 3055 }
3056 if(!(subblkpat & (1 << (1 - j))) && !skip_block){ 3056 if(!(subblkpat & (1 << (1 - j))) && !skip_block){
3057 s->dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off); 3057 s->dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
3058 if(apply_filter && cbp_top & (2 << j)) 3058 if(apply_filter && cbp_top & (2 << j))
3059 s->dsp.vc1_v_loop_filter4(dst + j*4, linesize, mquant); 3059 s->dsp.vc1_v_loop_filter4(dst + j*4, linesize, v->pq);
3060 if(apply_filter && j ? pat & 0x5 : (cbp_left & 0xA)) 3060 if(apply_filter && j ? pat & 0x5 : (cbp_left & 0xA))
3061 s->dsp.vc1_h_loop_filter8(dst + j*4, linesize, mquant); 3061 s->dsp.vc1_h_loop_filter8(dst + j*4, linesize, v->pq);
3062 } 3062 }
3063 } 3063 }
3064 break; 3064 break;
3065 } 3065 }
3066 return pat; 3066 return pat;
3179 }else{ 3179 }else{
3180 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4)); 3180 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4));
3181 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4)); 3181 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
3182 } 3182 }
3183 if(left_cbp & 0xC) 3183 if(left_cbp & 0xC)
3184 s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, mquant); 3184 s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
3185 if(top_cbp & 0xA) 3185 if(top_cbp & 0xA)
3186 s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, mquant); 3186 s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
3187 } 3187 }
3188 block_cbp |= 0xF << (i << 2); 3188 block_cbp |= 0xF << (i << 2);
3189 } else if(val) { 3189 } else if(val) {
3190 int left_cbp = 0, top_cbp = 0, filter = 0; 3190 int left_cbp = 0, top_cbp = 0, filter = 0;
3191 if(apply_loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){ 3191 if(apply_loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
3196 }else{ 3196 }else{
3197 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4)); 3197 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4));
3198 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4)); 3198 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
3199 } 3199 }
3200 if(left_cbp & 0xC) 3200 if(left_cbp & 0xC)
3201 s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, mquant); 3201 s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
3202 if(top_cbp & 0xA) 3202 if(top_cbp & 0xA)
3203 s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, mquant); 3203 s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
3204 } 3204 }
3205 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); 3205 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);
3206 block_cbp |= pat << (i << 2); 3206 block_cbp |= pat << (i << 2);
3207 if(!v->ttmbf && ttmb < 8) ttmb = -1; 3207 if(!v->ttmbf && ttmb < 8) ttmb = -1;
3208 first_block = 0; 3208 first_block = 0;
3310 }else{ 3310 }else{
3311 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4)); 3311 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4));
3312 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4)); 3312 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
3313 } 3313 }
3314 if(left_cbp & 0xC) 3314 if(left_cbp & 0xC)
3315 s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, mquant); 3315 s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
3316 if(top_cbp & 0xA) 3316 if(top_cbp & 0xA)
3317 s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, mquant); 3317 s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
3318 } 3318 }
3319 block_cbp |= 0xF << (i << 2); 3319 block_cbp |= 0xF << (i << 2);
3320 } else if(is_coded[i]) { 3320 } else if(is_coded[i]) {
3321 int left_cbp = 0, top_cbp = 0, filter = 0; 3321 int left_cbp = 0, top_cbp = 0, filter = 0;
3322 if(v->s.loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){ 3322 if(v->s.loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
3327 }else{ 3327 }else{
3328 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4)); 3328 left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1] >> ((i+1)*4));
3329 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4)); 3329 top_cbp = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
3330 } 3330 }
3331 if(left_cbp & 0xC) 3331 if(left_cbp & 0xC)
3332 s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, mquant); 3332 s->dsp.vc1_v_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
3333 if(top_cbp & 0xA) 3333 if(top_cbp & 0xA)
3334 s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, mquant); 3334 s->dsp.vc1_h_loop_filter8(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, v->pq);
3335 } 3335 }
3336 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); 3336 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);
3337 block_cbp |= pat << (i << 2); 3337 block_cbp |= pat << (i << 2);
3338 if(!v->ttmbf && ttmb < 8) ttmb = -1; 3338 if(!v->ttmbf && ttmb < 8) ttmb = -1;
3339 first_block = 0; 3339 first_block = 0;
3608 } 3608 }
3609 } 3609 }
3610 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize); 3610 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
3611 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize); 3611 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3612 } 3612 }
3613 if(v->s.loop_filter) vc1_loop_filter_iblk(s, s->current_picture.qscale_table[mb_pos]); 3613 if(v->s.loop_filter) vc1_loop_filter_iblk(s, v->pq);
3614 3614
3615 if(get_bits_count(&s->gb) > v->bits) { 3615 if(get_bits_count(&s->gb) > v->bits) {
3616 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)); 3616 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
3617 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits); 3617 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
3618 return; 3618 return;
3739 } 3739 }
3740 } 3740 }
3741 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize); 3741 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
3742 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize); 3742 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3743 } 3743 }
3744 if(v->s.loop_filter) vc1_loop_filter_iblk(s, s->current_picture.qscale_table[mb_pos]); 3744 if(v->s.loop_filter) vc1_loop_filter_iblk(s, v->pq);
3745 3745
3746 if(get_bits_count(&s->gb) > v->bits) { 3746 if(get_bits_count(&s->gb) > v->bits) {
3747 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)); 3747 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
3748 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits); 3748 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
3749 return; 3749 return;
3846 if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) { 3846 if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
3847 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)); 3847 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
3848 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y); 3848 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y);
3849 return; 3849 return;
3850 } 3850 }
3851 if(v->s.loop_filter) vc1_loop_filter_iblk(s, s->current_picture.qscale_table[s->mb_x + s->mb_y *s->mb_stride]); 3851 if(v->s.loop_filter) vc1_loop_filter_iblk(s, v->pq);
3852 } 3852 }
3853 ff_draw_horiz_band(s, s->mb_y * 16, 16); 3853 ff_draw_horiz_band(s, s->mb_y * 16, 16);
3854 s->first_slice_line = 0; 3854 s->first_slice_line = 0;
3855 } 3855 }
3856 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); 3856 ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));