19 |
* along with this program ; if not, write to the Free Software |
* along with this program ; if not, write to the Free Software |
20 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
21 |
* |
* |
22 |
* $Id: image.c,v 1.46 2010-11-28 15:18:21 Isibaar Exp $ |
* $Id: image.c,v 1.46.2.2 2011-03-08 19:18:34 Isibaar Exp $ |
23 |
* |
* |
24 |
****************************************************************************/ |
****************************************************************************/ |
25 |
|
|
127 |
memcpy(image1->v, image2->v, edged_width * height / 4); |
memcpy(image1->v, image2->v, edged_width * height / 4); |
128 |
} |
} |
129 |
|
|
130 |
/* setedges bug was fixed in this BS version */ |
/* setedges bug was in this BS versions */ |
131 |
#define SETEDGES_BUG_BEFORE 18 |
#define SETEDGES_BUG_BEFORE 18 |
132 |
|
#define SETEDGES_BUG_AFTER 57 |
133 |
|
#define SETEDGES_BUG_REFIXED 63 |
134 |
|
|
135 |
void |
void |
136 |
image_setedges(IMAGE * image, |
image_setedges(IMAGE * image, |
151 |
|
|
152 |
/* According to the Standard Clause 7.6.4, padding is done starting at 16 |
/* According to the Standard Clause 7.6.4, padding is done starting at 16 |
153 |
* pixel width and height multiples. This was not respected in old xvids */ |
* pixel width and height multiples. This was not respected in old xvids */ |
154 |
if (bs_version >= SETEDGES_BUG_BEFORE) { |
if (bs_version >= SETEDGES_BUG_BEFORE && |
155 |
|
bs_version < SETEDGES_BUG_AFTER || |
156 |
|
bs_version >= SETEDGES_BUG_REFIXED) { |
157 |
width = (width+15)&~15; |
width = (width+15)&~15; |
158 |
height = (height+15)&~15; |
height = (height+15)&~15; |
159 |
} |
} |
876 |
DECLARE_ALIGNED_MATRIX(squares, 1, 4, uint32_t, CACHE_LINE); |
DECLARE_ALIGNED_MATRIX(squares, 1, 4, uint32_t, CACHE_LINE); |
877 |
|
|
878 |
int x, y, i, j; |
int x, y, i, j; |
879 |
uint8_t *orig = orig_image->y; |
uint8_t *orig_y = orig_image->y; |
880 |
|
uint8_t *orig_u = orig_image->u; |
881 |
|
uint8_t *orig_v = orig_image->v; |
882 |
|
|
883 |
for (y = 0; y < mb_height; y++) { |
for (y = 0; y < mb_height; y++) { |
884 |
for (x = 0; x < mb_width; x++) { |
for (x = 0; x < mb_width; x++) { |
886 |
uint32_t var4[4]; |
uint32_t var4[4]; |
887 |
uint32_t sum = 0, square = 0; |
uint32_t sum = 0, square = 0; |
888 |
|
|
889 |
|
/* y-blocks */ |
890 |
for (j = 0; j < 2; j++) { |
for (j = 0; j < 2; j++) { |
891 |
for (i = 0; i < 2; i++) { |
for (i = 0; i < 2; i++) { |
892 |
int lsum = blocksum8(orig + ((y<<4) + (j<<3))*stride + (x<<4) + (i<<3), |
int lsum = blocksum8(orig_y + ((y<<4) + (j<<3))*stride + (x<<4) + (i<<3), |
893 |
stride, sums, squares); |
stride, sums, squares); |
894 |
int lsquare = (squares[0] + squares[1] + squares[2] + squares[3]); |
int lsquare = (squares[0] + squares[1] + squares[2] + squares[3])<<6; |
895 |
|
|
896 |
sum += lsum; |
sum += lsum; |
897 |
square += lsquare; |
square += lsquare; |
902 |
var4[3] = (squares[3]<<4) - sums[3]*sums[3]; |
var4[3] = (squares[3]<<4) - sums[3]*sums[3]; |
903 |
|
|
904 |
pMB->rel_var8[j*2 + i] = lsquare - lsum*lsum; |
pMB->rel_var8[j*2 + i] = lsquare - lsum*lsum; |
|
|
|
905 |
if (pMB->rel_var8[j*2 + i]) |
if (pMB->rel_var8[j*2 + i]) |
906 |
pMB->rel_var8[j*2 + i] = 256*(var4[0] + var4[1] + var4[2] + var4[3]) / |
pMB->rel_var8[j*2 + i] = ((var4[0] + var4[1] + var4[2] + var4[3])<<8) / |
907 |
pMB->rel_var8[j*2 + i]; /* 4*(Var(Di)/Var(D)) */ |
pMB->rel_var8[j*2 + i]; /* 4*(Var(Di)/Var(D)) */ |
908 |
else |
else |
909 |
pMB->rel_var8[j*2 + i] = 64; |
pMB->rel_var8[j*2 + i] = 64; |
910 |
} |
} |
911 |
} |
} |
912 |
|
|
913 |
|
/* u */ |
914 |
|
{ |
915 |
|
int lsum = blocksum8(orig_u + (y<<3)*(stride>>1) + (x<<3), |
916 |
|
stride, sums, squares); |
917 |
|
int lsquare = (squares[0] + squares[1] + squares[2] + squares[3])<<6; |
918 |
|
|
919 |
|
sum += lsum; |
920 |
|
square += lsquare; |
921 |
|
|
922 |
|
var4[0] = (squares[0]<<4) - sums[0]*sums[0]; |
923 |
|
var4[1] = (squares[1]<<4) - sums[1]*sums[1]; |
924 |
|
var4[2] = (squares[2]<<4) - sums[2]*sums[2]; |
925 |
|
var4[3] = (squares[3]<<4) - sums[3]*sums[3]; |
926 |
|
|
927 |
|
pMB->rel_var8[4] = lsquare - lsum*lsum; |
928 |
|
if (pMB->rel_var8[4]) |
929 |
|
pMB->rel_var8[4] = ((var4[0] + var4[1] + var4[2] + var4[3])<<8) / |
930 |
|
pMB->rel_var8[4]; /* 4*(Var(Di)/Var(D)) */ |
931 |
|
else |
932 |
|
pMB->rel_var8[4] = 64; |
933 |
|
} |
934 |
|
|
935 |
|
/* v */ |
936 |
|
{ |
937 |
|
int lsum = blocksum8(orig_v + (y<<3)*(stride>>1) + (x<<3), |
938 |
|
stride, sums, squares); |
939 |
|
int lsquare = (squares[0] + squares[1] + squares[2] + squares[3])<<6; |
940 |
|
|
941 |
|
sum += lsum; |
942 |
|
square += lsquare; |
943 |
|
|
944 |
|
var4[0] = (squares[0]<<4) - sums[0]*sums[0]; |
945 |
|
var4[1] = (squares[1]<<4) - sums[1]*sums[1]; |
946 |
|
var4[2] = (squares[2]<<4) - sums[2]*sums[2]; |
947 |
|
var4[3] = (squares[3]<<4) - sums[3]*sums[3]; |
948 |
|
|
949 |
|
pMB->rel_var8[5] = lsquare - lsum*lsum; |
950 |
|
if (pMB->rel_var8[5]) |
951 |
|
pMB->rel_var8[5] = ((var4[0] + var4[1] + var4[2] + var4[3])<<8) / |
952 |
|
pMB->rel_var8[5]; /* 4*(Var(Di)/Var(D)) */ |
953 |
|
else |
954 |
|
pMB->rel_var8[5] = 64; |
955 |
|
} |
956 |
|
|
957 |
} |
} |
958 |
} |
} |
959 |
} |
} |