Mercurial > libavcodec.hg
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)); |