Mercurial > libavcodec.hg
comparison vc1.c @ 3364:59c10b66fbbc libavcodec
Added loop filtering as ersatz for overlap filter (improves picture quality for coarse quantization).
author | kostya |
---|---|
date | Tue, 27 Jun 2006 15:37:48 +0000 |
parents | 4c5227327416 |
children | c59aa4cdf042 |
comparison
equal
deleted
inserted
replaced
3363:4c5227327416 | 3364:59c10b66fbbc |
---|---|
309 int ttmb; ///< Transform type | 309 int ttmb; ///< Transform type |
310 uint8_t ttblk4x4; ///< Value of ttblk which indicates a 4x4 transform | 310 uint8_t ttblk4x4; ///< Value of ttblk which indicates a 4x4 transform |
311 int codingset; ///< index of current table set from 11.8 to use for luma block decoding | 311 int codingset; ///< index of current table set from 11.8 to use for luma block decoding |
312 int codingset2; ///< index of current table set from 11.8 to use for chroma block decoding | 312 int codingset2; ///< index of current table set from 11.8 to use for chroma block decoding |
313 int pqindex; ///< raw pqindex used in coding set selection | 313 int pqindex; ///< raw pqindex used in coding set selection |
314 int a_avail, c_avail; | |
314 | 315 |
315 | 316 |
316 /** Luma compensation parameters */ | 317 /** Luma compensation parameters */ |
317 //@{ | 318 //@{ |
318 uint8_t lumscale; | 319 uint8_t lumscale; |
1851 int run_diff, i; | 1852 int run_diff, i; |
1852 int16_t *dc_val; | 1853 int16_t *dc_val; |
1853 int16_t *ac_val, *ac_val2; | 1854 int16_t *ac_val, *ac_val2; |
1854 int dcdiff; | 1855 int dcdiff; |
1855 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | 1856 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; |
1856 int a_avail, c_avail; | 1857 int a_avail = v->a_avail, c_avail = v->c_avail; |
1857 | 1858 |
1858 /* XXX: Guard against dumb values of mquant */ | 1859 /* XXX: Guard against dumb values of mquant */ |
1859 mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant ); | 1860 mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant ); |
1860 | 1861 |
1861 /* Set DC scale - y and c use the same */ | 1862 /* Set DC scale - y and c use the same */ |
1862 s->y_dc_scale = s->y_dc_scale_table[mquant]; | 1863 s->y_dc_scale = s->y_dc_scale_table[mquant]; |
1863 s->c_dc_scale = s->c_dc_scale_table[mquant]; | 1864 s->c_dc_scale = s->c_dc_scale_table[mquant]; |
1864 | 1865 |
1865 /* check if prediction blocks A and C are available */ | |
1866 a_avail = c_avail = 0; | |
1867 if((n == 2 || n == 3) || (s->mb_y && IS_INTRA(s->current_picture.mb_type[mb_pos - s->mb_stride]))) | |
1868 a_avail = 1; | |
1869 if((n == 1 || n == 3) || (s->mb_x && IS_INTRA(s->current_picture.mb_type[mb_pos - 1]))) | |
1870 c_avail = 1; | |
1871 /* Get DC differential */ | 1866 /* Get DC differential */ |
1872 if (n < 4) { | 1867 if (n < 4) { |
1873 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | 1868 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); |
1874 } else { | 1869 } else { |
1875 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); | 1870 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); |
1923 int last = 0, skip, value; | 1918 int last = 0, skip, value; |
1924 const int8_t *zz_table; | 1919 const int8_t *zz_table; |
1925 int scale; | 1920 int scale; |
1926 int k; | 1921 int k; |
1927 | 1922 |
1928 scale = mquant * 2 + v->halfpq; | 1923 scale = mquant * 2; |
1929 | 1924 |
1930 zz_table = vc1_simple_progressive_8x8_zz; | 1925 zz_table = vc1_simple_progressive_8x8_zz; |
1931 | 1926 |
1932 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | 1927 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
1933 ac_val2 = ac_val; | 1928 ac_val2 = ac_val; |
2012 if(!a_avail) { | 2007 if(!a_avail) { |
2013 memset(ac_val + 8, 0, 8 * sizeof(ac_val[0])); | 2008 memset(ac_val + 8, 0, 8 * sizeof(ac_val[0])); |
2014 dc_pred_dir = 1; | 2009 dc_pred_dir = 1; |
2015 } | 2010 } |
2016 | 2011 |
2017 scale = mquant * 2 + v->halfpq; | 2012 scale = mquant * 2; |
2018 memset(ac_val2, 0, 16 * 2); | 2013 memset(ac_val2, 0, 16 * 2); |
2019 if(dc_pred_dir) {//left | 2014 if(dc_pred_dir) {//left |
2020 ac_val -= 16; | 2015 ac_val -= 16; |
2021 if(s->ac_pred) | 2016 if(s->ac_pred) |
2022 memcpy(ac_val2, ac_val, 8 * 2); | 2017 memcpy(ac_val2, ac_val, 8 * 2); |
2066 if(ttblk == TT_4X4) { | 2061 if(ttblk == TT_4X4) { |
2067 subblkpat = ~(get_vlc2(gb, vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1); | 2062 subblkpat = ~(get_vlc2(gb, vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1); |
2068 } | 2063 } |
2069 if((ttblk != TT_8X8 && ttblk != TT_4X4) && (v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))) { | 2064 if((ttblk != TT_8X8 && ttblk != TT_4X4) && (v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))) { |
2070 subblkpat = decode012(gb); | 2065 subblkpat = decode012(gb); |
2066 if(subblkpat) subblkpat ^= 3; //swap decoded pattern bits | |
2071 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) ttblk = TT_8X4; | 2067 if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) ttblk = TT_8X4; |
2072 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) ttblk = TT_4X8; | 2068 if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) ttblk = TT_4X8; |
2073 } | 2069 } |
2074 scale = 2 * mquant; | 2070 scale = 2 * mquant; |
2075 | 2071 |
2222 s->dc_val[0][s->block_index[i]] = 0; | 2218 s->dc_val[0][s->block_index[i]] = 0; |
2223 dst_idx += i >> 2; | 2219 dst_idx += i >> 2; |
2224 val = ((cbp >> (5 - i)) & 1); | 2220 val = ((cbp >> (5 - i)) & 1); |
2225 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); | 2221 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); |
2226 if(s->mb_intra) { | 2222 if(s->mb_intra) { |
2223 /* check if prediction blocks A and C are available */ | |
2224 v->a_avail = v->c_avail = 0; | |
2225 if((i == 2 || i == 3) || (s->mb_y && IS_INTRA(s->current_picture.mb_type[mb_pos - s->mb_stride]))) | |
2226 v->a_avail = 1; | |
2227 if((i == 1 || i == 3) || (s->mb_x && IS_INTRA(s->current_picture.mb_type[mb_pos - 1]))) | |
2228 v->c_avail = 1; | |
2229 | |
2227 vc1_decode_intra_block(v, block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset); | 2230 vc1_decode_intra_block(v, block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset); |
2228 vc1_inv_trans(s->block[i], 8, 8); | 2231 vc1_inv_trans(s->block[i], 8, 8); |
2229 for(j = 0; j < 64; j++) s->block[i][j] += 128; | 2232 for(j = 0; j < 64; j++) s->block[i][j] += 128; |
2230 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); | 2233 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); |
2234 /* TODO: proper loop filtering */ | |
2235 if(v->a_avail) | |
2236 s->dsp.h263_v_loop_filter(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), s->y_dc_scale); | |
2237 if(v->c_avail) | |
2238 s->dsp.h263_h_loop_filter(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), s->y_dc_scale); | |
2231 } else if(val) { | 2239 } else if(val) { |
2232 vc1_decode_p_block(v, block[i], i, mquant, ttmb, first_block); | 2240 vc1_decode_p_block(v, block[i], i, mquant, ttmb, first_block); |
2233 if(!v->ttmbf && ttmb < 8) ttmb = -1; | 2241 if(!v->ttmbf && ttmb < 8) ttmb = -1; |
2234 first_block = 0; | 2242 first_block = 0; |
2235 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); | 2243 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); |
2359 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2); | 2367 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2); |
2360 v->s.ac_pred = get_bits(&v->s.gb, 1); | 2368 v->s.ac_pred = get_bits(&v->s.gb, 1); |
2361 | 2369 |
2362 for(k = 0; k < 6; k++) { | 2370 for(k = 0; k < 6; k++) { |
2363 val = ((cbp >> (5 - k)) & 1); | 2371 val = ((cbp >> (5 - k)) & 1); |
2372 | |
2364 if (k < 4) { | 2373 if (k < 4) { |
2365 int pred = vc1_coded_block_pred(&v->s, k, &coded_val); | 2374 int pred = vc1_coded_block_pred(&v->s, k, &coded_val); |
2366 val = val ^ pred; | 2375 val = val ^ pred; |
2367 *coded_val = val; | 2376 *coded_val = val; |
2368 } | 2377 } |
2375 vc1_overlap_block(s, s->block[k], k, (s->mb_y || k>1), (s->mb_x || (k != 0 && k != 2))); | 2384 vc1_overlap_block(s, s->block[k], k, (s->mb_y || k>1), (s->mb_x || (k != 0 && k != 2))); |
2376 } | 2385 } |
2377 } | 2386 } |
2378 | 2387 |
2379 vc1_put_block(v, s->block); | 2388 vc1_put_block(v, s->block); |
2389 if(v->pq >= 9 && v->overlap) { /* XXX: do proper overlapping insted of loop filter */ | |
2390 if(s->mb_y) { | |
2391 s->dsp.h263_v_loop_filter(s->dest[0], s->linesize, s->y_dc_scale); | |
2392 s->dsp.h263_v_loop_filter(s->dest[0] + 8, s->linesize, s->y_dc_scale); | |
2393 s->dsp.h263_v_loop_filter(s->dest[1], s->uvlinesize, s->y_dc_scale); | |
2394 s->dsp.h263_v_loop_filter(s->dest[2], s->uvlinesize, s->y_dc_scale); | |
2395 } | |
2396 s->dsp.h263_v_loop_filter(s->dest[0] + 8 * s->linesize, s->linesize, s->y_dc_scale); | |
2397 s->dsp.h263_v_loop_filter(s->dest[0] + 8 * s->linesize + 8, s->linesize, s->y_dc_scale); | |
2398 if(s->mb_x) { | |
2399 s->dsp.h263_h_loop_filter(s->dest[0], s->linesize, s->y_dc_scale); | |
2400 s->dsp.h263_h_loop_filter(s->dest[0] + 8 * s->linesize, s->linesize, s->y_dc_scale); | |
2401 s->dsp.h263_h_loop_filter(s->dest[1], s->uvlinesize, s->y_dc_scale); | |
2402 s->dsp.h263_h_loop_filter(s->dest[2], s->uvlinesize, s->y_dc_scale); | |
2403 } | |
2404 s->dsp.h263_h_loop_filter(s->dest[0] + 8, s->linesize, s->y_dc_scale); | |
2405 s->dsp.h263_h_loop_filter(s->dest[0] + 8 * s->linesize + 8, s->linesize, s->y_dc_scale); | |
2406 } | |
2380 | 2407 |
2381 if(get_bits_count(&s->gb) > v->bits) { | 2408 if(get_bits_count(&s->gb) > v->bits) { |
2382 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits); | 2409 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits); |
2383 return; | 2410 return; |
2384 } | 2411 } |