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