Mercurial > libavcodec.hg
comparison vc1.c @ 3528:79ad5cd43686 libavcodec
Use bicubic MC (should also remove those ringing artifacts) when needed
author | kostya |
---|---|
date | Sun, 30 Jul 2006 03:50:31 +0000 |
parents | 3187e7ffe52d |
children | f26bf13bbb69 |
comparison
equal
deleted
inserted
replaced
3527:3187e7ffe52d | 3528:79ad5cd43686 |
---|---|
796 srcU = s->edge_emu_buffer + 18 * s->linesize; | 796 srcU = s->edge_emu_buffer + 18 * s->linesize; |
797 srcV = s->edge_emu_buffer + 18 * s->linesize; | 797 srcV = s->edge_emu_buffer + 18 * s->linesize; |
798 } | 798 } |
799 | 799 |
800 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) | 800 if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) |
801 || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16 | 801 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3 |
802 || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){ | 802 || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 16 - s->mspel*3){ |
803 uint8_t *uvbuf= s->edge_emu_buffer + 18 * s->linesize; | 803 uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize; |
804 | 804 |
805 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 16+1, 16+1, | 805 srcY -= s->mspel * (1 + s->linesize); |
806 src_x, src_y, s->h_edge_pos, s->v_edge_pos); | 806 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2, |
807 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos); | |
807 srcY = s->edge_emu_buffer; | 808 srcY = s->edge_emu_buffer; |
808 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1, | 809 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8+1, 8+1, |
809 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | 810 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); |
810 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1, | 811 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1, |
811 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | 812 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); |
815 if(v->rangeredfrm) { | 816 if(v->rangeredfrm) { |
816 int i, j; | 817 int i, j; |
817 uint8_t *src, *src2; | 818 uint8_t *src, *src2; |
818 | 819 |
819 src = srcY; | 820 src = srcY; |
820 for(j = 0; j < 17; j++) { | 821 for(j = 0; j < 17 + s->mspel*2; j++) { |
821 for(i = 0; i < 17; i++) src[i] = ((src[i] - 128) >> 1) + 128; | 822 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128; |
822 src += s->linesize; | 823 src += s->linesize; |
823 } | 824 } |
824 src = srcU; src2 = srcV; | 825 src = srcU; src2 = srcV; |
825 for(j = 0; j < 9; j++) { | 826 for(j = 0; j < 9; j++) { |
826 for(i = 0; i < 9; i++) { | 827 for(i = 0; i < 9; i++) { |
835 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { | 836 if(v->mv_mode == MV_PMODE_INTENSITY_COMP) { |
836 int i, j; | 837 int i, j; |
837 uint8_t *src, *src2; | 838 uint8_t *src, *src2; |
838 | 839 |
839 src = srcY; | 840 src = srcY; |
840 for(j = 0; j < 17; j++) { | 841 for(j = 0; j < 17 + s->mspel*2; j++) { |
841 for(i = 0; i < 17; i++) src[i] = v->luty[src[i]]; | 842 for(i = 0; i < 17 + s->mspel*2; i++) src[i] = v->luty[src[i]]; |
842 src += s->linesize; | 843 src += s->linesize; |
843 } | 844 } |
844 src = srcU; src2 = srcV; | 845 src = srcU; src2 = srcV; |
845 for(j = 0; j < 9; j++) { | 846 for(j = 0; j < 9; j++) { |
846 for(i = 0; i < 9; i++) { | 847 for(i = 0; i < 9; i++) { |
849 } | 850 } |
850 src += s->uvlinesize; | 851 src += s->uvlinesize; |
851 src2 += s->uvlinesize; | 852 src2 += s->uvlinesize; |
852 } | 853 } |
853 } | 854 } |
855 srcY += s->mspel * (1 + s->linesize); | |
854 } | 856 } |
855 | 857 |
856 if(v->fastuvmc) { | 858 if(v->fastuvmc) { |
857 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1)); | 859 uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1)); |
858 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1)); | 860 uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1)); |
859 } | 861 } |
860 | 862 |
861 if(!s->quarter_sample) { // hpel mc | 863 if(s->mspel) { |
864 dxy = ((my & 3) << 2) | (mx & 3); | |
865 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] , srcY , s->linesize, v->rnd); | |
866 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd); | |
867 srcY += s->linesize * 8; | |
868 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize , srcY , s->linesize, v->rnd); | |
869 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd); | |
870 } else if(!s->quarter_sample) { // hpel mc | |
862 mx >>= 1; | 871 mx >>= 1; |
863 my >>= 1; | 872 my >>= 1; |
864 dxy = ((my & 1) << 1) | (mx & 1); | 873 dxy = ((my & 1) << 1) | (mx & 1); |
865 | 874 |
866 if(!v->rnd) | 875 if(!v->rnd) |
911 src_x = clip( src_x, -16, s->mb_width * 16); | 920 src_x = clip( src_x, -16, s->mb_width * 16); |
912 src_y = clip( src_y, -16, s->mb_height * 16); | 921 src_y = clip( src_y, -16, s->mb_height * 16); |
913 | 922 |
914 srcY += src_y * s->linesize + src_x; | 923 srcY += src_y * s->linesize + src_x; |
915 | 924 |
916 if(v->rangeredfrm || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16 | 925 if(v->rangeredfrm || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 8 - s->mspel |
917 || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){ | 926 || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 8 - s->mspel){ |
918 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 16+1, 16+1, | 927 srcY -= s->mspel * (1 + s->linesize); |
919 src_x, src_y, s->h_edge_pos, s->v_edge_pos); | 928 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 9+s->mspel*2, 9+s->mspel*2, |
929 src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos); | |
920 srcY = s->edge_emu_buffer; | 930 srcY = s->edge_emu_buffer; |
921 /* if we deal with range reduction we need to scale source blocks */ | 931 /* if we deal with range reduction we need to scale source blocks */ |
922 if(v->rangeredfrm) { | 932 if(v->rangeredfrm) { |
923 int i, j; | 933 int i, j; |
924 uint8_t *src; | 934 uint8_t *src; |
925 | 935 |
926 src = srcY; | 936 src = srcY; |
927 for(j = 0; j < 17; j++) { | 937 for(j = 0; j < 9 + s->mspel*2; j++) { |
928 for(i = 0; i < 17; i++) src[i] = ((src[i] - 128) >> 1) + 128; | 938 for(i = 0; i < 9 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128; |
929 src += s->linesize; | 939 src += s->linesize; |
930 } | 940 } |
931 } | 941 } |
932 } | 942 srcY += s->mspel * (1 + s->linesize); |
933 | 943 } |
934 if(!s->quarter_sample) { // hpel mc | 944 |
945 if(s->mspel) { | |
946 dxy = ((my & 3) << 2) | (mx & 3); | |
947 dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, v->rnd); | |
948 } else if(!s->quarter_sample) { // hpel mc | |
935 mx >>= 1; | 949 mx >>= 1; |
936 my >>= 1; | 950 my >>= 1; |
937 dxy = ((my & 1) << 1) | (mx & 1); | 951 dxy = ((my & 1) << 1) | (mx & 1); |
938 | 952 |
939 if(!v->rnd) | 953 if(!v->rnd) |