comparison vc1.c @ 3520:a48c957d0377 libavcodec

Add rounding for overlap filters
author kostya
date Fri, 28 Jul 2006 03:27:37 +0000
parents 20938be7b67b
children ae749c2da968
comparison
equal deleted inserted replaced
3519:5ef29058581e 3520:a48c957d0377
829 829
830 /** Apply overlap transform to vertical edge 830 /** Apply overlap transform to vertical edge
831 * @todo optimize 831 * @todo optimize
832 * @todo move to DSPContext 832 * @todo move to DSPContext
833 */ 833 */
834 static void vc1_v_overlap(uint8_t* src, int stride) 834 static void vc1_v_overlap(uint8_t* src, int stride, int rnd)
835 { 835 {
836 int i; 836 int i;
837 int a, b, c, d; 837 int a, b, c, d;
838 for(i = 0; i < 8; i++) { 838 for(i = 0; i < 8; i++) {
839 a = src[-2*stride]; 839 a = src[-2*stride];
840 b = src[-stride]; 840 b = src[-stride];
841 c = src[0]; 841 c = src[0];
842 d = src[stride]; 842 d = src[stride];
843 843
844 src[-2*stride] = clip_uint8((7*a + d + 3) >> 3); 844 src[-2*stride] = clip_uint8((7*a + d + 4 - rnd) >> 3);
845 src[-stride] = clip_uint8((-a + 7*b + c + d + 3) >> 3); 845 src[-stride] = clip_uint8((-a + 7*b + c + d + 3 + rnd) >> 3);
846 src[0] = clip_uint8((a + b + 7*c - d + 3) >> 3); 846 src[0] = clip_uint8((a + b + 7*c - d + 4 - rnd) >> 3);
847 src[stride] = clip_uint8((a + 7*d + 3) >> 3); 847 src[stride] = clip_uint8((a + 7*d + 3 + rnd) >> 3);
848 src++; 848 src++;
849 } 849 }
850 } 850 }
851 851
852 /** Apply overlap transform to horizontal edge 852 /** Apply overlap transform to horizontal edge
853 * @todo optimize 853 * @todo optimize
854 * @todo move to DSPContext 854 * @todo move to DSPContext
855 */ 855 */
856 static void vc1_h_overlap(uint8_t* src, int stride) 856 static void vc1_h_overlap(uint8_t* src, int stride, int rnd)
857 { 857 {
858 int i; 858 int i;
859 int a, b, c, d; 859 int a, b, c, d;
860 for(i = 0; i < 8; i++) { 860 for(i = 0; i < 8; i++) {
861 a = src[-2]; 861 a = src[-2];
862 b = src[-1]; 862 b = src[-1];
863 c = src[0]; 863 c = src[0];
864 d = src[1]; 864 d = src[1];
865 865
866 src[-2] = clip_uint8((7*a + d + 3) >> 3); 866 src[-2] = clip_uint8((7*a + d + 4 - rnd) >> 3);
867 src[-1] = clip_uint8((-a + 7*b + c + d + 3) >> 3); 867 src[-1] = clip_uint8((-a + 7*b + c + d + 3 + rnd) >> 3);
868 src[0] = clip_uint8((a + b + 7*c - d + 3) >> 3); 868 src[0] = clip_uint8((a + b + 7*c - d + 4 - rnd) >> 3);
869 src[1] = clip_uint8((a + 7*d + 3) >> 3); 869 src[1] = clip_uint8((a + 7*d + 3 + rnd) >> 3);
870 src += stride; 870 src += stride;
871 } 871 }
872 } 872 }
873 873
874 /** Put block onto picture 874 /** Put block onto picture
2569 for(j = 0; j < 64; j++) s->block[i][j] += 128; 2569 for(j = 0; j < 64; j++) s->block[i][j] += 128;
2570 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); 2570 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
2571 /* TODO: proper loop filtering */ 2571 /* TODO: proper loop filtering */
2572 if(v->pq >= 9 && v->overlap) { 2572 if(v->pq >= 9 && v->overlap) {
2573 if(v->a_avail) 2573 if(v->a_avail)
2574 vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); 2574 vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? ((i&1)>>1) : (s->mb_y&1));
2575 if(v->c_avail) 2575 if(v->c_avail)
2576 vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); 2576 vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? (i&1) : (s->mb_x&1));
2577 } 2577 }
2578 } else if(val) { 2578 } else if(val) {
2579 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); 2579 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block);
2580 if(!v->ttmbf && ttmb < 8) ttmb = -1; 2580 if(!v->ttmbf && ttmb < 8) ttmb = -1;
2581 first_block = 0; 2581 first_block = 0;
2670 for(j = 0; j < 64; j++) s->block[i][j] += 128; 2670 for(j = 0; j < 64; j++) s->block[i][j] += 128;
2671 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); 2671 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
2672 /* TODO: proper loop filtering */ 2672 /* TODO: proper loop filtering */
2673 if(v->pq >= 9 && v->overlap) { 2673 if(v->pq >= 9 && v->overlap) {
2674 if(v->a_avail) 2674 if(v->a_avail)
2675 vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); 2675 vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? ((i&1)>>1) : (s->mb_y&1));
2676 if(v->c_avail) 2676 if(v->c_avail)
2677 vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); 2677 vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? (i&1) : (s->mb_x&1));
2678 } 2678 }
2679 } else if(is_coded[i]) { 2679 } else if(is_coded[i]) {
2680 status = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); 2680 status = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block);
2681 if(!v->ttmbf && ttmb < 8) ttmb = -1; 2681 if(!v->ttmbf && ttmb < 8) ttmb = -1;
2682 first_block = 0; 2682 first_block = 0;
2833 for(j = 0; j < 64; j++) s->block[i][j] += 128; 2833 for(j = 0; j < 64; j++) s->block[i][j] += 128;
2834 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); 2834 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
2835 /* TODO: proper loop filtering */ 2835 /* TODO: proper loop filtering */
2836 if(v->pq >= 9 && v->overlap) { 2836 if(v->pq >= 9 && v->overlap) {
2837 if(v->a_avail) 2837 if(v->a_avail)
2838 vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); 2838 vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? ((i&1)>>1) : (s->mb_y&1));
2839 if(v->c_avail) 2839 if(v->c_avail)
2840 vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); 2840 vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? (i&1) : (s->mb_x&1));
2841 } 2841 }
2842 } else if(val) { 2842 } else if(val) {
2843 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); 2843 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block);
2844 if(!v->ttmbf && ttmb < 8) ttmb = -1; 2844 if(!v->ttmbf && ttmb < 8) ttmb = -1;
2845 first_block = 0; 2845 first_block = 0;
2924 } 2924 }
2925 2925
2926 vc1_put_block(v, s->block); 2926 vc1_put_block(v, s->block);
2927 if(v->pq >= 9 && v->overlap) { /* XXX: do proper overlapping insted of loop filter */ 2927 if(v->pq >= 9 && v->overlap) { /* XXX: do proper overlapping insted of loop filter */
2928 if(!s->first_slice_line) { 2928 if(!s->first_slice_line) {
2929 vc1_v_overlap(s->dest[0], s->linesize); 2929 vc1_v_overlap(s->dest[0], s->linesize, 0);
2930 vc1_v_overlap(s->dest[0] + 8, s->linesize); 2930 vc1_v_overlap(s->dest[0] + 8, s->linesize, 0);
2931 vc1_v_overlap(s->dest[1], s->uvlinesize); 2931 vc1_v_overlap(s->dest[1], s->uvlinesize, s->mb_y&1);
2932 vc1_v_overlap(s->dest[2], s->uvlinesize); 2932 vc1_v_overlap(s->dest[2], s->uvlinesize, s->mb_y&1);
2933 } 2933 }
2934 vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize); 2934 vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 1);
2935 vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize); 2935 vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1);
2936 if(s->mb_x) { 2936 if(s->mb_x) {
2937 vc1_h_overlap(s->dest[0], s->linesize); 2937 vc1_h_overlap(s->dest[0], s->linesize, 0);
2938 vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize); 2938 vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 0);
2939 vc1_h_overlap(s->dest[1], s->uvlinesize); 2939 vc1_h_overlap(s->dest[1], s->uvlinesize, s->mb_x&1);
2940 vc1_h_overlap(s->dest[2], s->uvlinesize); 2940 vc1_h_overlap(s->dest[2], s->uvlinesize, s->mb_x&1);
2941 } 2941 }
2942 vc1_h_overlap(s->dest[0] + 8, s->linesize); 2942 vc1_h_overlap(s->dest[0] + 8, s->linesize, 1);
2943 vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize); 2943 vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1);
2944 } 2944 }
2945 2945
2946 if(get_bits_count(&s->gb) > v->bits) { 2946 if(get_bits_count(&s->gb) > v->bits) {
2947 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits); 2947 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
2948 return; 2948 return;