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 }